3

我试图为一个项目完成一个 RPG 游戏,但不知道如何制作游戏地图。它不需要是图形的,但整个地图和每个图块的代码必须是正确的。

到目前为止,我考虑过使用包含所有链接图块的 ArrayList 来制作非矩阵地图(应教授的要求)。

public abstract class Casella {
/** 
 * @uml.property name="tabellone"
 * @uml.associationEnd multiplicity="(1 1)" inverse="casella:Tabellone"
 * @uml.association name="contains"
 */

private int id;
private boolean free = true;
private List adjacent;
private List items;
private Tabellone tabellone = null;

public void in(){
    free = false;
}

public void out(){
    free = true;
}

}

这是单个图块的代码(它有 3 个扩展它的类)。我仍然不知道如何组合和生成地图。

感谢您的时间。

4

8 回答 8

9

不要从实现开始,从你想如何使用地图开始。这会给你一些限制如何实现它。例如:

绘制地图时,如何访问它?通过坐标?还是通过“从瓷砖 X 向西走”?

[编辑] 我建议从 RPG 游戏的主循环开始。您需要将字符/标记放置在某处(即它需要与图块有某种关系)。

然后你需要移动角色。角色必须能够检查当前图块(对手、物品、类型)。它需要一种方法来知道它如何移动(即右边有墙吗?)

这为您的地图提供了一个界面:它为游戏中的其他对象呈现的服务。当您了解接口需要提供什么时,您应该了解如何实现映射(数据结构)。

至于生成地图,使用随机数生成器加上一些“常识”。看看相邻的瓷砖:当它们都是城市时,这个瓷砖可能也是城市。平原也一样。山丘是奇异的项目,而且它们的频率最低。

运行此代码,将地图打印为 ASCII(“C”ity、“P”lain、“H”ill)以查看它是否有效。

于 2009-06-22T12:41:56.393 回答
3

要在不使用矩阵的情况下生成这样的地图,我建议从中心图块开始,然后使用修改后的广度优先搜索算法向外填充地图。首先,我们需要一些比相邻图块列表更好的东西。您可以简单地有四个变量,一个用于存储下一个图块的每个方向,如下所示:

private Tabellone up = null;
private Tabellone down = null;
private Tabellone left = null;
private Tabellone right = null;

假设我们从最中心的瓷砖开始。你现在要做的就是弄清楚有多少方向是空的,并为每个方向创建一个新的 Tablellone 对象,确保在当前对象中设置每个变量,并在创建的对象中设置适当的相反变量.

Tabellone adj = new Tabellone();
up = adj;
adj.setDown(this);

填写完此图块上的所有说明后,然后选择您创建的其他图块之一并执行相同的操作。这就是广度优先搜索算法的用武之地。您可以使用队列来遍历您创建的每个图块并填写方向。要使算法停止,只需对要创建的图块数量设置限制,并使用计数器来跟踪已创建的图块数量。

int count = 0;
ArrayList<Tabellone> queue = new ArrayList<Tabellone>()
queue.add(/*center tile*/);
while (count < 100) { //if we want 100 tiles
  //take out the center tile from the beginning of the array list, create a tile for each direction and add those tiles to the array list, then increment count by 1.
}

注意:这个算法将创建一个菱形的地图,如果你想要一个正方形,你还需要为每个对角线方向设置一个变量。

当然,如果这看起来比你想要的复杂一点,我会推荐一个坐标系。

于 2009-06-22T13:10:18.067 回答
2

墙壁、袋子和区域是特殊的容器,可以容纳游戏的所有墙壁、袋子和区域。

private String level =
          "    ######\n"
        + "    ##   #\n"
        + "    ##$  #\n"
        + "  ####  $##\n"
        + "  ##  $ $ #\n"
        + "#### # ## #   ######\n"
        + "##   # ## #####  ..#\n"
        + "## $  $          ..#\n"
        + "###### ### #@##  ..#\n"
        + "    ##     #########\n"
        + "    ########\n";

这就是游戏的水平。除空格外,共有五个字符。井号 (#) 代表一堵墙。美元 ($) 代表要移动的框。点 (.) 字符表示我们必须移动框的位置。at 字符 (@) 是推箱子。最后换行符 (\n) 开始世界的新行。

于 2011-03-24T22:29:25.557 回答
1

速度或内存是这个项目的一个大问题吗?如果不是,为什么不使用二维数组?

就像是

Casella map [][] = new Casella[xSize][ySize];

从这里很容易概念化,只需将其想象为一个 Excel 电子表格,其中每个单元格都是地图上的一个图块。

不过,您要走的路很好,只是有时有点难以概念化。你有一个相邻瓷砖的列表。因此,在创建地图时,您从某个地方开始,可能是左上角,然后从那里开始。

您可以使用嵌套的 for 循环来设置地图,并帮助确定边缘项目。

for(int i = 0; i < XSIZE ; ++i)
    for(int j = 0; j < YSIZE ; ++j)
        if(j==0) //found left edge (i.e. no adjacent ones to the left)
        if(j==(YSIZE)) //found right edge (you get the picture) 

使用循环并检查边缘的要点是,您需要为每个图块向后和向前、向上和向下链接,除了边缘,您将有 2 或 3 个链接而不是 4 个。

于 2009-06-22T12:55:44.133 回答
1

代码需要正确实际上不是功能要求,因此如果不了解您的游戏/地图的更多信息,很难准确地说出什么是正确的。

假设您的地图具有 X 瓦片且没有有序邻接,则非矩阵解决方案是最好的,一个常见的解决方案是将其建模为使用非对称邻接的邻接列表或对称邻接的关联列表的图形。如果您使用关联列表,则需要包含边缘连接的顶点的边缘对象,如果您使用邻接列表,则使用图可能很酷。

如果你想要一个有序邻接的非矩阵解决方案,AlbertoPL 有解决方案。

假设您有一张 X 瓦片宽和 Y 瓦片高的地图,并且彼此相邻的瓦片是相邻的,因此每个瓦片最多有 4 个和最少 2 个相邻瓦片,您可以使用矩阵来访问瓦片并表示矩阵邻接的邻接。这个想法是 map[Y][X] 与 map[Y+1][X] 和 map[Y][X+1] 相邻并且相反。如果图块 [Y+1][X+1] 与图块 [Y][X] 相邻,则此解决方案也可以拟合最大 6 个和最小 3 个图块邻接。这样做的好处是您可以轻松解析地图,并且由于它有 2 个维度,因此很自然地可以像这样对其进行建模。缺点是一旦设置了一个图块,你就不能在不改变矩阵的情况下改变它的邻接关系。由于这不是您教授建议的,您可能不想这样做,但如果您有(静态)有序邻接,这可能是最简单的方法。

于 2009-06-22T13:58:43.413 回答
1

我通过使用邻接列表来管理这个。每个单元格将有一个包含相邻单元格索引的 ArrayList。这些索引是所述单元格在单元格的映射 ArrayList 中的索引。

http://en.wikipedia.org/wiki/Adjacency_list

于 2009-06-28T09:14:22.827 回答
0

如果是基于图块的地图,那么每个房间与其相邻的房间都有固定的关系。您可能不需要担心坐标(尽管如果瓷砖是方形的可能会更简单),但您需要担心方向。

如果图块是正方形的,那么您可能只需要关心基本方向(n、s、e、w)。如果它们是十六进制图块,您可以将出口编号为 1-6(可能使用静态最终常量)。然后每个相邻的瓦片可以与它的出口链接到这个瓦片。

于 2009-06-22T12:51:15.110 回答
0

正如Aaron所说,您需要首先确定映射坐标的方式。

但是您不受 XYZ 坐标系的限制。例如,每个图块都可以链接到地图上的任何其他图块。这完全取决于您要如何构建它。

您说您正在构建一个 RPG 游戏,那么您需要对角色周围的地形有一个很好的了解。是多层次的吗?角色如何从一块瓷砖移动到另一块瓷砖?运动是一种方式吗?

从字面上看,在为游戏设计地图时要问几十个问题。

在开始编码之前,您需要先计划好它。

于 2009-06-22T12:55:21.060 回答