【问题标题】:Why is my falling array value disappearing?为什么我的下降数组值消失了?
【发布时间】:2022-08-17 13:27:26
【问题描述】:

我在 C 中有一个二维数组,我试图使正值或1 值下降直到它到达数组的底部,但是由于某种原因,一旦我运行代码,1 就会向左移动并且然后下来。它的工作方式是将当前值变为0,底部值变为1,重复此操作并产生直线下降的效果,此代码在fallDown()功能。

代码:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#ifdef __unix__
# include <unistd.h>
#elif defined _WIN32
# include <windows.h>
#define sleep(x) Sleep(1000 * (x))
#endif

int sizeX = 20;
int sizeY = 20;

int grid[20][20] = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};

int fallDown(int grid[sizeX][sizeY], int x, int y){
    grid[x][y]=0;
 grid[x][y+1]=1;
}

int main(void){
 int neighbour_count[sizeX][sizeY];
    int x,y,iterations;

 for(iterations=0;iterations<500;iterations++){
  system(\"cls\"); //Clear screen
  for(x=0;x<sizeX;x++){
    printf(\"\\n\");
    for(y=0;y<sizeY;y++){
     if(grid[x][y]==1){
      printf(\"@\");
             }
    else{
      printf(\" \");
    }
         }
  }
  for(y=0;y<sizeY;y++){
    for(x=0;x<sizeX;x++){
        if(grid[x][y] == 1){
         fallDown(grid, x, y);
    }
   }
        }
  printf(\"\\n\");
  sleep(1);
 }
}
  • fallDown 没有任何边界检查。使用您的循环,可能会使用y == sizeY - 1 调用它。那么y + 1 就会越界。
  • @Some程序员老兄仍然,我只是想了解为什么会发生这种向左走的奇怪行为以及如何解决它。界限问题是我打算稍后解决的问题。

标签: arrays c matrix


【解决方案1】:

xy 需要在 fallDown 中交换。
main 的第二组循环中,当找到1 时,循环必须停止,否则x 循环的下一次执行将一次又一次地fallDown...直到循环结束。
我正在使用 Linux,必须使用 clear 来清除屏幕。

#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>

int sizeX = 20;
int sizeY = 20;

int grid[20][20] = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};

void fallDown(int grid[sizeX][sizeY], int x, int y){
    grid[x][y]=0;
    ++x;
    if ( x == 20) {
        x = 0; // back to top
    }
    grid[x][y]=1;
}

int main(void){
    int x,y,iterations;

    for(iterations=0;iterations<500;iterations++){
        system("clear"); //Clear screen
        for(x=0;x<sizeX;x++){
            printf("\n");
            for(y=0;y<sizeY;y++){
                if(grid[x][y]==1){
                    printf("@");
                }
                else{
                    printf(" ");
                }
            }
        }
        for(y=0;y<sizeY;y++){
            for(x=0;x<sizeX;x++){
                if(grid[x][y] == 1){
                    fallDown(grid, x, y);
                    y = sizeY;
                    break;
                }
            }
        }
        printf("\n");
        sleep(1);
    }
}

【讨论】:

    【解决方案2】:

    另一种方法是使用终端转义码。
    (只要终端支持它们。)
    这会包裹运动,因此如果@ 超出边缘,它会出现在相对边缘。不确定这是否是我们想要的?

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <time.h>
    
    #define MAXROW 20
    #define MAXCOL 20
    
    typedef struct at_s {
        int row;
        int col;
    } at_t;
    
    void moveat ( at_t *at, int ud, int rl) {
        // moves up down right left diagonal
        at->row += ud;
        if ( at->row > MAXROW) {
            at->row = 1;
        }
        if ( at->row < 1) {
            at->row = MAXROW;
        }
        at->col += rl;
        if ( at->col > MAXCOL) {
            at->col = 1;
        }
        if ( at->col < 1) {
            at->col = MAXCOL;
        }
    }
    
    void showat ( at_t at, int show) {
        printf ( "\033[%d;%dH%c", at.row, at.col, show);
        fflush ( stdout);
    }
    
    int main ( void) {
        int chgrow = 0;
        int chgcol = 0;
        at_t at = { 4, 12};
    
        srand ( time ( NULL));
        printf ( "\033[2J");//clear screen
    
        for ( int moving = 0; moving < 500; ++moving) {
            showat ( at, ' ');
            chgrow = rand ( ) % 3; // range of 0 1 or 2
            --chgrow; // range is now -1 0 or 1
    
            chgcol = rand ( ) % 3;
            --chgcol;
            moveat ( &at, chgrow, chgcol);
            showat ( at, '@');
            printf ( "\033[22;1H\n");
            sleep ( 1);
        }
    
        printf ( "\033[22;1H\n");
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:
      int fallDown(int grid[sizeX][sizeY], int x, int y){
          grid[x][y] = 0;
          grid[x][y+1] = 1;
      }
      

      sizex 是行数, sizeY 是列数

      所以你应该像这样改变fallDown函数

      int fallDown(int grid[sizeX][sizeY], int x, int y){
            if(x == 19 || grid[x][y] == 0) return;
            grid[x+1][y] = 1;
            grid[x][y] = 0;
      }
      
            
      

      【讨论】:

      • 它仍然不起作用,它只是保持静止。
      • 现在它所做的只是传送到底部而忽略了旨在减慢它的 sleep(1) 函数
      • 只需交换 X 和 Y 即可解决问题。
      • 根据二维数组的结构,X 表示行,Y 表示列。我们必须增加 X 才能向下移动。
      • 我需要更改哪些行,fallDown 函数中的行,因为当我这样做时 @ 不会移动,很抱歉给您带来麻烦。
      【解决方案4】:

      我找到了一个更简单的答案,您只需在每次移动@ 时更新屏幕即可。

      #include<stdio.h>
      #include<stdlib.h>
      #include<conio.h>
      #ifdef __unix__
      # include <unistd.h>
      #elif defined _WIN32
      # include <windows.h>
      #define sleep(x) Sleep(1000 * (x))
      #endif
      
      int sizeX = 20;
      int sizeY = 20;
      
      int grid[20][20] = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
                          
      int drawScreen(int x, int y){
          system("cls"); //Clear screen
        for(x=0;x<sizeX;x++){
          printf("\n");
          for(y=0;y<sizeY;y++){
           if(grid[x][y]==1){
            printf("@");
           }
          else{
           printf(" ");
          }
         }
        }
      }
      
      int main(void){
       int x,y,iterations;
      
       for(iterations=0;iterations<10;iterations++){
          for(y=0;y<sizeY;y++){
              for(x=0;x<sizeX;x++){
                  if(grid[y][x] >= 1){
                      grid[y][x] = 0;
                      grid[y+1][x] = 1;
                      drawScreen(x,y);
                      break;
            }
              }
          }
          printf("\n");
       }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-05-22
        • 2016-03-05
        • 1970-01-01
        • 2014-02-15
        • 1970-01-01
        • 2013-05-02
        • 2012-06-19
        • 2016-02-15
        • 1970-01-01
        相关资源
        最近更新 更多