我正在和学生们一起制作一个蛇游戏,我们即将完成,但我们添加的最后一件事不起作用:如果蛇与自己相撞,它不会结束游戏!检查背后的逻辑是正确的,它似乎在较低的帧率下更可靠,尽管它仍然不是在任何时候都能正确工作。
用于检测冲突的代码位于draw()中,并编写为:
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中编写的完整代码
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. ==
发布于 2017-07-14 05:16:19
整数并不总是与==一起使用,而是必须使用.equals。改变
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)))解决了问题
https://stackoverflow.com/questions/45090879
复制相似问题