搜索
首页JavaJava入门利用java实现一个简单的贪吃蛇小游戏

利用java实现一个简单的贪吃蛇小游戏

Oct 20, 2020 pm 04:37 PM
java贪吃蛇

利用java实现一个简单的贪吃蛇小游戏

GUI编程实现贪吃蛇小游戏

(推荐教程:java课程

1、编写主方法实现启动类

2、准备好素材图片,编写数据类

3、代码主体部分:在panel面板上实现游戏初始化,键盘和事件的监听等功能

4、代码运行效果图

5、GitHub源码链接

1、编写主方法实现启动类

		import javax.swing.*;
        //主启动类
 		public class StartGame {
 	    public static void main(String[] args) {
        JFrame jFrame = new JFrame("贪吃蛇小游戏");
        jFrame.setBounds(10,10,900,720);
        jFrame.setResizable(false);  //设置窗口大小不可变
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //面板
        jFrame.add(new GamePanel());
        jFrame.setVisible(true);
    }
}

2、准备好素材图片,编写数据类

import javax.swing.*;
import java.net.URL;


public class Data {
    //头部图片
    public static URL headerURL = Data.class.getResource("statics/header.png");
    public static ImageIcon header = new ImageIcon(headerURL);
    //头部上下左右
    public static URL upURL = Data.class.getResource("statics/up.png");
    public static URL downURL = Data.class.getResource("statics/down.png");
    public static URL leftURL = Data.class.getResource("statics/left.png");
    public static URL rightURL = Data.class.getResource("statics/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("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);

}

3、代码主体部分:在panel面板上实现游戏初始化,键盘和事件的监听等功能

package com.abc.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];  //蛇的x坐标  25*25
    int[] snakeY = new int[500];  //蛇的y坐标  25*25
    String fx;
    //食物
    int foodx;
    int foody;
    Random random = new Random();
    int score;  //游戏分数
    //游戏当前的状态
    boolean isStart = false;
    boolean isFail = false;  
    //定时器
    Timer timer = new Timer(100,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 = "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.header.paintIcon(this,g,25,11);//头部
        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 < length; i++) {
            Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
        }

        //食物
        Data.food.paintIcon(this,g,foodx,foody);
        //积分
        g.setColor(Color.white);
        g.setFont(new Font("微软雅黑",Font.BOLD,18));
        g.drawString("长度 "+length,750,35);
        g.drawString("分数 "+score,750,50);
        //游戏状态
        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){//如果游戏是开始状态,就让小蛇动起来
            //移动
            for (int i = length-1; i > 0 ; i--) {
                snakeX[i] = snakeX[i-1];
                snakeY[i] = snakeY[i-1];
            }
            //走向
            if (fx.equals("R")){
                snakeX[0] = snakeX[0]+25;
                //边界判断
                if (snakeX[0]>850){
                    snakeX[0]=25;
                }
            }else if (fx.equals("L")){
                snakeX[0] = snakeX[0]-25;
                if (snakeX[0]<25){
                    snakeX[0]=850;
                }
            }else if (fx.equals("U")){
                snakeY[0] = snakeY[0]-25;
                if (snakeY[0]<75){
                    snakeY[0]=650;
                }
            }else if (fx.equals("D")){
                snakeY[0] = snakeY[0]+25;
                if (snakeY[0]>650){
                    snakeY[0]=75;
                }
            }
            //吃食物
            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 = 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、代码运行效果图

初始化界面:

871bb0a197efa879cc488ba9d0d30bc.png

游戏中界面:

738f7d759d0229f3c845477aa4f7def.png

游戏结束界面:

b1eece546ab1448f30561fa0b703857.png

相关推荐:java入门

以上是利用java实现一个简单的贪吃蛇小游戏的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:csdn。如有侵权,请联系admin@php.cn删除

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能