使用javaGUI实现贪吃蛇小游戏

使用工具

idea编译器
exe4j

1.创建项目

创建包

2.创建StartGame类

package com.lhy.snake;
import  javax.swing.*;
public class StartGames {
    public static void main(String[] args){
        JFrame frame = new JFrame("贪吃蛇");            //创建一个JFARME窗口
        frame.setBounds(100,100,915,735);			//窗口起始位置在100,100,窗口大小为915,735
        frame.setResizable(false);					//设置窗口大小不可以改变
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口关闭程序结束
        frame.setVisible(true);						//窗口可见

        frame.add(new GamePanel());					//像窗口中添加一个画板,GamePanel为自建类
        			
    }
}

3.创建Data类引入游戏素材

package com.lhy.snake;
import javax.swing.*;
import java.net.URL;

public class Data {
    public static URL headerUrl =Data.class.getResource("/statics/header.png"); //定位图片地址
    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 URL bodyUrl =Data.class.getResource("/statics/body.png");
    public static URL foodUrl =Data.class.getResource("/statics/food.png");
    public static ImageIcon header = new ImageIcon(headerUrl);  //获取图片
    public static ImageIcon down = new ImageIcon(downUrl);
    public static ImageIcon up = new ImageIcon(upUrl);
    public static ImageIcon right = new ImageIcon(rightUrl);
    public static ImageIcon left = new ImageIcon(leftUrl);
    public static ImageIcon body = new ImageIcon(bodyUrl);
    public static ImageIcon food = new ImageIcon(foodUrl);
	//获取了全部游戏需要的图片素材

}

4.1 创建GamePanel类并继承 JPanel 实现KeyListener, ActionListener

	//定义数据
	int lenth;   //身体长度
    int[]snakeX = new int[600]; //身体数组
    int[]snakeY = new int[600];
    String fx; //方向
    boolean isStart = false; //游戏是否开始
    Timer timer = new Timer(100,this);//设置计时器的过程包括创建一个 Timer 对象,在该对象上注册一个或多个动作侦听器,以及使用 start 方法启动该计时器。
    //定义一个食物
    int foodX;
    int foodY;
    Random random=new Random(); //创建一个随机数生成对象
    //死亡判断
    boolean isFail = false;
    //积分系统
    int score;

4.2 写一个构造器

 public GamePanel(){ //构造器
        init();   //初始化函数
        //获取键盘的监听事件
        this.setFocusable(true);
        this.addKeyListener(this);
    }

4.3 编写初始化函数

 public void init(){
        //初始化
        lenth=3;		//起始长度为3格
        snakeX[0]=100; snakeY[0]=100; //头部坐标
        snakeX[1]=75; snakeY[1]=100;  //身体坐标
        snakeX[2]=50; snakeY[2]=100;
        fx="R";			//起始方向向右
        timer.start();	//计时器启动
        foodX =25 +25*random.nextInt(34);	//随机生成食物
        foodY =75 +25*random.nextInt(24);
        score=0;  //起始分数为0
    }

4.4 重写paintComponent函数

protected void paintComponent(Graphics g){

        super.paintComponent(g);//清屏
        this.setBackground(Color.white);//黑色背景
        //绘制头部
        Data.header.paintIcon(this,g,25,10);
        //绘制游戏区域
        g.fillRect(25,75,850,600); //绘制一个正方形区域  起始位置27,75 大小850 600
        //画一条静态蛇
        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<lenth;i++){     //绘制身体部分
            Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
        }
        //画食物
        Data.food.paintIcon(this,g,foodX,foodY);
        //游戏提示是否开始
        if(isStart==false){
            //画一个文字String
            g.setColor(Color.WHITE);//设置画笔颜色
            g.setFont(new Font("温软雅黑",Font.BOLD,40)); //设置字体
            g.drawString("按下空格开始游戏",300,300);  //在300 300的位置写下字符串
        }
        //失败提醒
        if(isFail==true){
            g.setColor(Color.RED);//设置画笔颜色
            g.setFont(new Font("温软雅黑",Font.BOLD,40)); //设置字体
            g.drawString("游戏结束,按下空格重新开始",150,300);
        }
        g.setColor(Color.BLACK);//设置画笔颜色
        g.setFont(new Font("温软雅黑",Font.BOLD,18)); //设置字体
        g.drawString(" "+score,500,50);  
    }

4.5 重写keyPressed函数

@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_LEFT&&!(fx.equals("R"))){   //根据按键方向修改蛇的前进路线
            fx="L";
        }else if(keyCode==KeyEvent.VK_RIGHT&&!(fx.equals("L"))){
            fx="R";
        }else if(keyCode==KeyEvent.VK_UP&&!(fx.equals("D"))){
            fx="U";
        }else if(keyCode==KeyEvent.VK_DOWN&&!(fx.equals("U"))){
            fx="D";
        }
    }

4.6 重写actionPerformed函数

 //定时器,监听时间
    @Override
    public void actionPerformed(ActionEvent e) {
        //执行定时操作
        //如果游戏处于开始状态 并且游戏没有失败
        if(isStart && !isFail){
            //右移

            for(int i=lenth-1;i>0;i--){//除了脑袋身体向前移动
                snakeX[i]=snakeX[i-1];
                snakeY[i]=snakeY[i-1];

            }
            //通过控制方向让头部移动
            if(fx.equals("R")){
                snakeX[0]+=25; //头部移动
                if(snakeX[0]>850){
                    snakeX[0]=25;
                }
            }else if(fx.equals("L")){
                snakeX[0]-=25; //头部移动
                if(snakeX[0]<25){
                    snakeX[0]=850;
                }
            }else if(fx.equals("U")){
                snakeY[0]-=25; //头部移动
                if(snakeY[0]<75){
                    snakeY[0]=650;
                }
            }else if(fx.equals("D")){
                snakeY[0]+=25; //头部移动
                if(snakeY[0]>650){
                    snakeY[0]=75;
                }
            }
            //如果头和食物坐标重合
            if(snakeX[0]==foodX&&snakeY[0]==foodY){
                lenth++;
                score++;
                //重新生成食物
                foodX =25 +25*random.nextInt(34);
                foodY =75 +25*random.nextInt(24);
            }
            for(int i=1;i<lenth;i++){  //判断头部是否与身体重合  如果重合isFail变为true
                if(snakeX[0]==snakeX[i] &&  snakeY[0]==snakeY[i]){
                    isFail=true;
                }
            }
            //刷新界面
            repaint();
        }
        timer.start();//让时间动起来
    }

4.创建GamePanel类 编写游戏画板 第四步全部代码

package com.lhy.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 lenth;   //身体长度
    int[]snakeX = new int[600]; //身体数组
    int[]snakeY = new int[600];
    String fx;
    boolean isStart = false;
    Timer timer = new Timer(100,this);//定时器
    //定义一个食物
    int foodX;
    int foodY;
    Random random=new Random();
    //死亡判断
    boolean isFail = false;
    //积分系统
    int score;
    public GamePanel(){ //构造器
        init();
        //获取键盘的监听事件
        this.setFocusable(true);
        this.addKeyListener(this);
    }
    public void init(){
        //初始化
        lenth=3;
        snakeX[0]=100; snakeY[0]=100; //头部坐标
        snakeX[1]=75; snakeY[1]=100;
        snakeX[2]=50; snakeY[2]=100;
        fx="R";
        timer.start();
        foodX =25 +25*random.nextInt(34);
        foodY =75 +25*random.nextInt(24);
        score=0;
    }
    //画板
    protected void paintComponent(Graphics g){
        super.paintComponent(g);//清屏
        this.setBackground(Color.white);//黑色背景
        //绘制头部
        Data.header.paintIcon(this,g,25,10);
        //绘制游戏区域
        g.fillRect(25,75,850,600);
        //画一条静态蛇
        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<lenth;i++){
            Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
        }
        //画食物
        Data.food.paintIcon(this,g,foodX,foodY);
        //游戏提示是否开始
        if(isStart==false){
            //画一个文字String
            g.setColor(Color.WHITE);//设置画笔颜色
            g.setFont(new Font("温软雅黑",Font.BOLD,40)); //设置字体
            g.drawString("按下空格开始游戏",300,300);
        }
        //失败提醒
        if(isFail==true){
            g.setColor(Color.RED);//设置画笔颜色
            g.setFont(new Font("温软雅黑",Font.BOLD,40)); //设置字体
            g.drawString("游戏结束,按下空格重新开始",150,300);
        }
        g.setColor(Color.BLACK);//设置画笔颜色
        g.setFont(new Font("温软雅黑",Font.BOLD,18)); //设置字体
        g.drawString(" "+score,500,50);
    }
    //监听键盘的输入
    @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_LEFT&&!(fx.equals("R"))){
            fx="L";
        }else if(keyCode==KeyEvent.VK_RIGHT&&!(fx.equals("L"))){
            fx="R";
        }else if(keyCode==KeyEvent.VK_UP&&!(fx.equals("D"))){
            fx="U";
        }else if(keyCode==KeyEvent.VK_DOWN&&!(fx.equals("U"))){
            fx="D";
        }
    }
    //定时器,监听时间
    @Override
    public void actionPerformed(ActionEvent e) {
        //执行定时操作
        //如果游戏处于开始状态 并且游戏没有失败
        if(isStart && !isFail){
            //右移

            for(int i=lenth-1;i>0;i--){//除了脑袋身体向前移动
                snakeX[i]=snakeX[i-1];
                snakeY[i]=snakeY[i-1];

            }
            //通过控制方向让头部移动
            if(fx.equals("R")){
                snakeX[0]+=25; //头部移动
                if(snakeX[0]>850){
                    snakeX[0]=25;
                }
            }else if(fx.equals("L")){
                snakeX[0]-=25; //头部移动
                if(snakeX[0]<25){
                    snakeX[0]=850;
                }
            }else if(fx.equals("U")){
                snakeY[0]-=25; //头部移动
                if(snakeY[0]<75){
                    snakeY[0]=650;
                }
            }else if(fx.equals("D")){
                snakeY[0]+=25; //头部移动
                if(snakeY[0]>650){
                    snakeY[0]=75;
                }
            }
            //如果头和食物坐标重合
            if(snakeX[0]==foodX&&snakeY[0]==foodY){
                lenth++;
                score++;
                //重新生成食物
                foodX =25 +25*random.nextInt(34);
                foodY =75 +25*random.nextInt(24);
            }
            for(int i=1;i<lenth;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) {
        //键盘按下弹起
    }
}

5.导出项目为jar包

在这里插入图片描述
点击此处
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样就导出了jar包 可以在cmd中运行 也可以继续打包成exe文件

6 打包成exe程序

https://jingyan.baidu.com/article/0964eca2a3a07f8285f536a4.html

发布了18 篇原创文章 · 获赞 5 · 访问量 338

猜你喜欢

转载自blog.csdn.net/qq_37076940/article/details/104878058