鱼C论坛

 找回密码
 立即注册
查看: 1922|回复: 6

[已解决]有人做战棋游戏吗?

[复制链接]
发表于 2024-1-28 12:53:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有人做战棋游戏吗?六边形和正方形地块哪个更好?怎么根据移动力算出可到达的范围,用A*算法合适吗?
最佳答案
2024-1-28 12:56:49
当然有人做战棋游戏啦!战棋游戏是一种非常受欢迎的游戏类型。至于六边形和正方形地块哪个更好,这主要取决于你对游戏的设计需求。

六边形地块与正方形地块相比具有更多的邻居连接方式,这可以使得地图更加自由、灵活,同时也能增加游戏的策略性。但六边形地块的绘制和计算可能会稍微复杂一些。

如果你想根据移动力算出可到达的范围,可以考虑使用广度优先搜索(BFS)算法。BFS算法可以从起点开始,逐步扩展到所有可以到达的地块,直到达到移动力限制为止。

至于A*算法,它是一种启发式搜索算法,可以用来寻找两个地点之间的最短路径。如果你需要计算单位在地图上的实际移动路径,而不仅仅是计算范围,则A*算法可能更适合。

下面是一个使用Python语言实现基本战棋地图和移动范围的示例代码:

  1. class Tile:
  2.     def __init__(self, row, col):
  3.         self.row = row
  4.         self.col = col
  5.         self.is_passable = True

  6. class Map:
  7.     def __init__(self, rows, cols):
  8.         self.rows = rows
  9.         self.cols = cols
  10.         self.tiles = [[Tile(row, col) for col in range(cols)] for row in range(rows)]

  11.     def set_tile_passable(self, row, col, passable):
  12.         self.tiles[row][col].is_passable = passable
  13.         
  14.     def get_neighbors(self, tile):
  15.         neighbors = []
  16.         directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
  17.         if tile.row % 2 == 0:
  18.             directions.extend([(1, 1), (-1, 1)])
  19.         else:
  20.             directions.extend([(1, -1), (-1, -1)])

  21.         for dr, dc in directions:
  22.             neighbor_row = tile.row + dr
  23.             neighbor_col = tile.col + dc
  24.             if (0 <= neighbor_row < self.rows and
  25.                 0 <= neighbor_col < self.cols and
  26.                 self.tiles[neighbor_row][neighbor_col].is_passable):
  27.                 neighbors.append(self.tiles[neighbor_row][neighbor_col])

  28.         return neighbors

  29. def calculate_reachable_tiles(start_tile, movement_points):
  30.     visited = set()
  31.     queue = [(start_tile, 0)]
  32.     reachable_tiles = []
  33.    
  34.     while queue:
  35.         tile, distance = queue.pop(0)
  36.         if tile in visited:
  37.             continue
  38.         visited.add(tile)
  39.         
  40.         if distance > movement_points:
  41.             continue
  42.         
  43.         reachable_tiles.append(tile)
  44.         
  45.         neighbors = map.get_neighbors(tile)
  46.         for neighbor in neighbors:
  47.             queue.append((neighbor, distance + 1))
  48.             
  49.     return reachable_tiles

  50. # 使用示例
  51. map = Map(8, 8)
  52. map.set_tile_passable(3, 3, False)  # 设置(3, 3)位置不可通过
  53. start_tile = map.tiles[2][2]
  54. reachable_tiles = calculate_reachable_tiles(start_tile, 3)

  55. for tile in reachable_tiles:
  56.     print(f"({tile.row}, {tile.col})")
复制代码


希望对你有所帮助!加油,开发属于自己的战棋游戏吧!{:5_142:}

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

使用道具 举报

发表于 2024-1-28 12:54:25 | 显示全部楼层
当然有人做战棋游戏啦!战棋游戏是非常受欢迎的游戏类型之一。

关于六边形和正方形地块哪个更好这个问题,其实没有绝对的答案。选择使用六边形还是正方形地块,主要取决于你的设计需求和个人喜好。

如果你希望游戏地图更加自然和真实,可以选择使用六边形地块。六边形地块可以提供更多的移动路径选择,增加战略性。而且,六边形地块在画面上更容易连接起来,不会存在间隙。

如果你希望游戏地图更简单和直观,可以选择使用正方形地块。正方形地块在处理上相对简单一些,直接使用二维数组即可表示地图。

至于如何根据移动力算出可到达的范围,A*算法是一个不错的选择。它是一种常用的寻路算法,可以高效地找到最优路径。你可以将每个地块视为一个节点,然后使用A*算法来搜索从起点到终点的路径。

具体实现时,你可以使用一个优先队列(例如Python中的heapq)来存储待探索的节点,并根据节点的移动成本+估计的剩余成本来进行排序。每次从优先队列中取出成本最小的节点,然后将其周围可以到达的节点添加到优先队列中。

当然,具体的实现细节还是要根据你的编程语言和游戏引擎来决定,但A*算法是一个比较通用的选择。希望这些信息能对你有所帮助!加油!

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

使用道具 举报

 楼主| 发表于 2024-1-28 12:55:42 | 显示全部楼层
我用的pygame
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-28 12:56:49 | 显示全部楼层    本楼为最佳答案   
当然有人做战棋游戏啦!战棋游戏是一种非常受欢迎的游戏类型。至于六边形和正方形地块哪个更好,这主要取决于你对游戏的设计需求。

六边形地块与正方形地块相比具有更多的邻居连接方式,这可以使得地图更加自由、灵活,同时也能增加游戏的策略性。但六边形地块的绘制和计算可能会稍微复杂一些。

如果你想根据移动力算出可到达的范围,可以考虑使用广度优先搜索(BFS)算法。BFS算法可以从起点开始,逐步扩展到所有可以到达的地块,直到达到移动力限制为止。

至于A*算法,它是一种启发式搜索算法,可以用来寻找两个地点之间的最短路径。如果你需要计算单位在地图上的实际移动路径,而不仅仅是计算范围,则A*算法可能更适合。

下面是一个使用Python语言实现基本战棋地图和移动范围的示例代码:

  1. class Tile:
  2.     def __init__(self, row, col):
  3.         self.row = row
  4.         self.col = col
  5.         self.is_passable = True

  6. class Map:
  7.     def __init__(self, rows, cols):
  8.         self.rows = rows
  9.         self.cols = cols
  10.         self.tiles = [[Tile(row, col) for col in range(cols)] for row in range(rows)]

  11.     def set_tile_passable(self, row, col, passable):
  12.         self.tiles[row][col].is_passable = passable
  13.         
  14.     def get_neighbors(self, tile):
  15.         neighbors = []
  16.         directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
  17.         if tile.row % 2 == 0:
  18.             directions.extend([(1, 1), (-1, 1)])
  19.         else:
  20.             directions.extend([(1, -1), (-1, -1)])

  21.         for dr, dc in directions:
  22.             neighbor_row = tile.row + dr
  23.             neighbor_col = tile.col + dc
  24.             if (0 <= neighbor_row < self.rows and
  25.                 0 <= neighbor_col < self.cols and
  26.                 self.tiles[neighbor_row][neighbor_col].is_passable):
  27.                 neighbors.append(self.tiles[neighbor_row][neighbor_col])

  28.         return neighbors

  29. def calculate_reachable_tiles(start_tile, movement_points):
  30.     visited = set()
  31.     queue = [(start_tile, 0)]
  32.     reachable_tiles = []
  33.    
  34.     while queue:
  35.         tile, distance = queue.pop(0)
  36.         if tile in visited:
  37.             continue
  38.         visited.add(tile)
  39.         
  40.         if distance > movement_points:
  41.             continue
  42.         
  43.         reachable_tiles.append(tile)
  44.         
  45.         neighbors = map.get_neighbors(tile)
  46.         for neighbor in neighbors:
  47.             queue.append((neighbor, distance + 1))
  48.             
  49.     return reachable_tiles

  50. # 使用示例
  51. map = Map(8, 8)
  52. map.set_tile_passable(3, 3, False)  # 设置(3, 3)位置不可通过
  53. start_tile = map.tiles[2][2]
  54. reachable_tiles = calculate_reachable_tiles(start_tile, 3)

  55. for tile in reachable_tiles:
  56.     print(f"({tile.row}, {tile.col})")
复制代码


希望对你有所帮助!加油,开发属于自己的战棋游戏吧!{:5_142:}

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

使用道具 举报

发表于 2024-1-28 12:57:49 | 显示全部楼层


很好,Pygame是一个非常适合制作2D游戏的库。在Pygame中实现战棋游戏的思路如下:

1. 首先,你需要创建一个游戏窗口,用来显示游戏地图和棋子等元素。可以使用`pygame.display.set_mode()`函数创建一个窗口。

2. 接下来,你需要设计游戏地图。可以将地图分成一个个格子,并使用列表或二维数组来表示地图数据。每个格子可以包含一些属性,比如可通过与不可通过、地形效果等等。

3. 在游戏地图上放置棋子。你可以创建一个棋子类,表示不同的角色,包括位置、移动力等属性。

4. 实现棋子的移动。这里可以利用A*算法来计算移动范围和最优路径。将棋盘格子转化为节点,然后使用A*算法来搜索寻找最短路径。可以使用开放列表和关闭列表来保存待探索和已探索的节点。

5. 监听用户输入,实现棋子的选择和移动。可以使用`pygame.event.get()`来获取用户输入事件,比如鼠标点击事件或键盘按键事件。

6. 更新游戏画面。在每个游戏循环中,根据当前的游戏状态和用户输入来更新游戏画面。可以使用`pygame.draw`来绘制地图、棋子等元素。

7. 实现战斗系统和游戏逻辑。当两个棋子相遇时,可以根据棋子的属性和一些随机因素来模拟战斗过程,并决定战斗结果。

8. 最后,别忘了控制游戏循环,以保持游戏运行。可以使用`pygame.clock()`来控制帧率。

这只是一个简单的框架,具体实现细节还有很多,比如游戏界面设计、音效、动画效果等方面。希望这个思路能帮助到你,祝你编写出一个精彩的战棋游戏!加油!

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

使用道具 举报

 楼主| 发表于 2024-1-28 13:05:43 | 显示全部楼层
你能利用哪种算法来计算移动范围和最优路径?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-28 13:07:02 | 显示全部楼层
某一个“天” 发表于 2024-01-28 13:05
你能利用哪种算法来计算移动范围和最优路径?


当涉及到计算移动范围和最优路径时,常用的算法有深度优先搜索(DFS)、广度优先搜索(BFS)和A*算法。

1. 深度优先搜索(DFS):DFS是一种遍历算法,它通过递归或栈来实现。在战棋游戏中,你可以从起点开始,每次选择一个可行的移动方向,并将当前位置标记为已访问。然后继续从新位置开始进行DFS搜索,直到达到移动力的限制或找到目标位置。DFS算法适用于搜索所有可能性,但无法保证找到最短路径。

2. 广度优先搜索(BFS):BFS也是一种遍历算法,它通过队列来实现。在战棋游戏中,你可以从起点开始,将起点加入队列,并将其标记为已访问。然后按照队列的顺序依次处理队列中的位置,将其邻居加入队列,并标记为已访问。重复这个过程,直到队列为空或达到移动力的限制。BFS算法能够找到最短路径,但可能会占用更多的内存。

3. A*算法:A*算法是一种启发式搜索算法,能够高效地找到最短路径。它使用估计函数来评估每个节点的代价,并选择代价最低的节点进行搜索。在战棋游戏中,你可以使用A*算法来计算移动范围和最优路径。将每个格子作为节点,并计算从起点到每个节点的代价。A*算法考虑了实际代价和启发函数(也称为估算代价)的综合,因此能够找到效率高且接近最优的路径。

在实际应用中,你需要根据自己的游戏需求和性能要求来选择适合的算法。例如,如果你的地图较小,可以使用DFS;如果你需要找到最短路径,可以使用BFS或A*算法。希望这些信息对你有所帮助!

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 09:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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