2017-10-13 17 views
0

私は、アイテム、ショップなどでコンソールのテキストベースの冒険に取り組んでいます。C#の他の関数で定義されたクラス変数を使用する

今、私はクラスを使って剣を購入するコードを短縮したいと思っています。私は、あなたが他で買うことができる剣をランダム化するために別々の機能とコードで剣の定義を置く:

namespace Text_Adventure 
{ 
     class Game 
    { 
//Weapon class 

    public class Weapon{ 
      public string name; 
      public int damage; 
      public int magic; 
      public int durability; 
      public int price; 
     } 

//the weapon showed in the shop 
    public class Weaponshop{ 
      public string name; 
      public int damage; 
      public int magic; 
      public int durability; 
      public int price; 
     } 

... 


// defenition of swords 

public void swords() 
    { 
     Weapon sword1 = new Weapon(); 

     sword1.name = "Wooden Sword"; 
     sword1.damage = 2; 
     sword1.magic = 1; 
     sword1.durability = 20; 
     sword1.price = 10; 

     Weapon sword2 = new Weapon(); 

     sword2.name = "Iron Sword"; 
     sword2.damage = 3; 
     sword2.magic = 2; 
     sword2.durability = 50; 
     sword2.price = 20; 
... 
    } 

//gamble sword that are shown in the shop 
public void swordgamble() 
    { 

     Random shopgamble = new Random(); 
     Weaponshop shopsword1 = new Weaponshop(); 
     //gamble shopsword 1 

     int shopgamblenumber = shopgamble.Next(1, 8 + 1); 

今problemcode同じことがshopsword2とshopsword3

で発生

---> if (shopgamblenumber == 1) 
     { 
      shopsword1 = sword1; 
     } 

     if (shopgamblenumber == 2) 
     { 
      shopsword1 = sword1; 
     } 
             <---- 

public void buysword 
{ 

swordgamble(); 
Console.WriteLine("Shop"); 
     Console.WriteLine(); 
     Console.WriteLine("Which sword do you would like to have?"); 
     Console.WriteLine(); 

     while (correct == 0) 
     { 
      Console.WriteLine("1. " + shopsword1.name); 
      Console.WriteLine("2. " + shopsword2.name); 
      Console.WriteLine("3. " + shopsword3.name); 
      Console.WriteLine("4. None of these"); 
      Console.WriteLine(""); 
... 

} 

私のプログラマーは、私が剣で設定した変数を読み込むことができず、それをショップに預けることはできません。

私の古いバージョンは変数だけで、これはかなり大きいので、私はあなたが買うことができる8つの剣を取った。誰かが私が剣で設定した変数を読んで、関数buysword()でショップワードを読む方法を知っていますか? ?

+0

あなたは変数を初期化し、それらをswords()voidの中に投げ捨てました。あなたはどこかにそれらを格納していたはずです –

+0

'Weapons'を' Weaponshop'型の変数にどのように割り当てることができますか? –

+0

--- ---セクタをマークすることでした 申し訳ありません申し訳ありません申し訳ありません私は新しいです – KillSwitch

答えて

0

誰かが指摘したように、生成された剣を変数に格納する必要があります。 IDictionary<int, Weapon>を使用すると、swordgamble()のコードを簡略化できます。この辞書の鍵は、この辞書にアクセスするために使用される店員番号です。

public IDictionary<int, Weapon> swords() 
    { 
     var dict = new Dictionary<int, Weapon> swords() { 
     1, new Weapon { 
      name = "Wooden Sword", 
      damage = 2, 
      magic = 1, 
      durability = 20, 
      price = 10 
     }, 
     2, new Weapon { 
      name = "Iron Sword", 
      damage = 3, 
      magic = 2, 
      durability = 50, 
      price = 20 
     } 
    }; 
    return dict; 
} 

次に、これを使用して剣を生成します。

public void swordgamble() { 

     var swordsDict = swords(); 
     Random shopgamble = new Random(Guid.NewGuid().GetHashCode()); // seed rng 
     Weaponshop shopsword1 = new Weaponshop(); 
     //gamble shopsword 1 

     int shopgamblenumber = shopgamble.Next(1, 8 + 1); 
     var sword = swordsDict[shopgamblenumber]; 
     //... 
} 

また、Weaponshopのでshopsword1 = swordが動作することができますWeaponから継承する必要があります。

+0

ありがとうございました – KillSwitch

+1

なぜ、継承は、合計で1つのクラスを使用するのですか?私が見る限り、「Weaponshop」と「Weapon」の間に違いはありません。意味のある違いがあった場合、私は期待しています。 「武器」には価格がない。 – Flater

0

ゲオルグの答えを使用すると、実際に武器ファクトリメソッドを作成することで、剣の呼び出しが行われるたびに辞書を作成するオーバーヘッドを節約できます。

 public Weapon swords(int weaponNumber) 
     { 
      switch (weaponNumber) 
      { 
       case (1); 
        return new Weapon() { 
         name = "Wooden Sword", 
         damage = 2, 
         magic = 1, 
         durability = 20, 
         price = 10 
         }; 
       case (2): 
        return new Weapon() { 
         name = "Iron Sword", 
         damage = 3, 
         magic = 2, 
         durability = 50, 
         price = 20 
        }; 
       default: 
        return null; //Or some other default for when it doesn't exist 
      } 
     } 

次に、あなたの呼び出し元のコードは、この

public void swordgamble() {  
     Random shopgamble = new Random(Guid.NewGuid().GetHashCode()); // seed rng 
     Weapon shopsword1; 
     //gamble shopsword 1 

     int shopgamblenumber = shopgamble.Next(1, 8 + 1); 
     shopsword1 = swords(shopgamblenumber); 
     //... 
} 

のようになります。そして、Flaterはあなただけで検索された武器のインスタンスを保持するために、再び武器クラスを使用することができWeaponShopクラスの必要がないコメントとして店から

関連する問題