使用到了单向链表
子弹类
public class Bullet {
//创建时,需要一个编号
public Bullet(int bulletId){
this.bulletId = bulletId;
}
private Integer bulletId;//子弹ID
public Bullet nextBullet;//下一个子弹索引地址 单链表的方式
@Override
public String toString() {
return "Bullet{" +
"子弹ID=" + bulletId +
'}';
}
}
弹夹类
public class Magazine {
private String magazineName;
public Magazine(String name){
this.magazineName = name;
}
//先创建一个头节点不能动 作为顶点标识
private Bullet headNode = new Bullet(0);
//如果将一发子弹成功压入弹匣中,则返回true;如果弹匣已满(弹匣至多可以装入6发子弹),则打印提示信息,并返回false
public Boolean pushBullet(Bullet b){
int magazineBulletSize = getMagazineBulletSize(headNode);
if(magazineBulletSize>=6){
System.out.println(this.magazineName+"弹夹已经满了!");
return false;
}
Bullet tmpNode = this.headNode;
//找到最后一个链表节点
while (true) {
if (tmpNode.nextBullet == null) {
break;
}
tmpNode = tmpNode.nextBullet;
}
//此时tmpNode指向的是最后一个空节点 添加
tmpNode.nextBullet = b;
System.out.println(this.magazineName+"添加弹夹子弹:"+b);
return true;
}
//获取当前弹夹子弹size
public int getMagazineBulletSize(Bullet bullet){
int bulletSize = 0;
Bullet bullet1 = bullet.nextBullet;
while(bullet1 != null){
bulletSize++;
bullet1 = bullet1.nextBullet;
}
return bulletSize;
}
//如果将一发子弹成功从弹匣弹出,则返回true;如果弹匣已空,则打印提示信息。并返回false
public Boolean popBullet(){
Bullet tmpNode = headNode;
if(tmpNode.nextBullet ==null){
System.out.println(this.magazineName+"子弹被打空了");
return false;
}
//弹出
System.out.println(this.magazineName+"射出子弹. ID="+tmpNode.nextBullet);
//转轮 下一个 往上移一位
tmpNode.nextBullet = tmpNode.nextBullet.nextBullet;
return true;
}
}
手枪类
public class Pistol {
private Magazine magazine;
//将给定的弹匣安装到手枪上,
public void setMagazine(Magazine m) {
this.magazine = m;
}
//如果成功将弹匣顶部的子弹id打印输出,并将该子弹从弹匣弹出,则返回true。如果弹匣为空,则打印提示信息,并返回 false
public Boolean shoot() {
if (magazine == null) {
System.out.println("弹夹没有安装!");
}
return magazine.popBullet();
}
}
Main方法
public class TestMain {
public static void main(String[] args) {
//创建两个弹匣对象,并都将它们压满子弹。
Magazine magazine1 = new Magazine("弹夹1");
Magazine magazine2 = new Magazine("弹夹2");
for(int i =1;i<7;i++){
magazine1.pushBullet(new Bullet(i));
magazine2.pushBullet(new Bullet(i));
}
//创建一个手枪对象
Pistol pistol = new Pistol();
//先将第一个弹匣装入手枪
pistol.setMagazine(magazine1);
//并将弹匣中子弹打空,
pistol.shoot();
pistol.shoot();
pistol.shoot();
pistol.shoot();
pistol.shoot();
pistol.shoot();
pistol.shoot();
pistol.shoot();
pistol.shoot();
//然后装入第二个弹匣,
pistol.setMagazine(magazine2);
//也将子弹打空。
pistol.shoot();
pistol.shoot();
pistol.shoot();
pistol.shoot();
pistol.shoot();
pistol.shoot();
pistol.shoot();
pistol.shoot();
pistol.shoot();
}
//添加子弹的逻辑我就不测试了,UML类图我只在eclipse画过,idea没有测试过
}
输出
弹夹1添加弹夹子弹:Bullet{子弹ID=1}
弹夹2添加弹夹子弹:Bullet{子弹ID=1}
弹夹1添加弹夹子弹:Bullet{子弹ID=2}
弹夹2添加弹夹子弹:Bullet{子弹ID=2}
弹夹1添加弹夹子弹:Bullet{子弹ID=3}
弹夹2添加弹夹子弹:Bullet{子弹ID=3}
弹夹1添加弹夹子弹:Bullet{子弹ID=4}
弹夹2添加弹夹子弹:Bullet{子弹ID=4}
弹夹1添加弹夹子弹:Bullet{子弹ID=5}
弹夹2添加弹夹子弹:Bullet{子弹ID=5}
弹夹1添加弹夹子弹:Bullet{子弹ID=6}
弹夹2添加弹夹子弹:Bullet{子弹ID=6}
弹夹1射出子弹. ID=Bullet{子弹ID=1}
弹夹1射出子弹. ID=Bullet{子弹ID=2}
弹夹1射出子弹. ID=Bullet{子弹ID=3}
弹夹1射出子弹. ID=Bullet{子弹ID=4}
弹夹1射出子弹. ID=Bullet{子弹ID=5}
弹夹1射出子弹. ID=Bullet{子弹ID=6}
弹夹1子弹被打空了
弹夹1子弹被打空了
弹夹1子弹被打空了
弹夹2射出子弹. ID=Bullet{子弹ID=1}
弹夹2射出子弹. ID=Bullet{子弹ID=2}
弹夹2射出子弹. ID=Bullet{子弹ID=3}
弹夹2射出子弹. ID=Bullet{子弹ID=4}
弹夹2射出子弹. ID=Bullet{子弹ID=5}
弹夹2射出子弹. ID=Bullet{子弹ID=6}
弹夹2子弹被打空了
弹夹2子弹被打空了
弹夹2子弹被打空了