java - Java 拉绳在代码的早期部分工作正常以计算点数,但在显示游戏结束时不起作用
问题描述
我正在用 Java 编写一个蛇游戏,代码几乎完成了,预计最后一个部分我有一个拉绳问题,在代码的后面部分不起作用,但在前面的部分可以正常工作。
我使用拉绳来实现一个计数点的计数器,但是当蛇与自身发生碰撞但文本根本没有显示时,我在 if 语句中执行相同操作。当然,它在向上移动代码时有效。
public class Game {
public static void main(String[] args) {
JFrame b = new JFrame("Snake");
b.setBounds(300,60,905,705);
b.setBackground(Color.DARK_GRAY);
b.setResizable(false);
Snake snake = new Snake();
b.setVisible(true);
b.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
b.add(snake);
}
}
public class Snake extends JPanel implements KeyListener, ActionListener {
private static final long serialVersionUID = 1 L;
private int[] snakeXlength = new int[750];
private int[] snakeYlength = new int[750];
private int[] foodXpos ={20,40,60,80,100,120,140,160,180,200,220,240,260,280,300,320,340,360,380,400,420,440,460,480,500,520,540,560,580,600,620,640};
private int[] foodYpos = {20,40,60,80,100,120,140,160,180,200,220,240,260,280,300,320,340,360,380,400,420,440,460,480,500,520,540,560,580,600};
private boolean right = true;
private boolean left = false;
private boolean up = false;
private boolean down = false;
private boolean over = false;
private Random random = new Random();
private int xPos = random.nextInt(32);
private int yPos = random.nextInt(30);
private Timer timer;
private int snakeDelay = 100;
private int points = 0;
private int moves = 0;
private int lengtOfSnake = 3;
public Snake() {
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
timer = new Timer(snakeDelay, this);
timer.start();
}
public void paint(Graphics g) {
// super.paintComponent(g);
g.setColor(Color.DARK_GRAY);
g.fillRect(0, 0, 900, 900);
g.setColor(Color.WHITE);
g.drawRect(20, 20, 864, 624);
g.setColor(Color.BLACK);
g.fillRect(21, 21, 863, 623);
g.setColor(Color.WHITE);
g.setFont(new Font("arial", Font.PLAIN, 14));
g.drawString("Score: " + points, 400, 15);
// ******* this counts the score ****
if (moves == 0) {
snakeXlength[2] = 60;
snakeXlength[1] = 80;
snakeXlength[0] = 100;
snakeYlength[2] = 100;
snakeYlength[1] = 100;
snakeYlength[0] = 100;
}
for (int a = 0; a < lengtOfSnake; a++) {
if (a == 0 && right) {
g.setColor(Color.RED);
g.fillRect(snakeXlength[a], snakeYlength[a], 20, 20);
}
if (a == 0 && left) {
g.setColor(Color.RED);
g.fillRect(snakeXlength[a], snakeYlength[a], 20, 20);
}
if (a == 0 && down) {
g.setColor(Color.RED);
g.fillRect(snakeXlength[a], snakeYlength[a], 20, 20);
}
if (a == 0 && up) {
g.setColor(Color.RED);
g.fillRect(snakeXlength[a], snakeYlength[a], 20, 20);
}
if (a != 0) {
g.setColor(Color.GREEN);
g.fillOval(snakeXlength[a], snakeYlength[a], 17, 17);
}
}
if ((foodXpos[xPos] == snakeXlength[0]) && (foodYpos[yPos] == snakeYlength[0])) {
points++;
lengtOfSnake++;
xPos = random.nextInt(32);
yPos = random.nextInt(30);
}
g.setColor(Color.ORANGE);
g.fillRect(foodXpos[xPos], foodYpos[yPos], 20, 20);
g.dispose();
for (int b = 1; b < lengtOfSnake; b++) {
if (snakeXlength[b] == snakeXlength[0] && snakeYlength[0] == snakeYlength[b]) {
right = false;
left = false;
up = false;
down = false;
over = true;
g.setColor(Color.WHITE);
g.setFont(new Font("game over", Font.BOLD, 20));
g.drawString("Game over", 300, 300);
g.drawString("press space bar to restart.", 300, 350);
thiss is meant to show off game over text.
}
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
points = 0;
moves = 0;
lengtOfSnake = 3;
over = false;
repaint();
xPos = random.nextInt(32);
yPos = random.nextInt(30);
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT && over != true) {
moves++;
right = true;
if (left != true) {
right = true;
} else {
right = false;
left = true;
}
down = false;
up = false;
}
if (e.getKeyCode() == KeyEvent.VK_LEFT && over != true) {
moves++;
left = true;
if (right != true) {
left = true;
} else {
left = false;
right = true;
}
down = false;
up = false;
}
if (e.getKeyCode() == KeyEvent.VK_UP && over != true) {
moves++;
up = true;
if (down != true) {
up = true;
} else {
up = false;
down = true;
}
left = false;
right = false;
}
if (e.getKeyCode() == KeyEvent.VK_DOWN && over != true) {
moves++;
down = true;
if (up != true) {
down = true;
} else {
up = true;
down = false;
}
left = false;
right = false;
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void actionPerformed(ActionEvent e) {
timer.start();
if (right) {
for (int r = lengtOfSnake - 1; r >= 0; r--) {
snakeYlength[r + 1] = snakeYlength[r];
}
for (int r = lengtOfSnake; r >= 0; r--) {
if (r == 0) {
snakeXlength[r] = snakeXlength[r] + 20;
} else {
snakeXlength[r] = snakeXlength[r - 1];
}
if (snakeXlength[r] > 860) {
snakeXlength[r] = 20;
}
}
repaint();
}
if (left) {
for (int r = lengtOfSnake - 1; r >= 0; r--) {
snakeYlength[r + 1] = snakeYlength[r];
}
for (int r = lengtOfSnake; r >= 0; r--) {
if (r == 0) {
snakeXlength[r] = snakeXlength[r] - 20;
} else {
snakeXlength[r] = snakeXlength[r - 1];
}
if (snakeXlength[r] < 20) {
snakeXlength[r] = 860;
}
}
repaint();
}
if (up) {
for (int r = lengtOfSnake - 1; r >= 0; r--) {
snakeXlength[r + 1] = snakeXlength[r];
}
for (int r = lengtOfSnake; r >= 0; r--) {
if (r == 0) {
snakeYlength[r] = snakeYlength[r] - 20;
} else {
snakeYlength[r] = snakeYlength[r - 1];
}
if (snakeYlength[r] < 20) {
snakeYlength[r] = 620;
}
}
repaint();
}
if (down) {
for (int r = lengtOfSnake - 1; r >= 0; r--) {
snakeXlength[r + 1] = snakeXlength[r];
}
for (int r = lengtOfSnake; r >= 0; r--) {
if (r == 0) {
snakeYlength[r] = snakeYlength[r] + 20;
} else {
snakeYlength[r] = snakeYlength[r - 1];
}
if (snakeYlength[r] > 620) {
snakeYlength[r] = 20;
}
}
repaint();
}
}
}
解决方案
推荐阅读
- mongodb - PyMongo 查询,多条语句指向 BSON 文档的同一部分
- python-3.x - Netfilterqueue,set_payload 不使用 python3 更改数据包
- ios - Azure SQL 数据库新创建的表不允许插入数据但所有旧表都允许插入数据
- javascript - 在 Vue.js 的监视中使用 try catch
- reactjs - 不变违规:当`goBack()` React Navigation 5 时需要 eventType 参数
- angular - 反应式表单验证但出现错误
- database - 在 Postgresql 的事务中创建唯一索引
- r - 在数据列中划分特定单元格
- database - Delphi:解析名称字符串以进行精确的数据库查找
- wix - 如何使用 Wix(版本 3.11)检查 .net 5