python井字棋最大最小算法_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):

判断这个位置是否有子,无子返回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 choosePossibleMoverFromList(board, moveList):

随机返回一个可以落子的坐标,若无子可下,则返回None

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):

确定电脑的落子位置

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

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

你可能感兴趣的:(python井字棋最大最小算法)