最新java小项目之贪吃蛇项目(图解超详细)_java贪吃蛇,想搞定大厂面试官

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

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

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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--){
            //这里要把Y也加上来,是因为,这个是一个整体的概念,上下左右都是会直接跟随的
            snakeX[i]=snakeX[i-1];
            snakeY[i]=snakeY[i-1];
        }
        //在这里继续判断是朝那边
        if(fx.equals("R")){
            //对于头部来说,那就是往前移动25.右移,y是不动的
            snakeX[0]=snakeX[0]+25;
            //但是在这里,解决蛇直接出边界的情况
            if(snakeX[0]>800){
                snakeX[0]=25;
            }
        }else if(fx.equals("L")){
            //如果向左的话
            snakeX[0]=snakeX[0]-25;
            //再进行边界判断
            if(snakeX[0]<25){
                snakeX[0]=800;
            }
        }
        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(snakeY[0]==foody&&snakeX[0]==foodx){
            //如果和食物重合的话,那就是需要把长度加一
            len++;
            //把分数也更新一下
            score=score+10;
            //并且重新刷新一个食物位置
            foodx=25+25\*rand.nextInt(24);
            foody=75+25\*rand.nextInt(24);

        }
        //这里就需要来判断游戏是否失败了
        for(int i=1;i<len;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) {

}

}


完工!!  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201212193804394.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTE1Mzc5,size_16,color_FFFFFF,t_70)




![img](https://img-blog.csdnimg.cn/img_convert/22ee758e19af8b54279c46337f68e342.png)
![img](https://img-blog.csdnimg.cn/img_convert/4974746cd9237ca96fcba8ca39325f35.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

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


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

VB-1715811562594)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

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


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值