java - 如何根据特定条件在java中为游戏生成随机棋盘?
问题描述
我正在为大学项目制作一个棋盘游戏,它需要用 Java 完成,我陷入的部分是生成棋盘游戏现在想象一下我们有一个方形的棋盘,它的大小是可变的,这意味着玩家决定在游戏开始时,棋盘由单元组成,我定义了一个代表单元的类(下面的类的 UML),棋盘只是单元的二维数组(游戏类的 UML)和每个单元有一个生物群落(山,平原,沙漠,森林,海洋)生物群落是在一个枚举中定义的,现在我的问题是我需要为每个游戏生成一个随机棋盘,而博拉德需要满足两个条件:
- 董事会的 2/3 必须是OCEAN
- 山、平原、森林或沙漠必须至少有一个不是海洋生物群系的邻居,我的邻居是指在其北部、南部、东部或西部。第一个条件很容易实现,但第二个条件我不知道如何在网上环顾四周,但没有什么与我的条件相似。下图中有一个板的示例(蓝色单元格是海洋,黄色是沙漠,浅绿色是平原,绿色是森林,棕色是山)。
生物群系枚举代码
public enum Biome {
MOUNTAIN, PLAIN, DESERT, FOREST, OCEAN;
}
解决方案
我猜你会逐行或逐列填写你的董事会。
你知道:
- 板子尺寸
- 多少必须是海洋
- 可以是多少其他(保存多少可以是其他ie
int nonOceanBiomeLeft
) - 你已经填了多少
当您填写时,对于每个字段,您随机决定(取决于其权重)您将设置什么。当你放置一个非海洋生物群系时,你会减少nonOceanBiomeLeft
一个。如果它已经在另一个非海洋附近,则您在该字段中停下来,否则您需要再减少nonOceanBiomeLeft
一次并添加一个类似的东西int nonOceanBlocked
(如果您的新字段没有邻居),这是为了确保您不会创建一个新的 noOcean 生物群系在某个地方,并且没有人可以满足条件。因此,如果您一无所有,就无法创建 noOcean 生物群系。
如果你有nonOceanBlocked > 0
你需要注意上面一行中的邻居,如果它是一个单独的非海洋生物群系(所以保存每个字段的邻居信息或即时计算)。如果您在上一行中的邻居是一个人,您需要添加一个 noOcean 并从中删除一个,nonOceanBlocked
因为这个有一个邻居,您不需要nonOceanBlocked
再次增加。
此外,如果您创建一个新的 noOcean 生物群系并且最后一个字段是单独的 noOcean,您也可以减少nnoOceanBlocked
。
小心
- 最后一行:那里你需要立即给邻居,不能等待下一行,因为不会有。
- 如果 only
nonOceanBiomeLeft
等于一个,则不能将其放置在没有邻居的地方,因为您需要 d
这只是对您可以做什么的理论上的描述,但对于大学项目,我想您应该自己完成大部分工作;)我希望它可以帮助您作为填写董事会的起点。
推荐阅读
- python - 如何修复“是否安装了 poppler 并在 PATH 中?” 在 R
- ssl - 在 Windows 上生成 cert.pem 和 key.pem
- ios - 如何使用 Timer 在 UITableView 内自动滚动 UICollectionView?
- java - 为了清楚起见,如何将 MainActivity 功能拆分为另一个类?
- scikit-learn - 在 GaussianMixture 中获取分量后验概率
- python - 更改 AxisArtist 上的刻度数
- java - 如何模拟带注释的类?
- bash - 使用 bash 进行单元测试:使 bash 函数调用未选中,同时让父函数在函数出错后继续?
- python - 使用函数切换帧
- c# - 尝试访问 DataGrid 单元内的 StackPanel