java swing小游戏-贪吃蛇大冒险

之前在网上看到很多人在在找贪吃蛇源码,难道今天比较闲就动手写了一个小项目现在分享给大家。
游戏源码获取方式1:游戏源码

游戏源码获取方式2:关注微信公众号:花笺说,回复:贪吃蛇大冒险 即可获取
首先下面看一下效果图:
这里写图片描述
小蛇每吃一个食物就会长长一点,当碰到自身或者墙壁游戏就结束了。
用法:
要点:
1. 图形的绘制
2. 贪吃蛇的移动
3. 食物的随机分布
4. 碰撞检测
5. 死亡检测
一 图形的绘制
图形绘制使用的是ImageIcon里的paintIcon()
方法,该方法接收三个参数:
第一个参数是要绘制的地方,第二个参数是画笔对象,第三个是要绘制图形位置的x坐标,第四个是要绘制图形的y坐标主要代码如下:

public void paint(Graphics g) {
        //此为重点,必须要调用父类方法才会重新绘制
        super.paint(g);
        this.setBackground(Color.BLACK);
        //this.setVisible(true);
        //根据前进的方向画出蛇头
        if(direction.equals("R")){
            snake.headR.paintIcon(this, g, snake.snakeX[0], snake.snakeY[0]);
        }else if (direction.equals("D")) {
            snake.headD.paintIcon(this, g, snake.snakeX[0], snake.snakeY[0]);
        }else if (direction.equals("L")) {
            snake.headL.paintIcon(this, g, snake.snakeX[0], snake.snakeY[0]);
        }else if (direction.equals("U")) {
            snake.headU.paintIcon(this, g, snake.snakeX[0], snake.snakeY[0]);
        }
        //画出蛇的身体
        for(int i=1;i<len;i++){
            snake.body.paintIcon(this, g, snake.snakeX[i], snake.snakeY[i]);
        }
        //提示文字
        if(!isStarted){
            Color color = g.getColor();
            g.setColor(Color.white);
            Font font=new Font("华文行楷", Font.BOLD, 30);
            g.setFont(font);
            g.drawString("点击空格键开始/暂停", 250, 380);
            g.setColor(color);

        }
        //游戏结束提示
        if(isDead){
            Color color = g.getColor();
            g.setColor(Color.white);
            Font font=new Font("隶书", Font.BOLD, 35);
            g.setFont(font);
            g.drawString("总得分:"+Score, 230, 300);
            g.drawString("GameOver/press space to restart!", 120, 380);
            g.setColor(color);

        }
        //paint Score
        //显示分数
        Color color = g.getColor();
        g.setColor(Color.white);
        Font font=new Font("隶书", Font.BOLD, 20);
        g.setFont(font);
        Score=(len-3)*5;
        g.drawString("分数:"+Score, 680, 30);
        g.setColor(color);

        snake.imgFood.paintIcon(this, g, food.foodX, food.foodY);
    }

二 贪吃蛇的移动:
蛇画出之后要解决的就是蛇的移动问题,移动的算法就是整个游戏的核心,核心思想是:
蛇头向前移动之后,跟在后面的身体依次向前进行移动,然后重新绘制图片,主要代码如下:

if(isStarted && !isDead){
        //移动蛇的身体
            for(int i=len-1;i>0;i--){
                snake.snakeX[i]=snake.snakeX[i-1];
                snake.snakeY[i]=snake.snakeY[i-1];

        }
            //移动蛇的头部
        if(direction.equals("R")){
            snake.snakeX[0]+=25;
        }else if (direction.equals("D")) {
            snake.snakeY[0]+=25;
        }else if (direction.equals("L")) {
            snake.snakeX[0]-=25;
        }else if (direction.equals("U")) {
            snake.snakeY[0]-=25;
        }

三 食物的随机分布
食物是贪吃蛇游戏中第二重要的,它的位置要随机分布而不是固定的位置,这就要用到Random函数了,该函数可以产生随机数。初始化食物类的时候会对其坐标进行随机分配,当贪吃蛇将食物吃下之后会调用getRandomXY()方法再获取一个随机位置主要代码如下:

public Food() {

    random=new Random();
    foodX=random.nextInt(30)*20+30;
    foodY=random.nextInt(30)*20+30;

}

public void getRandomXY(){

    foodX=random.nextInt(30)*20+30;
    foodY=random.nextInt(30)*20+30;

}   

四 碰撞检测
如何知晓贪吃蛇可以吃食物!就必须进行碰撞检测,当贪吃蛇的头与食物接触,食物重新绘制,原理很简单,虽然碰撞检测有很多种,比如矩形碰撞,像素检测等。但是对于贪吃蛇这种小游戏矩形碰撞已经足够了。首先要用到Rectangle类把贪吃蛇的头包装成一个矩形,然后食物也包装成一个矩形,当两个矩形有接触时,碰撞!
Rectangle类的初始化方法需要四个参数。

  1. 被包装物体左上角x坐标值
  2. 被包装物体左上角y坐标值
  3. 物体宽度
  4. 物体长度

主要代码如下:
贪吃蛇包装:

public Rectangle getRect()
    {
        return new Rectangle((int)snakeX[0],(int)snakeY[0],30,28);

    }

食物包装:

public Rectangle getRect()
{
    return new Rectangle((int)foodX,(int)foodY,25,25);

}

碰撞检测:

private void checkFood() {
        if(snake.getRect().intersects(food.getRect())){
            len++;
            food.getRandomXY();

        }

    }

五 死亡检测
死亡检测比较简单,只要判断蛇头的坐标是否大于边界或小于边界。当头与身体的坐标重合之后也可以判断为死亡最主要代码如下:


            if(snake.snakeX[0]==snake.snakeX[i]&&snake.snakeY[0]==snake.snakeY[i]){
                isDead=true;
            }
            if(snake.snakeX[0]<=0||snake.snakeX[0]>=775||snake.snakeY[0]<=0||snake.snakeY[0]>=725){

                isDead=true;
            }

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三寸花笺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值