【发布时间】:2019-08-03 12:28:16
【问题描述】:
我是 Java 编程新手,我正在寻找构建一个简单的基于文本的游戏。我目前正在尝试开发允许用户选择可播放单元的功能。
下面是我现在尝试编写的一些代码示例。我已经粘贴了构造器单元类、游侠单元类和游戏循环类的开头部分,您可以在其中看到问题。然后,您可以进一步了解我需要如何用某种类型的代码替换我的所有“rangerObj0.(任何相关的对象参数)”,这些代码允许我引用可能不同的对象并访问它们的参数。我使用 ArrayList 的唯一原因是因为我认为这是一种“制作”我自己的对象变量的简单方法,我以后可以引用它。我正在尝试访问这样的对象参数,但它不起作用。
playerChar.get(0).unitMoves
如果我在这里缺少某些东西或更好的方法来做到这一点,我确定有,请告知。感谢您的时间和帮助!
我花了很多时间在网上研究这个,我要么不知道要搜索的正确术语,要么我根本没有考虑我已经学过的一些功能。无论如何,我觉得我无法独自完成这项工作,所以我在这里发帖。
单元构造函数类
public abstract class Unit {
// instance fields
String unitName;
int unitHealth;
int unitMoves;
int unitDmg;
// constructor method
protected Unit(String name, int health, int dmg, int moves) {
unitName = name;
unitHealth = health;
unitDmg = dmg;
unitMoves = moves;
}
}
游侠单位类
import java.util.Random;
public class Ranger extends Unit{
public Ranger(String name, int health, int dmg, int moves) {
super(name, health, dmg, moves);
}
游戏循环类
import java.util.Scanner;
import java.util.ArrayList;
public class Game {
public static void main(String[] args) {
boolean gameLoop = true;
Scanner keyboard = new Scanner(System.in);
int player;
Ranger rangerObj0 = new Ranger("Ranger", 100, 10, 4);
Heavy heavyObj0 = new Heavy("Ranger", 100, 20, 4);
Monster monsterObj0 = new Monster("Steel Head", 150, 10, 3);
//Start of game ----------------------------------------------------------
System.out.println("Select you character!");
System.out.println("Enter 1 for Ranger(100, 10, 4)");
System.out.println("Enter 2 for Heavy (100, 20, 4)");
int resp = keyboard.nextInt();
这是我尝试使用的 ArrayList 和相关的 if 语句,它紧跟在前面的代码之后
ArrayList<Object> playerChar = new ArrayList<Object>();
if (resp == 1){
playerChar.add(rangerObj0);
} else if (resp == 2) {
playerChar.add(heavyObj0);
} else {
System.out.println("Please enter a valid responce!");
}
下面的注释部分保留在显示游戏循环的开始位置
在这里你可以看到我尝试通过 .get() 方法引用对象参数的第一个实例
/*while(gameLoop == true) {
playerChar.get(0).unitMoves = 4; /* <--------- */
monsterObj0.unitMoves = 3;
boolean endPlayerTurn = false; */
while (endPlayerTurn == false) {
System.out.println("Your "+rangerObj0.unitName+" is ready to fight! What do you want to do?");
System.out.println("Enter 1 to rappid fire for 2 movment points");
System.out.println("Enter 2 to pistol fire for 1 movment point");
System.out.println("Enter 3 to end turn");
resp = keyboard.nextInt();
if (resp == 1) {
rangerObj0.rapidFire(monsterObj0);
} else if (resp == 2) {
rangerObj0.rapidFire(monsterObj0);
} else if (resp == 3) {
System.out.println("Player turn ended!");
endPlayerTurn = true;
} else if (rangerObj0.unitMoves == 0) {
System.out.println(rangerObj0.unitName +" is out of moves! Do you want to end turn by typing 3?");
} else {
System.out.println("please enter a valid response!");
}
}
//End of player turn -----------------------------------------------------
接下来是 NPC 回合,然后是游戏循环的结束或重复。
这是我在尝试通过 .get() 方法引用对象参数时遇到的错误,如我上面指出的代码的游戏循环部分所示
“unitMoves 无法解析或不是有效字段”
【问题讨论】:
-
您的列表是
ArrayList<Object>。对象没有任何unitMoves属性。如果您需要单位列表,请创建ArrayList<Unit>,而不是ArrayList<Object>。 -
你能想出一个更好的方法吗?我现在无法访问每个类中包含的方法。
-
你看过我的评论了吗?它确实解释了一种更好的方法。
-
我有,但我现在遇到了这个错误 playerChar.get(0).rapidFire(monsterObj0);这行代码不起作用,因为我无法访问 Ranger 类中包含的方法。我现在正在尝试通过将多个 ArrayList 存储在一个数组列表中来解决这个问题,但我遇到了麻烦,因为每个 ArrayList 都是不同的 Monster、Ranger 和 Heavy。
-
您的答案是正确的,但是,我认为我在这里实际尝试实现的功能类型不应该以我尝试的方式完成。我只是想不出任何其他方式来稍后在我的代码中引用一个对象,就像我可能引用一个变量的存储值一样。基本上我想做的是让玩家选择一个类,游侠或重型,并在我的代码中使用该类的方法和对象参数。
标签: java object arraylist parameters get