试图用C语言制作一个帐篷和树木游戏
我开始学习C,我正在尝试制作一个帐篷和树木游戏,我正在用一些矩阵4x4,5x5,6x6,7x7进行关卡设计,例如,数字8代表一棵树,数字4代表一个帐篷,数字0是一个空白,然而,我试图通过8个位置的随机树来设置关卡,使游戏在每次打开时都有所不同试图用C语言制作一个帐篷和树木游戏,c,algorithm,tree,C,Algorithm,Tree,我开始学习C,我正在尝试制作一个帐篷和树木游戏,我正在用一些矩阵4x4,5x5,6x6,7x7进行关卡设计,例如,数字8代表一棵树,数字4代表一个帐篷,数字0是一个空白,然而,我试图通过8个位置的随机树来设置关卡,使游戏在每次打开时都有所不同 以下是一些可以帮助你安排事情的随机想法: 在C/C++中,二维数组实际上是一维结构,是相邻存储器的一个块。在C和C++中,二维数组以行的主要形式存储,意思是我们把整个第一行放在内存中,然后把整个第二行等。举个例子,如果我们有 二维阵列 0 1 2
以下是一些可以帮助你安排事情的随机想法: 在C/C++中,二维数组实际上是一维结构,是相邻存储器的一个块。在C和C++中,二维数组以行的主要形式存储,意思是我们把整个第一行放在内存中,然后把整个第二行等。举个例子,如果我们有 二维阵列
0 1 2 <--- columns
0 a b c
1 d e f
2 g h i
^
+-- rows
这种安排很有用,因为我们可以很容易地在一维内存数组中的索引和我们的二维数组概念之间进行转换。在以下等式中,R表示本例中二维数组3中的最大行数,C表示本例中二维数组3中的最大列数。最后,我们对行和列使用零基数;因此,元素“a”位于第0行第0列,在下文中缩写为[0,0]
如果我们对[r,c]中的内容感兴趣,我们需要生成一个索引n,via
n = r * C + c
例如,如果我们对[1,1]感兴趣,我们将计算:
n = 1 * 3 + 1 = 4
换句话说,[1,1]处的元素再次位于第四个索引,记住数组是基于零的
我们还可以通过使用将索引n转换回行-列表示法
r = n / C and c = n % C
例如,位于第六个内存位置索引=5的元素
r = 5 / 3 and c = 5 % 3 or [1,2]
树的放置是相当直接的,因为如果我们使用一个nxn数组,那么我们知道我们的索引从[0,n$^2$-1]开始运行,所以我们只在该范围内生成随机数,只是确保不使用相同的数字两次。某些psuedo代码可能用于排列t树:
// assume that our game board is in a data-structure called `world'
len <- n*n; // maximum number in our range
trees <- t; // number of trees to place
do
ndx <- rand() % len // generate random number in range [0,len-1]
if ( world[ndx] == 0) // picked an empty space
world[ndx] = 8; // plant a tree
trees -= 1; // decrement tree's remaining
while (trees > 0);
当然,我们必须确保我们没有离开这个世界。就我个人而言,我会将它们存储在一个数组中,而不是四个变量中
帐篷约束实际上只是说明八个相邻单元中的任何一个都不能有帐篷。考虑下面的图表,我们在细胞中有一个帐篷,用T标记。如果这个细胞的指数是N,那么周围的细胞显示我们需要检查的索引。< /P>
+---+---------+-----+----------+---+
| | | | | |
+---+---------+-----+----------+---+
| | n-C - 1 | n-C | n-C + 1 | |
+---+---------+-----+----------+---+
| | n-1 | T | n +1 | |
+---+---------+-----+----------+---+
| | n+C -1 | n+C | n+C +1 | |
+---+---------+-----+----------+---+
让我们把3和4放在一起。我们首先创建一个函数placeTents,它获取树放置位置的索引数组。这是一个简单的函数,它所做的一切就是创建一个潜在树位置数组,顺序为{top,left,right,bottom}。如果这些位置中有任何一个超出了边界,我们在数组中设置一个负的。最后,我们尝试为您生成一个可行的位置
功能场所帐篷;如果placeTent失败,我们将无法满足约束条件,并且从您的问题描述来看,目前还不清楚您希望做什么,在本次讨论中,我只是指出退出该计划
placeTents(trees):
max <- R * C -1 // max index
for each tree in trees
if (tree - C) > 0 then P[0] = tree - C else P[0] = -1;
if (tree - 1) > 0 then P[1] = tree - 1 else P[1] = -1;
if (tree + 1) < max then P[2] = tree + 1 else P[2] = -1;
if (tree + C) < max then P[3] = tree + C else P[3] = -1;
if (!placeTent(P))
exitError;
最后,真正的挑战是为帐篷找到一个可行的位置,对于这一点,我会考虑递归,这样当我找不到一个可行的位置时,我们可以放松位置,尝试不同的路径
看到它旋转成的长度。。。。对不起,可能是太多了……我将把递归部分留待以后
编辑/添加:
还有一件事我忘了提到,上面的内容是非常确定的,即我们允许在树上放置帐篷,然后逆时针移动。在某些时候,人们会发现这一点,因此您可能希望随机检查位置的顺序,即为每棵树在P数组上创建一个排列。您已经有了哪些代码?如果你还没有任何实际的代码,也许是一些关于如何解决问题的伪代码?哇,老兄,谢谢!这真的帮了我大忙!我做完了哈哈谢谢!
+---+---------+-----+----------+---+
| | | | | |
+---+---------+-----+----------+---+
| | n-C - 1 | n-C | n-C + 1 | |
+---+---------+-----+----------+---+
| | n-1 | T | n +1 | |
+---+---------+-----+----------+---+
| | n+C -1 | n+C | n+C +1 | |
+---+---------+-----+----------+---+
placeTents(trees):
max <- R * C -1 // max index
for each tree in trees
if (tree - C) > 0 then P[0] = tree - C else P[0] = -1;
if (tree - 1) > 0 then P[1] = tree - 1 else P[1] = -1;
if (tree + 1) < max then P[2] = tree + 1 else P[2] = -1;
if (tree + C) < max then P[3] = tree + C else P[3] = -1;
if (!placeTent(P))
exitError;
bool placeTent(P)
ret <- false;
max <- R * C - 1;
for each loc in P
if loc == -1 continue;
// calculate indexes we want to look at....
trial[0] <- loc - Col - 1;
trial[1] <- loc - Col;
.....
trial[6] <- loc + Col;
trial[7] <- loc + Col + 1;
for each t in trial
if ((t < 0) || (t > max)) continue; // we fell of the world.....splat!
if (world[t] == 0)
world[t] = 4;
return true;
return false; // failed to find a place to pitch our tent