2016-11-07 235 views
1

這是我第一次編寫如此複雜的代碼,我偶然發現了一個問題。 所以,我試圖在Visual C#中使用visual studio製作一個非常基本的基於文​​本的RPG遊戲。 我有3種形式,直到這一點。主菜單窗體(帶有播放和退出按鈕),角色選擇窗體(一旦你點擊播放就打開)以及遊戲窗體本身。 在角色選擇表單上,提示用戶選擇角色類別(法師,戰士,流氓)。 我創建了一個公共抽象類叫做實體:在switch語句中聲明類對象

public abstract class Entity 
{ 
    #region Attributes 

    protected string _name; 
    protected int _strength, _strengthModifier, 
     _magic, _magicModifier, 
     _luck, _luckModifier, 
     _defense, _defenseModifier, 
     _health, _healthModifier; 

    #endregion 

    #region Properties 

    public string Name 
    { 
     get { return _name; } 
     protected set { _name = value; } 
    } 
    public int Strength 
    { 
     get { return _strength; } 
     protected set { _strength = value; } 
    } 
    public int StrengthModifier 
    { 
     get { return _strengthModifier; } 
     protected set { _strengthModifier = value; } 
    } 
    public int Magic 
    { 
     get { return _magic; } 
     protected set { _magic = value; } 
    } 
    public int MagicModifier 
    { 
     get { return _magicModifier; } 
     protected set { _magicModifier = value; } 
    } 
    public int Luck 
    { 
     get { return _luck; } 
     protected set { _luck = value; } 
    } 
    public int LuckModifier 
    { 
     get { return _luckModifier; } 
     protected set { _luckModifier = value; } 
    } 
    public int Defense 
    { 
     get { return _defense; } 
     protected set { _defense = value; } 
    } 
    public int DefenseModifier 
    { 
     get { return _defenseModifier; } 
     protected set { _defenseModifier = value; } 
    } 
    public int Health 
    { 
     get { return _health; } 
     protected set { _health = value; } 
    } 
    public int HealthModifier 
    { 
     get { return _healthModifier; } 
     protected set { _healthModifier = value; } 
    } 

    #endregion 

    #region Constructor 
    public Entity() 
    { 
     Name = ""; 
     Strength = 0; 
     Magic = 0; 
     Luck = 0; 
     Defense = 0; 
     Health = 0; 
    } 
    #endregion 

    #region Methods 

    #endregion 

} 

然後,我創建了武士階層,年齡組和流氓類從這一個繼承。

class Mage : Entity 
{ 
    public Mage(string name) : base() 
    { 
     _name = name; 

      #region Stats 
     _strength = 0; 
     _strengthModifier = 0; 
     _magic = 10; 
     _magicModifier = 3; 
     _luck = 3; 
     _luckModifier = 0; 
     _defense = 5; 
     _defenseModifier = 0; 
     _health = 100; 
     _healthModifier = 0; 
      #endregion 
    } 
} 

現在,我在遊戲窗體上創建類對象本身。從角色選擇表格我稱之爲遊戲表格,我將玩家名稱和類別作爲參數發送。

 public Game(string name, string characterClass) 
    { 
     InitializeComponent(); 

     #region CreateCharacter 

     switch (characterClass) 
     { 
      case "Mage": 
       { 
        Mage player = new Mage(name); // create player 

        #region PrintPicture 

        pbPlayer.Image = Image.FromFile("C:/Users/mircea/Documents/Visual Studio 2015/Projects/RPG/Artwork/Characters/Mage.png"); 
        pbPlayer.BackgroundImageLayout = ImageLayout.Center; 
        pbPlayer.Size = new Size(145, 200); 

        #endregion 

        lblName.Text = player.Name.ToString(); // show player name 
        txtLog.Text += "Welcome to game title, " + name + "!"; // greet log 
        break; 
       } 
      case "Rogue": 
       { 
        Rogue player = new Rogue(name); // create player 

        #region PrintPicture 

        pbPlayer.Image = Image.FromFile("C:/Users/mircea/Documents/Visual Studio 2015/Projects/RPG/Artwork/Characters/Rogue.bmp"); 
        pbPlayer.BackgroundImageLayout = ImageLayout.Center; 
        pbPlayer.Size = new Size(145, 200); 

        #endregion 

        lblName.Text = player.Name.ToString(); // show player name 
        txtLog.Text += "Welcome to game title, " + name + "!"; // greet log 
        break; 
       } 
      case "Warrior": 
       { 
        Warrior player = new Warrior(name); // create player 

        #region PrintPicture 

        pbPlayer.Image = Image.FromFile("C:/Users/mircea/Documents/Visual Studio 2015/Projects/RPG/Artwork/Characters/Warrior.png"); 
        pbPlayer.BackgroundImageLayout = ImageLayout.Center; 
        pbPlayer.Size = new Size(145, 200); 

        #endregion 

        lblName.Text = player.Name.ToString(); //show player name 
        txtLog.Text += "Welcome to game title, " + name + "!"; // greet log 
        break; 
       } 
     } 

     #endregion 


    } 

現在。如果我試圖在該開關外面打電話給玩家,它不會工作。我能看到的唯一解決方案是讓代碼有三次,每次都是一次。無論如何,我肯定不會這樣。 有什麼建議嗎?

+2

變量對於開關盒來說是本地的。一旦在開關外面,它們就會自動銷燬。如果你想在交換機外部使用它們,你需要在交換機之外聲明它們 – Steve

回答

0

問題是因爲您在本地畫筆中實例化對象,也就是說,您將無法從開關外部訪問它們。如果你想在交換機外使用它們,你需要在交換機之外聲明它們。像這樣:

public Game(string name, string characterClass) 
    { 
     InitializeComponent(); 

     #region CreateCharacter 

     Entity player = null; 
     switch (characterClass) 
     { 
      case "Mage": 
       { 
        player = new Mage(name); // create player 

        #region PrintPicture 

        pbPlayer.Image = Image.FromFile("C:/Users/mircea/Documents/Visual Studio 2015/Projects/RPG/Artwork/Characters/Mage.png"); 
        pbPlayer.BackgroundImageLayout = ImageLayout.Center; 
        pbPlayer.Size = new Size(145, 200); 

        #endregion 

        lblName.Text = player.Name.ToString(); // show player name 
        txtLog.Text += "Welcome to game title, " + name + "!"; // greet log 
        break; 
       } 
      case "Rogue": 
       { 
        player = new Rogue(name); // create player 

        #region PrintPicture 

        pbPlayer.Image = Image.FromFile("C:/Users/mircea/Documents/Visual Studio 2015/Projects/RPG/Artwork/Characters/Rogue.bmp"); 
        pbPlayer.BackgroundImageLayout = ImageLayout.Center; 
        pbPlayer.Size = new Size(145, 200); 

        #endregion 

        lblName.Text = player.Name.ToString(); // show player name 
        txtLog.Text += "Welcome to game title, " + name + "!"; // greet log 
        break; 
       } 
      case "Warrior": 
       { 
        player = new Warrior(name); // create player 

        #region PrintPicture 

        pbPlayer.Image = Image.FromFile("C:/Users/mircea/Documents/Visual Studio 2015/Projects/RPG/Artwork/Characters/Warrior.png"); 
        pbPlayer.BackgroundImageLayout = ImageLayout.Center; 
        pbPlayer.Size = new Size(145, 200); 

        #endregion 

        lblName.Text = player.Name.ToString(); //show player name 
        txtLog.Text += "Welcome to game title, " + name + "!"; // greet log 
        break; 
       } 
     } 

     #endregion 


    } 

我只是把玩家的聲明放在抽象類型的開關上。

通過在交換機之前聲明對象,您將能夠訪問它並進出它。由於所有對象都是從實體繼承而來的,實體是一個抽象類,所以可以用它來輸入對象。

這是我看到解決您的問題的最佳方式。

+0

嗨!我嘗試過,但仍然出現錯誤。它說:「一個名爲'player'的本地或參數不能在這個範圍內聲明,因爲這個名字被用在一個封閉的本地範圍中來定義一個本地或參數」,並且它說每個「玩家」(法師,流氓,戰士)在交換機內 – Mike

+0

這對我來說很好。但請記住,所有類型都需要擴展實體。你可以把流氓和勇士班? –

+0

我也想看看Game類。我想你忘記在'player'變量之前刪除類型。您必須將變量的類型放在交換機上方的聲明中。 –