日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python实现井字棋

發(fā)布時(shí)間:2023/12/20 python 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python实现井字棋 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?參考學(xué)習(xí):Python實(shí)現(xiàn)井字棋游戲

閑扯

井字棋(Tic-Tac-Toe),初高中進(jìn)行打發(fā)時(shí)間的一種畫x畫o的游戲,3*3的格子組成,一方把行列斜行連成相同的就算獲勝。

那么怎么利用進(jìn)行人機(jī)對(duì)弈這種簡(jiǎn)單的小游戲那。我們先不急于寫代碼,先進(jìn)行思考,程序的實(shí)現(xiàn)是進(jìn)行方便人們的,我們?cè)O(shè)計(jì)井字棋,肯定想讓程序智能化,能夠最大程度的模擬人,所以我們?cè)O(shè)計(jì)一個(gè)無敵的“人”,最后的結(jié)果只能是玩家輸或者平局,機(jī)器必不可能輸。

順著這個(gè)思想想,怎么讓機(jī)器無敵,這個(gè)時(shí)候就要考慮這個(gè)游戲本身了,因?yàn)橛螒蚝?jiǎn)單,我們很輕松就可以推到想贏所對(duì)應(yīng)的步驟,把這種思想步驟灌輸給計(jì)算機(jī),讓他學(xué)習(xí)到,想輸都難,大概這就是人工智能(AI)吧,不過我們的這個(gè)游戲簡(jiǎn)單,簡(jiǎn)易的不能準(zhǔn)確的稱為標(biāo)準(zhǔn)的人工智能,做不到AlphaGo那樣可以對(duì)戰(zhàn)世界冠軍,但是總體AlphaGo也是通過不斷學(xué)習(xí)不斷增強(qiáng)的。

言歸正傳,說我們的井字棋。井字棋我們分為0-8,橫著排就是這樣。

想要獲勝就要:

(第一個(gè)下角,后面的下中)(第一個(gè)下中,后面的下角)(不然的必定有一個(gè)死棋)

設(shè)計(jì)

棋盤采用包含9個(gè)元素的列表來實(shí)現(xiàn)

棋盤為board

board[0]到board[8]存儲(chǔ)代表棋子的字符串

字符串0到8代表未落子

字符串X、O表示兩種棋子,也就是玩家和機(jī)器進(jìn)行下的棋子

程序

1.先有一個(gè)棋盤

? ? ? ? 棋盤的設(shè)計(jì)不唯一,可以設(shè)計(jì)多種樣式的棋盤,有興趣的話可以進(jìn)行自行探索。

board = list("012345678") def dis_board(board):#顯示出棋盤print("\t{0} | {1} | {2}".format(board[0], board[1], board[2]))print("\t_ | _ | _")print("\t{0} | {1} | {2}".format(board[3], board[4], board[5]))print("\t_ | _ | _")print("\t{0} | {1} | {2}".format(board[6], board[7], board[8]))

2.進(jìn)行詢問:是x先走還是o先走

3.人機(jī)進(jìn)行交互落子

AI尋求落子算法

首要目的是要確保AI的每一步都不能出錯(cuò),一出錯(cuò)可能就滿盤皆輸

  • ?AI判定某個(gè)位置可以贏那么就選擇這個(gè)位置落子
  • ?否則,AI進(jìn)行判定如果玩家下一步落某個(gè)位置贏,那么AI不讓他贏,就落子落在這個(gè)位? ?置
  • ?否則,按照中心,角,邊的位置進(jìn)行落子

這樣就可以讓AI立于不敗之地了。

AI先找到可以落子的位置

def _moves(board):#尋求可落子的位置moves = []for i in range(9):if board[i] in list("012345678"): #遍歷了棋盤的位置如果位置為0-8那么這個(gè)位置可以落子moves.append(i)return moves

詢問玩家落子位置,無效落子重復(fù)詢問

def playermove(board):#詢問并確定玩家的選擇落子位置,無效落子重復(fù)詢問move = 9while move not in _moves(board):move = int(input("請(qǐng)選擇落子位置(0-8):"))return move

參數(shù):棋盤,AI棋子,玩家棋子

并且運(yùn)用winner函數(shù),贏就返回True?

def computermove(board,computerletter,playerletter):#核心算法:計(jì)算AI的落子位置boardcopy = board.copy()#規(guī)則一:判斷如果某位置落子可以獲勝,則選擇這個(gè)位置for move in _moves(boardcopy):boardcopy[move] = computerletterif winner(boardcopy):return moveboardcopy[move] = str(move)#規(guī)則二:某個(gè)位置玩家下一步落子就可以獲勝,則選擇該位置for move in _moves(boardcopy):boardcopy[move] = playerletterif winner(boardcopy):return moveboardcopy[move] = str(move)#規(guī)則三:按照中心、角、邊的選擇空的位置for move in(4,0,2,6,8,1,3,5,7):if move in _moves(board):return move

winner函數(shù):判斷怎樣是獲勝

分為八種情況,三種橫線,三種豎線,兩種對(duì)角線

def winner(board):#判斷所給棋子是否獲勝_to_win = {(0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)} for r in _to_win:if board[r[0]] == board[r[1]] == board[r[2]]:return Truereturn False

Tie函數(shù):還有判定平局的情況?

def Tie(board):#判斷是否平局for i in list("012345678"):if i in board:return Falsereturn True

完整代碼實(shí)現(xiàn)

# python菜鳥 # 2022.01.10 def dis_board(board):#顯示出棋盤print("\t{0} | {1} | {2}".format(board[0], board[1], board[2]))print("\t_ | _ | _")print("\t{0} | {1} | {2}".format(board[3], board[4], board[5]))print("\t_ | _ | _")print("\t{0} | {1} | {2}".format(board[6], board[7], board[8]))def _moves(board):#尋求可落子的位置moves = []for i in range(9):if board[i] in list("012345678"): #遍歷了棋盤的位置如果位置為0-8那么這個(gè)位置可以落子moves.append(i)return movesdef playermove(board):#詢問并確定玩家的選擇落子位置,無效落子重復(fù)詢問move = 9while move not in _moves(board):move = int(input("請(qǐng)選擇落子位置(0-8):"))return movedef computermove(board,computerletter,playerletter):#核心算法:計(jì)算AI的落子位置boardcopy = board.copy()#規(guī)則一:判斷如果某位置落子可以獲勝,則選擇這個(gè)位置for move in _moves(boardcopy):boardcopy[move] = computerletterif winner(boardcopy):return moveboardcopy[move] = str(move)#規(guī)則二:某個(gè)位置玩家下一步落子就可以獲勝,則選擇該位置for move in _moves(boardcopy):boardcopy[move] = playerletterif winner(boardcopy):return moveboardcopy[move] = str(move)#規(guī)則三:按照中心、角、邊的選擇空的位置for move in(4,0,2,6,8,1,3,5,7):if move in _moves(board):return movedef winner(board):#判斷所給棋子是否獲勝_to_win = {(0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)}for r in _to_win:if board[r[0]] == board[r[1]] == board[r[2]]:return Truereturn Falsedef Tie(board):#判斷是否平局for i in list("012345678"):if i in board:return Falsereturn Truedef tic_tac_toe():#井字棋board = list("012345678")playerletter = input("請(qǐng)選擇棋子x(玩家)或者o(AI)——(x先走,o后走):")if playerletter in("X","x"):turn = "player"playerletter = "x"computerletter = "o"else:turn = "AI"computerletter = "x"playerletter = "o"print("{}先走!".format(turn))while True:dis_board(board)if turn == 'player':move = playermove(board)board[move] = playerletterif winner(board):dis_board(board)print("恭喜玩家獲勝!")breakelse:turn = "AI"else:move = computermove(board, computerletter, playerletter)print("人工智能AI落子位置:",move)board[move] = computerletterif winner(board):dis_board(board)print("人工智能AI獲勝!")breakelse:turn = "player"if Tie(board):dis_board(board)print('平局!')breakif __name__=='__main__':tic_tac_toe()

其中一個(gè)實(shí)現(xiàn)效果?

請(qǐng)選擇棋子x(玩家)或者o(AI)——(x先走,o后走):x player先走!0 | 1 | 2_ | _ | _3 | 4 | 5_ | _ | _6 | 7 | 8 請(qǐng)選擇落子位置(0-8):80 | 1 | 2_ | _ | _3 | 4 | 5_ | _ | _6 | 7 | x 人工智能AI落子位置: 40 | 1 | 2_ | _ | _3 | o | 5_ | _ | _6 | 7 | x 請(qǐng)選擇落子位置(0-8):20 | 1 | x_ | _ | _3 | o | 5_ | _ | _6 | 7 | x 人工智能AI落子位置: 50 | 1 | x_ | _ | _3 | o | o_ | _ | _6 | 7 | x 請(qǐng)選擇落子位置(0-8):30 | 1 | x_ | _ | _x | o | o_ | _ | _6 | 7 | x 人工智能AI落子位置: 0o | 1 | x_ | _ | _x | o | o_ | _ | _6 | 7 | x 請(qǐng)選擇落子位置(0-8):7o | 1 | x_ | _ | _x | o | o_ | _ | _6 | x | x 人工智能AI落子位置: 6o | 1 | x_ | _ | _x | o | o_ | _ | _o | x | x 請(qǐng)選擇落子位置(0-8):1o | x | x_ | _ | _x | o | o_ | _ | _o | x | x 平局!進(jìn)程已結(jié)束,退出代碼0

遇到的一些問題

  • 縮進(jìn)問題:python中是有著嚴(yán)格的縮進(jìn)的,一旦縮進(jìn)不規(guī)整,就會(huì)出現(xiàn)邏輯上的錯(cuò)誤
  • ?其他都是碼代碼的小問題,符號(hào)的錯(cuò)誤,語言的錯(cuò)誤,等等,需要后期認(rèn)真糾正

總結(jié)

以上是生活随笔為你收集整理的python实现井字棋的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。