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

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}"

代码修正说明

  1. 修复原代码中strating_x的拼写错误
  2. 修正direction.upper未加括号的方法调用错误
  3. 调整战舰位置范围计算,避免因长度导致的格子多占问题
  4. 规范ship_placement的访问方式,确保正确使用类实例属性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 23:30:29