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. 小结
到现在已经可以生成食物了,接下来对蛇类进行设计