python實(shí)現(xiàn)三子棋游戲_第1頁
python實(shí)現(xiàn)三子棋游戲_第2頁
python實(shí)現(xiàn)三子棋游戲_第3頁
python實(shí)現(xiàn)三子棋游戲_第4頁
python實(shí)現(xiàn)三子棋游戲_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第python實(shí)現(xiàn)三子棋游戲目錄一、基本流程二、基本步驟1、菜單界面2、初始化棋盤、打印棋盤3、玩家落子4、電腦落子5、輸贏判定三、整體代碼四、結(jié)果展示三子棋的python實(shí)現(xiàn)代碼,供大家參考,具體內(nèi)容如下

一、基本流程

三子棋游戲?qū)崿F(xiàn)邏輯如下:

1、創(chuàng)建初始化3*3棋盤;

2、玩家執(zhí)U子,先進(jìn)行落子;

3、勝負(fù)判定【勝、負(fù)、和棋】,若勝負(fù)未分,則繼續(xù)如下

4、電腦執(zhí)T子,進(jìn)行落子;

5、勝負(fù)判定,若勝負(fù)未分,則從步驟2繼續(xù)執(zhí)行

二、基本步驟

1、菜單界面

選擇1是開始游戲,選擇2是退出游戲

defmenu():

print('-'*20)

print('1---------------begin')

print('2---------------exit')

print('pleaseselectbeginorexit')

print('-'*20)

while(1):

select=input('pleaseinput:')

ifselect=='1':

begin_games()

pass

elifselect=='2':

print('exitthegame')

break

#pass

pass

2、初始化棋盤、打印棋盤

三子棋棋盤是3*3的方陣,在python中用列表來進(jìn)行存儲。

chess_board=[[0,0,0],[0,0,0],[0,0,0]]

那么如何將這個存儲列表打印出來,成為棋盤呢?

definit_cheaa_board(chess_board):#先對列表進(jìn)行初始化

foriinrange(MAX_ROW):

forjinrange(MAX_COL):

chess_board[i][j]=''

pass

defprint_chess_board(chess_board):#棋盤打印

print('*'+'-'*7+'*'+'-'*7+'*'+'-'*7+'*')

foriinrange(MAX_ROW):

print('|'+''*3+chess_board[i][0]+''*3+'|'+''*3+chess_board[i][1]+''*3+'|'+''*3+chess_board[i][2]+''*3+'|')

print('*'+'-'*7+'*'+'-'*7+'*'+'-'*7+'*')

pass

pass

3、玩家落子

玩家在3*3的棋盤中選擇落子的橫縱坐標(biāo)。坐標(biāo)點(diǎn)需要滿足:1、該點(diǎn)在棋盤內(nèi);2、該點(diǎn)還未置子。

defplayer_first(chess_board):

while(1):

x=int(input('pleaseinputx:'))

y=int(input('pleaseinputy:'))

if(chess_board[x][y]!=''):#若已被置子,則重新選擇坐標(biāo)

print('Thispositionisalreadyoccupied!')

pass

elif(x=MAX_ROWory=MAX_COLorx0ory0):#所選坐標(biāo)超出棋盤范圍,重新選擇坐標(biāo)

print('Thispositionisbeyondthechessboard!')

pass

else:#若坐標(biāo)可以落子,則將該坐標(biāo)置為玩家的棋子U

chess_board[x][y]='U'

print_chess_board(chess_board)

#returnx,y

break

pass

pass

4、電腦落子

電腦落子算法:

4.1、先檢查一下棋盤,看電腦已占有棋面中是否已經(jīng)有兩子連成、即將成棋的狀態(tài)。若已有,則獲取可以促成勝利的坐標(biāo)點(diǎn),進(jìn)行落子T;

4.2、若4.1不滿足,則再去檢查一下棋盤,看玩家已占有棋面中是否已經(jīng)有兩子連成、即將成棋的狀態(tài)。若已有,則獲取玩家即將勝利的坐標(biāo)點(diǎn),落子T進(jìn)行攔截;

4.3、若4.1、4.2均不滿足,則在棋面中選擇電腦端有利的點(diǎn)進(jìn)行落子;

A、先判斷中心位置[1][1]處是否被占領(lǐng),若未被占領(lǐng),則這是最有利點(diǎn)。當(dāng)占領(lǐng)[1][1]點(diǎn)時,則阻斷了玩家的橫、縱、正對角線、副對角線四條線路;

B、次有利點(diǎn)則是3*3棋盤的四個角,每占領(lǐng)一個角,則會阻斷玩家的三條線路;

C、最后有利的點(diǎn)則是每條邊的中心位置,會阻斷玩家的兩條線路;

defIntercept_player(chess_board,key):

count2=0

index2=[]

intercept_index={'x':-1,'y':-1}

foriinrange(MAX_ROW):

index=[]

count=0

count1=0

index1=[]

allindex=[0,1,2]

forjinrange(MAX_ROW):

if(chess_board[i][j]==key):#每一行的玩家落子情況

count+=1

index.append(j)

if(chess_board[j][i]==key):#每一列的玩家落子情況

#print('j'+str(j)+',i'+str(i)+'='+chess_board[j][i])

count1+=1

index1.append(j)

if(i==jandchess_board[j][i]==key):

#在主對角線中的玩家落子情況

count2+=1

index2.append(j)

if(count==2):

#在每一行中

獲取具體的可以攔截的位置坐標(biāo)

需要排除掉已經(jīng)填充的位置

result=list(set(allindex).difference(set(index)))

result=result[0]

if(chess_board[i][result]==''):#當(dāng)這個位置可以進(jìn)行攔截時,進(jìn)行坐標(biāo)返回

#returni,result

intercept_index['x']=i

intercept_index['y']=result

returnintercept_index

#print(count1,'-------',index1)

if(count1==2):

#在每一列中獲取具體的可以攔截的位置坐標(biāo)

需要排除掉已經(jīng)填充的位置

result=list(set(allindex).difference(set(index1)))

result=result[0]

#print('count1==2,result:',result)

if(chess_board[result][i]==''):

#當(dāng)這個位置可以進(jìn)行攔截時,進(jìn)行坐標(biāo)返回

intercept_index['x']=result

intercept_index['y']=i

returnintercept_index

#returni,result

if(count2==2):

#在主對角線上獲取具體的可以攔截的位置坐標(biāo)

需要排除掉已經(jīng)填充的位置

result=list(set(allindex).difference(set(index2)))

result=result[0]

if(chess_board[i][result]==''):

#當(dāng)這個位置可以進(jìn)行攔截時,進(jìn)行坐標(biāo)返回

intercept_index['x']=i

intercept_index['y']=result

returnintercept_index

#returni,result

count3=0

if(chess_board[0][2]==key):

count3+=1

if(chess_board[1][1]==key):

count3+=1

if(chess_board[2][0]==key):

count3+=1

if(count3==2):

if(chess_board[0][2]==''):

intercept_index['x']=0

intercept_index['y']=2

elif(chess_board[1][1]==''):

intercept_index['x']=1

intercept_index['y']=1

elif(chess_board[2][0]==''):

intercept_index['x']=2

intercept_index['y']=0

returnintercept_index

defcomputer_second(chess_board):

#電腦智能出棋

#1、先檢查一下電腦是否兩子成棋

若已有,則獲取空位置坐標(biāo)自己先成棋

intercept_index=Intercept_player(chess_board,'T')

if(intercept_index['x']==-1andintercept_index['y']==-1):

pass

else:

#電腦可落子

x=intercept_index['x']

y=intercept_index['y']

chess_board[x][y]='T'

return

#2、若玩家快成棋

則先進(jìn)行攔截

intercept_index=Intercept_player(chess_board,'U')

#若玩家已經(jīng)兩子成棋

則獲取空位置的坐標(biāo)

#print('intercept_index---:')

#print(intercept_index)

if(intercept_index['x']==-1andintercept_index['y']==-1):

pass

else:

#電腦可落子

x=intercept_index['x']

y=intercept_index['y']

chess_board[x][y]='T'

return

#3、如果沒有,則電腦端排棋

以促進(jìn)成棋

#3.1、占領(lǐng)中心位置

如若中心位置[1,1]未被占領(lǐng)

if(chess_board[1][1]==''):

chess_board[1][1]='T'

return

#3.2、占領(lǐng)四角位置

若[0,0]

[0,2]

[2,0]

[2,2]未被占領(lǐng)

if(chess_board[0][0]==''):

chess_board[0][0]='T'

return

if(chess_board[0][2]==''):

chess_board[0][2]='T'

return

if(chess_board[2][0]==''):

chess_board[2][0]='T'

return

if(chess_board[2][2]==''):

chess_board[2][2]='T'

return

#3.3、占領(lǐng)每一邊中心位置

若[0,1]

[1,0]

[1,2]

[2,1]未被占領(lǐng)

if(chess_board[0][1]==''):

chess_board[0][1]='T'

return

if(chess_board[1][0]==''):

chess_board[1][0]='T'

return

if(chess_board[1][2]==''):

chess_board[1][2]='T'

return

if(chess_board[2][1]==''):

chess_board[2][1]='T'

return

5、輸贏判定

最終的結(jié)果:輸、贏、和棋D

判定流程:判斷每個橫線、縱線、對角線上是否有玩家U或電腦T連成三子的,若有則是該方勝出;當(dāng)整個棋面都被占滿,但玩家和電腦都未成棋時,則說明和棋。

defchess_board_isfull(chess_board):

#判斷棋盤是否填充滿

foriinrange(MAX_ROW):

if(''inchess_board[i]):

return0

return1

pass

defWin_or_lose(chess_board):

isfull=chess_board_isfull(chess_board)

foriinrange(MAX_ROW):

#每一列的判斷

if(chess_board[0][i]==chess_board[1][i]==chess_board[2][i]):

returnchess_board[0][i]

pass

pass

foriinrange(MAX_ROW):

#每一行的判斷

if(chess_board[i][0]==chess_board[i][1]==chess_board[i][2]):

returnchess_board[i][0]

pass

pass

if(chess_board[0][0]==chess_board[1][1]==chess_board[2][2]):

#判斷棋盤正對角線

returnchess_board[0][0]

if(chess_bo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論