【问题标题】:Python How to keep score in a tic tac toe gamePython 如何在井字游戏中保持得分
【发布时间】:2014-10-22 18:22:54
【问题描述】:

我需要帮助弄清楚如何计算输赢和平局的记录。现在,当玩家输了时,代码会返回字符串“loss”。我希望它返回 1,一次损失。任何人都可以帮忙吗?这是我到目前为止的代码。

# Tic Tac Toe

import random

def score():
    wins = 0
    losses = 0
    ties = 0
def result(wins, losses, ties):
    if result =='win':
        wins += 1
    if result == 'loss':
        losses += 1
    else:
        ties += 1

def drawBoard(board):
    # This function prints out the board that it was passed.

    # "board" is a list of 10 strings representing the board (ignore index 0)
    print('   |   |')
    print(' ' + board[7] + ' | ' + board[8] + ' | ' + board[9])
    print('   |   |')
    print('-----------')
    print('   |   |')
    print(' ' + board[4] + ' | ' + board[5] + ' | ' + board[6])
    print('   |   |')
    print('-----------')
    print('   |   |')
    print(' ' + board[1] + ' | ' + board[2] + ' | ' + board[3])
    print('   |   |')

def inputPlayerLetter():
    # Let's the player type which letter they want to be.
    # Returns a list with the player's letter as the first item, and the computer's letter as the second.
    letter = ''
    while not (letter == 'X' or letter == 'O'):
        print('Do you want to be X or O?')
        letter = input().upper()

    # the first element in the tuple is the player's letter, the second is the computer's letter.
    if letter == 'X':
        return ['X', 'O']
    else:
        return ['O', 'X']

def whoGoesFirst():
    # Randomly choose the player who goes first.
    if random.randint(0, 1) == 0:
        return 'computer'
    else:
        return 'player'

def playAgain():
    # This function returns True if the player wants to play again, otherwise it returns False.
    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(bo, le):
    # Given a board and a player's letter, this function returns True if that player has won.
    # We use bo instead of board and le instead of letter so we don't have to type as much.
    return ((bo[7] == le and bo[8] == le and bo[9] == le) or # across the top
    (bo[4] == le and bo[5] == le and bo[6] == le) or # across the middle
    (bo[1] == le and bo[2] == le and bo[3] == le) or # across the bottom
    (bo[7] == le and bo[4] == le and bo[1] == le) or # down the left side
    (bo[8] == le and bo[5] == le and bo[2] == le) or # down the middle
    (bo[9] == le and bo[6] == le and bo[3] == le) or # down the right side
    (bo[7] == le and bo[5] == le and bo[3] == le) or # diagonal
    (bo[9] == le and bo[5] == le and bo[1] == le)) # diagonal



def getBoardCopy(board):
    # Make a duplicate of the board list and return it the duplicate.
    dupeBoard = []

    for i in board:
        dupeBoard.append(i)

    return dupeBoard

def isSpaceFree(board, move):
    # Return true if the passed move is free on the passed board.
    return board[move] == ' '

def getPlayerMove(board):
    # Let the player type in his move.
    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 chooseRandomMoveFromList(board, movesList):
    # Returns a valid move from the passed list on the passed board.
    # Returns None if there is no valid move.
    possibleMoves = []
    for i in movesList:
        if isSpaceFree(board, i):
            possibleMoves.append(i)

    if len(possibleMoves) != 0:
        return random.choice(possibleMoves)
    else:
        return None

def getComputerMove(board, computerLetter):
    # Given a board and the computer's letter, determine where to move and return that move.
    if computerLetter == 'X':
        playerLetter = 'O'
    else:
        playerLetter = 'X'

    # Here is our algorithm for our Tic Tac Toe AI:
    # First, check if we can win in the next move
    for i in range(1, 10):
        copy = getBoardCopy(board)
        if isSpaceFree(copy, i):
            makeMove(copy, computerLetter, i)
            if isWinner(copy, computerLetter):
                return i

    # Check if the player could win on his next move, and block them.
    for i in range(1, 10):
        copy = getBoardCopy(board)
        if isSpaceFree(copy, i):
            makeMove(copy, playerLetter, i)
            if isWinner(copy, playerLetter):
                return i

    # Try to take one of the corners, if they are free.
    move = chooseRandomMoveFromList(board, [1, 3, 7, 9])
    if move != None:
        return move

    # Try to take the center, if it is free.
    if isSpaceFree(board, 5):
        return 5

    # Move on one of the sides.
    return chooseRandomMoveFromList(board, [2, 4, 6, 8])

def isBoardFull(board):
    # Return True if every space on the board has been taken. Otherwise return False.
    for i in range(1, 10):
        if isSpaceFree(board, i):
            return False
    return True



print('Welcome to Tic Tac Toe!')

while True:
    # Reset the board
    theBoard = [' '] * 10
    playerLetter, computerLetter = inputPlayerLetter()
    turn = whoGoesFirst()
    print('The ' + turn + ' will go first.')
    gameIsPlaying = True

    while gameIsPlaying:

        if turn == 'player':
            # Player's turn.
            drawBoard(theBoard)
            move = getPlayerMove(theBoard)
            makeMove(theBoard, playerLetter, move)

            if isWinner(theBoard, playerLetter):
                drawBoard(theBoard)
                result = 'win'
                print('Hooray! You have won the game!')
                isWinner = True
                gameIsPlaying = False
            else:
                if isBoardFull(theBoard):
                    drawBoard(theBoard)
                    result = 'tie'
                    print('The game is a tie!')
                    break
                else:
                    turn = 'computer'

        else:
            # Computer's turn.
            move = getComputerMove(theBoard, computerLetter)
            makeMove(theBoard, computerLetter, move)

            if isWinner(theBoard, computerLetter):
                drawBoard(theBoard)
                print('The computer has beaten you! You lose.')
                result = 'loss'
                isWinner = False
                gameIsPlaying = False
            else:
                if isBoardFull(theBoard):
                    drawBoard(theBoard)
                    result = 'tie'
                    print('The game is a tie!')
                    break
                else:
                    turn = 'player'

    if not playAgain():
        print(result)
    break

【问题讨论】:

  • 我建议您删除与您的问题毫无共同之处的代码。
  • @GingerPlusPlus 我想展示程序的其余部分是如何工作的
  • @brendan 但是程序的其余部分与问题无关。你应该尽量只包含必要的信息来突出问题。
  • @DavidSanders 我想这是有道理的,因为人们可能不想阅读所有代码。这是我第一次发帖,所以我不知道
  • @brendan 感谢您加入社区!删除不需要的信息可能需要一些努力,但这是值得的。有时,正确提出问题的过程甚至可以得出答案:)。

标签: python tic-tac-toe


【解决方案1】:

你可以在开始和重置时设置wins = 0,而不是result = 'win',当玩家获胜时,只需执行wins += 1。对tieslosses 执行相同操作,然后您可以从以winslossesties 作为参数的函数中提取完整记录。

【讨论】:

    【解决方案2】:

    您的函数score()result(wins, loses, ties) 肯定不能正常工作。

    函数中的所有变量都是局部变量,因此这段代码将打印 10 而不是 11:

    def make_bigger(x):
        x += 1
    X = 10
    make_bigger(X)
    print(x)
    

    您可能需要一些类似这样的函数,而不是使用这些函数:

    def pr_score(win, lose, tie):
        print('Score:')
        print('\twin:', win)
        print('\tlose:', lose)
        print('\ttie:', tie)
    

    对于赢/输/平计数,您需要添加:

    win = 0
    lose = 0
    tie = 0
    

    while True:之前。

    您还应该在if isWinner(theBoard, playerLetter): 语句中添加win += 1,在if isBoardFull(theBoard): 语句中添加tie += 1

    关于计算机轮次的代码也应该是这样的:

            if isBoardFull(theBoard):
                drawBoard(theBoard)
                result = 'tie'
                print('The game is a tie!')
            else:
                # Computer's turn.
                move = getComputerMove(theBoard, computerLetter)
                makeMove(theBoard, computerLetter, move)
                turn = 'player'
            if isWinner(theBoard, computerLetter):
                drawBoard(theBoard)
                print('The computer has beaten you! You lose.')
                result = 'loss'
                lose += 1
                isWinner = False
                gameIsPlaying = False
            if isBoardFull(theBoard):
                drawBoard(theBoard)
                result = 'tie'
                print('The game is a tie!')
                break
    

    对于打印结果,您应该在if not playAgain(): 中添加pr_score(win, lose, tie)

    如果你想要最后一轮的能力,break 应该缩进更多。

    另外,如果您在getPlayerMove(board) 中的move = input() 之后添加这些行:

        if move not in '1 2 3 4 5 6 7 8 9'.split(): #input is incorrect
            print('Input is incorrect.\nPlease write nuber!')
        elif not isSpaceFree(board, int(move)): #that place isn't free
            print('That place is already taken.\nPlease take free place!')
    

    以及while True之前的这些行:

    exampleBoard = [' ']
    for x in range(1, 10):
        exampleBoard.append(str(x))
    drawBoard(exampleBoard)
    

    对用户有帮助。

    【讨论】:

      猜你喜欢
      • 2016-04-29
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 2013-12-21
      • 2015-06-14
      相关资源
      最近更新 更多