1

我正在做一个项目来帮助我重新开始 Java 编码,它是一个基于文本的游戏(我知道,不多,但我必须从某个地方开始)。无论如何,我遇到了一个问题。我需要能够将零件名称(这是一个硬件大亨​​游戏)和价格连同它们一起放入一个数组中。例如,台式计算机具有 CPU 等部件,游戏会列出您的 CPU 选择。我需要一种存储这些数据的方法,这对我来说非常复杂,因为我不仅需要存储所有 CPU 的名称以供玩家使用,而且还要存储名称旁边的价格。最重要的是,我有多种产品类型,例如台式机、笔记本电脑和游戏机,每一种都有不同的部件名称和价格。我想到了一个 3 维数组来存储产品类型,例如桌面(列),

另外,我想为每种产品类型创建类,并在每个类中放置数组来定义零件和价格(二维数组),但这仍然很复杂,我想知道如何对这些数据进行排序,并可能建立一个系统,其中某些随着游戏时间的进行,零件会被解锁。先感谢您。

4

4 回答 4

1

我可能会带你去另一个方向。为什么不创建类和对象?然后创建这些对象的实例?Java 是一种面向对象的语言。创建对象将允许您保存所需的所有值。快速示例,

Public abstract class CPU {

    // Declare fields
    private float price;
    private String name;

    // Declare constructors 
}

Public class intelCPU extends CPU {

    // GetPrice
    public int getPrice() {
        return price;
    }

    // Set Name
    public void setName(n) {
        name = n;
    }

}
于 2015-08-07T16:19:07.863 回答
0

改用 a 怎么样Map。AMap让您以Key/Value对的形式存储信息。您可以制作一个Map类型keyString(代表产品类型)和value类型为Map(代表单个产品)的类型,其中包含一个String key(产品名称)和一个存储价格(可能是 a double)或信息(作为String或者其他的东西)。这样你就可以做类似的事情outerMap.get("laptops").get("laptop1"),这将返回笔记本电脑1的信息。首先get,获取包含所有笔记本电脑产品(或 ypu 想要的任何产品类型)的地图。第二个返回该类别中特定产品的信息。

你可以这样实现。

Map<String, Map<String, String>> productMap = new HashMap<>();

使用它,您将放置这样的产品类型:

productMap.put("laptops", new HashMap<String,String>());

然后添加这样的产品:

productMap.get("laptops").put("laptop1","This is information about laptop 1");

PS:如果您不知道,我使用= new HashMap而不是= new Map因为Map接口而不是类。AHashMap是一个表示implements接口Map的类。

于 2015-08-07T16:21:08.783 回答
0

除了多维数组,您还可以使用面向对象编程 (OOP) 对其进行标记。根据您的描述,您似乎需要一个类层次结构,例如:

abstract class Product

class Desktop extends Product
class Laptop extends Product
class Console extends Product

将桌面、笔记本电脑、控制台等可以使用的所有常用字段/方法放入您的产品类中。

//Just an example
abstract class Product {
   String name;
   ArrayList<Component> components;
   public String getName(){
      return name;
   }
}

由于每个产品都有多个组件,因此产品需要具有如上所示的组件列表。

abstract class Component{
   Double price;
   public Double getPrice(){
      return price;
   }
}

现在您可以拥有 CPU、电源等组件,它们具有一些常见的行为和字段,例如放入 Component 类的价格。每个组件的任何专门的行为/字段都可以放入相应的类中,如下所示的时钟频率:

class CPU extends Component {
  Double clockFreq;
}

因此,如果您的部件列表有 3 项长,则可以将其写入文本文件,如下所示:

name,type,price
intelCPU6600,CPU,200
amdCPU7789,CPU,150
PS1Power,PSU,120
newPart,unknown,500

此列表可能是 100 项没有任何问题的项目。使用 Scanner 将其读入您的程序,并为每一行执行以下操作:

String line = scanner.nextLine();
String[] fields = line.split(",");
if("CPU".equals(fields[1]){
 CPU cpu = new CPU(fields[0],fields[1],fields[2]);
 //Product is an object of the class Product that you should have created earlier
 product.components.add(cpu);
} else if("PSU".equals(fields[1]) {
 PSU psu = new PSU(fields[0],fields[1],fields[2]);
 product.components.add(psu);
} //..so on

如果有一个没有类的通用产品,那么可以使用抽象类:

if("unknown".equals(fields[1]){
 Component comp = new Component(fields[0],fields[1],fields[2]);
 product.components.add(comp);
} 
于 2015-08-07T16:21:49.297 回答
0

I agree with @Regis that you should be using a custom object to describe your products, and then storing them in a some kind of data structure.

However, you can solve the problem you described by declaring a multi-dimensional array of the type "Object," which will allow you to put basically anything into it, even primitives (autoboxing and autounboxing was added in Java 5 and will seamlessly translate between primitive types like int and the Java wrapper class for that type, like java.lang.Integer).

Of course such an array would be very weakly typed and there would be nothing stopping you from adding doubles to the product name column, or vice versa. You'd also have to do a lot of casting, which is a code smell.

于 2015-08-07T16:24:08.350 回答