GUI编程 --> 贪吃蛇游戏
狂神说的详细视频教程
1. 一些概念
帧:如果时间片足够小,就是动画。如1s 30帧。帧拆开就是静态的图片。键盘监听定时器:Timer类
2. 思路
①定义数据②绘制图形③添加监听事件
3. 代码实现
3.1 Data
package com
.anobabe
.snake
;
import javax
.swing
.*
;
import java
.net
.URL
;
public class Data {
public static URL titleURL
= Data
.class.getResource("pic/title.jpg");
public static ImageIcon title
= new ImageIcon(titleURL
);
public static URL upURL
= Data
.class.getResource("pic/up.png");
public static URL downURL
= Data
.class.getResource("pic/down.png");
public static URL leftURL
= Data
.class.getResource("pic/left.png");
public static URL rightURL
= Data
.class.getResource("pic/right.png");
public static ImageIcon up
= new ImageIcon(upURL
);
public static ImageIcon down
= new ImageIcon(downURL
);
public static ImageIcon left
= new ImageIcon(leftURL
);
public static ImageIcon right
= new ImageIcon(rightURL
);
public static URL bodyURL
= Data
.class.getResource("pic/body.png");
public static ImageIcon body
= new ImageIcon(bodyURL
);
public static URL foodURL
= Data
.class.getResource("pic/food.png");
public static ImageIcon food
= new ImageIcon(foodURL
);
}
3.2 StartGame
package com
.anobabe
.snake
;
import javax
.swing
.*
;
public class StartGame {
public static void main(String
[] args
) {
JFrame frame
= new JFrame("SnakeGame");
frame
.setBounds(10,10,920,745);
frame
.setResizable(false);
frame
.setDefaultCloseOperation(WindowConstants
.EXIT_ON_CLOSE
);
frame
.add(new GamePanel());
frame
.setVisible(true);
}
}
3.3 GamePanel
package com
.anobabe
.snake
;
import javax
.swing
.*
;
import java
.awt
.*
;
import java
.awt
.event
.ActionEvent
;
import java
.awt
.event
.ActionListener
;
import java
.awt
.event
.KeyEvent
;
import java
.awt
.event
.KeyListener
;
import java
.util
.Random
;
public class GamePanel extends JPanel implements KeyListener, ActionListener
{
int length
;
int[] snakeX
= new int[600];
int[] snakeY
= new int[500];
String fx
;
int foodX
;
int foodY
;
Random random
= new Random();
int score
;
boolean isStart
= false;
boolean isFail
= false;
public GamePanel() {
init();
this.setFocusable(true);
this.addKeyListener(this);
timer
.start();
}
Timer timer
= new Timer(100,this);
public void init(){
length
= 3;
snakeX
[0] = 100;snakeY
[0] = 100;
snakeX
[1] = 75;snakeY
[1] = 100;
snakeX
[2] = 50;snakeY
[2] = 100;
fx
= "R";
foodX
= 25 + 25* random
.nextInt(34);
foodY
= 75 + 25* random
.nextInt(24);
score
= 0;
}
@Override
protected void paintComponent(Graphics g
) {
super.paintComponent(g
);
this.setBackground(Color
.WHITE
);
Data
.title
.paintIcon(this,g
,25,11);
g
.fillRect(25,75,850,600);
g
.setColor(Color
.WHITE
);
g
.setFont(new Font("微软雅黑",Font
.BOLD
,18));
g
.drawString("长度:" + length
, 750,35);
g
.drawString("分数:" + score
,750,50);
Data
.food
.paintIcon(this,g
,foodX
,foodY
);
if(fx
.equals("R")){
Data
.right
.paintIcon(this,g
,snakeX
[0],snakeY
[0]);
}else if(fx
.equals("L")){
Data
.left
.paintIcon(this,g
,snakeX
[0],snakeY
[0]);
}else if(fx
.equals("U")){
Data
.up
.paintIcon(this,g
,snakeX
[0],snakeY
[0]);
}else if(fx
.equals("D")){
Data
.down
.paintIcon(this,g
,snakeX
[0],snakeY
[0]);
}
for(int i
= 1; i
< length
; i
++){
Data
.body
.paintIcon(this,g
,snakeX
[i
],snakeY
[i
]);
}
if(isStart
== false){
g
.setColor(Color
.WHITE
);
g
.setFont(new Font("微软雅黑",Font
.BOLD
,40));
g
.drawString("按下空格开始游戏",300,300);
}
if(isFail
){
g
.setColor(Color
.RED
);
g
.setFont(new Font("微软雅黑",Font
.BOLD
,40));
g
.drawString("失败,按下空客重新开始游戏",300,300);
}
}
@Override
public void keyPressed(KeyEvent e
) {
int keyCode
= e
.getKeyCode();
if(keyCode
== KeyEvent
.VK_SPACE
){
if(isFail
){
isFail
= false;
init();
}else{
isStart
= !isStart
;
}
repaint();
}
if(keyCode
== KeyEvent
.VK_UP
){
fx
= "U";
}else if(keyCode
== KeyEvent
.VK_DOWN
){
fx
= "D";
}else if(keyCode
== KeyEvent
.VK_LEFT
){
fx
= "L";
}else if(keyCode
== KeyEvent
.VK_RIGHT
){
fx
= "R";
}
}
@Override
public void actionPerformed(ActionEvent e
) {
if(isStart
&& isFail
== false){
if(snakeX
[0] == foodX
&& snakeY
[0] == foodY
){
length
++;
score
= score
+ 10;
foodX
= 25 + 25* random
.nextInt(34);
foodY
= 75 + 25* random
.nextInt(24);
}
for(int i
= length
-1; i
> 0; i
--){
snakeX
[i
] = snakeX
[i
-1];
snakeY
[i
] = snakeY
[i
-1];
}
if(fx
== "R"){
snakeX
[0] = snakeX
[0] + 25;
if(snakeX
[0] > 850){ snakeX
[0] = 25;}
}else if(fx
== "L"){
snakeX
[0] = snakeX
[0] - 25;
if(snakeX
[0] < 25){ snakeX
[0] = 850;}
}else if(fx
== "U"){
snakeY
[0] = snakeY
[0] - 25;
if(snakeY
[0] < 75){ snakeY
[0] = 650;}
}else if(fx
== "D") {
snakeY
[0] = snakeY
[0] + 25;
if (snakeY
[0] > 650) { snakeY
[0] = 75;}
}
for(int i
= 1; i
< length
; i
++){
if(snakeX
[0] == snakeX
[i
] && snakeY
[0] == snakeY
[i
]){
isFail
= true;
}
}
repaint();
}
timer
.start();
}
@Override
public void keyTyped(KeyEvent e
) {}
@Override
public void keyReleased(KeyEvent e
) {}
}
4. 运行结果界面
转载请注明原文地址:https://blackberry.8miu.com/read-27183.html