- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的小文本游戏中,我有一个 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/
由于 typescript 现在支持条件类型,我决定进行一些元编程,为 VSCODE intellisense 添加更多 flavor 。但是,虽然使用 A extends B 可以轻松分离其他类型,
我有一个 php var,它在回显时将 JS 函数写入页面的源代码。该函数循环遍历 CSV,因此其中包含以下行: $str="var lines = data.split('\n');"; 目前,当回
我有以下代码: name= "a"; value="b" $.post("ajax.php", {name:value}).... 然而 ajax.php 将收到 name=b 而不是 a=b。 我如
以下情况: var myVehicle = { brand: 'Tesla' }; var isMoving = Symbol(); var currentStatus = Symbol(); myV
我正在为 Python 翻译器编写 JavaScript,“\8”和“\9”给我带来了很多问题。根据文档,像“\8”或“\9”这样的东西是非法的,因为它们不是有效的八进制转义符。 Esprima pa
我有一个简单的 LinearLayout。当我将 android:background 添加到 LinearLayout 时,TextView 不再可见。 我不明白什么?
在尝试获得某种效果时遇到困难: 我有一张图片。我想将鼠标悬停在它上面。它应该变黑并弹出一些文本。 例子^ 执行此操作最简单/最简单的设置是什么?最好只有 HTML 和 CSS 注意:该元素需要在 CS
考虑以下代码: #include void f(const char * str) { str = "java"; } void main (int argc, char * argv[])
我想在 MySQL 中插入一条具有非 ASCII Unicode 字符的记录,但我在一个不允许我轻松键入非 ASCII 字符的终端上。如何在 MySQL 的 SQL 语法中转义 Unicode 文字?
Perl脚本batchReplace.pl可以用来批量替换文件中的文字/代码。可在指定目录中查找指定类型的文件,并递归检查子目录;在输出文件时复制输入文件的目录结构。 [附件]Win32应用程序b
我知道从 flutter 应用程序共享的官方包。 https://pub.dartlang.org/packages/share 共享文本和 url 很容易,但我想共享来自服务器的图像意味着它是 UR
在 Qt 文档中,它说 qreal是一个 Typedef for double unless Qt is configured with the -qreal float option. 这基本上意味
我想让 idris 证明 testMult : mult 3 3 = 9有人居住。 不幸的是,这是键入为 mult (fromInteger 3) (fromInteger 3) = fromInte
如您所知,Apple 为 NSNumber、NSDictionary、NSArray 等类提供了 @literals,因此我们可以通过这种方式创建对象,例如 NSArray *array = @[ob
有没有办法在类型上定义公共(public)文字(C# 中的公共(public) const)?显然 let 类型中的绑定(bind)必须是私有(private)的,并且 Literal 属性不能应用于
为什么下面的语法不能识别 bool 值? 我已经将其与 Java 和 GraphQL 的语法进行了比较,但不明白为什么它不起作用。 给定以下语法,解析如下: foo = null // foo = v
当我需要一个文字来测试一个带有序列的函数时,我注意到我自己的习惯比列表更频繁地使用向量。 IE。 : (map inc [1 2 3]) 但不是: (map inc (list 1 2 3)) 虽然它
是否可以在sqlite中制作类似的东西? FOREIGN KEY(TypeCode, 'ARawValue', IdServeur) REFERENCES OTHERTABLE(TypeCode, T
在我这学期的系统软件类(class)中,我们正在学习汇编程序和其他系统软件。在阅读整个类(class)时,我遇到了LITERALS主题。 对文字和立即操作数进行了比较,发现它们之间的唯一区别是文字不被
我正在使用命令行语法编写一个 gstreamer 管道来发送视频流,并想用它发送数据。我认为可行的一种解决方案是将数据作为字幕文件发送。 我可以使用以下管道通过 rtp 多路复用视频和字幕文件: gs
我是一名优秀的程序员,十分优秀!