2017-12-05 11 views
1

私のプロジェクトでは、私はビジュアルスタジオフォームで人生のゲームを構築しています。私が現在直面している問題は、クラスオブジェクトを初期化する場所がわからないため、他のフォームで値を変更できることです。別のフォームのクラスのインスタンス変数を変更する

これは私がボードゲームとプレイヤーの現在の統計情報を表示しています、私の基本フォームクラスである:

public partial class Life : Form 
{ 
    public Game game; 

    public Life() 
    { 
     game = new Game(); 
     InitializeComponent(); 
    } 

    private void Life_Load(object sender, EventArgs e) 
    { 
     Txt_BlueMoney.Text = game.player1.money.ToString(); 
     Txt_RedMoney.Text = game.player2.money.ToString(); 
    } 

    private void Btn_Start_Click(object sender, EventArgs e) 
    { 
     StartGame sg = new StartGame(); 
     sg.Show(); 


    } 
} 

マイゲームのクラスは他のクラスのインスタンスが含まれているだけのクラスです:

public class Game 
{ 
    public Board board; 
    public BoardSpaceEvent boardEvent; 
    public Player player1; 
    public Player player2; 

    public Game() 
     : base() 
    { 
     board = new Board(); 
     boardEvent = new BoardSpaceEvent(); 
     player1 = new Player(); 
     player2 = new Player(); 
    } 

} 

と、ここではそのすべての重要性のゲームをする場合には初期化されたクラスのうちの一つの例である:

public class Player : BoardSpaceEvent 
{ 
    // might need to add getter and setter to access these variables 
    public bool endOfTurn; 
    public int currentSpace; 
    public int numChildren; 
    public int money; 
    public int advanceSpaces; 
    public List<int> playerLifeCards; 
    public string career; // superstar, agent, teacher, athlete, salesperson, doctor, accountant, artist, police 
    public int salary; 
    public int taxes; 
    public bool autoInsurance; 
    public bool houseInsurance; 

    public Player() 
     : base() 
    { 
     endOfTurn = false; // might need to switch this 
     currentSpace = 0; 
     money = 10000; // will have to change this to whatever you start with 
     numChildren = 0; 
     advanceSpaces = 0; // make sure to pass this as reference 
     playerLifeCards = new List<int> { }; 
     career = ""; 
     salary = 0; 
     taxes = 0; 
     autoInsurance = false; 
     houseInsurance = false; 
    } 
} 

今私がしようとしているのは、ユーザーが2つのボタンの間で選択しなければならない別のフォームを開き、これらのボタンのそれぞれがクラスインスタンス変数を変更することです。これを行う最善の方法は何ですか?ここでは(私のコメントは、私が何をしたいのかを示して)私がこれまで持っているものです。

public partial class StartGame : Form 
{ 
    public StartGame() 
    { 
     InitializeComponent(); 
    } 

    private void Btn_College_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("You've chosen college"); 
     // this is where I want to update a players money variable in the Player class 
     this.Close(); 
    } 

    private void Btn_Job_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("You've chosen job"); 
    } 
} 

私は参照として渡す試してみましたが、それは動作しませんでした。たぶん私は間違っていた。私もメインフォームから継承しようとしましたが、その問題は背景も継承されていることです。私は静的なインスタンスを使用するように見てきましたが、この悪い習慣ではありませんか?前もって感謝します!

+4

をスパムではない言語タグを行ってください。 – molbdnilo

+0

"私は参照として渡すことを試みたが、それはうまくいかなかった。"私はあなたが参照を渡そうとするところにコードを見ません。何が間違っていたのですか?あなたのコンパイラは代わりにスープを作るかコード実行をしましたか? ;) –

答えて

0

クラスStartGameにはGameオブジェクトをパラメータとして、Game localGame;のローカル変数をとることができる2番目のコンストラクタを与えます。

private void Btn_Start_Click(object sender, EventArgs e) 
{ 
    StartGame sg = new StartGame(game); 
    sg.Show(); 
} 

は、単にローカル変数にStartGame、コンストラクタに渡されたパラメータを割り当て、あなたがそれを使用することができます:あなたはStartGameフォームを開いたときに

はその後、クラス Lifeから public Game game;を渡すことができますあなたの Btn_College_Clickメソッド。

これが役に立ちます。それは私にコメント

EDITドロップオフにされていない場合:

を私はまた、メインフォームから継承しようとしたが、それに伴う問題も継承されている背景です。

継承が可能な場合でも、問題は解決しません。それぞれの子供はそれを持っていますs own personal instance ofゲーム `は、親が持っているオブジェクトとは異なります。したがって、子オブジェクトを変更しても、親オブジェクトには影響しません。

あなたの子供があなたの髪の色を引き継ぐと想像してください。今あなたはあなたの髪に何が起こるのかについて、あなたの子供の髪を別の色に塗るのですか?私はちょうどそれをしようとしたとき

0

これが働いた:

public partial class Life : Form 
{ 
    private int _money; 

    public void AddMoney(int amount) 
    { 
     _money += amount; 
     label1.Text = _money.ToString(); 
    } 

    public Life() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, System.EventArgs e) 
    { 
     var startGame = new StartGame(this); 
     startGame.Show(); 
    } 
} 

public partial class StartGame : Form 
{ 
    private readonly Life _life; 

    public StartGame(Life life) 
    { 
     InitializeComponent(); 

     _life = life; 
    } 

    private void button1_Click(object sender, System.EventArgs e) 
    { 
     _life.AddMoney(5); 
    } 
} 
関連する問題