java编写的多态项目,宠物小精灵图形化界面,第三节
Adventure(冒险家)是游戏核心控制类,负责管理玩家资源(装备、药品、宠物);
驱动游戏流程(关卡切换、地图探索、事件交互)
处理用户输入与反馈(移动、战斗、物品获取)
功能:初始化游戏,启动主循环处理用户输入与事件。
流程:
关键逻辑:
关卡切换:通过传送门(Portar)实现,通往下一关时动态生成新关卡(Level),并更新currentLevel;地图刷新:每次操作后调用LevelMap.show()重新绘制地图,确保用户看到最新状态;输入校验:使用Tools.getInputChar()和Tools.getInputNumber()限制用户输入范围,避免非法操作。public void start(){
currentLevel = new Level(null,1,null);
LevelMap map = currentLevel.getMap();
map.addAdventure(this);
while(true){
currentLevel.getMap().show();
System.out.println("请选择移动方向:W(上)、A(左)、S(下)、D(右)、E(退出)");
char direct = Tools.getInputChar();
if(direct == 'E')
{
System.out.println("确定要退出吗?Y/N");
char quit = Tools.getInputChar();
if(Character.toUpperCase(quit) == 'Y'){
System.out.println("感谢使用宠物小精灵闯关");
break;
}
}
else
{
Item item = discovery(direct);
if(item != null){
item.setDiscovery(true);
currentLevel.getMap().show();
}
if(item instanceof Treasure){
processTreasure((Treasure) item,direct);
}else if(item instanceof Monster){
processMonster((Monster) item,direct);
} else if (item instanceof Portar) {
System.out.println("发现传送门是否通过? Y/N");
char pass = Tools.getInputChar();
if(Character.toUpperCase(pass) == 'Y'){
if(((Portar) item).isNext()){
Level nextLevel = currentLevel.getNextLevel();
if(nextLevel == null)
{
nextLevel = new Level(currentLevel,currentLevel.getNumber()+1,null);
nextLevel.getMap().addAdventure(this);
currentLevel.setNextLevel(nextLevel);
}
currentLevel = nextLevel;
}else{
Level prevLevel = currentLevel.getPrevLevel();
if(prevLevel == null){
System.out.println("非法操作");
}else{
currentLevel = prevLevel;
}
}
}
}
else {
move(direct);
}
}
}
}
java
运行
2. processMonster(Monster monster, char direct):处理怪物战斗功能:与怪物交互,触发战斗逻辑,处理药品使用、宠物选择及战斗结果。
关键步骤:
确认战斗:用户选择是否清除怪物(输入Y/N);选择宠物:展示所有宠物信息,用户选择出战宠物;战斗循环:宠物与怪物交替攻击(Pokemon.attackMonster()和Monster.attackPokemon());宠物生命值低于50%时,询问是否使用药品(调用getCurrentLevelHP()查找可用药品);药品使用后更新背包(若药品数量耗尽则移除,否则减少数量);战斗结果:怪物被击败:掉落物品(Monster.drop()),物品添加至背包(processItem());宠物被击败:怪物恢复满血(Monster.resume())。private void processMonster(Monster monster,char direct){
System.out.println("发现" + monster.getName() + ",是否清除?Y/N");
char clear = Tools.getInputChar();
if(Character.toUpperCase(clear) == 'Y'){
for (int i=0;i<pokemons.length;i++)
{
System.out.println((i+1) + "t" + pokemons[i].getItemInformation());
}
System.out.println("请选择出站宠物小精灵:");
int number = Tools.getInputNumber(1,pokemons.length);
Pokemon pokemon = pokemons[number-1];
while (monster.getCurrentHealth() > 0 && pokemon.getCurrentHealth() > 0)
{
double rate = pokemon.getHealthPercent();
if(rate < 0.5){
System.out.println(pokemon.getName() + "生命值低于50%,是否使用药品?Y/N");
char eatHp = Tools.getInputChar();
if(Character.toUpperCase(eatHp) == 'Y')
{
HP hp = getCurrentLevelHP(currentLevel.getNumber());
if(hp == null){
System.out.println("背包中没有药品。请探索其他地图");
break;
}else {
if(hp.canDestroy()){
int index = -1;
for (int i = 0;i<medicines.length;i++){
if(hp.getLevelNumber() == medicines[i].getLevelNumber()){
index = i;
break;
}
}
System.arraycopy(medicines,index + 1,medicines,index,medicines.length - index - 1);
System.out.println("药品已经使用完毕");
}else {
int health = hp.use();
pokemon.setCurrentHealth(pokemon.getCurrentHealth() + health);
}
}
}
}
Tools.lazy(300L);
pokemon.attackMonster(monster);
Tools.lazy(300L);
monster.attackPokemon(pokemon);
Tools.lazy(300L);
}
if(monster.getCurrentHealth() == 0) {
System.out.println("怪物已被击败");
Item dropItem = monster.drop();
System.out.println("怪物已被击败,掉落" + dropItem.getItemInformation());
processItem(dropItem);
move(direct);
}else {
monster.resume();
System.out.println(pokemon.getName() + "已被击败");
}
}
}
java
运行
3. processTreasure(Treasure treasure, char direct):处理宝箱功能:开启宝箱,获取随机物品(药品、装备、宠物),并将物品添加至背包。
关键逻辑:
用户确认开启宝箱(输入Y/N);调用Treasure.open()生成随机物品(通过Tools.getRandomItem());调用processItem()将物品分类存入对应背包(药品合并、装备更换、宠物融合或新增);开启后冒险家移动至宝箱位置(move(direct))。private void processTreasure(Treasure treasure,char direct){
System.out.println("发现宝箱,是否打开? Y/N");
char open = Tools.getInputChar();
if(Character.toUpperCase(open) == 'Y'){
Item item = treasure.open();
System.out.println("获得" + item.getItemInformation());
processItem(item);
move(direct);
}
}
java
运行
4. processItem(Item item):处理获得的物品功能:根据物品类型(药品、装备、宠物),将其添加至对应背包或执行特殊操作(如融合)。
分支逻辑:
药品(HP):遍历medicines背包,若存在同等级药品则合并数量(HP.addCount());装备(Equipment):询问用户是否更换宠物装备(Pokemon.changeEquipment()),换下的旧装备存入equipments背包;宠物(Pokemon):若背包已有同类型宠物(getClass()比较),询问是否融合(Pokemon.merge());若无同类型宠物,直接扩容pokemons背包并添加新宠物。private void processItem(Item item){
if(item instanceof HP)
{
for(HP hp:medicines){
if(hp.getLevelNumber() == item.getLevelNumber()){
hp.addCount(((HP) item).getCount());
break;
}
}
}
else if(item instanceof Equipment)
{
System.out.println("发现新的装备,是否给宠物小精灵更换? Y/N");
char change = Tools.getInputChar();
if(Character.toUpperCase(change) == 'Y'){
Equipment old = null;
for(Pokemon pokemon: pokemons)
{
old = pokemon.changeEquipment((Equipment) item);
if(old == null) break;
}
if(old != null){
equipments = Arrays.copyOf(equipments,equipments.length+1);
equipments[equipments.length-1] = old;
}
}
}
else {
int index = -1;
for(int i=0;i<pokemons.length;i++)
{
if(item.getClass() == pokemons[i].getClass()){
index = i;
break;
}
}
if(index == -1){
pokemons = Arrays.copyOf(pokemons,pokemons.length + 1);
pokemons[pokemons.length - 1] = (Pokemon) item;
}
else {
System.out.println("发现可融合宠物小精灵,是否融合? Y/N");
char merge = Tools.getInputChar();
if(Character.toUpperCase(merge) == 'Y'){
pokemons[index].merge((Pokemon) item);
}else{
pokemons = Arrays.copyOf(pokemons,pokemons.length + 1);
pokemons[pokemons.length - 1] = (Pokemon) item;
}
}
}
}
java
运行
5. getCurrentLevelHP(int levelNumber):查找可用药品功能:递归查找当前关卡或更低关卡的可用药品(优先使用当前关卡,逐级回退)。
逻辑:
从当前关卡levelNumber开始遍历medicines背包,查找同等级药品;若未找到,递归调用levelNumber-1继续查找;若到第0关仍未找到,返回null(无可用药品)。private HP getCurrentLevelHP(int levelNumber){
if(levelNumber == 0)return null;
HP hp = null;
for (int i= 0;i<medicines.length;i++)
{
if(medicines[i].getLevelNumber() == levelNumber){
hp = medicines[i];
break;
}
}
if(hp == null){
return getCurrentLevelHP(levelNumber - 1);
}else {
return hp;
}
}
java
运行
6. discovery(char direct)与move(char direct):探索与移动 discovery:调用LevelMap.getPositionItem()获取目标方向的物品,并标记为可见(item.setDiscovery(true));move:调用LevelMap.move()移动冒险家位置,更新地图中冒险家坐标。private Item discovery(char direct){
return (Item) currentLevel.getMap().getPositionItem(Character.toUpperCase(direct));
}
private void move(char direct){
currentLevel.getMap().move(Character.toUpperCase(direct));
}
java
运行
最后创建一个启动类调用游戏入口方法就能运行了
以上就是冒险家的实现,感谢大家观看!
相关知识
【项目】疾病治疗 一直在乖乖体检 前阶段
中宠股份:年产3万吨宠物湿粮项目目前已进入试生产阶段
项目合作目标案例分析选项目,项目找资源
宠物店创业项目选项目,项目找资源
宠物店创业项目介绍选项目,项目找资源
宠物店创业项目背景选项目,项目找资源
宠物店创业项目简介选项目,项目找资源
宠物店的创业项目介绍选项目,项目找资源
宠物app创业项目策划选项目,项目找资源
阳光城土拨鼠项目
网址: 阶段项目 https://m.mcbbbk.com/newsview1278139.html
上一篇: 十年前抓宠物对战的一个游戏叫什么 |
下一篇: 课室的宠物完整版下载 |