2016-11-07 2 views
1

これは私の初めてのコード作成なので、問題に遭遇しました。 私はビジュアルC#でビジュアルスタジオを使用して、非常に基本的なテキストベースのRPGを作成しようとしています。 私はこの時点までに3つの書式を持っています。メインメニューフォーム(プレイボタンと終了ボタン)、キャラクタ選択フォーム(プレイをクリックすると開く)、ゲームフォーム自体。 キャラクタ選択フォームでは、キャラクタクラス(Mage、Warrior、Rogue)を選択するように求められます。 私は、エンティティと呼ばれるパブリック抽象クラスを作成しました: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 

} 

それから私はこの1つから継承して武士階級、年齢クラスと不正なクラスを作成しました。

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 


    } 

です。私はそのスイッチの外にプレーヤーを呼び出そうとすると、それは動作しません。私が見ることができる唯一の解決策は、それぞれの場合に1回、コードを3回持つことです。私は、とにかく、1000%は方法ではないと確信しています。 提案がありますか?

+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

こんにちは!私はそれを試みたが、私はまだエラーが発生します。 「プレイヤー」という名前のローカルまたはパラメータは、このスコープ内で宣言することはできません。その名前は、ローカルまたはパラメータを定義するためにローカルスコープを囲むために使用されるため、「プレイヤー」(メイジ、ローグ、戦士)スイッチ内 – Mike

+0

これは私にとってはうまく動作します。しかし、すべてのタイプがEntityを拡張する必要があることを忘れないでください。あなたはローグと戦士のクラスを置くことができますか? –

+0

私はGameクラスも見たいと思います。私は 'player'変数の前に型を削除することを忘れてしまったと思います。変数の型をスイッチの上に宣言する必要があります。 –

関連する問題