2024年最新java小项目之贪吃蛇项目(图解超详细)_java贪吃蛇(1),2024阿里、网易、京东等大厂最新大数据开发面试题

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

最终版的StartGame:

package com.kuang.snake;

import javax.swing.*;

public class StartGames {
    public static void main(String[] args) {
        //首先创建一个静态窗口 JFrame,还能设置窗口名称
        JFrame frame=new JFrame("贪吃蛇小游戏");
        //再设置窗口大小,这个也是为了方便游戏到时候的位置确认
        frame.setBounds(10,10,900,720);
        //并且设置一系列,比如窗口大小不可变这个也是为了之后的游戏位置确认的,且游戏可关闭
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //把这个画板通过创建对象的方法导入进去
        frame.add(new GamePanel());
        //然后就是最后的展现窗口
        frame.setVisible(true);
    }


}


再创建一个Data类:

package com.kuang.snake;

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

//用来存放外部数据的图片
public class Data {
    //需要创建一个连接
    //首先是把头部的地址和头部的图片生成,还用到反射的机制,路劲src这个路径
    public  static URL headerURL=Data.class.getResource("/statics/header.png");
    public static ImageIcon head=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);

}


GamePanel类:

package com.kuang.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 {
    //这个是一个画板,在上面画蛇画图像
    //Graphics这个类型就是一个画笔
    //先设置一些变量,蛇的长度和蛇的x轴以及y轴坐标
    int len;
    int[] snakeX=new int[600];
    int[] snakeY=new int[500];
    //这里在定义一个方向,并且默认是R
    String fx;//可以是R L U D
    //这里再初始化一个用来判断游戏是否开始的,如果没开始的话,就可以进行一些文字提示
    boolean isStart=false;
    //这里需要初始化调用init,所以直接在构造函数里调用
    //创建一个timer 参数就是隔着的时间和当前需要监听的对象
    Timer timer=new Timer(100,this);
    //然后再这边定一个一个食物的属性,有坐标,还有一个随机数
    int foodx;
    int foody;
    Random rand=new Random();
    //再定义一个游戏失败
    boolean isFail=false;
    //这里再加一个分数系统
    int score;
    GamePanel(){
        init();
        //也不知道为什么,反正就是需要有,获取到键盘的监听事件
        this.setFocusable(true);
        this.addKeyListener(this);
    }

    //然后对这个蛇进行初始化
    public void init(){
        //让蛇的长度为3,并且是头部,第一部分以及第二部分身体的长度设置好
        len=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\*rand.nextInt(24);
        foody=75+25\*rand.nextInt(24);
        //把分数初始化为0
        score=0;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);//作用是清屏
        //可以先设置一下背景颜色
        this.setBackground(Color.BLACK);
        //再试试看调用Data的头部数据
       Data.head.paintIcon(this,g,25,11);
        //再这个的基础之上,绘制游戏的区域
        g.fillRect(25,75,850,600);

        //然后开始话一个静态的小蛇,因为最初蛇头是朝右边的,所以头是right,然后就是两个位置
        /\*Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);\*/
        //这里通过方向也优化一下
        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]);
        }
        /\*Data.body.paintIcon(this,g,snakeX[1],snakeY[1]);
 Data.body.paintIcon(this,g,snakeX[2],snakeY[2]);\*/
        //优化一下
        for(int i=1;i<len;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,20));
        //这个是对应的位置
        g.drawString("长度"+len,750,200);
        g.drawString("分数"+score,750,250);
        //这里画完小蛇之后,就进行游戏是否开始的判断
        if(!isStart){
            //如果没开始,就要进行设置
            //先设置字体颜色和位置
            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_LEFT){
            //如果等于左边的话
            fx="L";
        }else if(keyCode==KeyEvent.VK_RIGHT){
            fx="R";
        }else if(keyCode==KeyEvent.VK_UP){
            fx="U";
        }else if(keyCode==KeyEvent.VK_DOWN){
            fx="D";
        }
    }

    //再写一个定时器,用来监听时间,帧
    @Override
    public void actionPerformed(ActionEvent e) {
        //就是就要开始让小蛇动起来了
        //先判断他是不是开始游戏了,并且没有失败的话
        if(isStart&&!isFail){
            //如果开始了,并且是右移的
            //然后对于其他的,就使用循环就行了,这里是需要让从后面往前面的,如果是前面往后面的话,由于0和1不是同一个,所以会被直接吞并
            for(int i=len-1;i>0;i--){


![img](https://img-blog.csdnimg.cn/img_convert/83549032fc99f184416cce56b33135b3.png)
![img](https://img-blog.csdnimg.cn/img_convert/9c679da5832dedd80c326e34464bad67.png)
![img](https://img-blog.csdnimg.cn/img_convert/8586f7fc12678b7e7c248f32eb0f5c5a.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

tYpKw98-1715298389243)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值