for 循环在特定条件下的奇怪行为。加工

Weird behavior of for loops in specific conditions. Processing

我正在学习如何使用处理并尝试制作一个简单的贪吃蛇游戏,同时它确实显示了(尽管它是第一个中的 cntrl+c cntrl+v,它是向上的)Weir 行为在 for 循环中专门用于向右或向下移动。

我设法通过简单地更改来解决 'down' 问题 对于(int k=0;k<56;k++) 至 对于(int k=55;k<=0;k--) 这是完全一样的东西,不是吗?我是不是漏了什么?

    int [][] snakeHead = new int[60][60];

    int game = 1;
    int value = 0;

    String s = "You lost\nPress SHIFT to Restart";

    void setup(){

    size(600,600);
    frameRate(10);

    for(int i=0;i<56;i++){
      for(int k=0;k<56;k++){
        snakeHead[i][k] = 0;
      }
    }
    snakeHead[1][22] = 1;
    game = 1;
    value = 0;

    }

    void draw(){
      background(0);
      fill(255);
      rect(20, 20, 560, 560);

    if(game == 1){
      for(int i=0;i<56;i++){
        for(int k=0;k<56;k++){
          if(snakeHead[i][k] == 1){
            fill(0,255,0);
            rect(20+i*10, 20+k*10, 10,10);
          }
        }
      }
      if(value == 1){
        up();
      }else if(value == 2){
        down();
      }else if(value == 3){
        left();
      }else if(value == 4){
        right();
      }
    }
    else{
      textSize(32);
      textAlign(CENTER);
      fill(0,0,255);
      text(s, 300, 300);
    }
    }

    void keyPressed(){
      if(key == CODED){

        if(keyCode == UP){
          value = 1;
          }
        else if(keyCode == DOWN){
          value = 2;
        }
        else if(keyCode == LEFT){
          value = 3;
        }
        else if(keyCode == RIGHT){
          value = 4;

        }else if(keyCode == SHIFT){
            setup();
        }
    }
    }

    void up(){

      for(int i=0;i<56;i++){
        for(int k=0;k<56;k++){
          if(snakeHead[i][k] == 1 && k == 0){
            game = 0;
          }else if(snakeHead[i][k] == 1){
            snakeHead[i][k-1] = 1;
            snakeHead[i][k]=0;
          }
        }
      }
    }

    void down(){

      for(int i=0;i<56;i++){
        for(int k=0;k<56;k++){
          if(snakeHead[i][k] == 1 && k == 55){
            game = 0;

          }else if(snakeHead[i][k] == 1 && k != 55){
            snakeHead[i][k+1] = 1;
            snakeHead[i][k] = 0;
          }
        }
      }
    }

    void right(){

      for(int i=0;i<56;i++){
        for(int k=0;k<56;k++){
          if(snakeHead[i][k] == 1 && i == 55){
            game = 0;
          }else if(snakeHead[i][k] == 1 && i != 55){
            snakeHead[i+1][k] = 1;
            snakeHead[i][k]=0;
          }
        }
      }

    }
    void left(){
      for(int i=0;i<56;i++){
        for(int k=0;k<56;k++){
          if(snakeHead[i][k] == 1 && i == 0){
            game = 0;
          }else if(snakeHead[i][k] == 1){
            snakeHead[i-1][k] = 1;
            snakeHead[i][k]=0;
          }
        }
      }
    }

你的问题在右边和下面,你更新头部 down 循环(使用 i+1 or j+1)所以 else 块执行多次然后一次(在 upleft 你做 i-1j-1 所以它不会发生在那里)。

让我们看看right函数来演示:

void right(){
    for(int i=0;i<56;i++){
        for(int k=0;k<56;k++){
            if(snakeHead[i][k] == 1 && i == 55){
                game = 0;
            } else if(snakeHead[i][k] == 1 && i != 55){
                snakeHead[i+1][k] = 1; // update the sankeHead to i+1 which will be reached in the next iteration in i so basiclly keep moving right till reach if block 
                snakeHead[i][k]=0;
            }
        } // end k loop
    } // end i loop
}

要解决此问题,您需要做的就是添加 return,因为您只想移动蛇头 一次

所以:

void right(){
    for(int i=0;i<56;i++){
        for(int k=0;k<56;k++){
            if(snakeHead[i][k] == 1 && i == 55){
                game = 0;
                return;
            } else if(snakeHead[i][k] == 1 && i != 55){
                snakeHead[i+1][k] = 1; 
                snakeHead[i][k]=0;
                return;
            }
        } // end k loop
    } // end i loop
}