|
您好!关于您的Python小游戏问题,我将为您提供一个简洁的代码示例,实现机器人在6x6地图上移动和切换草地状态的功能。代码使用了面向对象编程,易于理解和扩展。地图是循环的(从边界移动会回到对面),并且每个单元格状态可以在“grassland”和“soil”之间切换。
以下是完整的代码实现。代码包括:
- 一个 Map 类来管理地图状态。
- 一个 Robot 类来处理机器人移动和耕种操作。
- 简单的文本显示功能来呈现地图状态。
代码设计为灵活可扩展,要改为8x8地图,只需在初始化时修改参数即可。
- # 定义草地状态常量
- GRASSLAND = 'grassland'
- SOIL = 'soil'
- class Map:
- def __init__(self, width=6, height=6):
- self.width = width
- self.height = height
- # 初始化地图,所有单元格为未开垦状态(grassland)
- self.grid = [[GRASSLAND for _ in range(width)] for _ in range(height)]
-
- def get_cell_state(self, x, y):
- # 获取指定坐标的单元格状态(x为列索引,y为行索引)
- return self.grid[y][x]
-
- def set_cell_state(self, x, y, state):
- # 设置指定坐标的单元格状态
- self.grid[y][x] = state
-
- def toggle_cell_state(self, x, y):
- # 切换指定坐标的单元格状态:grassland <-> soil
- current_state = self.get_cell_state(x, y)
- if current_state == GRASSLAND:
- self.set_cell_state(x, y, SOIL)
- else:
- self.set_cell_state(x, y, GRASSLAND)
-
- def display(self):
- # 打印当前地图状态,显示每个单元格的状态
- for row in self.grid:
- print(' '.join(row))
- print() # 空行用于输出分隔
- class Robot:
- def __init__(self, map, start_x=0, start_y=0):
- self.map = map # 机器人关联的地图对象
- self.x = start_x # 当前列索引(东西方向)
- self.y = start_y # 当前行索引(南北方向)
-
- def move(self, direction):
- # 根据方向移动机器人,处理边界循环
- # 方向参数为字符串,如 'east', 'north', 等
- if direction == 'east':
- dx, dy = 1, 0 # 向东移动:列索引增加
- elif direction == 'west':
- dx, dy = -1, 0 # 向西移动:列索引减少
- elif direction == 'north':
- dx, dy = 0, -1 # 向北移动:行索引减少(假设地图左上角为(0,0))
- elif direction == 'south':
- dx, dy = 0, 1 # 向南移动:行索引增加
- else:
- print("错误:无效方向!请使用 'east', 'west', 'north', 或 'south'。")
- return
-
- # 计算新位置
- new_x = self.x + dx
- new_y = self.y + dy
-
- # 处理边界循环:如果超出边界,则从对面重新进入
- if new_x >= self.map.width:
- new_x = 0
- elif new_x < 0:
- new_x = self.map.width - 1
-
- if new_y >= self.map.height:
- new_y = 0
- elif new_y < 0:
- new_y = self.map.height - 1
-
- # 更新机器人位置
- self.x = new_x
- self.y = new_y
- print(f"机器人移动方向: {direction}, 新位置: ({self.x}, {self.y})")
-
- def till(self):
- # 在当前单元格执行耕种操作,切换状态
- self.map.toggle_cell_state(self.x, self.y)
- current_state = self.map.get_cell_state(self.x, self.y)
- print(f"在位置 ({self.x}, {self.y}) 耕种,当前状态: {current_state}")
- # 示例使用:初始化6x6地图和机器人
- if __name__ == "__main__":
- # 创建6x6地图
- game_map = Map(6, 6)
- robot = Robot(game_map) # 机器人默认从(0,0)开始
-
- # 显示初始地图
- print("初始地图状态:")
- game_map.display()
-
- # 示例操作:移动和耕种
- robot.move('east') # 向东移动
- robot.till() # 耕种当前单元格
- robot.move('north') # 向北移动
- robot.till() # 耕种当前单元格
-
- # 显示更新后的地图
- print("操作后地图状态:")
- game_map.display()
复制代码
如何扩展到8x8地图:
只需在初始化 Map 对象时指定宽度和高度为8。例如,将上面示例中的 game_map = Map(6, 6) 改为 game_map = Map(8, 8)。机器人的移动和耕种逻辑会自动适应新大小。
代码说明:
- 地图使用二维列表存储状态,初始全部为 grassland。
- 机器人移动时,坐标会根据方向更新,并处理边界循环(例如从最东侧移动会回到最西侧)。
- till() 方法会切换当前单元格状态。
- display() 方法用于打印地图,方便查看状态变化。
您可以根据需要修改起始位置或添加更多功能(如多个机器人或复杂地图)。如果您有具体问题(如处理其他方向或错误输入),欢迎进一步询问!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|