Java 如何从ArrayList中选择特定对象
我们正在制作一个简单的rpg游戏。现在我们有一个叫做战场的职业,玩家可以在这里与怪物战斗。当我们开始战斗时,我们使用一个随机发生器来挑选一个随机的怪物。在terminal/main方法中,我们有像“攻击”和“奔跑”这样的命令,它们要么对随机怪物造成伤害,要么让玩家离开/退出游戏。现在,我们正在尝试添加一个名为“攻击恐怖”的命令,它将让玩家与伤害最大的最硬的怪物战斗(在我们的主菜单中有三个可供选择)。我们需要一种方法,根据伤害从ArrayList怪物中选择一个特定的对象。有人知道我们怎么做吗 这是我们在战场类中开始游戏的代码:Java 如何从ArrayList中选择特定对象,java,arraylist,Java,Arraylist,我们正在制作一个简单的rpg游戏。现在我们有一个叫做战场的职业,玩家可以在这里与怪物战斗。当我们开始战斗时,我们使用一个随机发生器来挑选一个随机的怪物。在terminal/main方法中,我们有像“攻击”和“奔跑”这样的命令,它们要么对随机怪物造成伤害,要么让玩家离开/退出游戏。现在,我们正在尝试添加一个名为“攻击恐怖”的命令,它将让玩家与伤害最大的最硬的怪物战斗(在我们的主菜单中有三个可供选择)。我们需要一种方法,根据伤害从ArrayList怪物中选择一个特定的对象。有人知道我们怎么做吗 这是
public void startBattle() {
printWelcomeMessage();
boolean finished = false;
this.currentMonster = getRandomMonster();
if(this.currentMonster == null) {
return;
}
System.out.println("A random monster is chosen for you. Prepare to meet the mighty " + this.currentMonster.getName());
System.out.println("\n-------- Player Stats ---------");
System.out.println(this.player);
while(!finished && monsters.size() > 0) {
ArrayList<String> commands = reader.getInput();
if(isValidCommand(commands)) {
if(commands.contains("quit") && !this.currentMonster.isDead()){
System.out.println("You can't quit the game in the middle of a fight!");
}else if(commands.contains("quit") && this.currentMonster.isDead()) {
finished = true;
System.out.println();
printFinalStats();
System.out.println();
System.out.println("You have left the arena, and the game has ended.");
System.out.println();
}
if(commands.contains("run")) {
finished = true;
System.out.println("You are a coward and you lose 50 gold pieces...\n");
this.player.changeGold(-50);
printFinalStats();
System.out.println("\nThanks for playing...");
}else if(commands.contains("drink") && !this.currentMonster.isDead()){
Potion potion = (Potion) player.findItem(commands.get(1));
player.drinkPotion(potion);
}else if(commands.contains("equip") && !this.currentMonster.isDead()){
Weapons weapon = (Weapons) player.findItem(commands.get(1));
player.useWeapon(weapon);
} else if(commands.contains("attack") && !this.currentMonster.isDead()) {
if(this.player.attack(this.currentMonster)) {
playerWon();
if(this.monsters.size() > 0) {
System.out.println("\nThere are " + this.monsters.size() + " more monsters to beat\nType \"attack\" if you want to attack another monster, or \"quit\" if you want to end the game.");
} else {
System.out.println("\n\n#### Congratulations ####\nYou have beaten every single monster in the game. You are a true champion!");
printFinalStats();
finished = true;
}
} else if(this.currentMonster.attack(this.player)) {
printLosingMessage();
finished = true;
}
} else if(commands.contains("attack") && this.currentMonster.isDead() && this.monsters.size() > 0) {
this.currentMonster = getRandomMonster();
printContinueMessage(this.player, this.currentMonster);
this.player.changeHealth(50);
}
} else {
System.out.println("Please write a valid command. Valid commands are:");
printCommands();
}
}
}
public void startBattle(){
printWelcomeMessage();
布尔完成=假;
this.currentMonster=getRandomMonster();
如果(this.currentMonster==null){
返回;
}
System.out.println(“为您选择了一个随机怪物。准备迎接强大的”+this.currentMonster.getName());
System.out.println(“\n-------玩家统计-----------”);
System.out.println(this.player);
而(!finished&&monsters.size()>0){
ArrayList commands=reader.getInput();
if(isValidCommand(命令)){
if(commands.contains(“quit”)&&!this.currentMonster.isDead()){
系统。out。打印(“你不能在战斗中退出游戏!”);
}else if(commands.contains(“quit”)&&this.currentMonster.isDead()){
完成=正确;
System.out.println();
printFinalStats();
System.out.println();
System.out.println(“您已经离开竞技场,游戏已经结束。”);
System.out.println();
}
if(commands.contains(“run”)){
完成=正确;
System.out.println(“你是个胆小鬼,丢了50块金币…\n”);
这个.player.changeGold(-50);
printFinalStats();
System.out.println(“\n播放等级…”);
}else if(commands.contains(“drink”)&&!this.currentMonster.isDead()){
药剂药剂=(药剂)玩家.findItem(commands.get(1));
玩家。饮用药水(药剂);
}else if(commands.contains(“装备”)&&!this.currentMonster.isDead()){
武器武器=(武器)玩家.findItem(命令.get(1));
玩家。使用武器(武器);
}else if(commands.contains(“攻击”)&&!this.currentMonster.isDead()){
如果(这个.玩家.攻击(这个.怪物)){
playerWon();
如果(this.monsters.size()>0){
System.out.println(“\n这里有“+这个.monsters.size()+”更多要打败的怪物\n如果你想攻击另一个怪物,请键入“攻击”;如果你想结束游戏,请键入“退出”);
}否则{
System.out.println(“\n\n#######################你在游戏中击败了每一个怪物。你是真正的冠军!”;
printFinalStats();
完成=正确;
}
}否则如果(此.currentMonster.attack(此.player)){
printLosingMessage();
完成=正确;
}
}else if(commands.contains(“攻击”)&&this.currentMonster.isDead()&&this.monsters.size()>0){
this.currentMonster=getRandomMonster();
printContinueMessage(this.player,this.currentMonster);
此.player.changeHealth(50);
}
}否则{
System.out.println(“请编写有效命令。有效命令为:”);
打印命令();
}
}
}
这是主类中怪物的阵列列表:
Monster beelzebub = new Monster("Beelzebub", 60);
Monster witch = new Monster("Witch", 40);
Monster ogre = new Monster("Ogre", 80);
ArrayList<Monster> monsters = new ArrayList<>();
monsters.add(beelzebub);
monsters.add(witch);
monsters.add(ogre);
Battleground battleground = new Battleground(monsters, player, reader);
battleground.startBattle();
Monster beelzebub=新怪物(“beelzebub”,60);
怪物女巫=新怪物(“女巫”,40岁);
怪物食人魔=新怪物(“食人魔”,80);
ArrayList怪物=新的ArrayList();
怪物。添加(魔王);
怪物。添加(女巫);
怪物。添加(食人魔);
战场战场=新战场(怪物、玩家、读者);
战场;
我们感谢任何帮助 用SortedSet或PriorityQueue替换ArrayList。为Monster类实现一个比较器。然后选择怪物集合的第一个元素。将ArrayList替换为SortedSet或PriorityQueue。为Monster类实现一个比较器。然后选择怪物集合的第一个元素。我看不到你的怪物类,但我假设构造器的第二个变量是“伤害等级”?如果不是,理想情况下这应该是属于每个怪物的东西,所以你应该把它放在某个地方 所以你有一个阵阵怪物,它已经拥有了所有具有不同伤害等级的怪物。有很多方法可以做到这一点,但一个简单的方法(假设你只有3个怪物)就是迭代你的怪物,跟踪伤害最高的怪物,然后返回该怪物 例如:
Monster findHardestMonster(ArrayList<Monster> monsters)
{
//Set to the first monster in the list ASSUMING you have
//at least one monster
Monster highestDamageMonster = monsters.get(0);
//Go through every monster in your array
for (Monster monster : monsters)
{
//record the highest so far
if(monster.getDamage() > highestDamageMonster.getDamage())
highestDamageMonster = monster;
}
}
//return it
return highestDamageMonster;
}
怪物findHardestMonster(阵列列表怪物)
{
//设置为列表中的第一个怪物,假设您有
//至少有一个怪物
Monster HighestDamageOnster=怪物。获取(0);
//穿过你阵阵中的每一个怪物
用于(怪物:怪物)
{
//创历史最高纪录
if(monster.getDamage()>highestdamagementster.getDamage())
最高伤害者=怪物;
}
}
//还它
返回最高的damagementster;
}
如果你计划频繁地移除怪物(比如,当他们被击败时),那么正如另一张海报所建议的那样,使用优先级队列或某种类型的队列可能是值得的
for(int i=0;i<monsters.size()-1;i++){
Monster m=monsters.get(i);
Monster m2=monsters.get(i+1);
if(m.getDamage()<m2.getDamage()){
Monster rightMonster=m2;
}else{
Monster rightMonster=m;
}
}
Comparator<Monster> orderByDamage =
(m1, m2) -> m1.getDamage() < m2.getDamage() ? -1
: m1.getDamage() == m2.getDamage() ? 0 : 1;
Optional<Monster> scariest = monsters.stream().max(orderByDamage);
scariest.ifPresent(monster -> /* do something to the monster */);
Optional<Monster> leastScary = monsters.stream().min(orderByDamage);