Странное поведение для циклов в определенных условиях.обработка - PullRequest
0 голосов
/ 05 февраля 2019

Я изучаю, как использовать обработку, и пытался сделать простую игру со змеями, при этом она показывает (хотя это был cntrl + c cntrl + v с первого, который был запущен) поведение Weir дляциклы специально для движения вправо или вниз.

Мне удалось исправить проблему «вниз», просто изменив (int k = 0; k <56; k ++) на for (int k = 55; k <=0; k--) это точно то же самое, не так ли?я что-то упустил? </p>

    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;
          }
        }
      }
    }

1 Ответ

0 голосов
/ 05 февраля 2019

Ваша проблема справа и вниз в том, что в обоих вы обновляете голову вниз цикл (с i+1 or j+1), так что блок else будет выполняться более одного раза (в up и left вы делаете i-1 и j-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, потому что вы хотите переместить snakeHead только один раз !

так:

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
}
...