2017-07-13 1 views
0

Je travaille avec des étudiants pour faire un jeu de serpent, et nous sommes à peu près fini mais la dernière chose que nous avons ajoutée ne fonctionne pas: si le serpent entre en collision avec lui-même, il ne finit pas le jeu! La logique derrière le contrôle est correcte, et il semble être plus fiable à un débit inférieur, bien qu'il ne fonctionne toujours pas correctement à tout moment.Collision de serpent ne fonctionne pas - Java Traitement

Le code pour détecter la collision est en tirage au sort(), et il est écrit que:

System.out.println("headX: " + x.get(x.size()-1) + "\theadY: " +y.get(y.size()-1)); 
    for (int i=0; i < x.size()-1; i++) { 
     System.out.println("i: " + i + "\tx: " + x.get(i) + "\ty: " + y.get(i)); 
     if ((x.get(x.size()-1) == x.get(i)) && (y.get(y.size()-1) == y.get(i))) { 
     println("======================================="); 
     alive = false; 
     textSize(90); 
     text("YOU LOSE", 300, 400); 
     } 
    } 

Cela comprend des déclarations d'impression que je l'ai ajouté à vérifier, et il a en fait la condition dans la si l'instruction est satisfaite sans exécuter le code à l'intérieur de l'instruction if. Le serpent est sauvegardé dans une liste d'arrays sous la forme d'une série de coordonnées x et y, et un rectangle est tiré de chacune d'elles. Cette boucle for est censée vérifier les coordonnées de chacune des pièces de serpent à l'exception de la tête et le comparer à la tête. Même quand c'est vrai, le code ne s'exécute pas toujours.

est ici tout le code écrit dans l'EDI de traitement

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Random; 
boolean moveRight = true; 
boolean moveLeft = false; 
boolean moveUp = false; 
boolean moveDown = false; 
boolean alive = true; 

Random food = new Random(); 
int foodX = food.nextInt(100)*10; 
int foodY = food.nextInt(100)*10; 

ArrayList<Integer> x = new ArrayList<Integer>(Arrays.asList(0, 10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60, 50, 40, 30, 20, 20)); 
ArrayList<Integer> y = new ArrayList<Integer>(Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 20)); 
void setup() { 
    size(1000, 1000); 
    frameRate(60); 
} 
    void draw() { 
    if (alive) { 
     background(242, 195, 53); 
     if (moveRight) { 
     int headX = x.get(x.size()-1)+10; 
     int headY = y.get(y.size()-1); 
     x.add(headX); 
     y.add(headY); 
     //if you eat food, stuff below is false 
     if (headX != foodX || headY != foodY) { 
      x.remove(0); 
      y.remove(0); 
     } else { 
      updateFood(); 
     } 
     } 
     if (moveLeft) { 
     int headX = x.get(x.size()-1)-10; 
     int headY = y.get(y.size()-1); 
     x.add(headX); 
     y.add(headY); 
     if (headX != foodX || headY != foodY) { 
      x.remove(0); 
      y.remove(0); 
     } else { 
      updateFood(); 
     } 
     } 
     if (moveUp) { 
     int headX = x.get(x.size()-1); 
     int headY = y.get(y.size()-1)-10; 
     x.add(headX); 
     y.add(headY); 
     if (headX != foodX || headY != foodY) { 
      x.remove(0); 
      y.remove(0); 
     } else { 
      updateFood(); 
     } 
     } 
     if (moveDown) { 
     int headX = x.get(x.size()-1); 
     int headY = y.get(y.size()-1)+10; 
     x.add(headX); 
     y.add(headY); 
     if (headX != foodX || headY != foodY) { 
      x.remove(0); 
      y.remove(0); 
     } else { 
      updateFood(); 
     } 
     } 

     drawFood(); 
     fill(25, 62, 125); 

     for (int i=0; i < x.size(); i++) { 
     rect(x.get(i), y.get(i), 10, 10); 
     } 
     if (x.get(x.size() -1) >1000 || y.get(y.size() -1) > 1000 || x.get(x.size() -1) < 0 || y.get(y.size() -1) < 0) { 
     textSize(90); 
     text("YOU LOSE", 300, 400); 
     fill(255, 255, 255); 

     alive = false; 
     } 
     System.out.println("headX: " + x.get(x.size()-1) + "\theadY: " +y.get(y.size()-1)); 
     for (int i=0; i < x.size()-1; i++) { 
     System.out.println("i: " + i + "\tx: " + x.get(i) + "\ty: " + y.get(i)); 
     if ((x.get(x.size()-1) == x.get(i)) && (y.get(y.size()-1) == y.get(i))) { 
      println("======================================="); 
      alive = false; 
      textSize(90); 
      text("YOU LOSE", 300, 400); 
     } 
     } 
    } 
    } 



    void keyPressed() 
    { 
    if (key == 'd') { 
     if (!moveLeft) { 

     moveRight = true; 
     moveLeft = false; 
     moveUp = false; 
     moveDown = false; 
     } 
    } 
    if (key == 'a') { 
     if (!moveRight) { 
     moveLeft = true; 
     moveUp = false; 
     moveRight = false; 
     moveDown = false; 
     } 
    } 

    if (key == 'w') { 
     if (!moveDown) { 
     moveUp = true; 
     moveLeft = false; 
     moveDown = false; 
     moveRight = false; 
     } 
    } 
    if (key == 's') { 
     if (!moveUp) 
     moveUp = false; 
     moveLeft = false; 
     moveDown = true; 
     moveRight = false; 
    } 
    } 
    void drawFood() { 
    fill(255, 12, 12); 
    rect(foodX, foodY, 10, 10); 
    } 
    void updateFood() { 
    foodX = food.nextInt(100)*10; 
    foodY = food.nextInt(100)*10; 
    } 

EDIT: Entiers ne fonctionnent pas de manière fiable avec ==, ils doivent utiliser .equals. Vérifiez cette question: Java: Integer equals vs. ==

+0

Vous devriez vraiment pas enseigner l'écriture que les méthodes longues aux étudiants. Utilisez des méthodes privées et nommez-les correctement. – A1m

+0

D'accord. Vos sections 'if (moveRight) {' sont presque identiques, donc elles doivent être déplacées dans une méthode séparée et combinées en une seule fonction en fonction d'un paramètre. Aucun sens ayant un code similaire partout où il peut être dans un seul endroit. Même ainsi, ils devraient être «sinon si» après, sauf s'ils peuvent se déplacer en diagonale ou quelque chose. – mbomb007

+0

Je suis d'accord, c'est la première fois que j'enseigne et jongle 8 étudiants, c'est un art. Ils font un peu de travail par eux-mêmes et ensuite je viens les aider, je vais devoir être plus ferme à l'avenir sur la structure adéquate. Merci pour le conseil! – a0935

Répondre

1

Les entiers ne fonctionnent pas toujours avec ==, mais doivent utiliser .equals. Changer

if(x.get(x.size()-1) == x.get(i)) && (y.get(y.size()-1) == y.get(i)) 

à

if(x.get(x.size()-1).equals(x.get(i))) && (y.get(y.size()-1.equals(y.get(i))) 

a résolu le problème

+0

Notez que vous devriez probablement utiliser un seul' ArrayList' d'instances de 'PVector', ce qui éliminerait complètement ce problème. –