记忆配对游戏输入逻辑异常排查:有效输入被判定为无效
Hey Zachary, let's figure out why all your valid inputs are getting flagged as invalid—this is a super common snag with coordinate-based games, so let's break down the most likely culprits and how to fix them.
Top 3 Causes to Check First
1. You’re Mixing Up 1-Based vs 0-Based Indexing
Most users will enter coordinates starting at 1 (like "1 1" for the top-left corner), but Python lists use 0-based indexing. If you’re not converting the user’s input to match your board’s index system, every valid input will look like it’s out of bounds.
For example:
- If your board is a 4x4 list, valid indices are 0-3 for rows and columns.
- If a user enters "1 1" and you use that directly as
row = 1,col = 1, your validation logic might incorrectly flag it as out of bounds if you’re checking against 0-based ranges without conversion.
Fix: Convert the user’s input to 0-based before validation:
# After splitting user input into parts row = int(parts[0]) - 1 col = int(parts[1]) - 1
Then validate against 0 <= row < size and 0 <= col < size.
2. Your Input Validation Logic Is Reversed
It’s easy to mix up the conditions for "valid" vs "invalid" input. For example, if your code accidentally checks for invalid conditions first and treats them as valid, you’ll end up flagging all good inputs as bad.
Fix: Structure your validation to first catch invalid cases, then proceed if all checks pass:
# ✅ Correct flow user_input = input("Enter row and column: ").split() if len(user_input) != 2: print("Invalid: Enter two numbers separated by space") continue try: row = int(user_input[0]) - 1 col = int(user_input[1]) - 1 except ValueError: print("Invalid: Enter integers only") continue if not (0 <= row < size and 0 <= col < size): print(f"Invalid: Coordinates must be between 1 and {size}") continue if board[row][col]['selected'] or board[row][col]['matched']: print("Invalid: This card is already used") continue # If we get here, input is valid!
3. You’re Not Resetting Selected Card State Properly
If you don’t un-select cards after a failed match, the next time a user tries to pick any card, your code might think it’s still selected—except for repeat coordinates, which your code correctly flags (since it checks for selected cards).
Fix: After a failed match, set both cards’ selected status back to False:
if first_card_value != second_card_value: print("No match!") board[first_row][first_col]['selected'] = False board[second_row][second_col]['selected'] = False
Debugging Tip to Pinpoint the Exact Issue
Add print statements right before your validation check to see what’s happening under the hood:
# Right before checking if input is valid print(f"User input converted to row: {row}, col: {col}") print(f"Board size: {size}") print(f"Card status: selected={board[row][col]['selected']}, matched={board[row][col]['matched']}")
This will show you exactly which condition is failing (e.g., row is 4 when size is 4, meaning it’s out of bounds, or the card is marked as selected even though it shouldn’t be).
Example Working Input Handling Snippet
Here’s a condensed version of how your input handling should look to avoid these issues:
import random def create_board(size): pairs = [chr(ord('A') + i) for i in range(size*size//2)] * 2 random.shuffle(pairs) return [[{'val': pairs[i*size+j], 'matched': False, 'selected': False} for j in range(size)] for i in range(size)] def get_valid_coord(size, board): while True: inp = input("Enter row col (1-based): ").strip().split() if len(inp) != 2: print("Need two numbers!") continue try: r, c = int(inp[0])-1, int(inp[1])-1 except ValueError: print("Enter integers only!") continue if not (0 <= r < size and 0 <= c < size): print(f"Coords must be 1-{size}!") continue if board[r][c]['selected'] or board[r][c]['matched']: print("Card already in use!") continue return (r, c) # Game setup size = int(input("Enter even board size: ")) while size % 2 != 0: size = int(input("Must be even! Try again: ")) board = create_board(size) # Game loop first = None while not all(c['matched'] for row in board for c in row): if not first: print("\nPick first card:") first = get_valid_coord(size, board) board[first[0]][first[1]]['selected'] = True else: print("\nPick second card:") second = get_valid_coord(size, board) board[second[0]][second[1]]['selected'] = True if board[first[0]][first[1]]['val'] == board[second[0]][second[1]]['val']: print("Match!") board[first[0]][first[1]]['matched'] = True board[second[0]][second[1]]['matched'] = True else: print("No match!") board[first[0]][first[1]]['selected'] = False board[second[0]][second[1]]['selected'] = False first = None print("You won!")
内容的提问来源于stack exchange,提问作者Zachary Mueller

