-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSnakegame-demo
149 lines (135 loc) · 4.73 KB
/
Snakegame-demo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<MainFrame>
package SnakeGame;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.Timer;
import java.util.TimerTask;
public class MainFrame extends JFrame {
// 成员变量
private Snake snake;//蛇
private JPanel JPanel;//游戏棋盘
private Timer timer;//定时器,在规定的时间调用蛇移动的方法
private Node food;//食物
public MainFrame() throws HeadlessException {
// 初始化窗体参数
iniFrame();
// 初始化游戏棋盘
iniGamePanel();
// 初始化蛇
initSnake();
// 初始化食物
initFood();
// 初始化定时器
initTimer();
// 设置键盘监听,让蛇随着上下左右方向移动
setKeyListener();
}
// 初始化食物
private void initFood() {
food = new Node();
food.random();
}
private void setKeyListener() {
addKeyListener(new KeyAdapter() {
// 当键盘按下时,会自动调用此方法
@Override
public void keyPressed(KeyEvent e) {
// 键盘的每一个键都有编号
switch (e.getKeyCode()) {
case KeyEvent.VK_UP://上键
// 改变蛇的运动方向
if (snake.getDirection() != Direction.DOWN) {
snake.setDirection(Direction.UP);
}
break;
case KeyEvent.VK_DOWN://下键
if (snake.getDirection() != Direction.UP) {
snake.setDirection(Direction.DOWN);
}
break;
case KeyEvent.VK_LEFT://左键
if (snake.getDirection() != Direction.RIGHT) {
snake.setDirection(Direction.LEFT);
}
break;
case KeyEvent.VK_RIGHT://右键
if (snake.getDirection() != Direction.LEFT) {
snake.setDirection(Direction.RIGHT);
}
break;
}
}
});
}
private void initTimer() {
// 创建定时器对象
timer = new Timer();
// 初始化定时任务
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
snake.move();
// 判断蛇头是否和食物重合
Node head = snake.getBody().getFirst();
if (head.getX() == food.getX() && head.getY() == food.getY()) {
snake.eat(food);
food.random();
}
// 重绘游戏棋盘
JPanel.repaint();
}
};
// 每100毫秒,执行一次定时任务
timer.scheduleAtFixedRate(timerTask, 0, 100);
}
private void initSnake() {
snake = new Snake();
}
// 初始化游戏棋盘
private void iniGamePanel() {
JPanel = new JPanel() {
// 绘制游戏棋盘中的内容
@Override
public void paint(Graphics g) {
// 清空棋盘
g.clearRect(0, 0, 600, 600);
//Graphics g 可以看做是一个画笔,提供了很多方法可以绘制一些基本的图形
// 绘制40条横线
for (int i = 0; i <= 40; i++) {
g.drawLine(0, i * 15, 600, i * 15);
}
// 绘制40条竖线
for (int i = 0; i <= 40; i++) {
g.drawLine(i * 15, 0, i * 15, 600);
}
// 绘制蛇
LinkedList<Node> body = snake.getBody();
for (Node node : body) {
g.fillRect(node.getX() * 15, node.getY() * 15, 15, 15);
}
// 绘制食物
g.setColor(Color.red);
g.fillOval(food.getX() * 15, food.getY() * 15, 15, 15);
}
};
// 把棋盘添加到窗体中
add(JPanel);
}
private void iniFrame() {
// 设置窗体宽高
setSize(620, 645);
// 设置窗体位置(距离屏幕位置)
setLocation(400, 400);
// 设置关闭按钮的作用 退出程序
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置窗体大小不可变
setResizable(false);
}
public static void main(String[] args) {
// 创建窗体对象,并显示
new MainFrame().setVisible(true);
}
}