簡體   English   中英

Python 中的井字游戲:縮進或代碼有問題?

[英]Tic Tac Toe in Python: Problem with indentation or code?

我是 Python 和一般編碼的完全初學者。 作為我正在學習的在線課程的一部分,我正在 Python 制作井字游戲。

我一直在努力了解函數如何工作和如何使用的細節。 我不得不非常仔細地遵循課程筆記,以嘗試理解一旦代碼開始組合在一起會發生什么。 在這里找不到類似的問題,所以這不是課程筆記的問題!

當我運行該程序時,它會跳過我的 position_choice() function,顯示空白板,然后要求重播。 我覺得我遺漏了一些基本問題,如縮進,但如果有人能夠發現 function 本身或代碼設置的問題,我將不勝感激? 它遵循課程筆記的結構幾乎完全相同,我不知所措!

以下是功能:

from IPython.display import clear_output
import random

def display_board(board):
    clear_output()

    print(' ' + board[7] + ' ' + '|' + ' ' + board[8] + ' ' + '|' + ' ' + board[9] + ' ')
    print('- - - - - -')
    print(' ' + board[4] + ' ' + '|' + ' ' + board[5] + ' ' + '|' + ' ' + board[6] + ' ')
    print('- - - - - -')
    print(' ' + board[1] + ' ' + '|' + ' ' + board[2] + ' ' + '|' + ' ' + board[3] + ' ')


def player_choice():

    player1 = input('Choose your marker: '.upper())

    while True:
        if player1.upper() == 'X':
            player2 = 'O'
            print('\nPlayer 1 is ' + player1.upper() + '\nPlayer 2 is ' + player2 + '.')
            return player1.upper(), player2
        elif player1.upper() == 'O':
            player2 = 'X'
            print('\nPlayer 1 is ' + player1.upper() + '\nPlayer 2 is ' + player2 + '.')
            return player1.upper(), player2
        else:
            print('Sorry, that is not a valid marker. Please choose either O or X.')
            player1 = input('Choose your marker: '.upper())


def place_marker(board, marker, position):

    board[position] = marker


def win_check(position, mark):

    return ((position[7] == position[8] == position[9] == mark)
    or (position[4] == position[5] == position[6] == mark)
    or (position[1] == position[2] == position[3] == mark)
    or (position[1] == position[5] == position[9] == mark)
    or (position[7] == position[5] == position[3] == mark)
    or (position[7] == position[4] == position[1] == mark)
    or (position[8] == position[5] == position[2] == mark)
    or (position[9] == position[6] == position[3] == mark))


def choose_first():
    rand_int = random.randint(1,2)

    if rand_int == 1:
        print('Player 1 goes first')
        return '1'
    if rand_int == 2:
        print('Player 2 goes first')
        return '2'


def space_check(board, position):

    return board[position] == ' '


def full_board_check(board):

    for position in range(1,10):
        if space_check(board, position):
            return False

    return True


def position_choice(board):

    position = 0

    while position not in [1,2,3,4,5,6,7,8,9] and not space_check(board, position):
        position = int(input('Please choose your position: '))
    
    return position


def replay():

    return input('Do you want to play again?').lower().startswith('y')


def play_game():

    play_game = input('Do you want to play?')

    if play_game.lower()[0] == 'y':
        return True
    else:
        return False

這是程序代碼。 為什么它只顯示空板,跳過詢問 position,並要求重播? 任何幫助都會讓我停滯不前的動力!!

print('Welcome to Tic Tac Toe!')

while play_game():

    theboard = [' '] * 10
    player1_marker, player2_marker = player_choice()
    turn = choose_first()

    if turn == 1:
        display_board(theboard)
        position = position_choice(theboard)
        place_marker(theboard, player1_marker, position)
        
        if win_check(theboard, player1_marker):
            display_board(theboard)
            print('Player 1 is the winner!')
            replay()
        else:
            if full_board_check(theboard):
                display_board(theboard)
                print('The game is a tie!')
                replay()
            else:
                turn == 2
    
    else:
        display_board(theboard)
        position = position_choice(theboard)
        place_marker(theboard, player2_marker, position)
        
        if win_check(theboard, player2_marker):
            display_board(theboard)
            print('Player 2 is the winner!')
            replay()
        else:
            if full_board_check(theboard):
                display_board(theboard)                    
                print('The game is a tie!')
                replay()
            else:
                turn == 1
            
    if not replay():
        break

有幾個問題:

  • choose_first返回一個字符串而不是 integer。
  • while中調用的方法,總是詢問是否要玩。
  • 您在每個循環中重新創建一個新板,如果您不想丟失它,則必須在循環之前聲明它。
  • 在每個循環結束時,您每次都會詢問是否要重播
  • 要更改turn變量,您應該執行turn = 2而不是使用雙等號比較相等。
  • 當你想“重播”時,不要忘記重置棋盤。

要對此進行調試,您應該對代碼的一部分進行注釋。 並逐步運行它。 通過這樣做,您會發現錯誤。

這是代碼,游戲可以運行,但您可能仍想做一些改進。

theboard = [' '] * 10
if play_game():
    player1_marker, player2_marker = player_choice()
    turn = choose_first()
    while not full_board_check(theboard):
        display_board(theboard)
        position = position_choice(theboard)
        if turn == 1:
            place_marker(theboard, player1_marker, position)

            if win_check(theboard, player1_marker):
                display_board(theboard)
                print('Player 1 is the winner!')
                if replay():
                    theboard = [' '] * 10
                else:
                    break
            turn = 2

        else:
            place_marker(theboard, player2_marker, position)
            if win_check(theboard, player2_marker):
                display_board(theboard)
                print('Player 2 is the winner!')
                if replay():
                    theboard = [' '] * 10
                else:
                    break
            turn = 1

        if full_board_check(theboard):
            display_board(theboard)
            print('The game is a tie!')
            if replay():
                theboard = [' '] * 10
            else:
                break

為什么它只顯示空板,跳過詢問 position,並要求重播?

position not in [1,2,3,4,5,6,7,8,9] and not space_check(board, position) - 這個條件不工作,邏輯是錯誤的。

>>> theboard = [' '] * 10
>>> theboard
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
>>> position = 0
>>> position not in [1,2,3,4,5,6,7,8,9] and not space_check(theboard, position)
False
>>>

這是重構position_choice的一種方法

def position_choice(board):
    #print(board)
    #position = 0
    valid = False
    # keep asking till thay give a valid answer
    while not valid:
        position = int(input('Please choose your position (1-9): '))
        valid = position in [1,2,3,4,5,6,7,8,9]
        valid = valid and space_check(board, position)
    return position

##    OLD STUFF    
##    while position not in [1,2,3,4,5,6,7,8,9] and not space_check(board, position):
##        position = int(input('Please choose your position: '))
##    
##    return position

要求用戶輸入,直到他們給出有效響應
如何調試小程序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM