GUI编写贪吃蛇小游戏
1.游戏主启动类
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);
}
}
2.游戏面板类
package com.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;
//2游戏面板
public class GamePanel extends JPanel implements KeyListener , ActionListener {
//使用画笔绘制面板
int lenght;//蛇的长度
int[] snakeX=new int[600];//蛇的x坐标
int[] snakeY=new int[600];//蛇的y坐标
String direction;//方向
boolean isStart=false;//默认暂停状态
boolean isfail=false;//判断游戏是否失败
int score;//记录分数
//定时器
Timer timer=new Timer(100,this);//100毫秒执行一次
//食物坐标
int foolx;
int fooly;
Random random=new Random();
//构造器
public GamePanel(){
init();
this.setFocusable(true);//获得焦点事件
this.addKeyListener(this);//获得键盘监听
timer.start();
}
//初始化小蛇
public void init(){
lenght=3;//初始长度为3
snakeX[0]=100;snakeY[0]=100;//头部位置
snakeX[1]=75;snakeY[1]=100;//第一个身体
snakeX[2]=50;snakeY[2]=100;//第二个身体
direction="R";//初始方向向右
//随机分配食物
foolx=25+25*random.nextInt(34);
fooly=75+25*random.nextInt(24);
score=0;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);//可清屏
//3绘制静态面板
this.setBackground(Color.white);
Data.header.paintIcon(this,g,25,11);//头部广告栏
g.fillRect(25,75,850,600);//默认游戏界面
//判断移动方向,并根据移动方向设置小蛇头部方向
if(direction.equals("R")){
Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if(direction.equals("L")){
Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if(direction.equals("U")){
Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if(direction.equals("D")){
Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
}
//根据长度设置小蛇长度
for (int i = 1; i < lenght; i++) {
Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
}
//积分描述
g.setColor(Color.white);
g.setFont(new Font("微软雅黑",Font.BOLD,13));
g.drawString("长度 "+lenght,750,30);
g.drawString("分数 "+score,750,47);
//食物生成
Data.fool.paintIcon(this,g,foolx,fooly);
//游戏状态
if(isStart==false){
g.setColor(Color.white);
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.drawString("按下空格启动游戏",300,300);
}
if(isfail){
g.setColor(Color.white);
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){
//isfail为true时,游戏失败
if(isfail){
//重新开始
isfail=false;
init();
}else {
isStart=!isStart;//取反
repaint();
}
}
//根据键盘键判断小蛇移动方向
if(keycode==KeyEvent.VK_UP){
direction="U";
}else if(keycode==KeyEvent.VK_DOWN){
direction="D";
}else if(keycode==KeyEvent.VK_RIGHT){
direction="R";
}else if(keycode==KeyEvent.VK_LEFT){
direction="L";
}
}
//事件监听--需要通过固定时间监听
@Override
public void actionPerformed(ActionEvent e) {
if(isStart&&isfail==false){
//判断是否吃到食物,如果吃到,则长度加1,分数加10,并重新生成食物
if(snakeX[0]==foolx && snakeY[0]==fooly){
lenght++;//吃到食物长度加一
score+=10;//分数加10
foolx=25+25*random.nextInt(34);
fooly=75+25*random.nextInt(24);
}
//移动
for (int i=lenght-1;i>0;i--){//后一节覆盖前一节
snakeX[i]=snakeX[i-1];
snakeY[i]=snakeY[i-1];
}
if(direction.equals("R")){
snakeX[0]=snakeX[0]+25;
if(snakeX[0]>850){
snakeX[0]=25;
}//边界判断
}else if(direction.equals("L")){
snakeX[0]=snakeX[0]-25;
if(snakeX[0]<25){
snakeX[0]=850;
}//边界判断
}else if(direction.equals("U")){
snakeY[0]=snakeY[0]-25;
if(snakeY[0]<75){
snakeY[0]=650;
}//边界判断
}else if(direction.equals("D")){
snakeY[0]=snakeY[0]+25;
if(snakeY[0]>650){
snakeY[0]=75;
}//边界判断
}
//判断失败
for (int i = 1; i < lenght; i++) {
if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){
isfail=true;
}
}
repaint();//重画页面
}
timer.start();//定时器开启
}
@Override
public void keyReleased(KeyEvent e) {}
@Override
public void keyTyped(KeyEvent e) {}
}
3.图片资源存放
//用于存放图片等数据信息
public class Data {
//获取图片路径
public static URL headerURL=Data.class.getResource("static/header.png");
public static ImageIcon header = new ImageIcon(headerURL);
//获取图片路径
public static URL bodyURL=Data.class.getResource("static/body.png");
public static ImageIcon body = new ImageIcon(bodyURL);
//获取图片路径
public static URL upURL=Data.class.getResource("static/up.png");
public static ImageIcon up = new ImageIcon(upURL);
//获取图片路径
public static URL downURL=Data.class.getResource("static/down.png");
public static ImageIcon down = new ImageIcon(downURL);
//获取图片路径
public static URL rightURL=Data.class.getResource("static/right.png");
public static ImageIcon right = new ImageIcon(rightURL);
//获取图片路径
public static URL leftURL=Data.class.getResource("static/left.png");
public static ImageIcon left = new ImageIcon(leftURL);
//获取图片路径
public static URL foolURL=Data.class.getResource("static/fool.png");
public static ImageIcon fool = new ImageIcon(foolURL);
}
注:本例子为视频学习笔记。
参考视频来源于https://www.bilibili.com/video/BV1DJ411B75F