📄 mainframe.java
字号:
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
//用JinternalFrame不知道为什么设置好的大小会被自动改变
public class MainFrame extends JFrame implements Runnable {
public static final int WIDTH = 800;
public static final int HEIGHT = 630;
Snake snake = new Snake();
Rect blood;
int eatBloodCount = 0;
boolean bOver = false;
int timeInv = 500;
boolean keyRel = true;
enum DIRECTION {
UP, DOWN, LEFT, RIGHT
};
DIRECTION dir = DIRECTION.RIGHT;
public MainFrame() {
blood = Rect.getBlood();
this.addKeyListener(new FrameKeyboardListener());
this.setSize(WIDTH, HEIGHT);
this.setTitle("贪吃蛇游戏-林蒋");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setResizable(false);
this.setVisible(true);
new Thread(this).start();
}
public void paint(Graphics g) {
super.paint(g);
if (!bOver) {
snake.drawSnake(g);
blood.drawRect(g);
g.drawString("已吃数目: " + eatBloodCount, MainFrame.WIDTH - 120,
MainFrame.HEIGHT - 20);
} else {
String gameOver = "Game Over";
g.drawString(gameOver, (MainFrame.WIDTH - gameOver.length()) / 2,
(MainFrame.HEIGHT - 30) / 2);
g.drawString("总共吃的数目: " + eatBloodCount, MainFrame.WIDTH - 120,
MainFrame.HEIGHT - 20);
}
}
class FrameKeyboardListener extends KeyAdapter {
@Override
public void keyReleased(KeyEvent e) {
super.keyReleased(e);
super.keyPressed(e);
int keycode = e.getKeyCode();
switch (keycode) {
case KeyEvent.VK_UP:
case KeyEvent.VK_DOWN:
case KeyEvent.VK_LEFT:
case KeyEvent.VK_RIGHT:
keyRel = true;
}
}
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
int keycode = e.getKeyCode();
switch (keycode) {
case KeyEvent.VK_UP:
if (!bOver && dir != DIRECTION.DOWN) {
if ((snake.snakeList.getLast().y - Rect.HEIGHT) >= 30) {
Rect up = new Rect(snake.snakeList.getLast().x,
snake.snakeList.getLast().y - Rect.HEIGHT);
if (Rect.isInSnakeBody(up)) {
bOver = true;
repaint();
return;
}
snake.addRect(up);
if (Rect.isInSnakeBody(blood)) {
snake.addRect(blood);
eatBloodCount++;
blood = Rect.getBlood();
} else {
snake.snakeList.remove();
}
dir = DIRECTION.UP;
keyRel = false;
} else {
bOver = true;
repaint();
return;
}
}
repaint();
break;
case KeyEvent.VK_DOWN:
if (!bOver && dir != DIRECTION.UP) {
if ((snake.snakeList.getLast().y + Rect.HEIGHT) <= (MainFrame.HEIGHT - Rect.HEIGHT)) {
Rect down = new Rect(snake.snakeList.getLast().x,
snake.snakeList.getLast().y + Rect.HEIGHT);
if (Rect.isInSnakeBody(down)) {
bOver = true;
repaint();
return;
}
snake.addRect(down);
if (Rect.isInSnakeBody(blood)) {
snake.addRect(blood);
eatBloodCount++;
blood = Rect.getBlood();
} else {
snake.snakeList.remove();
}
dir = DIRECTION.DOWN;
keyRel = false;
} else {
bOver = true;
repaint();
return;
}
}
repaint();
break;
case KeyEvent.VK_LEFT:
if (!bOver && dir != DIRECTION.RIGHT) {
if ((snake.snakeList.getLast().x - Rect.WIDTH) >= 0) {
// System.out.println(snake.snakeList.getLast().x );
Rect left = new Rect(snake.snakeList.getLast().x
- Rect.WIDTH, snake.snakeList.getLast().y);
if (Rect.isInSnakeBody(left)) {
bOver = true;
repaint();
return;
}
snake.addRect(left);
if (Rect.isInSnakeBody(blood)) {
snake.addRect(blood);
eatBloodCount++;
blood = Rect.getBlood();
} else {
snake.snakeList.remove();
}
dir = DIRECTION.LEFT;
keyRel = false;
} else {
bOver = true;
repaint();
return;
}
}
repaint();
break;
case KeyEvent.VK_RIGHT:
if (!bOver && dir != DIRECTION.LEFT) {
if ((snake.snakeList.getLast().x + Rect.WIDTH) <= (MainFrame.WIDTH - Rect.WIDTH)) {
Rect right = new Rect(snake.snakeList.getLast().x
+ Rect.WIDTH, snake.snakeList.getLast().y);
if (Rect.isInSnakeBody(right)) {
bOver = true;
repaint();
return;
}
snake.addRect(right);
if (Rect.isInSnakeBody(blood)) {
snake.addRect(blood);
eatBloodCount++;
blood = Rect.getBlood();
} else {
snake.snakeList.remove();
}
dir = DIRECTION.RIGHT;
keyRel = false;
} else {
bOver = true;
repaint();
return;
}
}
repaint();
break;
}
}
}
public void run() {
// System.out.println("aaaaaaaaa----------"+this.getWidth());
while (!bOver) {
if (keyRel) {
switch (dir) {
case UP:
if ((snake.snakeList.getLast().y - Rect.HEIGHT) >= 30) {
Rect up = new Rect(snake.snakeList.getLast().x,
snake.snakeList.getLast().y - Rect.HEIGHT);
if (Rect.isInSnakeBody(up)) {
bOver = true;
repaint();
return;
}
snake.addRect(up);
if (Rect.isInSnakeBody(blood)) {
snake.addRect(blood);
eatBloodCount++;
blood = Rect.getBlood();
} else {
snake.snakeList.remove();
}
} else {// 碰到墙壁了
bOver = true;
repaint();
return;
}
repaint();
break;
case DOWN:
if ((snake.snakeList.getLast().y + Rect.HEIGHT) <= (MainFrame.HEIGHT - Rect.HEIGHT)) {
Rect down = new Rect(snake.snakeList.getLast().x,
snake.snakeList.getLast().y + Rect.HEIGHT);
if (Rect.isInSnakeBody(down)) {
bOver = true;
repaint();
return;
}
snake.addRect(down);
if (Rect.isInSnakeBody(blood)) {
snake.addRect(blood);
eatBloodCount++;
blood = Rect.getBlood();
} else {
snake.snakeList.remove();
}
} else {
bOver = true;
repaint();
return;
}
repaint();
break;
case LEFT:
if ((snake.snakeList.getLast().x - Rect.WIDTH) >= 0) {
Rect left = new Rect(snake.snakeList.getLast().x
- Rect.WIDTH, snake.snakeList.getLast().y);
if (Rect.isInSnakeBody(left)) {
bOver = true;
repaint();
return;
}
snake.addRect(left);
if (Rect.isInSnakeBody(blood)) {
snake.addRect(blood);
eatBloodCount++;
blood = Rect.getBlood();
} else {
snake.snakeList.remove();
}
} else {
bOver = true;
repaint();
return;
}
repaint();
break;
case RIGHT:
// System.out.println(this.getWidth());
if ((snake.snakeList.getLast().x + Rect.WIDTH) <= (MainFrame.WIDTH - Rect.WIDTH)) {
Rect right = new Rect(snake.snakeList.getLast().x
+ Rect.WIDTH, snake.snakeList.getLast().y);
if (Rect.isInSnakeBody(right)) {
bOver = true;
repaint();
return;
}
snake.addRect(right);
if (Rect.isInSnakeBody(blood)) {
snake.addRect(blood);
eatBloodCount++;
blood = Rect.getBlood();
} else {
snake.snakeList.remove();
}
} else {
bOver = true;
repaint();
return;
}
repaint();
break;
}
}
try {
Thread.sleep(timeInv);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -