井字棋盘看起来像一个大的井字符号(#),有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()
代码语言:javascript复制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):
判断是否获胜
代码语言:javascript复制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):
复制一份棋盘给电脑落子使用
代码语言:javascript复制depuBoard = []
for i in board:
depuBoard.append(i)
return depuBoard
def isSpaceFree(board, move):
判断这个位置是否有子,无子返回True
代码语言:javascript复制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 choosePossibleMoverFromList(board, moveList):
随机返回一个可以落子的坐标,若无子可下,则返回None
代码语言:javascript复制possibleMoves = []
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):
确定电脑的落子位置
代码语言:javascript复制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 board
代码语言:javascript复制theBoard = [' '] * 10
playerLetter, computerLetter = inputPlayerLetter()
turn = whoGoesFirst()
print('The ' turn ' will go first.')
gameIsPlaying = True
while 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