Closed. This question needs details or clarity。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
                        
                        4年前关闭。
                                                                                            
                
        
我正在尝试创建一个名为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';
}


不是执行此操作的代码。条件必须是,我处于巨石位置,并且下方的位置有空气。然后,只有到那时,您才能将粗体定位在应该为空的粗体下,然后使粗体为空。最终结果是,粗体下降了一位。

迭代从最下面的一行开始开始,然后逐步向上的事实是正确的。但是,这没有考虑到巨石可能必须掉落多个空间(如果说在其下方有2个空气空间)。
这可以通过许多方式解决。您可能需要放置一会儿条件。

 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中的“巨石”功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29570659/

10-11 19:42