首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Snake collision不工作- Java处理

Snake collision不工作- Java处理
EN

Stack Overflow用户
提问于 2017-07-14 05:05:46
回答 1查看 229关注 0票数 0

我正在和学生们一起制作一个蛇游戏,我们即将完成,但我们添加的最后一件事不起作用:如果蛇与自己相撞,它不会结束游戏!检查背后的逻辑是正确的,它似乎在较低的帧率下更可靠,尽管它仍然不是在任何时候都能正确工作。

用于检测冲突的代码位于draw()中,并编写为:

代码语言:javascript
复制
    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);
      }
    }

这包括我为检查而添加的一些print语句,并且它确实具有if语句中的条件,而无需执行if语句中的代码。

蛇被保存在数组列表中,作为一系列x和y坐标,并从每个坐标绘制一个矩形。这个for循环应该检查除头部之外的每个蛇片的坐标,并将其与头部进行比较。即使它是真的,代码也不会总是执行。

下面是在Processing IDE中编写的完整代码

代码语言:javascript
复制
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;
  }

编辑:整数不能可靠地使用==,它们必须使用.equals。看看这个问题:Java: Integer equals vs. ==

EN

回答 1

Stack Overflow用户

发布于 2017-07-14 05:16:19

整数并不总是与==一起使用,而是必须使用.equals。改变

代码语言:javascript
复制
if(x.get(x.size()-1) == x.get(i)) && (y.get(y.size()-1) == y.get(i))

代码语言:javascript
复制
if(x.get(x.size()-1).equals(x.get(i))) && (y.get(y.size()-1.equals(y.get(i)))

解决了问题

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45090879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档