如何根据特定条件为 java 中的游戏生成随机棋盘?
How to generate random board for a game in java but according to specefic conditions?
我正在为大学项目制作棋盘游戏,需要在 java 中完成,
我坚持的部分是生成棋盘游戏,现在和我一起想象我们有一个方形的棋盘,它的大小是可变的,这意味着玩家在游戏开始时决定,
电路板由单元格组成,我定义了一个 class 代表单元格(下面 class 的 UML)
棋盘只是一个二维单元格数组(游戏的 UML class),每个单元格都有一个生物群落 (山脉、平原、沙漠、森林、海洋)生物群系在枚举中定义,
现在我的问题是我需要为每场比赛生成一个随机棋盘,棋盘需要满足两个条件:
- 2/3 的棋盘必须是 OCEAN
- 一座山或平原或森林或沙漠必须至少有一个不是海洋生物群落的邻居,邻居是指在它的北部、南部、东部或西部。
第一个条件很容易实现,但第二个条件我不知道如何在网上四处查看,但没有任何东西与我的条件相似。
下图中有一个板的示例(蓝色单元格是海洋,黄色是沙漠,浅绿色是平原,绿色是森林,棕色是山地)。
生物群系枚举代码
public enum Biome {
MOUNTAIN, PLAIN, DESERT, FOREST, OCEAN;
}
我猜你会逐行或逐列填满你的看板。
你知道:
- 棋盘大小
- 多少一定是海洋
- 多少可以是其他的(节省多少可以是其他的即
int nonOceanBiomeLeft
)
- 你已经填了多少
当你填满时,你可以为每个字段随机决定(取决于它的权重)你将设置什么。当你放置一个非海洋生物群落时,你将 nonOceanBiomeLeft
减一。如果它已经在另一个非 Ocean 附近,那么您就在该字段的此处停下来,否则您需要再次减少 nonOceanBiomeLeft
并添加一个到 int nonOceanBlocked
之类的东西(如果您的新字段没有邻居),这是为了确保您不会在某处创建新的 noOcean 生物群落,并留下 none 来满足条件。所以如果你还剩下 none,你就无法创建 noOcean 生物群系。
如果你有 nonOceanBlocked > 0
如果它是一个单独的非海洋生物群落,你需要注意上面一行中的邻居(所以保存每个字段的邻居信息或即时计算)。如果你在上一行的邻居是单独的,你需要添加一个 noOcean 并从 nonOceanBlocked
中删除一个因为这个有一个邻居你不需要再次增加 nonOceanBlocked
。
此外,如果您创建了一个新的 noOcean 生物群落并且最后一个字段是一个单独的 noOcean,您也可以减少 nnoOceanBlocked
。
小心
- 最后一行:这里需要立即给邻居,不能等到下一行,因为会有none.
- 如果只有
nonOceanBiomeLeft
等于 1 你不能把它放在没有邻居的地方,因为你需要 d
这只是对您可以做什么的理论上的描述,但对于大学项目,我想您应该自己完成大部分工作;)
希望对大家有所帮助,作为填板的起点。
我正在为大学项目制作棋盘游戏,需要在 java 中完成, 我坚持的部分是生成棋盘游戏,现在和我一起想象我们有一个方形的棋盘,它的大小是可变的,这意味着玩家在游戏开始时决定, 电路板由单元格组成,我定义了一个 class 代表单元格(下面 class 的 UML) 棋盘只是一个二维单元格数组(游戏的 UML class),每个单元格都有一个生物群落 (山脉、平原、沙漠、森林、海洋)生物群系在枚举中定义, 现在我的问题是我需要为每场比赛生成一个随机棋盘,棋盘需要满足两个条件:
- 2/3 的棋盘必须是 OCEAN
- 一座山或平原或森林或沙漠必须至少有一个不是海洋生物群落的邻居,邻居是指在它的北部、南部、东部或西部。 第一个条件很容易实现,但第二个条件我不知道如何在网上四处查看,但没有任何东西与我的条件相似。 下图中有一个板的示例(蓝色单元格是海洋,黄色是沙漠,浅绿色是平原,绿色是森林,棕色是山地)。
生物群系枚举代码
public enum Biome {
MOUNTAIN, PLAIN, DESERT, FOREST, OCEAN;
}
我猜你会逐行或逐列填满你的看板。
你知道:
- 棋盘大小
- 多少一定是海洋
- 多少可以是其他的(节省多少可以是其他的即
int nonOceanBiomeLeft
) - 你已经填了多少
当你填满时,你可以为每个字段随机决定(取决于它的权重)你将设置什么。当你放置一个非海洋生物群落时,你将 nonOceanBiomeLeft
减一。如果它已经在另一个非 Ocean 附近,那么您就在该字段的此处停下来,否则您需要再次减少 nonOceanBiomeLeft
并添加一个到 int nonOceanBlocked
之类的东西(如果您的新字段没有邻居),这是为了确保您不会在某处创建新的 noOcean 生物群落,并留下 none 来满足条件。所以如果你还剩下 none,你就无法创建 noOcean 生物群系。
如果你有 nonOceanBlocked > 0
如果它是一个单独的非海洋生物群落,你需要注意上面一行中的邻居(所以保存每个字段的邻居信息或即时计算)。如果你在上一行的邻居是单独的,你需要添加一个 noOcean 并从 nonOceanBlocked
中删除一个因为这个有一个邻居你不需要再次增加 nonOceanBlocked
。
此外,如果您创建了一个新的 noOcean 生物群落并且最后一个字段是一个单独的 noOcean,您也可以减少 nnoOceanBlocked
。
小心
- 最后一行:这里需要立即给邻居,不能等到下一行,因为会有none.
- 如果只有
nonOceanBiomeLeft
等于 1 你不能把它放在没有邻居的地方,因为你需要 d
这只是对您可以做什么的理论上的描述,但对于大学项目,我想您应该自己完成大部分工作;) 希望对大家有所帮助,作为填板的起点。