You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.6井字棋游戏结束时胜负/平局消息重复打印问题求助

Hey there! Let's dive into fixing that duplicate end-game message issue in your Noughts and Crosses game first, then go over some handy optimizations.

Why You're Seeing Duplicate Win/Draw Messages

The most common culprit here is that your game-over check logic is running twice somewhere in your code. A few likely scenarios:

  • You might be checking for a win/draw both inside the player's turn function AND in the main game loop
  • The function that checks for a win could be getting called twice in a row (e.g., once after Player 1 moves, then accidentally again before Player 2's turn)
  • Your print statements for win/draw might be inside a function that's invoked multiple times without proper checks to exit the game immediately

Since you only shared a snippet of your code, let's walk through a structured fix that eliminates this problem, plus cleans up your game logic.

Fixed & Optimized Code Example

Here's a polished version of your game that stops duplicate messages and adds better structure:

# Initialize game grid
grid = [str(i) for i in range(9)]

def print_grid():
    """Print the current state of the tic-tac-toe board"""
    print(f"\n{grid[0]} | {grid[1]} | {grid[2]}")
    print("--+---+--")
    print(f"{grid[3]} | {grid[4]} | {grid[5]}")
    print("--+---+--")
    print(f"{grid[6]} | {grid[7]} | {grid[8]}\n")

def check_win(symbol):
    """Check if the current player has won"""
    # All possible winning combinations
    win_patterns = [
        [0,1,2], [3,4,5], [6,7,8],  # Horizontal rows
        [0,3,6], [1,4,7], [2,5,8],  # Vertical columns
        [0,4,8], [2,4,6]             # Diagonals
    ]
    for pattern in win_patterns:
        if grid[pattern[0]] == grid[pattern[1]] == grid[pattern[2]] == symbol:
            return True
    return False

def check_draw():
    """Check if the game is a draw (no empty spots left)"""
    return all(cell in ['X', 'O'] for cell in grid)

def main():
    print("Welcome to Noughts and Crosses!")
    p1_name = input("Enter Player 1's name: ")
    p2_name = input("Enter Player 2's name: ")
    
    current_player = p1_name
    current_symbol = 'X'

    while True:
        print_grid()
        print(f"{current_player}'s turn (playing as {current_symbol})")
        
        # Get valid move from player
        try:
            move = int(input("Pick a spot (0-8): "))
            if grid[move] not in ['X', 'O']:
                grid[move] = current_symbol
            else:
                print("Oops, that spot's already taken! Try again.")
                continue
        except (ValueError, IndexError):
            print("Invalid input! Please enter a number between 0 and 8.")
            continue
        
        # Check game state ONCE after each valid move
        if check_win(current_symbol):
            print_grid()
            print(f"🎉 Congratulations {current_player}! You won the game!")
            break
        if check_draw():
            print_grid()
            print("🤝 It's a draw! No winners this time.")
            break
        
        # Switch to the other player
        current_player = p2_name if current_player == p1_name else p1_name
        current_symbol = 'O' if current_symbol == 'X' else 'X'

if __name__ == "__main__":
    main()

Key Fix for Duplicate Messages

In this code, we only check for a win or draw once after every valid move. As soon as we detect a win/draw, we print the message once and break out of the game loop immediately—no chance for duplicate checks!

Extra Optimization Tips
  • Modularize with a Class: For cleaner, more scalable code, wrap the game logic in a TicTacToe class. This makes it easier to add features like multiple rounds or AI opponents later.
  • Add a Restart Option: Let players choose to play another game without restarting the program.
  • Visual Improvements: Use the colorama library to highlight winning lines or player symbols in different colors for better readability.
  • Better Input Hints: Show players which spots are still available before they make a move, to reduce invalid inputs.

内容的提问来源于stack exchange,提问作者jr100

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:15:13