gpt4 book ai didi

Java:从一种基本类型创建多个单独的对象。文字冒险

转载 作者:行者123 更新时间:2023-12-01 19:10:22 25 4
gpt4 key购买 nike

在我的小文本游戏中,我有一个 Item 类,它从 .txt 文件加载其对象,然后将该对象添加到 Item 类型的 ArrayList 中。我正在尝试使用 Item 类中的 update() 方法进行升级。它有效,但如果我的库存中有两个相同的元素,因为如果我升级一个元素,它们会引用相同的元素,我会升级该类型的所有元素。

有没有办法创建一个新项目(青铜 Helm ),创建时将与从文本文件加载的青铜 Helm 相同,但升级时不会更改静态 Helm ArrayList中的原始对象项目.java。

Player 类中的 openInventory() 方法:

public void openInventory(){
//newWindow();
int selection;
boolean upgraded = false;

backPack.printInventory(this);
println("[1] UseItem [2] Upgrade Item [3] Item Details");
selection = getInt();
if(selection == 1){
println("Type the number of the corresponding Item Slot you would like to use.");
int itemNum = (getInt() - 1);
Item itemSelection = backPack.itemSlot[itemNum].oi;
if(backPack.itemSlot[itemNum].stack.size() > 0){
itemSelection = backPack.itemSlot[itemNum].stack.get(0);
}
itemSelection.printStats();
this.useItem(itemSelection);
}
if(selection == 2){

int sInt;
Item scroll = new Item();
Item item = new Item();

while(upgraded == false){
println("Pick a scroll");
sInt = getInt();
if(backPack.itemSlot[sInt - 1].oi.type.equals("scroll")){
scroll = backPack.itemSlot[sInt - 1].oi;
}
else
println("Not a Scroll");

println("Pick which " + scroll.category + " to upgrade.");
sInt = getInt();
if(backPack.itemSlot[sInt - 1].oi.type.equals(scroll.category)){
item = backPack.itemSlot[sInt - 1].oi;
}
else
println("Wrong type of Item");

if(scroll.name != "None" && item.name != "None"){
backPack.itemSlot[sInt - 1].oi.upgrade(scroll);
upgraded = true;
}
}
}
if(selection == 3){
println("Pick item to display details.");
int i = getInt();

backPack.itemSlot[i - 1].oi.printStats();
}
}

升级“青铜 Helm ”之一后的库存

—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
[1] Bronze Helmet [+1] [2] Bronze Helmet [+1] [3] Helmet Def Scroll [4] None [5] None

[6] None [7] None [8] None [9] None [10] None
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
[Gold]: $50
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

项目.java:

import static com.projects.aoa.Print.*;
import static com.projects.aoa.Input.*;

import java.util.*;
import java.io.*;

class Item {

//Item
String name, type, category, statUpgrade;
int remSlots, maxSlots, upgraded, probability, statIncrease;
int hp, mp, str, def, atk, dex, duration;
Area shopPurchased;


//Inventory
public boolean filled;
public int count, stackLimit;


public static List<Item> helmets = new ArrayList<Item>();
public static List<Item> potions = new ArrayList<Item>();
public static List<Item> swords = new ArrayList<Item>();
public static List<Item> scrolls = new ArrayList<Item>();

Item(){
name = "None";
maxSlots = 5;
remSlots = 5;
}
public String toString(){
return (name);
}

static void loadItems(){

try {
//System.out.println(System.getProperty("user.dir"));

FileInputStream fstream = new FileInputStream(System.getProperty("user.dir")
+ "/LoadFiles/" + "itemLoad.txt");

DataInputStream in = new DataInputStream(fstream);

BufferedReader br = new BufferedReader(new InputStreamReader(in));

String line, itemType = "none";
int counter = 0;
Item newItem = new Item();

while((line = br.readLine()) != null) {
if(line.length() == 0){
newItem.printStats();
if(itemType.equals("helmet")){
helmets.add(newItem);
}
if(itemType.equals("potion")){
potions.add(newItem);
}
if(itemType.equals("sword")){
swords.add(newItem);
}
if(itemType.equals("scroll")){
scrolls.add(newItem);
}
counter = -1;
}
if(line.equals("#"))
break;

switch(counter) {
case -1:
counter++;
break;

case 0:

itemType = line;
counter++;
break;


case 1:
if(itemType.equals("helmet")){
//tempName = line;
newItem = new Helmet(line);
newItem.type = itemType;
}
if(itemType.equals("potion")){
newItem = new Potion(line);
newItem.type = itemType;
}
if(itemType.equals("sword")){
newItem = new Sword(line);
newItem.type = itemType;
}
if(itemType.equals("scroll")){
newItem = new Scroll(line);
newItem.type = itemType;
counter = 9;
}
counter++;
break;

case 2:
newItem.hp = Integer.parseInt(line);
counter++;
break;

case 3:
newItem.mp = Integer.parseInt(line);
counter++;
break;

case 4:
newItem.def = Integer.parseInt(line);
counter++;
break;

case 5:
newItem.str = Integer.parseInt(line);
counter++;
break;

case 6:
newItem.atk = Integer.parseInt(line);
counter++;
break;

case 7:
newItem.dex = Integer.parseInt(line);
counter++;
break;

case 8:
newItem.stackLimit = Integer.parseInt(line);
counter++;
break;

case 9:
newItem.duration = Integer.parseInt(line);
counter++;
break;
case 10:
newItem.category = line;
counter++;
break;
case 11:
newItem.statUpgrade = line;
counter++;
break;
case 12:
newItem.statIncrease = Integer.parseInt(line);
counter++;
break;
case 13:
newItem.probability = Integer.parseInt(line);
counter++;
break;
}

}

in.close();

} catch (Exception e) {
e.printStackTrace();
}
}


void printStats(){
line();
println("[" + name + "]");
println("Type: " + type);
println("Stack Limit: " + stackLimit);
println("Duration: " + duration);
println("HP: " + hp);
println("MP: " + mp);
println("Def: " + def);
println("Str: " + str);
println("Atk: " + atk);
println("Dex: " + dex);
}

void upgrade(Item scroll){
Random rand = new Random();

int geti;

if(remSlots > 0){
if(this.type.equals(scroll.category)){
int prob = rand.nextInt(99);
println("Prob: " + prob);

if(prob < scroll.probability){
if(scroll.statUpgrade.equals("def")){
this.def += scroll.statIncrease;
this.upgraded++;
println("Upgraded: " + this.upgraded);
}
}

remSlots--;
println("Slots: " + this.remSlots + " / " + this.maxSlots);
}
}
else
println("No slots remaining.");
}

static Item getItem(String searchedName){

Item item = new Item();

for(int i = 0; i < potions.size(); i++){
if(potions.get(i).name.equals(searchedName)){
item = potions.get(i);
return item;
}
}
for(int i = 0; i < helmets.size(); i++){
if(helmets.get(i).name.equals(searchedName)){
item = helmets.get(i);
return item;
}
}
for(int i = 0; i < swords.size(); i++){
if(swords.get(i).name.equals(searchedName)){
item = swords.get(i);
return item;
}
}

for(int i = 0; i < scrolls.size(); i++){
if(scrolls.get(i).name.equals(searchedName)){
item = scrolls.get(i);
return item;
}
}
return item;
}
}

库存:

public class Inventory {

int useableSlots, slots = 50;
Itemslot[] itemSlot = new Itemslot[slots];


Inventory(int slots){
this.useableSlots = slots;
}

public void printInventory(Player playerOne){
newWindow(5);

int excess, lineTotal = 0, invSlotSize = 25, maxLineLength = 125;
String invItem, difference = "";
String inventoryTitle = "[" + playerOne.name + "'s BackPack]";
String invTitleIndent = "";

for(int i = 0; i < (maxLineLength - inventoryTitle.length()) / 2; i++){
invTitleIndent += " ";
}

println(invTitleIndent + inventoryTitle);

printMult("—", maxLineLength);

line();


for(int i = 0; i < useableSlots; i++){

if(lineTotal >= maxLineLength){
line();
lineTotal = 0;
line();
}

if(i < 9){
difference = " ";
}
else{
difference = "";
}

invItem = ("[" + (i + 1) + "] " + difference);
if(itemSlot[i].stack.size() > 0){
invItem += (itemSlot[i].stack.get(0).name + "(" + itemSlot[i].stack.size() + ")");
}
else {
invItem += itemSlot[i].oi.name;

if(itemSlot[i].oi.upgraded > 0){
invItem += " [+" + itemSlot[i].oi.upgraded + "]";
}
}


excess = (invSlotSize - invItem.length());

for(int v = 0; v < excess; v++){
invItem += " ";
}

//print(invItem.length());
print(invItem);

lineTotal += invItem.length();

}

line();
printMult("—", maxLineLength);
line();

String printGold = "[Gold]: $" + playerOne.gold;
String goldIndent = "";

for(int i = 0; i < (maxLineLength - printGold.length()) / 2; i++){
goldIndent += " ";
}

println(goldIndent + printGold);

printMult("—", maxLineLength);
line();

line(2);

}


void addItem(Item item){
for (int i = 0; i < useableSlots; i++){
if (itemSlot[i].occupied == false) {
itemSlot[i].oi = item;
itemSlot[i].occupied = true;
break;
}
}
}

元素栏:

public class Itemslot extends Item{

List<Item> stack = new ArrayList<Item>();
Item oi = new Item();
boolean occupied;

}

这很可能只是我太愚蠢了,但如果能帮助解决这个问题,或者采取什么方向,我们将不胜感激。

编辑:已解决

向 Item 添加了复制构造函数

Item(Item item){
this.name = item.name;
this.type = item.type;
this.category = item.category;
this.statUpgrade = item.statUpgrade;
this.remSlots = item.remSlots;
this.maxSlots = item.maxSlots;
this.upgraded = item.upgraded;
this.probability = item.probability;
this.statIncrease = item.statIncrease;
this.hp = item.hp;
this.mp = item.mp;
this.str = item.str;
this.def = item.def;
this.atk = item.atk;
this.dex = item.dex;
this.duration = item.duration;
}

更改了addItem

void addItem(Item item){
Item newItem = new Item(item);
for (int i = 0; i < useableSlots; i++){
if (itemSlot[i].occupied == false) {
itemSlot[i].oi = newItem;
itemSlot[i].occupied = true;
break;
}
}
}

最佳答案

根据Effective Java 2 复制对象的推荐方式是提供一个复制构造函数

public Foo(Foo foo){
//.. copy all members
this.name=foo.name;
this.age=foo.age;

}

请注意,clone 方法是 broken in Java,根据同一本书。

我认为您的方法是错误的,您可以使用 ObjectInputStream 和 ObjectOutputStream 将对象写入数据文件

public class Item implements java.io.Serializable{
....
}

{
Item item=new Item();
ObjectInputStream stream=new ObjectInputStream(fileStream);
stream.write(item);
}

关于Java:从一种基本类型创建多个单独的对象。文字冒险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8629004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com