围棋棋盘to_integer()函数问题:无法生成正确三元编码整数
修正围棋棋盘to_integer函数实现问题
需求明确:to_integer()函数需要把围棋棋盘的字符映射为数字(空.→0、白O→1、黑@→2),将所有行的映射结果拼接成一串数字后转为整数。示例输入["O.O", ".@.", "@O."]应输出101020210。
原代码的to_integer()函数存在多处错误,同时类内部分方法的缩进也不符合Python规范,以下是问题点和修正方案:
原代码错误点
- 调用了不存在的
self.to_strings()方法,实际应该使用初始化时存储输入行的self.from_strings属性 - 给字符额外添加单引号(
character = "'" + character + "'"),导致无法匹配to_int字典的键 - 错误使用
self.to_integer.values(character)获取映射值,正确方式是通过self.to_int字典的键直接取值 - 类内部分方法(
__init__、__str__、to_integer)存在缩进错误,违反Python类结构规范
修正后的完整代码
from string import ascii_uppercase as letters class Board: # 颜色与对应符号的字典 points = {'E': '.', 'B': '@', 'W': 'O'} to_int = {'.': '0', 'O': '1', '@': '2'} # 构造函数 def __init__(self, size=19, from_strings=None): assert 2 <= size <= 26, "Illegal board size: must be between 2 and 26." assert type(from_strings) is list, "input is not a list" assert len(from_strings) == size, "length of input list does not match size" for idx, row in enumerate(from_strings): assert type(row) == str, f"row {idx+1} is not a string" assert len(row) == size, f"length of row {idx+1} does not match size" self.size = size self.grid = [['E'] * size for _ in range(size)] self.from_strings = [] if from_strings is None else from_strings def __str__(self): # 生成棋盘字符串 padding = ' ' heading = ' ' + ' '.join(letters[:self.size]) lines = [heading] for r, row in enumerate(self.grid): if len(self.grid) < 10: if self.from_strings: line = " " + f'{self.size - r} ' + ' '.join(self.from_strings[r]) else: line = " " + f'{self.size - r} ' + ' '.join(self.points[x] for x in row) lines.append(line) else: if r > 9: if self.from_strings: line = f'{self.size - r} ' + ' '.join(self.from_strings[r]) else: line = f'{self.size - r} ' + ' '.join(self.points[x] for x in row) line = padding + line lines.append(line) else: if self.from_strings: line = f'{self.size - r} ' + ' '.join(self.from_strings[r]) else: line = f'{self.size - r} ' + ' '.join(self.points[x] for x in row) lines.append(line) return '\n'.join(lines) # 修正后的to_integer函数 def to_integer(self): digit_colour = "" # 遍历存储的输入行 for line in self.from_strings: for character in line: # 直接通过to_int字典映射字符为数字字符串 digit_colour += self.to_int[character] # 转为整数返回 return int(digit_colour) b = Board( 3, ["O.O", ".@.", "@O."] ) print(b.to_integer()) # 输出:101020210
关键修改说明
- 替换
self.to_strings()为self.from_strings,直接使用初始化时保存的输入行数据 - 移除给字符添加单引号的错误代码,确保字典键匹配正确
- 将
self.to_integer.values(character)改为self.to_int[character],正确通过字典键获取对应数字字符串 - 修复了类内所有方法的缩进问题,保证代码符合Python语法规范
- 优化了原
__init__中的断言提示信息,使用f-string让错误提示更清晰
内容的提问来源于stack exchange,提问作者Anne_Music
相关产品推荐
相关产品推荐

