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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python井字棋

發布時間:2023/12/20 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python井字棋 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用python寫井字棋小游戲
井字棋簡介:井字棋又稱三子棋,英文名為Tic Tac Toe。具體玩法為在一個3x3的棋盤上,一個玩家用X做棋子,另一個玩家用O做棋子,誰先在棋盤上的一行、一列或對角線上畫滿三個棋子,即可獲勝,如果棋盤下滿無人勝出,即為平局。
井字棋在與電腦對戰時涉及到了簡單的人工智能,人工智能分為四個等級:
巔峰級——已經實現了無法超越的最優能力

超越人類級——比所有人類的能力都要強

強人類級——比大多數人類的能力要強

弱人類級——比大多數人類的能力要弱

而在井字棋下的人工智能可以達到巔峰級—————人類永遠無法戰勝電腦。這是游戲本身性質所導致,同齡人之間下井字棋,多下幾把后便很難出現勝方,只要掌握了其中的套路,認真一下,就不再會輸了。

這是游戲設計的流程圖,源代碼也是按照這個思路來的。
關于落子問題
由于只能采用鍵盤輸入,所以需要對棋盤進行坐標表示。有兩種方式,一種是用橫豎坐標來表示,這種方法常見于圍棋和五子棋中。井字棋是一種簡單的棋盤游戲,只有9個棋子位,所以用另一種更簡單的表示方法,即直接用1-9個9個數字來表示位置,其索引順序與鍵盤上的數字鍵排列一致,下棋時看著數字鍵下,較為簡便。

計算機的算法--尋找最佳落子位置
首先簡單的將棋盤劃分為三個部分——中心(1),角(4),邊(4)。中心雖然只有一個但卻不是最重要的,三個部分落子的優先順序依次為:角、中心、邊。這是關于井字棋最有算法的相關文章鏈接,請自行查閱,http://www.guokr.com/article/4754/
因此,井字棋的AI算法計算最佳落子位置的順序如下:
直接落子獲勝
阻止玩家獲勝
在角上落子
在中心落子
在邊上落子
程序源代碼

# Tic Tac Toe
?
?
import random
?
?
def drawBoard(board):
? ? # 打印棋盤
?
?
? ? # "board"是長度為10的列表,為了方便輸入,忽略第一個元素board[0]
?
?
? ? print('\n\n\n\n')
? ? print('\t\t\t┌─┬─┬─┐')
? ? print('\t\t\t│'+board[7]+' │'+board[8]+' │'+board[9]+' │')
? ? print('\t\t\t├─┼─┼─┤')
? ? print('\t\t\t│'+board[4]+' │'+board[5]+' │'+board[6]+' │')
? ? print('\t\t\t├─┼─┼─┤')
? ? print('\t\t\t│'+board[1]+' │'+board[2]+' │'+board[3]+' │')
? ? print('\t\t\t└─┴─┴─┘')
?
?
def inputPlayerLetter():
? ? # 讓玩家選擇棋子
? ? # 返回一個列表,第一個是玩家的棋子,第二個是電腦的
? ? letter = ''
? ? while not (letter == 'X' or letter == 'O'):
? ? ? ? print('Do you want to be X or O?')
? ? ? ? letter = input().upper()
?
?
? ? if letter == 'X':
? ? ? ? return ['X', 'O']
? ? else:
? ? ? ? return ['O', 'X']
?
?
def whoGoesFirst():
? ? # 隨機產生誰先走
? ? if random.randint(0, 1) == 0:
? ? ? ? return 'computer'
? ? else:
? ? ? ? return 'player'
?
?
def playAgain():
? ? # 再玩一次?輸入yes或y返回True
? ? print('Do you want to play again? (yes or no)')
? ? return input().lower().startswith('y')
?
?
def makeMove(board, letter, move):
? ? #落子
? ? board[move] = letter
?
?
def isWinner(bo, le):
? ? # 判斷所給的棋子是否獲勝
? ? # 參數為棋盤上的棋子(列表)和棋子符號
? ? # 以下是所有可能勝利的情況,共8種
? ? return ((bo[7] == le and bo[8] == le and bo[9] == le) or?
? ? (bo[4] == le and bo[5] == le and bo[6] == le) or?
? ? (bo[1] == le and bo[2] == le and bo[3] == le) or?
? ? (bo[7] == le and bo[4] == le and bo[1] == le) or?
? ? (bo[8] == le and bo[5] == le and bo[2] == le) or?
? ? (bo[9] == le and bo[6] == le and bo[3] == le) or
? ? (bo[7] == le and bo[5] == le and bo[3] == le) or
? ? (bo[9] == le and bo[5] == le and bo[1] == le))?
?
?
def getBoardCopy(board):
? ? # 復制一份棋盤,供電腦落子時使用
? ? dupeBoard = []
?
?
? ? for i in board:
? ? ? ? dupeBoard.append(i)
?
?
? ? return dupeBoard
?
?
def isSpaceFree(board, move):
? ? # 判斷這個位置是否有子,沒子返回True
? ? return board[move] == ' '
?
?
def getPlayerMove(board):
? ? # 玩家落子
? ? move = ' '
? ? while move not in '1 2 3 4 5 6 7 8 9'.split() or not isSpaceFree(board, int(move)):
? ? ? ? print('What is your next move? (1-9)')
? ? ? ? move = input()
? ? return int(move)
?
?
def chooseRandomMoveFromList(board, movesList):
? ? # 隨機返回一個可以落子的坐標
? ? # 如果沒有所給的movesList中沒有可以落子的,返回None
? ? possibleMoves = []
? ? for i in movesList:
? ? ? ? if isSpaceFree(board, i):
? ? ? ? ? ? possibleMoves.append(i)
?
?
? ? if len(possibleMoves) != 0:
? ? ? ? return random.choice(possibleMoves)
? ? else:
? ? ? ? return None
?
?
def getComputerMove(board, computerLetter):
? ? # 確定電腦的落子位置
? ? if computerLetter == 'X':
? ? ? ? playerLetter = 'O'
? ? else:
? ? ? ? playerLetter = 'X'
?
?
? ? # Tic Tac Toe AI核心算法:
? ? # 首先判斷電腦方能否通過一次落子直接獲得游戲勝利
? ? for i in range(1, 10):
? ? ? ? copy = getBoardCopy(board)
? ? ? ? if isSpaceFree(copy, i):
? ? ? ? ? ? makeMove(copy, computerLetter, i)
? ? ? ? ? ? if isWinner(copy, computerLetter):
? ? ? ? ? ? ? ? return i
?
?
? ? # 判斷玩家下一次落子能否獲得勝利,如果能,給它堵上
? ? for i in range(1, 10):
? ? ? ? copy = getBoardCopy(board)
? ? ? ? if isSpaceFree(copy, i):
? ? ? ? ? ? makeMove(copy, playerLetter, i)
? ? ? ? ? ? if isWinner(copy, playerLetter):
? ? ? ? ? ? ? ? return i
?
?
? ? # 如果角上能落子的話,在角上落子
? ? move = chooseRandomMoveFromList(board, [1, 3, 7, 9])
? ? if move != None:
? ? ? ? return move
?
?
? ? # 如果能在中心落子的話,在中心落子
? ? if isSpaceFree(board, 5):
? ? ? ? return 5
?
?
? ? # 在邊上落子
? ? return chooseRandomMoveFromList(board, [2, 4, 6, 8])
?
?
def isBoardFull(board):
? ? # 如果棋盤滿了,返回True
? ? for i in range(1, 10):
? ? ? ? if isSpaceFree(board, i):
? ? ? ? ? ? return False
? ? return True
?
?
?
?
print('Welcome to Tic Tac Toe!')
?
?
while True:
? ? # 更新棋盤
? ? theBoard = [' '] * 10
? ? playerLetter, computerLetter = inputPlayerLetter()
? ? turn = whoGoesFirst()
? ? print('The ' + turn + ' will go first.')
? ? gameIsPlaying = True
?
?
? ? while gameIsPlaying:
? ? ? ? if turn == 'player':
? ? ? ? ? ? # 玩家回合
? ? ? ? ? ? drawBoard(theBoard)
? ? ? ? ? ? move = getPlayerMove(theBoard)
? ? ? ? ? ? makeMove(theBoard, playerLetter, move)
?
?
? ? ? ? ? ? if isWinner(theBoard, playerLetter):
? ? ? ? ? ? ? ? drawBoard(theBoard)
? ? ? ? ? ? ? ? print('Hooray! You have won the game!')
? ? ? ? ? ? ? ? gameIsPlaying = False
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? if isBoardFull(theBoard):
? ? ? ? ? ? ? ? ? ? drawBoard(theBoard)
? ? ? ? ? ? ? ? ? ? print('The game is a tie!')
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? turn = 'computer'
?
?
? ? ? ? else:
? ? ? ? ? ? # 電腦回合
? ? ? ? ? ? move = getComputerMove(theBoard, computerLetter)
? ? ? ? ? ? makeMove(theBoard, computerLetter, move)
?
?
? ? ? ? ? ? if isWinner(theBoard, computerLetter):
? ? ? ? ? ? ? ? drawBoard(theBoard)
? ? ? ? ? ? ? ? print('The computer has beaten you! You lose.')
? ? ? ? ? ? ? ? gameIsPlaying = False
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? if isBoardFull(theBoard):
? ? ? ? ? ? ? ? ? ? drawBoard(theBoard)
? ? ? ? ? ? ? ? ? ? print('The game is a tie!')
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? turn = 'player'
?
?
? ? if not playAgain():
? ? ? ? break
————————————————
版權聲明:本文為CSDN博主「極度寒空」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_39035741/article/details/77101765

總結

以上是生活随笔為你收集整理的python井字棋的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。