c - C 中的函数 "boulders"

标签 c

我正在尝试创建一个名为 boulders 的函数

void boulders (char landscapes[][L_WIDTH], int nrows);

基本上,我应该用巨石和空气填充一个数组,其中巨石由“o”表示,空气由“-”表示。它应该填充随机数量的巨石,最后它必须遵循重力规则。

例如:

--------------O---------
---O----------O-----O---
---OO------O--OO----OO--
---OO-----OOOOOO---OOO--
--OOOO---OOOOOOOO-OOOOO-

到目前为止,我已经让它填充了随机的巨石和空气,但我正在努力研究如何使其遵循重力规则。

这是迄今为止我的代码:

void boulders (char landscape[][L_WIDTH], int nrows) {
    srand(time(NULL));
    int i, j;//populate with -
    for (i=0; i<nrows; i++) {
        for (j=0; j<L_WIDTH; j++) {
            landscape[i][j] = '-';
        }
    }

    int boulders;//random population of o
    for (i=0; i<nrows; i++) {
        boulders = rand() % L_WIDTH;
        for (j=0; j<boulders; j++) {
            landscape[rand()%(nrows)][rand()%L_WIDTH] = 'o';
        }
    }

    //follow gravitational rules
    for (i=nrows-1; i<0; i--) {
        for (j=0; j<L_WIDTH; j++) {
            if (landscape[i-1][j] == 'o') {
                landscape[i][j] = 'o';
            }
        }
    }

    //print
    for (i=0; i<nrows; i++) {
        for (j=0; j<L_WIDTH; j++) {
            printf("%c", landscape[i][j]);
        }
        printf("\n");
    }
}
main () {
    char landscape[6][L_WIDTH];
    boulders (landscape, 6);
}

输出:

L_WIDTH定义为80供引用

最佳答案

您需要检查巨石下方是否有空气。

if (landscape[i-1][j] == 'o') {
     landscape[i][j] = 'o';
}

不是执行此操作的代码。条件必须是,我处于巨石位置,并且其下方的位置有空气。然后,只有到那时,你才能将位置放在粗体下方,该粗体应该是空气,粗体,然后你就制作了更粗体的空气。最终结果,胆大者下降一位。

事实上,您的迭代从底部迭代上方的 1 行开始,然后向上进行,这是正确的。然而,这并没有考虑到如果一 block 巨石下面有 2 个空气空间,那么它可能必须掉落多个空间。 这可以通过多种方式解决。您可能需要设置一个 while 条件。

 int boulderdropped = 1;
 while(boulderdropped==1){
     boulderdropped = 0;
     //do your iteration and if you detect air under a boulder 
     //set boulderdropped to 1 again.
 }

我故意不给你解决方案。只是一些提示。 所以你可以制定自己的解决方案。 还有比这更有效的解决方案。因为实际上巨石总是从下到上生长。计算一列中巨石的数量足以快速得出最终布局。或者更好的是,您甚至可以随机分配每列中应该有多少巨石。 这将很快得到解决方案。 我同意你的代码并给出了一些提示,但是如果你阅读上面的文本,你可以想出更好的算法。我再次故意不提供解决方案。您应该能够自己解决。

关于c - C 中的函数 "boulders",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29570659/

相关文章:

Java 比 C 快 2 倍以上(作为 C++ 的子集)

c - 链接 2 个源文件而不是使用头文件有什么意义?

内存复制功能

c - 为什么 func() 和 func(void) 不同

读内存会不会出现segmentation fault?

c - 函数 join() 中 char 和 char* 出现问题

c - Valgrind,有可能得到行数吗?

c - 从汇编代码中查找数组的维度

c - 如何在不显示的情况下获取最大化窗口的大小?

c - 为什么我的多线程程序有时会阻塞?