GUI:贪吃蛇

以上是准备工作

Data


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

public class Data {
    public static URL headerURL=Data.class.getResource("static/header.png");
    public static ImageIcon header =new ImageIcon(headerURL);

    public static URL upURL=Data.class.getResource("static/up.png");
    public static URL downURL=Data.class.getResource("static/down.png");
    public static URL leftURL=Data.class.getResource("static/left.png");
    public static URL rightURL=Data.class.getResource("static/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("static/body.png");
    public static ImageIcon body =new ImageIcon(bodyURL);
    public static URL foodURL=Data.class.getResource("static/food.png");
    public static ImageIcon food =new ImageIcon(foodURL);
}

GamePanel


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;//蛇的长度
        // 蛇的x,y坐标
        int[]snakeX=new int[600];
        int[]snakeY=new int[500];
        String fx;
        //游戏当前的状态:开始,停止
        boolean isStart=false;//默认是不开始
        boolean isFail=false;//游戏结果的状态
    int score;
    int foody,foodx;
    Random  random=new Random();
    //定时器 ms为单位 1000ms=1s
    Timer timer=new Timer(100,this);

    //构造器

    public GamePanel(){
        init();
        //获得焦点和键盘事件
        this.setFocusable(true);
        this.addKeyListener(this);
        timer.start();//游戏qidong
    }
    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";//inti向右

        //随机分布food
        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);//默认的游戏界面

        //画积分
        g.setColor(Color.WHITE);
        g.setFont(new Font("微软雅黑",Font.BOLD,18));
        g.drawString("长度 "+length,750,30);
        g.drawString("积分 "+score,750,55);

        //画食物
        Data.food.paintIcon(this,g,foodx,foody);


        //把小蛇画上去
        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]);//蛇头初始化向L
        }
        else if(fx.equals("U")){
            Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向UP
        }
        else if(fx.equals("D")){
            Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向down
        }

        for(int i=1;i<length;i++){
            Data.body.paintIcon(this,g,snakeX[i],snakeY[i] );
        }

//游戏状态
        if(isStart==false){
            g.setColor(Color.white);
            g.setFont(new Font("微软雅黑",Font.BOLD,30));
            g.drawString("Pressed the Blank Key Begin Game",300,300);
        }


//游戏结束
        if(isFail){
            g.setColor(Color.RED);
            g.setFont(new Font("微软雅黑",Font.BOLD,30));
            g.drawString("The Game Is Failed",250,300);
        }
    }



    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode=e.getKeyCode();//获得键盘参数
        //空格开始
        if(keyCode==KeyEvent.VK_SPACE){
            if(isFail){
                isFail=false;
            }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";
        }
        //走向
        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;}//边界判断
        }
    }
    @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(snakeX[0]==foodx&&snakeY[0]==foody){
                length++;
                score+=10;
//重置食物
                foodx=25+25*random.nextInt(34);
                foody=75+25*random.nextInt(24);

            }
            //头部走向
            if(fx.equals("R")){
                snakeX[0] = snakeX[0]+25;   //头部右移25个单位(即一格)
                if(snakeX[0]>850){  //边界判断:如果蛇右移到了边界,则回到左边
                    snakeX[0] = 25;
                }
            }else if(fx.equals("L")){
                snakeX[0] = snakeX[0]-25;           //头部左移25个单位(即一格)
                if(snakeX[0]<25){snakeX[0] = 850;}  //边界判断
            }else if(fx.equals("U")){
                snakeY[0] = snakeY[0]-25;           //向上移动应该是-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;}  //边界判断
            }
            for (int i = 1; i < length; i++) {  //头部与身体的某一节坐标重合,即撞到自己
                if(snakeX[0] == snakeX[i] && snakeY[0]==snakeY[i]){
                    isFail=true;
                    init();
                }
            }
            repaint();
        }
        timer.start();
    }
    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }
}

StartGame


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);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/125464.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【vector题解】连续子数组的最大和 | 数组中出现次数超过一次的数字

连续子数组的最大和 连续子数组的最大和_牛客题霸_牛客网 描述 输入一个长度为n的整型数组array&#xff0c;数组中的一个或连续多个整数组成一个子数组&#xff0c;子数组最小长度为1。求所有子数组的和的最大值。 要求:时间复杂度为 O(n)&#xff0c;空间复杂度为 O(n) 进…

Python爬虫框架Scrapy:实现高效数据抓取

目录 一、引言 二、Scrapy框架概述 1、Scrapy框架特点 2、Scrapy框架结构 三、Scrapy框架的使用 1、安装Scrapy框架 2、创建Scrapy项目 3、创建爬虫 4、运行爬虫 四、Scrapy框架常见问题及解决方案 1、请求被网站封禁 2、处理动态加载的页面 3、避免被网站检测到爬…

C#查看启用或关闭的Windows功能

通过命令查看启用或关闭的Windows功能&#xff0c;以管理员身份打开powershell&#xff0c;输入命令get-windowsoptionalfeature -online 得出结果如下&#xff1a; 如果使用C#查看&#xff0c;需要先安装System.Management 代码如下&#xff1a; private void isInstall() …

pinpoint监控tomcat应用,页面显示No data collected

pinpoint安装部署教程大家都可以搜到。这里就不说了。单说一下 页面没有数据的情况。 部署环境&#xff0c;pinpoint安装部署在A服务器上。现在是在C、D、E、F……linux机器上安装pinpoint-agnet 1. 将文件 pinpoint-agent-1.8.5.tar.gz 上传到 服务器C、D、E、F…… 2. 解压…

MQTT协议消息代理服务公网远程连接

文章目录 前言1. Linux 搭建 Mosquitto2. Linux 安装Cpolar3. 创建MQTT服务公网连接地址4. 客户端远程连接MQTT服务5. 代码调用MQTT服务6. 固定连接TCP公网地址7. 固定地址连接测试 前言 Mosquitto是一个开源的消息代理&#xff0c;它实现了MQTT协议版本3.1和3.1.1。它可以在不…

Spring Cloud 微服务入门篇

文章目录 什么是微服务架构 Microservice微服务的发展历史微服务的定义微小的服务微服务 微服务的发展历史1. 微服务架构的发展历史2. 微服务架构的先驱 微服务架构 Microservice 的优缺点1. 微服务 e Microservice 优点2. 微服务 Microservice 缺点微服务不是银弹&#xff1a;…

C语言---插入排序、希尔排序、冒泡排序、选择排序、快速排序简单介绍

文章目录 插入排序希尔排序冒泡排序选择排序快速排序 本文主要介绍用C语言实现的一些排序方法&#xff0c;有插入排序、希尔排序、冒泡排序、选择排序和快速排序&#xff0c;文章中给出的例子都是按照升序排列的。 插入排序 若数组只有一个元素&#xff0c;自然不用排序&#…

和数链“分布式存储”技术结合隐私计算让数据更安全

存储是IT业的核心技术&#xff0c;全球存储行业历经半个世纪的洗礼&#xff0c;在技术和需求相互促进的演变下沧桑变幻&#xff0c;经历桌面级存储、企业级存储、云存储多次迭代变迁。 目前的存储方式主要是“大数据中心”等集中式存储&#xff0c;随着数据规模和复杂度的迅速…

如何用Java实现一个基于机器学习的情感分析系统,用于分析文本中的情感倾向

背景&#xff1a;练习两年半&#xff08;其实是两周半&#xff09;&#xff0c;利用工作闲余时间入门一下机器学习&#xff0c;本文没有完整的可实施的案例&#xff0c;由于知识体系不全面&#xff0c;目前代码只能运行&#xff0c;不能准确的预测 卡点&#xff1a; 1 由于过…

Java自学第6课:电商项目(2)

1 创建工具类并连接数据库 在工程src右键单击new&#xff0c;新建util包 再创建DBUtil类 数据库交互需要有数据库支持的包&#xff0c;这是官方给出的类库。 先声明1个代码块 // 静态代码块 只加载1次static{try {Class.forName("com.mysql.jdbc.Driver");} catch (…

Kotlin文件和类为什么不是一对一关系

在Java中&#xff0c;一个类文件的public类名必须和文件名一致&#xff0c;如何不一致就会报异常&#xff0c;但是在kotlin的文件可以和类名一致&#xff0c;也可以不一致。这种特性&#xff0c;就跟c有点像&#xff0c;毕竟c的.h 和 .cpp文件是分开的。只要最终编译的时候对的…

无人机红外相机的畸变矫正

在项目开展过程中&#xff0c;发现大疆M30T的红外相机存在比较明显的畸变问题&#xff0c;因此需要对红外图像进行畸变矫正。在资料检索过程中&#xff0c;发现对红外无人机影像矫正的资料较少&#xff0c;对此&#xff0c;我从相机的成像原理角度出发&#xff0c;探索出一种效…

史上第一款AOSP开发的IDE (支持Java/Kotlin/C++/Jni/Native/Shell/Python)

ASFP Study 史上第一款AOSP开发的IDE &#xff08;支持Java/Kotlin/C/Jni/Native/Shell/Python&#xff09; 类似于Android Studio&#xff0c;可用于开发Android系统源码。 Android studio for platform&#xff0c;简称asfp(爱上富婆)。 背景&下载&使用 背景 由…

2022最新版-李宏毅机器学习深度学习课程-P34 自注意力机制类别总结

在课程的transformer视频中&#xff0c;李老师详细介绍了部分self-attention内容&#xff0c;但是self-attention其实还有各种各样的变化形式&#xff1a; 一、Self-attention运算存在的问题 在self-attention中&#xff0c;假设输入序列&#xff08;query&#xff09;长度是N…

leetcode:LCP 11. 期望个数统计(python3解法)

难度&#xff1a;简单 某互联网公司一年一度的春招开始了&#xff0c;一共有 n 名面试者入选。每名面试者都会提交一份简历&#xff0c;公司会根据提供的简历资料产生一个预估的能力值&#xff0c;数值越大代表越有可能通过面试。 小 A 和小 B 负责审核面试者&#xff0c;他们均…

Python克隆单个网页

网上所有代码都无法完全克隆单个网页&#xff0c;不是Css&#xff0c;Js下载不下来就是下载下来也不能正常显示&#xff0c;只能自己写了&#xff0c;记得点赞~ 效果如图&#xff1a; 源码与所需的依赖&#xff1a; pip install requests pip install requests beautifulsoup4…

Zigbee—网络层地址分配机制

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;孤雏 0:21━━━━━━️&#x1f49f;──────── 4:14 &#x1f504; ◀️ ⏸ ▶️ ☰ &#x1f497;关注…

CSS特效004:hover图片,显示文字或附加层

css实战中&#xff0c;时常会碰见鼠标放在某个区块上&#xff0c;显示出一段文字或者其他附加信息。思路是利用position的层叠关系&#xff0c;将文字层放在图片的上面&#xff0c;display:none; hover的时候层 display&#xff1a;block。 效果图 源代码 /* * Author: 大剑师…

windows系统自动更新中断电导致系统无法开启

windows系统自动更新中断电导致系统无法开启 现象原因解决进入bios拆机更新系统重新安装内存条 现象 前一天晚上电脑出现合上之后风扇继续转的现象&#xff0c;拔掉电源后&#xff0c;第二天开不了机。现象为按压电源键&#xff0c;电源键和充电指示灯亮一次后熄灭&#xff0c…

复盘一个诡异的Bug

该Bug的诡异之处在于这是一个由多种因素综合碰撞之后形成的综合体。纵观整个排查过程&#xff0c;一度被错误的目标误导&#xff0c;花费大量功夫后才找到问题点所在&#xff0c;成熟的组件在没有确凿证据之前不能随意怀疑其稳定性。 前言 此前在接入两台粒径谱仪&#xff08;…