废话不多说,直接奉上代码:
Frame.java
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
|
package snake; import java.awt.Graphics; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; public class Frame extends JFrame implements KeyListener { /** * */ Boolean isAlive; Boolean isPause; Panel panel; Character direction; private static final long serialVersionUID = 1L; public Frame(){ // TODO Auto-generated constructor stub setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize( 300 , 300 ); addKeyListener( this ); panel = new Panel(); add(panel); setVisible( true ); isAlive = true ; isPause = false ; direction = new Character( 'd' ); MenuBar menuBar = new MenuBar(); Menu menu = new Menu( "menu" ); MenuItem reset = new MenuItem( "newgame" ); MenuItem pause= new MenuItem( "pause" ); pause.addActionListener( new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if (!isPause) isPause= true ; else isPause= false ; } }); reset.addActionListener( new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub reset(); } }); menu.add(reset); menu.add(pause); menuBar.add(menu); setMenuBar(menuBar); } public void reset(){ panel.reset(); isAlive = true ; } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub if (e.getKeyCode()==KeyEvent.VK_UP) direction = 'w' ; if (e.getKeyCode()==KeyEvent.VK_DOWN) direction = 's' ; if (e.getKeyCode()==KeyEvent.VK_LEFT) direction = 'a' ; if (e.getKeyCode()==KeyEvent.VK_RIGHT) direction = 'd' ; } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } public void paint(Graphics g){ panel.repaint(); } } |
Launch.java
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
|
package snake; import java.util.Timer; import java.util.TimerTask; public class Launch extends TimerTask { Frame frame = new Frame(); public Launch() { // TODO Auto-generated constructor stub } boolean crashWall(){ SnakeBody sb = frame.panel.snake.getFirst(); if ((sb.x< 0 )||(sb.y< 0 )||(sb.x>=Panel.LINE)||(sb.y>=Panel.LINE)) return true ; else return false ; } void initial(){ frame.panel.snake.add(newBody()); frame.panel.food = newBody(); } @Override public void run() { // TODO Auto-generated method stub if (frame.panel.snake.isEmpty()) initial(); if (frame.isAlive) if (!frame.isPause){ if (goStraight()) frame.isAlive = false ; frame.repaint(); } if (crashWall()) frame.isAlive = false ; } SnakeBody newBody(){ SnakeBody sb = new SnakeBody(); boolean overlap = true ; while (overlap){ overlap = false ; sb.x = ( int ) (Math.random()*(Panel.LINE- 2 )+ 1 ); sb.y = ( int ) (Math.random()*(Panel.LINE- 2 )+ 1 ); if (!frame.panel.snake.isEmpty()) for (SnakeBody s : frame.panel.snake) if (sb.equals(s)) overlap = true ; } return sb; } void eat(SnakeBody sb){ frame.panel.snake.addFirst(sb); } boolean goStraight(){ boolean result = false ; SnakeBody sb = new SnakeBody(frame.panel.snake.getFirst()); frame.panel.snake.removeLast(); if (frame.direction== 'w' ) sb.turnUp(); if (frame.direction== 's' ) sb.turnDown(); if (frame.direction== 'a' ) sb.turnLeft(); if (frame.direction== 'd' ) sb.turnRight(); for (SnakeBody s : frame.panel.snake){ if (sb.equals(s)) result = true ; } frame.panel.snake.addFirst(sb); if (sb.equals(frame.panel.food)){ if (frame.direction== 'w' ) frame.panel.food.turnUp(); if (frame.direction== 's' ) frame.panel.food.turnDown(); if (frame.direction== 'a' ) frame.panel.food.turnLeft(); if (frame.direction== 'd' ) frame.panel.food.turnRight(); eat(frame.panel.food); frame.panel.food = newBody(); } return result; } public static void main(String[] args){ // TODO Auto-generated method stub Launch timertask = new Launch(); Timer timer = new Timer(); timer.schedule(timertask, 0 , 500 ); } } |
Panel.java
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
|
package snake; import java.awt.Color; import java.awt.Graphics; import java.util.LinkedList; import javax.swing.JPanel; public class Panel extends JPanel { /** * */ private static final long serialVersionUID = 1L; public LinkedList<SnakeBody> snake = new LinkedList<SnakeBody>(); static final int LINE = 10 ; SnakeBody food = new SnakeBody(- 99 ,- 99 ); public Panel() { // TODO Auto-generated constructor stub } public void reset(){ snake.clear(); } public void paint(Graphics g){ g.setColor(Color.white); g.fillRect( 0 , 0 , getWidth(), getHeight()); for (SnakeBody sb : snake){ g.setColor(Color.black); g.drawRect(sb.x*getWidth()/LINE,sb.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE); g.setColor(Color.orange); g.fillRect(sb.x*getWidth()/LINE,sb.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE); } g.setColor(Color.red); g.fillRect(food.x*getWidth()/LINE,food.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE); } } |
SnakeBody.java
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
|
package snake; class SnakeBody { int x; int y; public SnakeBody() { // TODO Auto-generated constructor stub x = 0 ; y = 0 ; } public SnakeBody( int a, int b){ x = a; y = b; } public SnakeBody(SnakeBody sb){ this (sb.x,sb.y); } public void turnUp(){ y--; } public void turnDown(){ y++; } public void turnLeft(){ x--; } public void turnRight(){ x++; } boolean equals(SnakeBody s){ if ((x==s.x)&&(y==s.y)) return true ; else return false ; } } |
以上所述就是本文给大家分享的贪吃蛇的全部代码了,希望能够对大家熟练掌握java有所帮助。