python井字棋算法及代码

发布时间:2019-09-18 07:26:13编辑:auto阅读(2238)

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

关键字