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
相关产品推荐
相关产品推荐

