简体   繁体   English

我不知道为什么我的井字游戏无法识别获胜者,我检查了整个代码

[英]I don't know why my tic tac toe doesn't recognize the winner, I've checked the whole code

I don't know where the mistake to the winner is, it doesn't recognize, but it still recognizes a tie, please help, I'm still a beginner, thanks.我不知道获胜者的错误在哪里,它不识别,但它仍然识别平局,请帮助,我还是初学者,谢谢。 I've been starring to the screen for 3 hours and still couldn't solve this particular problem, also, I've looked in the forum, but found nothing.我一直盯着屏幕3个小时,仍然无法解决这个特殊问题,而且我在论坛上找过,但什么也没找到。

#------Global variables ------- #--------全局变量------

# Will hold our game board data
board = ["-", "-", "-", 
         "-", "-", "-", 
         "-", "-", "-",]


#If game is still going
game_still_going = True

#Tell us who won
winner = None

#Tell us who goes first, x goes first
current_player = "X"


#---------------FUNCTIONS---------------

#Play a game of tic tac toe
def play_game():

  #Display initial board
  display_board()

  #While the game is still going
  while game_still_going:

    # Handle a turn
    handle_turn(current_player)

    # Check if the game is over
    check_if_game_over()

    # Flip to the other player
    flip_player()

  # Since the game is over, print the winner or tie
  if winner == "X" or winner == "O":
    print(winner + " won.")
  elif winner == None:
    print("Tie.")


# Display the game board to the screen
def display_board():
  print("\n")
  print(board[0] + " | " + board[1] + " | " + board[2] + "     1 | 2 | 3")
  print(board[3] + " | " + board[4] + " | " + board[5] + "     4 | 5 | 6")
  print(board[6] + " | " + board[7] + " | " + board[8] + "     7 | 8 | 9")
  print("\n")



#Handle a single turn of an arbitrary player
def handle_turn(player):

  #get position from player
  print(player + "'s turn. ")
  position = input("Choose a position from 1-9: ")
  print()

  # Whatever the user inputs, make sure it is a valid input, and the spot is open
  valid = False
  while not valid:

    #Make sure the input is correct
    while position not in ["1", "2", "3", "4", "5", "6", "7", "8", "9"]:
      position = input("Choose a position from 1-9: ")

    # Get correct index in our board list
    position = int(position) - 1

    # Then also make sure the spot is available on the board
    if board[position] == "-":
      valid = True
    else:
      print("You can't go there, go again. ")
      print()

 # Put the game piece on the board
  board[position] = player

  # Show the game board
  display_board()



# Check if the game is over
def check_if_game_over():
  check_for_winner
  check_for_tie()



#Check if someone won the game
def check_for_winner():

  # Set global variable
  global winner 
  # Check if there was a winner anywhere
  row_winner = check_rows()
  column_winner = check_columns() 
  diagonal_winner = check_diagonals()

  #Get the winner
  if row_winner:
    winner = row_winner
  elif  column_winner:
    winner = column_winner
  elif diagonal_winner:
    winner = diagonal_winner
  else:
    winner = None



#Looking for winner in rows
def check_rows(): 
  #Set up global variables
  global game_still_going

  #Checking if the rows got the same value and are not empty
  row_1 = board[0] == board[1] == board[2] != "-"
  row_2 = board[3] == board[4] == board[5] != "-"
  row_3 = board[6] == board[7] == board[8] != "-"

 #If any row does have a match, flag that there is a win
  if row_1 or row_2 or row_3:
    game_still_going = False

  #return the winner X or O
  if row_1:
    return board[0]
  elif row_2:
    return board[3]
  elif row_3:
    return board[6]
  else:
    return None



#Looking for winner in columns
def check_columns():

   #Set up global variables
  global game_still_going

  #Checking if the column got the same value and are not empty
  column_1 = board[0] == board[3] == board[6] != "-"
  column_2 = board[1] == board[4] == board[7] != "-"
  column_3 = board[2] == board[5] == board[8] != "-"
 #If any column does have a match, flag that there is a win
  if column_1 or column_2 or column_3:
    game_still_going = False

  #return the winner X or O
  if column_1:
    return board[0]
  elif column_2:
    return board[1]
  elif column_3:
    return board[2]
    # Or return None if there was no winner
  else:
    return None



#Looking for a winner in diagonals
def check_diagonals():
  #Set up global variables
  global game_still_going

  #Checking if the diagonal got the same value and are not empty
  diagonal_1 = board[0] == board[4] == board[8] != "-"
  diagonal_2 = board[2] == board[4] == board[6] != "-"

 #If any diagonal does have a match, flag that there is a win
  if diagonal_1 or diagonal_2:
    game_still_going = False
  #return the winner X or O
  if diagonal_1:
    return board[0]
  elif diagonal_2:
    return board[2]
  else:
    return None


#Looking if there's a tie
def check_for_tie():

  #Global variable
  global game_still_going

  #if the board is full
  if "-" not in board:
    game_still_going = False
  # Else there is no tie
  else:
    return False


#Changing players time a time
def flip_player():
  #Global variable we need
  global current_player
  #If the current player was x, then change it to O
  if current_player == "X":
    current_player = "O"
  elif current_player == "O":
    current_player = "X"



#--------Start the application----------
play_game()

You have missed global [variable] in most of the functions, I have find some missing variables please refer below code line by line:您在大多数函数中都错过了global [variable] ,我发现了一些缺少的变量,请逐行参考下面的代码:

 #------Global variables -------

    # Will hold our game board data
    board = ["-", "-", "-", 
             "-", "-", "-", 
             "-", "-", "-",]


    #If game is still going
    game_still_going = True

    #Tell us who won
    winner = None

    #Tell us who goes first, x goes first
    current_player = "X"


    #---------------FUNCTIONS---------------

    #Play a game of tic tac toe
    def play_game():

      global winner #this is new

      #Display initial board
      display_board()

      #While the game is still going
      while game_still_going:

        # Handle a turn
        handle_turn(current_player)

        # Check if the game is over
        check_if_game_over()

        # Flip to the other player
        flip_player()

      # Since the game is over, print the winner or tie
      if winner == "X" or winner == "O":
        print(winner + " won.")
      elif winner == None:
        print("Tie.")


    # Display the game board to the screen
    def display_board():
      global board
      print("\n")
      print(board[0] + " | " + board[1] + " | " + board[2] + "     1 | 2 | 3")
      print(board[3] + " | " + board[4] + " | " + board[5] + "     4 | 5 | 6")
      print(board[6] + " | " + board[7] + " | " + board[8] + "     7 | 8 | 9")
      print("\n")



    #Handle a single turn of an arbitrary player
    def handle_turn(player):

      #get position from player
      print(player + "'s turn. ")
      position = input("Choose a position from 1-9: ")
      print()

      # Whatever the user inputs, make sure it is a valid input, and the spot is open
      valid = False
      while not valid:

        #Make sure the input is correct
        while position not in ["1", "2", "3", "4", "5", "6", "7", "8", "9"]:
          position = input("Choose a position from 1-9: ")

        # Get correct index in our board list
        position = int(position) - 1

        # Then also make sure the spot is available on the board
        if board[position] == "-":
          valid = True
        else:
          print("You can't go there, go again. ")
          print()

     # Put the game piece on the board
      board[position] = player

      # Show the game board
      display_board()



    # Check if the game is over
    def check_if_game_over():
      check_for_winner
      check_for_tie()



    #Check if someone won the game
    def check_for_winner():

      # Set global variable
      global winner 
      # Check if there was a winner anywhere
      row_winner = check_rows()
      column_winner = check_columns() 
      diagonal_winner = check_diagonals()

      #Get the winner
      if row_winner:
        winner = row_winner
      elif  column_winner:
        winner = column_winner
      elif diagonal_winner:
        winner = diagonal_winner
      else:
        winner = None



    #Looking for winner in rows
    def check_rows(): 
      #Set up global variables
      global game_still_going

      #Checking if the rows got the same value and are not empty
      row_1 = board[0] == board[1] == board[2] != "-"
      row_2 = board[3] == board[4] == board[5] != "-"
      row_3 = board[6] == board[7] == board[8] != "-"

     #If any row does have a match, flag that there is a win
      if row_1 or row_2 or row_3:
        game_still_going = False

      #return the winner X or O
      if row_1:
        return board[0]
      elif row_2:
        return board[3]
      elif row_3:
        return board[6]
      else:
        return None



    #Looking for winner in columns
    def check_columns():

       #Set up global variables
      global game_still_going

      #Checking if the column got the same value and are not empty
      column_1 = board[0] == board[3] == board[6] != "-"
      column_2 = board[1] == board[4] == board[7] != "-"
      column_3 = board[2] == board[5] == board[8] != "-"
     #If any column does have a match, flag that there is a win
      if column_1 or column_2 or column_3:
        game_still_going = False

      #return the winner X or O
      if column_1:
        return board[0]
      elif column_2:
        return board[1]
      elif column_3:
        return board[2]
        # Or return None if there was no winner
      else:
        return None



    #Looking for a winner in diagonals
    def check_diagonals():
      #Set up global variables
      global game_still_going

      #Checking if the diagonal got the same value and are not empty
      diagonal_1 = board[0] == board[4] == board[8] != "-"
      diagonal_2 = board[2] == board[4] == board[6] != "-"

     #If any diagonal does have a match, flag that there is a win
      if diagonal_1 or diagonal_2:
        game_still_going = False
      #return the winner X or O
      if diagonal_1:
        return board[0]
      elif diagonal_2:
        return board[2]
      else:
        return None


    #Looking if there's a tie
    def check_for_tie():

      #Global variable
      global game_still_going

      #if the board is full
      if "-" not in board:
        game_still_going = False
      # Else there is no tie
      else:
        return False


    #Changing players time a time
    def flip_player():
      #Global variable we need
      global current_player
      #If the current player was x, then change it to O
      if current_player == "X":
        current_player = "O"
      elif current_player == "O":
        current_player = "X"



    #--------Start the application----------
    play_game()

You can read this for more information about global : https://www.google.com/url?sa=t&source=web&rct=j&url=https://www.geeksforgeeks.org/global-keyword-in-python/amp/&ved=2ahUKEwi2gbeo_fDoAhVo7XMBHZvjAHIQFjAPegQICxAy&usg=AOvVaw0fpoalAG4dROAIz3PlXcQo&ampcf=1您可以阅读本文以获取有关全球的更多信息: https://www.google.com/url?sa=t&source=web&rct=j&url=https://www.geeksforgeeks.org/global-keyword-in-python/amp/ &ved=2ahUKEwi2gbeo_fDoAhVo7XMBHZvjAHIQFjAPegQICxAy&usg=AOvVaw0fpoalAG4dROAIz3PlXcQo&ampcf=1

In your check_if_game_over function, you are not calling the check_for_winner function correctly.在您的check_if_game_over function 中,您没有正确调用check_for_winner function。 You need to add parenthesis afterward to call it correctly.您需要在之后添加括号才能正确调用它。

def check_if_game_over():
    check_for_winner()
    check_for_tie()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM