(Java小游戏)魔塔v1.0

实现一个控制台操作的4399小游戏——魔塔

游戏情景如下:

(Java小游戏)魔塔v1.0

  1. 勇士类
  2. 怪物类
  3. 怪物数组类
  4. 地图类
  5. 游戏类测试类
  6. 测试类
    代码如下

勇士类Hero.java

package com.nll.oop1;
//勇士
public class Hero {
 //属性
private String name;
private int level;
private int blood;
private int attack;
private int defense;
private int gold;
private int exp;
public String getName() {
 return name;
}
public void setName(String name) {
 this.name = name;
}
public int getLevel() {
 return level;
}
public void setLevel(int level) {
 this.level = level;
}
public int getBlood() {
 return blood;
}
public void setBlood(int blood) {
 this.blood = blood;
}
public int getAttack() {
 return attack;
}
public void setAttack(int attack) {
 this.attack = attack;
}
public int getDefense() {
 return defense;
}
public void setDefense(int defense) {
 this.defense = defense;
}
public int getGold() {
 return gold;
}
public void setGold(int gold) {
 this.gold = gold;
}
public int getExp() {
 return exp;
}
public void setExp(int exp) {
 this.exp = exp;
}
@Override
 public String toString() {
return "勇士,等级"+level+",血量"+blood+",攻击"+attack+",防御"+defense+",金币"+gold+",经验"+exp;
 }
 public Hero() {
 //一开始的数据是定死的
this.name="勇士";
this.level=1;
this.blood=1000;
this.attack=10;
this.defense=10;
this.gold=10;
this.exp=0;}
}

怪物类 Monster.java

package com.nll.oop1;
//怪物
public class Monster {
 //属性
 private String name;
 private int blood;
 private int attack;
 private int defense;
 private int gold;
 private int exp;
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
    public int getBlood() {
  return blood;
 }
 public void setBlood(int blood) {
  this.blood = blood;
 }
 public int getAttack() {
  return attack;
 }
 public void setAttack(int attack) {
  this.attack = attack;
 }
 public int getDefense() {
  return defense;
 }
 public void setDefense(int defense) {
  this.defense = defense;
 }
 public int getGold() {
  return gold;
 }
 public void setGold(int gold) {
  this.gold = gold;
 }
 public int getExp() {
  return exp;
 }
 public void setExp(int exp) {
  this.exp = exp;
 }
 public Monster(String name, int blood, int attack, int defense, int gold, int exp) {
  super();
  this.name = name;
   
  this.blood = blood;
  this.attack = attack;
  this.defense = defense;
  this.gold = gold;
  this.exp = exp;
 }
 
}

怪兽数组类Monsters.java

package com.nll.oop1;
//定义很多怪物
public class Monsters {
//创建一个该怪物:绿色史莱姆 血量80 攻击力:15 防御力 2 金币 1 经验
 static Monster m1=new Monster("绿色史莱姆",80,15,2,1,1);
 static Monster m2=new Monster("红色史莱姆",100,18,0,2,2);
 static Monster m3=new Monster("骷髅兵",80,50,0,4,4);
 static Monster m4=new Monster("智障骷髅兵",120,60,20,8,8);
 //将所有的怪物都放到了一个数组中
 public static Monster[] ms=new Monster[] {m1,m2,m3,m4};
}

地图类Map.java

package com.nll.oop1;
public class Map {
//有几张地图,每一张地图有多少数据  10关 每关为10*10大小的地图
 public static String[][] maps=new String[10][100];
 public Map() {
  maps[0]=new String[]{
    "x","x","x","x","x","x","x","x","x","x",
    "x","a","d","x","x","n","x","x"," ","x",
    "x","x","1","x","x","4","a","2","a","x",
    "x","x"," ","1"," ","d","x","x","d","x",
    "x","x"," ","x","x","a","x","x","a","x",
    "x","x"," ","x","x"," ","x","x","a","x",
    "x","x"," ","x","x"," ","x","x","a","x",
    "x","x"," ","x","2","3","a","a","d","x",
    "x","x","h","x","a","x","x","x","x","x",
    "x","x","x","x","x","x","x","x","x","x",
   };
 }
 }

游戏类Game.java

package com.nll.oop1;
import java.util.Scanner;
public class Game {
 // 勇士只有一个
 private static Hero hero = new Hero();
    //有很多怪物
    //private static Monster ms;//这里可以不定义,因为是静态的
 private static Map map = new Map();
 private int mindex = 0;// 默认是第一层
      //定义勇士的位置
 private int hindex = 82;// 数组的索引下标
  //移动
 public void move(int num) {
  String str = map.maps[mindex][hindex + num];
  if ("x".equals(str)) {
   // 意味着,勇士移动之后,是一面墙不能移动
   createMap(mindex);// 重新显示地图
   return;
  } else if (" ".equals(str)) {
   // 可以移动
  } else if ("a".equals(str)) {
   // 吃到红宝石 攻击+3
   hero.setAttack(hero.getAttack() + 3);
  } else if ("d".equals(str)) {
   // 吃到蓝宝石 防御+3
   hero.setAttack(hero.getDefense() + 3);
  } else if ("r".equals(str)) {
   // 吃到红血瓶 生命+200
   hero.setAttack(hero.getBlood() + 200);
  } else if ("b".equals(str)) {
   // 吃到蓝血瓶 生命+500
      hero.setAttack(hero.getBlood() + 500);
  } else {
   // 除了墙 空格 宝石 血瓶之外 剩下的不就是怪物了嘛
   // 首先 str要转为int类型的值,因为要索引下标
      int m = Integer.parseInt(str) - 1;// 因为索引下标从0开始,而我们的怪物,是从1开始
   Monster monster = new Monster(Monsters.ms[m].getName(), Monsters.ms[m].getBlood(),
     Monsters.ms[m].getAttack(), Monsters.ms[m].getDefense(), Monsters.ms[m].getGold(),
     Monsters.ms[m].getExp());
        if (fight(hero, Monsters.ms[m]) == false) {
    System.out.println("游戏结束");
    System.exit(0);
   }
  }
    map.maps[mindex][hindex] = " ";
  hindex = hindex + num;
  map.maps[mindex][hindex] = "h";
  // 重新显示地图
  System.out.println(hero.toString());
  createMap(mindex);
 }
//打架       勇士和怪物打架,而且我们要知道,打赢了还是打输了
 public boolean fight(Hero h, Monster m) {
  // 勇士攻击怪物一次造成的伤害
  int h2m = h.getAttack() - m.getDefense();
  // 怪物攻击勇士一次造成的伤害
  int m2h = m.getAttack() - h.getDefense();
  // 万一 勇士的防御力:100 怪物的攻击力 20 -80;
  if (m2h <= 0) {
   m2h = 0;
  }
  if (h2m <= 0) {
   System.out.println("勇士砍不动怪物,被怪物乱刀砍死");
   return false;
  }
    // 如果能破防,那么勇士攻击怪物一次,怪物攻击勇士一次,依次循环
  // 直到勇士和怪物,有一方血量小于等于0
  do {
   // 开始打架,勇士先打怪物
   int mblood = m.getBlood() - h2m;
   m.setBlood(mblood);
   if (mblood <= 0) {
    System.out.println("恭喜胜利,您获得" + m.getGold() + "金币," + m.getExp() + "经验");
    h.setGold(m.getGold() + h.getGold());
    h.setExp(m.getExp() + h.getExp());
    // 输出勇士现在的状态
    System.out.println(h.toString());
    return true;
    }
    } while (h.getBlood() > 0 && m.getBlood() > 0);
  return false;
  }
  //创建地图
 public void createMap(int mindex) {
  String[] maps = map.maps[mindex];
  for (int i = 0; i < maps.length; i++) {
   System.out.print(maps[i] + " ");
   if ((i + 1) % 10 == 0) {
    System.out.println();
   }
  }
 }
  public void startGame() {
  // 首先创建地图
  createMap(mindex);
  System.out.println("游戏开始,请按wsad进行移动");
  Scanner sc = new Scanner(System.in);
  while (true) {
   // 勇士要一直移动
   String choise = sc.nextLine();
   if ("w".equalsIgnoreCase(choise)) {
    move(-10);
   } else if ("s".equalsIgnoreCase(choise)) {
    move(+10);
    System.out.println("游戏开始,请按wsad进行移动");
   } else if ("a".equalsIgnoreCase(choise)) {
    move(-1);
   } else {
    move(1);
   }
   // 注意我们这里取巧了,四周都是墙,意味着勇士是不能穿墙的,因此不需要判断边界
  }
 }
}
  

测试类Test.java

package com.nll.oop1;
public class Test {
public static void main(String[] args) {
 Game g=new Game();
 g.startGame();
 //测试打架
// Hero h=new Hero();
//  Monster m=Monsters.m1;
//  g.fight(h, m);
}
}

(Java小游戏)魔塔v1.0
代码贴的些许潦草.ha

(Java小游戏)魔塔v1.0(Java小游戏)魔塔v1.0 仙女泡泡 发布了2 篇原创文章 · 获赞 0 · 访问量 57 私信 关注
上一篇:C++设计模式——原型(Prototype)模式


下一篇:[Python3] 022 面向对象 第二弹