Python入门级战舰游戏开发:字母坐标转整数实现方案问询
战舰游戏字母坐标与数字的转换实现方案
核心思路
将用户输入的A-J字母坐标转换为1-10的整数用于后台计算,展示结果时再将整数转回对应字母。对应关系为:A→1、B→2……J→10。
具体转换方法
字母转数字
利用Python内置ord()函数,基于ASCII码特性实现转换,同时加入输入合法性校验:
def letter_to_num(letter): letter = letter.strip().upper() if not letter.isalpha() or len(letter) != 1 or letter > 'J': raise ValueError("请输入A-J之间的有效字母") return ord(letter) - ord('A') + 1
数字转字母
用chr()函数反向转换,同样加入范围校验:
def num_to_letter(num): if not isinstance(num, int) or num < 1 or num > 10: raise ValueError("坐标数字必须在1-10范围内") return chr(num + ord('A') - 1)
整合到现有代码(含原代码错误修正)
class Player: def __init__(self, name): self.name = name self.is_turn = False self.is_winner = False self.num_ships = 10 def __repr__(self): return f"Hello {self.name}, welcome to Battle Ship! You currently have {self.num_ships} ships. Place them on the board and get ready!" # 坐标转换辅助函数 def letter_to_num(letter): letter = letter.strip().upper() if not letter.isalpha() or len(letter) != 1 or letter > 'J': raise ValueError("请输入A-J之间的有效字母") return ord(letter) - ord('A') + 1 def num_to_letter(num): if not isinstance(num, int) or num < 1 or num > 10: raise ValueError("坐标数字必须在1-10范围内") return chr(num + ord('A') - 1) class Ship: def __init__(self, ship_type, length, direction, starting_x, starting_y): # 自动处理用户输入的字母坐标转数字 self.starting_x = letter_to_num(starting_x) if isinstance(starting_x, str) else starting_x self.starting_y = starting_y self.type = ship_type self.length = length self.lives = length # 修正原代码大小写错误:Lives→lives self.direction = direction.upper() # 提前统一方向输入为大写 self.ending_x = 0 self.ending_y = 0 # 初始化战舰位置存储字典 self.ship_placement = {self.type: []} # 放置战舰逻辑 def place_ship(self): try: if self.direction == "V": self.ending_x = self.starting_x self.ending_y = self.starting_y + self.length - 1 # 修正范围计算,避免多占格子 # 生成字母+数字格式的坐标存入字典 for y in range(self.starting_y, self.ending_y + 1): self.ship_placement[self.type].append(f"{num_to_letter(self.starting_x)}{y}") elif self.direction == "H": self.ending_x = self.starting_x + self.length - 1 self.ending_y = self.starting_y for x in range(self.starting_x, self.ending_x + 1): self.ship_placement[self.type].append(f"{num_to_letter(x)}{self.starting_y}") else: return "Error: 方向输入无效,请输入V(垂直)或H(水平)" return f"战舰{self.type}放置完成,位置:{self.ship_placement[self.type]}" except ValueError as e: return f"放置失败:{str(e)}" def __repr__(self): # 将数字坐标转回字母,展示给用户 start_letter = num_to_letter(self.starting_x) end_letter = num_to_letter(self.ending_x) return f"Your {self.type} is placed between {start_letter}{self.starting_y} and {end_letter}{self.ending_y}"
代码修正说明
- 修复原代码中
strating_x的拼写错误 - 修正
direction.upper未加括号的方法调用错误 - 调整战舰位置范围计算,避免因长度导致的格子多占问题
- 规范
ship_placement的访问方式,确保正确使用类实例属性
内容的提问来源于stack exchange,提问作者user17470872
相关产品推荐
相关产品推荐

