




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 觸電安全教育托班教案
- 合作社農(nóng)業(yè)生產(chǎn)合作運(yùn)營協(xié)議
- 行政管理經(jīng)濟(jì)法重點(diǎn)體系試題及答案
- 2025年??谑协偵絽^(qū)九年級中考語文一模試卷附答案解析
- 目標(biāo)明確2025年中級經(jīng)濟(jì)師試題及答案
- 行政管理公共關(guān)系學(xué)職業(yè)發(fā)展試題及答案
- 項(xiàng)目經(jīng)理安全b證考試試題及答案
- 職高本科考試試題及答案
- 節(jié)約糧食主題班會教育
- 班級工作計劃整體資源
- 500KV變電站設(shè)備、接線特點(diǎn)及保護(hù)配置原則
- 第十章-老年人的臨終護(hù)理課件
- 結(jié)構(gòu)化學(xué)大綱
- 康復(fù)評定學(xué)第三章肌力
- 圖形創(chuàng)意(高職藝術(shù)設(shè)計)PPT完整全套教學(xué)課件
- 2023年財會金融-注冊會計師-審計(官方)考試歷年真題甄選版帶答案
- 2023學(xué)年完整公開課版粘壓阻力
- YY/T 0299-2022醫(yī)用超聲耦合劑
- MT 181-1988煤礦井下用塑料管安全性能檢驗(yàn)規(guī)范
- GB/T 193-2003普通螺紋直徑與螺距系列
- 因納特工商管理綜合實(shí)訓(xùn)軟件V4.00
評論
0/150
提交評論