b站狂神说Java一小时开发贪吃蛇游戏
事前准备
新建一个snake java project
在snake中新建一个statics包存放素材
静态页面绘制
运用到GUI编程知识
-
绘制一个JFrame窗口
设置窗口大小时要注意public class Lsnake { public static void main(String[] args) { // TODO Auto-generated method stub JFame frame = new JFrame("贪吃蛇小游戏"); //绘制一个静态窗口 JFrame frame.setBounds(x:10, y:10, width:900,height:720); //设置了一个距离起点为(10,10)的,宽为900,高为720的静态窗口 } }
起点(0,0)是屏幕左上角
-
设置可视化和设置可关闭
frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
绘制游戏面板
- Graphics g: 画笔
所有东西都要通过g绘画上去 - 新建一个面板
public class MPanel extends JPanel{ public void paintComponent(Graphics g) { super.paintComponents(g); //清屏 this.setBackground(Color.WHITE); //设置白色的背景
- JPanel添加到JFrame中
frame.add(new MPanel());
- 新建一个类存放外部数据
public class Data { // 顶部的图片 public static URL headURL = Data.class.getResource("/statics/title.jpg"); public static ImageIcon header = new ImageIcon(headURL); // 头部 public static URL upURL = Data.class.getResource("/statics/up.png"); public static URL downURL = Data.class.getResource("/statics/down.png"); public static URL rightURL = Data.class.getResource("/statics/right.png"); public static URL leftURL = Data.class.getResource("/statics/left.png"); public static ImageIcon up = new ImageIcon(upURL); public static ImageIcon down = new ImageIcon(downURL); public static ImageIcon right = new ImageIcon(rightURL); public static ImageIcon left = new ImageIcon(leftURL); // 身体 public static URL bodyURL = Data.class.getResource("/statics/body.png"); public static ImageIcon body = new ImageIcon(bodyURL); // 食物 public static URL foodURL = Data.class.getResource("/statics/food.png"); public static ImageIcon food = new ImageIcon(foodURL); }
- 在游戏面板中绘制
//绘制顶部的广告栏 Data.header.paintIcon(this, g, 25, 11); //离X轴25,离Y轴11的距离 //绘制游戏区域 g.fillRect(25, 75, 850, 600);
- 画一条静态的蛇
public class MPanel extends JPanel{ int length; //蛇的长度 int[] snakeX = new int[600]; //蛇的坐标X int[] snakeY = new int[600]; //蛇的坐标Y String fx ; } //初始化 public void init() { length = 3; snakeX[0] = 100;snakeY[0] = 100; //头部坐标 snakeX[1] = 75;snakeY[1] = 100; //第一个身体坐标 snakeX[2] = 50;snakeY[2] = 100; //第二个身体坐标 } for(int i = 1; i<length; i++) { Data.body.paintIcon(this, g, snakeX[i], snakeY[i]); //蛇的身体长度通过length来控制 } //画一条静态的小蛇 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]); }
让小蛇动起来
- 定时器
Timer timer = new Timer(100,this); //定时器
- 键盘监听
// 构造器 public MPanel() { init(); // 获取键盘的监听事件 this.setFocusable(true); this.addKeyListener(this); timer.start(); //让时间动起来 } // 死亡判断 boolean isFail = false; // 接收键盘的输入:监听 @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub // 获取按下的键盘是哪个键 int KetCode = e.getKeyCode(); if(KetCode==KeyEvent.VK_SPACE) { //如果按下空格键,启动 if(isFail) { // 失败,游戏再来一遍 isFail = false; init(); //重新初始化游戏 }else { // 暂停游戏 isStart = !isStart; } repaint(); //刷新界面 }```
吃食物
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;
//如果小蛇的头和食物坐标重合了
if(snakeX[0] == foodx && snakeY[0] == foody){
length++; //长度+1
score = score+10;
//重新生成食物
foodx = 25 + 25*random.nextInt(34);
foody = 75 + 25*random.nextInt(24);
}
死亡判断
// 死亡判断
boolean isFail = false;
public void paintComponent(Graphics g) {
//结束判断
for(int i = 1; i < length; i++) {
if(snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]) {
isFail = true;
}
}
// 刷新界面
repaint();
}