Day15 2021.3.30
贪吃蛇游戏
帧,如果时间片足够小,就是动画,一秒30帧
键盘监听
计数器Timer
package com.hong.Day011_Day020.Day015.Demo01;
import javax.swing.*;
//游戏的主启动类
public class StartGame {
public static void main(String[] args) {
JFrame frame = new JFrame("贪吃蛇小游戏");
frame.setBounds(10,10,900,720);
frame.setResizable(false);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(new GamePanel());
frame.setVisible(true);
}
}
package com.hong.Day011_Day020.Day015.Demo01;
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];//蛇的x坐标
int[] snakeY = new int[500];//蛇的y坐标
String fx;//初始方向向右
//食物的坐标
int foodX;
int foodY;
Random random = new Random();
//成绩
int score;//成绩
//游戏当前的状态: 开始、停止
boolean isStart = false;//默认停止
//游戏失败状态: 失败、未失败
boolean isFail = false;//默认失败
//定时器
int TT = 50;
Timer timer = new Timer(TT,this);//100毫秒执行一次
//初始化构造器
public GamePanel() {
init();
//获取焦点和键盘事件
this.setFocusable(true);//获得焦点事件
this.addKeyListener(this);//获得键盘事件
timer.start();//游戏一开始定时器就启动
}
//初始化方法
public void init(){
length = 3;
snakeX[0] = 100;snakeY[0] = 100;//脑袋的坐标
snakeX[1] = 75;snakeY[1] = 100;//第一个身体的坐标
snakeX[2] = 50;snakeY[2] = 100;//第二个身体的坐标
fx = "right";
//把食物随机分布在界面上
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);
Data123.header.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,60);
//画食物
Data123.food.paintIcon(this,g,foodX,foodY);
//把小蛇画上去
if (fx.equals("right")){
Data123.right.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向右
}else if (fx.equals("left")){
Data123.left.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if (fx.equals("up")){
Data123.up.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if (fx.equals("down")){
Data123.down.paintIcon(this,g,snakeX[0],snakeY[0]);
}
for (int i = 1; i < length; i++)