溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python井字棋算法及代碼

發(fā)布時(shí)間:2020-07-16 13:01:26 來源:網(wǎng)絡(luò) 閱讀:2241 作者:lisiyun22 欄目:編程語言

井字棋盤看起來像一個(gè)大的井字符號(hào)(#),有9 個(gè)空格,可以包含X、O 或
關(guān)于落子問題
由于只能采用鍵盤輸入,所以需要對(duì)棋盤進(jìn)行坐標(biāo)表示;
即直接用1-9個(gè)9個(gè)數(shù)字來表示位置,
7|8|9
-+-+-
4|5|6
-+-+-
1|2|3
其索引順序與數(shù)字鍵盤上的數(shù)字鍵排列一致,下棋時(shí)看著數(shù)字鍵下,較為簡(jiǎn)便。
計(jì)算機(jī)的算法--尋找最佳落子位置
首先簡(jiǎn)單的將棋盤劃分為三個(gè)部分——中心(1),角(4),邊(4)。
中心雖然只有一個(gè)但卻不是最重要的,三個(gè)部分落子的優(yōu)先順序依次為:角、中心、邊。
因此,井字棋的計(jì)算機(jī)算法計(jì)算最佳落子位置的順序如下:
1 直接落子獲勝
2 阻止玩家獲勝
3 在角上落子
4 在中心落子
5 在邊上落子

游戲流程
1、開始
2、選子 X或者O
3、隨機(jī)先手
4、輪流下棋
5、是否分出勝負(fù)
5.1 分出勝負(fù) 跳到6
5.2 未分出勝負(fù) 跳到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 定義了棋盤打印輸出函數(shù)
與數(shù)字鍵盤排列一致'''

def inputPlayerLetter():
'''#讓玩家選擇棋子
返回一個(gè)列表,顯示玩家和電腦的棋子類型
'''
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():
'''隨機(jī)先手'''
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):

復(fù)制一份棋盤給電腦落子使用

depuBoard = []

for i in board:
    depuBoard.append(i)

return depuBoard

def isSpaceFree(board, move):

判斷這個(gè)位置是否有子,無子返回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):

隨機(jī)返回一個(gè)可以落子的坐標(biāo),若無子可下,則返回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

'''判斷玩家下一次落子是否獲勝,若能,則再該點(diǎn)落子'''
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
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI