鱼C论坛

 找回密码
 立即注册
查看: 59|回复: 3

关于python的一个小游戏

[复制链接]
发表于 昨天 21:14 | 显示全部楼层 |阅读模式
15鱼币
javascript:;
首先这是一款python编程的游戏。
游戏中有一只机器人能够在地图中移动。move(east)/move(north)等就是向东/北移动一格
目前场地为6X6,后续会出现8X8。当机器人从最东侧移动6步后(抵达边界后),会回到起点。
地图中的草地有两种状态1.已开垦(soil) 2.未开垦(grassland),通过till()指令能够使土地切换状态
请问我想呈现出这种状态,该如何编辑代码呢?javascript:;
要是想在8x8也呈现出这种状态,该如何编辑呢?javascript:;

图例

图例

目的

目的
8x8.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 21:17 | 显示全部楼层
您好!关于您的Python小游戏问题,我将为您提供一个简洁的代码示例,实现机器人在6x6地图上移动和切换草地状态的功能。代码使用了面向对象编程,易于理解和扩展。地图是循环的(从边界移动会回到对面),并且每个单元格状态可以在“grassland”和“soil”之间切换。

以下是完整的代码实现。代码包括:
- 一个 Map 类来管理地图状态。
- 一个 Robot 类来处理机器人移动和耕种操作。
- 简单的文本显示功能来呈现地图状态。

代码设计为灵活可扩展,要改为8x8地图,只需在初始化时修改参数即可。


  1. # 定义草地状态常量
  2. GRASSLAND = 'grassland'
  3. SOIL = 'soil'

  4. class Map:
  5.     def __init__(self, width=6, height=6):
  6.         self.width = width
  7.         self.height = height
  8.         # 初始化地图,所有单元格为未开垦状态(grassland)
  9.         self.grid = [[GRASSLAND for _ in range(width)] for _ in range(height)]
  10.    
  11.     def get_cell_state(self, x, y):
  12.         # 获取指定坐标的单元格状态(x为列索引,y为行索引)
  13.         return self.grid[y][x]
  14.    
  15.     def set_cell_state(self, x, y, state):
  16.         # 设置指定坐标的单元格状态
  17.         self.grid[y][x] = state
  18.    
  19.     def toggle_cell_state(self, x, y):
  20.         # 切换指定坐标的单元格状态:grassland <-> soil
  21.         current_state = self.get_cell_state(x, y)
  22.         if current_state == GRASSLAND:
  23.             self.set_cell_state(x, y, SOIL)
  24.         else:
  25.             self.set_cell_state(x, y, GRASSLAND)
  26.    
  27.     def display(self):
  28.         # 打印当前地图状态,显示每个单元格的状态
  29.         for row in self.grid:
  30.             print(' '.join(row))
  31.         print()  # 空行用于输出分隔

  32. class Robot:
  33.     def __init__(self, map, start_x=0, start_y=0):
  34.         self.map = map  # 机器人关联的地图对象
  35.         self.x = start_x  # 当前列索引(东西方向)
  36.         self.y = start_y  # 当前行索引(南北方向)
  37.    
  38.     def move(self, direction):
  39.         # 根据方向移动机器人,处理边界循环
  40.         # 方向参数为字符串,如 'east', 'north', 等
  41.         if direction == 'east':
  42.             dx, dy = 1, 0   # 向东移动:列索引增加
  43.         elif direction == 'west':
  44.             dx, dy = -1, 0  # 向西移动:列索引减少
  45.         elif direction == 'north':
  46.             dx, dy = 0, -1  # 向北移动:行索引减少(假设地图左上角为(0,0))
  47.         elif direction == 'south':
  48.             dx, dy = 0, 1   # 向南移动:行索引增加
  49.         else:
  50.             print("错误:无效方向!请使用 'east', 'west', 'north', 或 'south'。")
  51.             return
  52.         
  53.         # 计算新位置
  54.         new_x = self.x + dx
  55.         new_y = self.y + dy
  56.         
  57.         # 处理边界循环:如果超出边界,则从对面重新进入
  58.         if new_x >= self.map.width:
  59.             new_x = 0
  60.         elif new_x < 0:
  61.             new_x = self.map.width - 1
  62.         
  63.         if new_y >= self.map.height:
  64.             new_y = 0
  65.         elif new_y < 0:
  66.             new_y = self.map.height - 1
  67.         
  68.         # 更新机器人位置
  69.         self.x = new_x
  70.         self.y = new_y
  71.         print(f"机器人移动方向: {direction}, 新位置: ({self.x}, {self.y})")
  72.    
  73.     def till(self):
  74.         # 在当前单元格执行耕种操作,切换状态
  75.         self.map.toggle_cell_state(self.x, self.y)
  76.         current_state = self.map.get_cell_state(self.x, self.y)
  77.         print(f"在位置 ({self.x}, {self.y}) 耕种,当前状态: {current_state}")

  78. # 示例使用:初始化6x6地图和机器人
  79. if __name__ == "__main__":
  80.     # 创建6x6地图
  81.     game_map = Map(6, 6)
  82.     robot = Robot(game_map)  # 机器人默认从(0,0)开始
  83.    
  84.     # 显示初始地图
  85.     print("初始地图状态:")
  86.     game_map.display()
  87.    
  88.     # 示例操作:移动和耕种
  89.     robot.move('east')  # 向东移动
  90.     robot.till()        # 耕种当前单元格
  91.     robot.move('north') # 向北移动
  92.     robot.till()        # 耕种当前单元格
  93.    
  94.     # 显示更新后的地图
  95.     print("操作后地图状态:")
  96.     game_map.display()
复制代码


如何扩展到8x8地图:
只需在初始化 Map 对象时指定宽度和高度为8。例如,将上面示例中的 game_map = Map(6, 6) 改为 game_map = Map(8, 8)。机器人的移动和耕种逻辑会自动适应新大小。

代码说明:
- 地图使用二维列表存储状态,初始全部为 grassland
- 机器人移动时,坐标会根据方向更新,并处理边界循环(例如从最东侧移动会回到最西侧)。
- till() 方法会切换当前单元格状态。
- display() 方法用于打印地图,方便查看状态变化。

您可以根据需要修改起始位置或添加更多功能(如多个机器人或复杂地图)。如果您有具体问题(如处理其他方向或错误输入),欢迎进一步询问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 昨天 21:26 | 显示全部楼层
FishC 发表于 2025-10-21 21:17
您好!关于您的Python小游戏问题,我将为您提供一个简洁的代码示例,实现机器人在6x6地图上移动和切换草地 ...

我想要更加精简的,例如只利用for循环其他不涉及到class,能做到吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 21:27 | 显示全部楼层
1838569480 发表于 2025-10-21 21:26
FishC 发表于 2025-10-21 21:17
您好!关于您的Pytho ...


当然可以!以下是一个不使用类(class)的精简版本,只使用基本函数、全局变量和for循环来实现您的需求。代码使用全局变量来管理地图状态和机器人位置,并通过函数处理移动和耕种操作。地图大小可以通过修改常量轻松调整(例如从6x6改为8x8)。


  1. # 定义常量
  2. GRASSLAND = 'grassland'
  3. SOIL = 'soil'
  4. MAP_WIDTH = 6  # 要改为8x8时,只需将这里改为8
  5. MAP_HEIGHT = 6

  6. # 初始化地图(二维列表,全部为未开垦状态)
  7. map_grid = []
  8. for i in range(MAP_HEIGHT):
  9.     row = []
  10.     for j in range(MAP_WIDTH):
  11.         row.append(GRASSLAND)
  12.     map_grid.append(row)

  13. # 初始化机器人位置(起始点为(0,0))
  14. robot_x = 0
  15. robot_y = 0

  16. # 移动函数
  17. def move(direction):
  18.     global robot_x, robot_y
  19.     # 根据方向计算移动增量
  20.     if direction == 'east':
  21.         dx, dy = 1, 0
  22.     elif direction == 'west':
  23.         dx, dy = -1, 0
  24.     elif direction == 'north':
  25.         dx, dy = 0, -1
  26.     elif direction == 'south':
  27.         dx, dy = 0, 1
  28.     else:
  29.         print("错误:方向无效!请使用 'east', 'west', 'north' 或 'south'。")
  30.         return
  31.    
  32.     # 计算新位置并处理边界循环
  33.     new_x = (robot_x + dx) % MAP_WIDTH
  34.     new_y = (robot_y + dy) % MAP_HEIGHT
  35.    
  36.     # 更新位置
  37.     robot_x = new_x
  38.     robot_y = new_y
  39.     print(f"机器人向 {direction} 移动,新位置: ({robot_x}, {robot_y})")

  40. # 耕种函数
  41. def till():
  42.     global map_grid
  43.     # 切换当前单元格状态
  44.     if map_grid[robot_y][robot_x] == GRASSLAND:
  45.         map_grid[robot_y][robot_x] = SOIL
  46.     else:
  47.         map_grid[robot_y][robot_x] = GRASSLAND
  48.     print(f"在位置 ({robot_x}, {robot_y}) 耕种,当前状态: {map_grid[robot_y][robot_x]}")

  49. # 显示地图函数
  50. def display_map():
  51.     for row in map_grid:
  52.         # 使用for循环打印每一行
  53.         line = ''
  54.         for cell in row:
  55.             line += cell + ' '
  56.         print(line)
  57.     print()  # 空行用于输出分隔

  58. # 示例使用
  59. print("初始地图状态:")
  60. display_map()

  61. # 示例操作
  62. move('east')
  63. till()
  64. move('north')
  65. till()

  66. print("操作后地图状态:")
  67. display_map()
复制代码


代码说明:
- 地图使用二维列表 map_grid 存储,初始全部为 grassland
- 机器人位置用全局变量 robot_xrobot_y 跟踪。
- move() 函数通过模运算(%)处理边界循环,使机器人从一侧移出时从对面进入。
- till() 函数切换当前单元格状态。
- display_map() 函数使用嵌套for循环打印地图。

如何改为8x8地图:
只需将代码开头的 MAP_WIDTHMAP_HEIGHT 从6改为8。例如:

  1. MAP_WIDTH = 8
  2. MAP_HEIGHT = 8
复制代码


这个版本完全避免了类,只使用基本函数和循环,代码简洁易懂。如果您需要添加更多功能(如多个方向或错误处理),可以在此基础上扩展。如果有其他问题,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-22 04:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表