Articles of 程序代

解决难题的方法

我有一个关于制作拼图游戏的任务,可以用彩色的珍珠填充游戏板,然后需要玩家来解决。 核心规则是 珍珠被放置在一个网格,大小各不相同。 玩家需要清除所有的珍珠,否则关卡就会丢失。 只能连续排列三颗珍珠(相邻)。 popup7或更多将popup这种颜色的每颗珍珠,放松板很多。 珍珠受重力的影响,会落在清除的珍珠的地方。 没有新的珍珠诞生。 我也需要两个杠杆来调整难度。 一个是珍珠可以拥有的颜色的数量(对玩家来说是清楚的),另一个是正确解决scheme与死亡水平包含的范围有多紧密的“残酷”因素。 我似乎处于两种处理方式的交叉路口,并希望得到你们的反馈。 我的两个select似乎是: 从干净的板子开始,然后以编程方式将珍珠组合板添加到板子,直到完成。 然后玩家需要从那里追踪解决。 (他们不会看到它实际上正在产生,这将在后台发生)这应该确保董事会总是有至less一个解决scheme,这是回溯如何发动机放置珍珠首先。 制作一个纯粹的随机电路板,然后设置一个脚本化的跑步者去尝试解决它,每当有不止一个选项的时候就会分支,如果所有的分支导致死胡同,重新开始一个新的棋盘。 这应该给我一个很好的结果关于多less死胡同VS解答董事会包含。 林不知道哪一个是最好的方法,或者如果我把它全部弄错了,需要第三个方法来解决这个问题。 无可否认,这是我第一次尝试一个益智游戏机制。

使用二进制空间分区来布置游戏中的场景

问:如何在大场面中随机摆放这些场景,使它们不重叠? 我正在使用Godot引擎来创建一个小型的2D RPG类游戏。 我正在以一种程序化的方式铺设一座村庄,最大的房子首先被放下,然后是小房子,等等。 这些房屋被设置在一个tilemap ,而它本身被设置在一个更大的tilemap场景中。 我尝试过使用Vector2对象中的随机值随机设置它们,但它们可能会相互重叠。 经过大量的实验,我发现了一篇关于二进制空间分区的文章,并试图find一个在Godot引擎中做出的例子。 我在YouTube上find了这个video ,并使用该代码来制作一个小function: func bsp(map_size_width, map_size_height): var rec1 var rec2 var back = [] var contents = [[0, 0, map_size_width, map_size_height]] for i in range(0, 4): back.clear() for rec in contents: randomize() if rec[2] > rec[3]: var width = round(rand_range(0.3,0.7) * rec[2]) rec1 = [rec[0], rec[1], width, rec[3]] […]

如何加载/卸载视图端口当前关注的块数据?

我有一个基于2D瓦片的引擎,具有无限的程序块代。 但是我不能发明一种algorithm,只能在视口上填充大块的瓷砖(并破坏旧的)。 请帮助 ViewPort大小可以随时更改(2 – 100) 我无法完全加载所有区块,因为我需要分析可见区域中的区块 class Map { public List<Chunk> { get; set; } public int viewPortWidth = 2 … 100; public int viewPortHeight = viewPortWidth; public Vector2Int playerPosition { get; set; } } class Chunk { Tile[] Tiles { get; set; } public int chunkWidth = 16; public int chunkHeight = chunkWidth; […]

行星地形的瓷砖坐标

我试图做一个基本上没有人的天空穷人的版本 。 我特别想要类似的系统,我可以从空间到无缝的表面,但也许技术上不太完美。 我的技术目标是地球直径比地球直径大(14k vs 12k),地形的分辨率为2m,我用6×6 km的地区作为整体行星地形度量(也就是直径最大的2600个地区星球)和大小在区域的增量。 我的方法是: 1 – 我使用轴alignment的立方球体, 2 – 我发现这个星球运载vector, 3 – 我把这个vector夹在半径上,find悬浮的表面点 4 – 使用这一点,我发现它登陆的立方体的哪个面 5 – 使用这一点我想find“瓷砖的哈希坐标” 6 – 使用瓦片的散列,我想要在该坐标周围构建地形LOD 7 – 从技术上讲,我打算使用圆形arrays来实现快速行驶和地形生成,因此拥有一个固定的块大小是我想的关键。 我的问题是第5点 ,我似乎无法以令人满意的方式解决这个问题,它基本上是将立方体投影到球体上(即将球体投影到立方体中)的反面。 扭曲的是,我使用“球体上的立方体的正确投影”来生成行星,这不是典型的标准坐标。 这是一个重要的function,因为它允许保存游戏玩法度量! 看到这里: http : //catlikecoding.com/unity/tutorials/cube-sphere/ 有没有人有一个想法或替代scheme来实现相同的目标?

移动相机沿着生成的地形?

我在GPU上生成我的地形,使用菱形方块细分(不包含高度图)。 我怎样才能将相机的位置固定在生成的地形上? 谢谢

在无限的世界中绘制哪些部分?

我有一个无限的世界(来自Perlin Noise)。 世界是在那些立方体很大的部门产生的(上面的图像中的颜色是随机的,我的部门是10x10x10)。 我目前正在把扇区放在一个哈希表中,用左上角的坐标标记。 我可以遍历我已经生成的所有部门,看看他们是否相交的平截头体。 但是,我怎样才能计算我没有产生但是可见的,需要按需产生的部门呢? 即使我有一个八叉树或其他空间索引,我需要计算在视锥体内部可见的部分,而不是我已经生成的部分。

随机/程序生成的拼图平台水平

我有一个拼图平台的游戏,其中的水平将随机生成的想法。 创建一个随机世代相对简单。 检查随机生成的关卡是否可能完成,或者生成可能完成的关卡是不容易的。 我认为有很多不同的方法可以做到这一点。 有没有任何游戏使用这样的东西? 通常如何做到这一点?

如何正确地生成模拟洞穴周围的洞穴石头的角度墙?

长话短说。 我的关卡瓷砖目前看起来像这样: 我希望他们看起来像这样: 我的水平被devise为400×400的程序生成0和1的方块,0代表污垢(玩家可以走),1代表石头(不可穿透)。 游戏本身看起来很像这样 。 起初,我的方法是运行另一个循环 – 生成replace石砖的世界后,根据空砖的方向,与墙壁。 这个方法没有那么糟糕,直到有一个宽大的墙壁伸出来,这是不可能的转换,检查图片: 正如你所看到的,在我的方法中,墙壁是另一种纹理,它本身就是一块瓷砖。 我不能用空气取代空气,因为这样可能会阻碍通道。 它基本上每次有3个或更多的污垢直接贴在它旁边。 这是我想知道的地方,如果我select正确的方法,或者如果我应该改变整个devise的墙壁,如果是的话 – 什么? 我应该单独创建一个1宽的纹理吗? 或者,也许我不应该生成1全宽? 游戏如何处理这个问题? 我已经find了我的问题的答案,并没有find它。 可能是因为我很难说出来(抱歉杂乱的post)。

如何处理不断增长的地图大小的负坐标2d地图

我喜欢这个程序式的生成理论,并且一直在搞乱它。 不过,我在包装我的地图数据时遇到了麻烦。 通常我将地图数据存储在二维数组中,并且在有限的空间内工作。 然而,随着玩家探索新领域,我的地图也在不断增长。 所以地图的大小会发生变化,而数组只会支持正数。 所以如果玩家试图向西或北方探索,他将陷入一个虚无的黑暗深渊。 但是我在这些方向上还有更多的地图。 不幸的是,这些是地图的负坐标部分。 当玩家探索新区域时,有没有办法支持负面的坐标? 这是一个在行动中的问题的例子。 https://76295db93db3812642fa5ba984c042fa81ffc37c.googledrive.com/host/0B6H3TRExU5M9eEkyd2FreHhiNlU/ 尝试向西或向北移动,你会碰到地图的边缘。

数组中的随机对象

我正在使用Unity。 我已经创建了八种不同types的对象,存储在一个数组中,我将它们以随机顺序以网格模式显示在场景中。 数组中的前四个对象是红色的。 玩家需要摧毁所有四个红色物体才能进入下一个级别。 我写的代码到目前为止使用Random.Range方法,它完全随机地select对象。 有时它会产生一个不包含四个红色物体的格子,所以我的玩家不能摧毁它们并进入下一个级别。 我如何随机生成这个网格,以确保它有四个红色的物体? 这是我的代码。 public int gridWidth = 0; public int gridHeight = 0; public GameObject[] facePrefab = new GameObject[8]; void Awake() { gridHeight = Random.Range (3, 5); CreateGrid(gridWidth,gridHeight); } void CreateGrid(int numX, int numY) { for (int x = 0; x < gridHeight; x++) { for (int y = 0; […]