自学java小项目 贪吃蛇(二)

1. 写在前面

前面已经写完了贪吃蛇将要用到的辅助类Pos和Dir类,接下来我们继续完成食物的有关类

2. 设计

2.1 Obj抽象类

2.1.1 动机

  • 蛇类需要存储蛇头的位置,食物也有一个位置;两个类有共同属性可以继承Obj类型
  • 用于实践学习到的java的抽象类对应how2j的链接如下

2.1.2 设计

Obj抽象类定义一个坐标(使用Pos类),并提供抽象方法getPos获得这个坐标(需在子类中实现

在这里插入图片描述

2.1.3 实现

package object;
/**
 * @author: huluhulu~
 * @date: 2022-06-28 13:02
 * @description: 本文件为Obj.java 提供了一个包含位置的抽象类
 * @version: 1.0
 */
import position.Pos;

//该类属于抽象类
//是Snake和food类的父类
//用于学习
public abstract class Obj {
    
    
    //表示位置
    //保护属性protect
    protected Pos pos;

    //获取坐标
    public abstract Pos getPos();
}

2.2 食物类

2.2.1 设计分析

  • 食物类的属性有
    • 位置(继承Obj抽象类而来
    • 游戏界面大小(设置食物位置时的范围
    • 食物大小(食物的坐标必须和蛇能经过的坐标一致
  • 食物类提供的方法有
    • 有参和无参构造函数
    • 实现父类(抽象类)中的抽象方法:获取食物位置
    • 提供重新生成食物位置的接口

2.2.2 具体实现

2.2.2.1 类属性

类属性都设置为私有或保护属性,提高封装性。

    /**********以下是类属性*********/
    //类属性:食物坐标(继承Obj抽象类而来
    //Pos pos;

    //游戏界面的大小
    private int console_x, console_y;
    //一个食物的大小
    private int block_x,block_y;

2.2.2.2 类方法

2.2.2.2.1 无参构造函数

无参构造函数提供了默认的食物初始位置与游戏界面大小、食物大小的初始化

    /**********以下是类方法*********/

    //无参构造函数
    //提供默认的食物初始位置与游戏界面大小、食物大小的初始化
    public Food(){
    
    
        //初始化位置:(10,10)
        this.pos=new Pos(10,10);
        console_x=800;
        console_y=800;

        //初始化一个食物的大小
        this.block_x=10;
        this.block_y=10;
    }
2.2.2.2.2 有参构造函数

带参构造函数提供了个性化的游戏界面大小、食物大小的初始化,方便切换调试素材;另外,食物初始位置也是随机生成的

  //带参构造函数
    //初始化食物位置(位置随机,但是在控制台界面内)
    //初始化指定的游戏界面大小、食物大小
    //方便更换素材
    public Food(int console_x,int console_y,int block_x,int block_y){
    
    
        this.pos=new Pos();
        //初始化游戏界面大小
        this.console_x=console_x;
        this.console_y=console_y;
        //初始化一个食物的大小
        this.block_x=block_x;
        this.block_y=block_y;
        //随机生成食物
        this.genFood();
    }
2.2.2.2.3 获取食物位置

获取食物位置的接口直接返回保护属性pos

    //复写抽象函数
    //获取食物位置信息
    public Pos getPos() {
    
    
        return this.pos;
    }
2.2.2.2.4 重新生成食物位置

利用随机数生成随机坐标,这里要注意的几点是:
1. 食物和蛇的每一节都是有大小的,所以食物和蛇的位置想要重合应该让每一节大小相同
2. 因为食物是有大小的,所以它的横坐标位置范围是[0,console_x/block_x) * block_x
3. 因为java的gui绘制出来的窗体边框是有大小的,如果食物的大小过小,在最上边和最下边可能会看不见食物(别问我怎么发现的),所以我设计的食物横坐标位置是在[1,console_x/block-1) * block_x位置范围内。具体是利用random产生[0,console_x/block_x-2)的随机数,然后在窗体绘制的函数里加上block_x的偏差,纵坐标同理

    //重新生成食物坐标
    public Pos genFood(){
    
    
        //设置随机种子:默认是当前时间
        Random r=new Random();
        //位置初始化
        //利用random产生[0,console_x/block_x-2)的随机数
        //利用random产生[0,console_y/block_y-2)的随机数
        this.pos.setPos(r.nextInt(console_x/block_x-2)*block_x,
                r.nextInt(console_y/block_y-2)*block_y);
        return this.pos;
    }

2.2.3 所有代码

//包的声明
package object;
/**
 * @author: huluhulu~
 * @date: 2022-06-28 13:02
 * @description: 本文件为Food.java 提供了一个食物的类,继承了Obj抽象类
 * @version: 1.0
 */
//导入包
import java.util.Random;
import position.Pos;

public class Food extends Obj {
    
    
    /**********以下是类属性*********/
    //类属性:食物坐标(继承Obj抽象类而来
    //Pos pos;

    //游戏界面的大小
    private int console_x, console_y;
    //一个食物的大小
    private int block_x,block_y;

    /**********以下是类方法*********/

    //无参构造函数
    //提供默认的食物初始位置与游戏界面大小、食物大小的初始化
    public Food(){
    
    
        //初始化位置:(10,10)
        this.pos=new Pos(10,10);
        console_x=800;
        console_y=800;

        //初始化一个食物的大小
        this.block_x=10;
        this.block_y=10;
    }
    //带参构造函数
    //初始化食物位置(位置随机,但是在控制台界面内)
    //初始化指定的游戏界面大小、食物大小
    //方便更换素材
    public Food(int console_x,int console_y,int block_x,int block_y){
    
    
        this.pos=new Pos();
        //初始化游戏界面大小
        this.console_x=console_x;
        this.console_y=console_y;
        //初始化一个食物的大小
        this.block_x=block_x;
        this.block_y=block_y;
        //随机生成食物
        this.genFood();
    }

    //复写抽象函数
    //获取食物位置信息
    public Pos getPos() {
    
    
        return this.pos;
    }

    //重新生成食物坐标
    public Pos genFood(){
    
    
        //设置随机种子:默认是当前时间
        Random r=new Random();
        //位置初始化
        //利用random产生[0,console_x/block_x-2)的随机数
        //利用random产生[0,console_y/block_y-2)的随机数
        this.pos.setPos(r.nextInt(console_x/block_x-2)*block_x,
                r.nextInt(console_y/block_y-2)*block_y);
        return this.pos;
    }
}

3. 小结

到现在已经可以生成食物了,接下来对蛇类进行设计

猜你喜欢

转载自blog.csdn.net/qq_51204877/article/details/125501096
今日推荐