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

Python实现3x3 FOX字符游戏 按规则批量修改字典值方案

3x3 FOX网格翻转游戏优化实现

原有代码冗余主要来自两个问题:一是多余创建了9个类实例,实际上棋盘直接存字符值即可;二是逐位置写if判断处理相邻格,完全可以通过预定义位置映射+通用翻转逻辑消除重复代码。

核心优化思路

  • 预定义位置-翻转范围映射表:提前把0-8每个位置点击后需要修改的格子编号存成字典,自动过滤棋盘外的无效位置,不需要运行时反复写边界判断
  • 用映射表实现字符循环切换:替代多分支if判断,一行代码完成F→O→X→F的转换
  • 去掉无意义的类封装:棋盘直接用字典存字符值,减少不必要的代码复杂度

修正后可运行代码

import random

# 预定义每个位置点击后需要翻转的格子编号(自身+上下左右合法相邻格)
FLIP_TARGETS = {
    0: [0, 1, 3],
    1: [0, 1, 2, 4],
    2: [1, 2, 5],
    3: [0, 3, 4, 6],
    4: [1, 3, 4, 5, 7],
    5: [2, 4, 5, 8],
    6: [3, 6, 7],
    7: [4, 6, 7, 8],
    8: [5, 7, 8]
}
# 字符翻转映射
CHAR_FLIP = {'f': 'o', 'o': 'x', 'x': 'f'}

def init_board():
    """初始化随机棋盘"""
    return {str(i): random.choice(['f', 'o', 'x']) for i in range(9)}

def print_board(board):
    """打印棋盘,和给出的示例样式一致"""
    print('-----------')
    for row_start in [0, 3, 6]:
        print(f'|{board[str(row_start)]} |{board[str(row_start+1)]} |{board[str(row_start+2)]} |')
        if row_start != 6:
            print('|--|--|--|')
    print('------------')

def check_win(board):
    """检查是否满足胜利条件:任意行/列出现f-o-x顺序组合"""
    # 所有胜利判定线:3行+3列
    win_lines = [
        [0,1,2], [3,4,5], [6,7,8],
        [0,3,6], [1,4,7], [2,5,8]
    ]
    for line in win_lines:
        line_vals = [board[str(i)] for i in line]
        if line_vals == ['f','o','x']:
            return True
    return False

def maingame():
    board = init_board()
    print_board(board)
    print('游戏规则:输入0-8的格子编号,该格子和其上下左右相邻格会按f→o→x→f循环切换')
    print('凑出任意一行/列为f-o-x顺序即可获胜')

    while True:
        try:
            player_choice = int(input("请输入0-8的格子编号: "))
        except ValueError:
            print("输入无效,请输入数字")
            continue
        if player_choice not in range(9):
            print("编号超出范围,请重新输入")
            continue
        
        # 批量翻转对应格子,不需要写任何if判断分支
        for pos in FLIP_TARGETS[player_choice]:
            board[str(pos)] = CHAR_FLIP[board[str(pos)]]
        
        print_board(board)
        if check_win(board):
            print("恭喜你凑出FOX,获胜!")
            break

if __name__ == '__main__':
    maingame()

补充说明

  • 后续如果要改棋盘大小(比如改成4x4、5x5),不需要重写翻转逻辑,只要重新计算FLIP_TARGETS映射表即可,扩展性很强
  • 所有重复逻辑都抽成了通用函数,总代码量比逐位置写if判断少60%以上,也不会出现漏改、错改相邻格的问题
  • 补充了输入合法性校验、胜利判断逻辑,直接运行就能玩

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:24:29