繁体   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