python井字棋算法及代码
admin
2023-07-18 12:02:08
0次

井字棋盘看起来像一个大的井字符号(#),有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

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...