การสร้างเกมข้อความเพื่อฝึกเขียนโค้ดและพบปัญหาที่แปลกประหลาดจริงๆ ฉันค้นหาสิ่งนี้ แต่คนส่วนใหญ่พยายามโคลนวัตถุหนึ่งไปยังอีกวัตถุหนึ่งในขณะที่ฉันพยายามชี้วัตถุ B ไปที่วัตถุ A เพราะฉันต้องการเปลี่ยนคุณสมบัติของวัตถุเดียวกัน
public Armor Player_Chest_Armor { get; set; }
public Armor Player_Head_Armor { get; set; }
public Armor Player_Legs_Armor { get; set; }
public Weapon Player_Weapon { get; set; }
public Spell Player_Spell { get; set; }
public List<Consumable> Consumables { get; set; }
public List<IEquipment> Inventory { get; set; }
[JsonConstructor]
public Player (string name) {
this.Name = name;
this.Consumables = new List<Consumable>();
this.Inventory = new List<IEquipment>();
this.Inventory.Add(new Weapon("bronze sword", 22, 28, 25, 1.2, false));
this.Inventory.Add(new Armor("bronze chestplate", Armor.ArmorSlot.Chest, 35, 10, 20, false));
this.Inventory.Add(new Armor("bronze helmet", Armor.ArmorSlot.Head, 12, 3, 7, false));
this.Inventory.Add(new Armor("bronze legplates", Armor.ArmorSlot.Legs, 20, 5, 10, false));
this.Consumables.Add(new Consumable("minor health potion", 3, Consumable.PotionType.Health, 50));
this.Consumables.Add(new Consumable("minor mana potion", 3, Consumable.PotionType.Mana, 50));
this.Player_Spell = new Spell("Fireball", 50, 0, 1);
}
public void EquipInitialGear() {
this.EquipWeapon(this.Inventory[0] as Weapon);
this.EquipArmor(this.Inventory[1] as Armor);
this.EquipArmor(this.Inventory[2] as Armor);
this.EquipArmor(this.Inventory[3] as Armor);
}
public void DecreaseArmorDurability() {
try {
this.Player_Chest_Armor.DecreaseDurability();
}
นี่คือส่วนที่เกี่ยวข้องของโค้ดจากคลาสผู้เล่นของฉัน ผู้เล่น_ อะไรก็ตามที่เป็นของที่ผู้เล่นได้ติดตั้ง ไม่ว่าจะเป็นชุดเกราะ อาวุธ ฯลฯ ฉันใช้อินเทอร์เฟซ IEquipment เพื่อเชื่อมต่อทั้งชุดเกราะและวัตถุอาวุธในรายการเดียว เนื่องจากช่องเก็บของของผู้เล่นควรมีทุกอย่าง เมื่อผู้เล่นถูกสร้างขึ้น การเรียกเมธอด EquipWeapon และ EquipArmor กำลังตั้งค่าออบเจ็กต์ดัชนีสินค้าคงคลังเหล่านั้นไปยังช่องเกราะ/อาวุธของผู้เล่นที่เหมาะสม โค้ดด้านล่างและสมมุติเพื่อความเรียบง่ายว่าไม่มีอาวุธที่ติดตั้งไว้แล้ว ดังนั้นมันจึงตรงไปที่บรรทัด this.Player_Weapon = weapon
public void EquipWeapon(Weapon weapon) {
if (weapon.IsEquipped() == true) {
Console.WriteLine("You have already equipped {0}.", weapon.GetName());
return;
}
try {
if (this.Player_Weapon.Equipped == true) {
this.UnequipWeapon(this.Player_Weapon);
}
}
catch(NullReferenceException) {}
this.Player_Weapon = weapon;
weapon.Equipped = true;
Console.WriteLine("You have equipped {0}.", this.Player_Weapon.GetName());
}
เมื่อฉันพยายามเปลี่ยนค่าคุณสมบัติของ Player_Weapon มันจะเปลี่ยนสำหรับวัตถุนั้น แต่วัตถุในสินค้าคงคลัง (ซึ่งควรจะเหมือนกัน) มีค่าคุณสมบัติดั้งเดิม ลดความทนทานดังต่อไปนี้ในคลาสอาวุธ:
public void DecreaseDurability() {
this.Durability -= 1;
}
ทุกรอบการโจมตี ผมเรียกวิธีนี้ว่าค่าความทนทานของอาวุธลดลง 1 จากสูงสุด 100 ในโหมดแก้ไขจุดบกพร่อง ผมสามารถเห็นได้ว่าสิ่งนี้ Player_Weapon ความทนทานเปลี่ยนจาก 100 เป็น 99 อย่างไรก็ตาม หากผมไปดูที่ สิ่งที่ควรเป็นวัตถุเดียวกันในสินค้าคงคลังคือความทนทานคือ 100 ซึ่งทำให้ฉันคิดว่ามันเป็นการสร้างสำเนาของวัตถุแทนที่จะอ้างอิงถึงวัตถุดั้งเดิม
ฉันเชื่อว่านี่เป็นปัญหาของพอยน์เตอร์ แต่ฉันไม่เห็นว่าปัญหาอยู่ที่ใด ฉันต้องการให้การเปลี่ยนแปลงคุณสมบัติของ Player_Weapon ส่งผลต่อการเปลี่ยนแปลงวัตถุเดียวกันของอาวุธนั้นในสินค้าคงคลังที่ควรชี้ไปด้วย
แก้ไขเพื่อความชัดเจน: ผู้เล่น อาวุธ และชุดเกราะล้วนเป็นคลาส ไม่ใช่โครงสร้าง
ref
- person   schedule 20.12.2019Weapon
คือclass
ไม่ใช่struct
ใช่ไหม - person Fildor   schedule 20.12.2019Player.Player_Weapon
ควรอ้างอิงอินสแตนซ์เดียวกันกับWeapon
เป็นPlayer.Inventory[0]
อย่างที่คุณพูด จะต้องมีอย่างอื่นที่อื่น - person Fildor   schedule 20.12.2019Player_Weapon
เป็น r/w ในขณะที่ควรเป็นแบบอ่านอย่างเดียว สถานที่เดียวที่ควรได้รับอนุญาตให้ตั้งค่าคุณสมบัติPlayer_Weapon
ควรเป็นเมธอดEquipWeapon
ทำ{get; private set;}
แล้วดูว่าแตกตรงไหน - person Fildor   schedule 20.12.2019Player_Weapon
คุณสมบัติเช่นนี้ เลย อาจแค่เก็บดัชนีไว้ในช่องเก็บของเพื่อทำเครื่องหมายรายการที่ คือ อาวุธของผู้เล่น แต่ฉันอยู่ข้างหน้าตัวเอง ... - person Fildor   schedule 20.12.2019