python井字棋算法及代码
井字棋盘看起来像一个大的井字符号(#),有9 个空格,可以包含X、O 或
关于落子问题
由于只能采用键盘输入,所以需要对棋盘进行坐标表示;
即直接用1-9个9个数字来表示位置,
7|8|9
-+-+-
4|5|6
-+-+-
1|2|3
其索引顺序与数字键盘上的数字键排列一致,下棋时看着数字键下,较为简便。
计算机的算法--寻找最佳落子位置
首先简单的将棋盘划分为三个部分——中心(1),角(4),边(4)。
中心虽然只有一个但却不是最重要的,三个部分落子的优先顺序依次为:角、中心、边。
因此,井字棋的计算机算法计算最佳落子位置的顺序如下:
1 直接落子获胜
2 阻止玩家获胜
3 在角上落子
4 在中心落子
5 在边上落子
游戏流程
1、开始
2、选子 X或者O
3、随机先手
4、轮流下棋
5、是否分出胜负
5.1 分出胜负 跳到6
5.2 未分出胜负 跳到4
6、再来一局
6.1是, 跳到2
6.2否, 退出
游戏代码:
import random
def printBoard(borad):
print(borad[7] + '|' + borad[8] + '|' + borad[9])
print('-+-+-')
print(borad[4] + '|' + borad[5] + '|' + borad[6])
print('-+-+-')
print(borad[1] + '|' + borad[2] + '|' + borad[3])
'''printBoard 定义了棋盘打印输出函数
与数字键盘排列一致'''
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():
'''再玩一次?'''
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(board, occupy):
判断是否获胜return ((board[1] == occupy and board[2] == occupy and board[3] == occupy) or (board[4] == occupy and board[5] == occupy and board[6] == occupy) or (board[7] == occupy and board[8] == occupy and board[9] == occupy) or (board[1] == occupy and board[4] == occupy and board[7] == occupy) or (board[2] == occupy and board[5] == occupy and board[8] == occupy) or (board[3] == occupy and board[6] == occupy and board[9] == occupy) or (board[1] == occupy and board[5] == occupy and board[9] == occupy) or (board[3] == occupy and board[5] == occupy and board[7] == occupy))
def getBoardCopy(board):
复制一份棋盘给电脑落子使用depuBoard = []for i in board: depuBoard.append(i)return depuBoard
def isSpaceFree(board, move):
判断这个位置是否有子,无子返回Truereturn 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 choosePossibleMoverFromList(board, moveList):
随机返回一个可以落子的坐标,若无子可下,则返回NonepossibleMoves = []for i in moveList: 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''''先判断电脑方能否通过一次落子直接获得游戏胜利'''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 = choosePossibleMoverFromList(board, [1, 3, 5, 7])if move != None: return move'''若中心能落子,则在中心落子'''if isSpaceFree(board, 5): return 5'''若边上能落子,则在边上落子'''return choosePossibleMoverFromList(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 the TicTacToe game!')
while True:
update boardtheBoard = [' '] * 10playerLetter, computerLetter = inputPlayerLetter()turn = whoGoesFirst()print('The ' + turn + ' will go first.')gameIsPlaying = Truewhile gameIsPlaying: if turn == 'Player': # 玩家回合 printBoard(theBoard) move = getPlayerMove(theBoard) makeMove(theBoard, playerLetter, move) if isWinner(theBoard, playerLetter): printBoard(theBoard) print('Wow!!!You win the game!!!') gameIsPlaying = False else: if isBoardFull(theBoard): printBoard(theBoard) print('The game is tie') break else: turn = 'Computer' else: # 电脑回合 move = getComputerMove(theBoard, computerLetter) makeMove(theBoard, computerLetter, move) if isWinner(theBoard, computerLetter): printBoard(theBoard) print('Oh!,The computer win!,You lose.') gameIsPlaying = False else: if isBoardFull(theBoard): printBoard(theBoard) print('The game is tie') break else: turn = 'Player'if not playAgain(): break
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。