2

PC向けの人気ゲーム「 Ruzzle 」をやってみました参照:

ここに画像の説明を入力

私は非常にばかげたエラーで立ち往生していると思いますが、何らかの理由でプロパティが機能していないようです!

という名前のboolプロパティを持つ「check」というクラスがありますUsed。true に設定すると、背景が白からオレンジに変わります。これは、次の方法で実現されます。

bool _used; 

public bool Used
{
    get { return _used; }
    set { _used = value; Invalidate(); }
}

void Check_Paint(object sender, PaintEventArgs e)
{
    Graphics area = e.Graphics;

    if (_used==false)
    {
        area.FillRectangle(Brushes.White, 0, 0, Width - 1, Height - 1);
        ...
    }
    else
    {
        area.FillRectangle(Brushes.Orange, 0, 0, Width - 1, Height - 1);
        ...
    }
}

mouseClickクラスで定義するイベントに割り当てましたRuzzle。このクラスRuzzleは、基本的に の 2 次元配列であるゲームを処理しCheckます。

public event EventHandler selected;

//in the constructor I've put this
this.MouseClick += new MouseEventHandler(Check_MouseClick);

そして最後に

void Check_MouseClick(object sender, MouseEventArgs e)
{
    if (selected != null)
    {
        selected(this, e);
    }                

    Invalidate();
}

クラスでは、次のようにしてオブジェクトRuzzleの bool プロパティを変更しようとしています:Check

public Ruzzle(Control father)
{ 
    myGame = new Check[4, 4];

    for (int i = 0; i < 4; i++)
    {
        for(int j=0;j<4;j++)
        {          
            myGame[i, j] = new Check(50, father,i,j);
            myGame[i, j].Location = new Point((i * 50), (j * 50));
            father.Controls.Add(myGame[i, j]);
            myGame[i, j].selected += new EventHandler(Ruzzle_selected);
        }
    }       
}

void Ruzzle_selected(object sender, EventArgs e)
{
    int r = (sender as Check).Row;
    int c = (sender as Check).Column;
    myGame[r, c].Used = true;
}

MessageBox.Show を実行すると、正しい値が得られるため、プロパティとプロパティは正常に機能していますRowただし、クラスで Paint メソッドを実行すると、ブール値は変更されません。ColumnCheckUsed

私は何を間違っていますか?

4

1 に答える 1

1

これを回答として投稿しますが、これはコードの正確な問題を伝えるものではありません。コード自体は問題ないように見えるので、デバッグする必要があります。この問題をデバッグする方法に関するヒントをいくつか紹介しましょう。

あなたのUsedプロパティが である理由として、2 つの明白なシナリオが考えられfalseます。

  1. true正しく変更されていません。

  2. falseある時点でリセットされます。

したがって、これらの両方の可能性を確認する必要があります。Checkまず、クリックされたインスタンスを除いて、すべてのインスタンスを無視する必要があります。そうしないと、デバッグ中に他のインスタンスが気を散らしてしまう可能性があります。これを行うには、次の 2 つの簡単な方法があります。

  1. インスタンスを 1 つだけインスタンス化します。この場合、ゲームで可能であれば 1x1 フィールドを作成する必要があります。

  2. デバッグ中に距離を区別します。Make object Idと呼ばれる VS デバッガーの便利な機能があります。基本的に、デバッグ中に数値の一意の識別子をオブジェクトに割り当てることができます。後で、デバッガーでその ID を観察することにより、特定のインスタンスが以前にマークしたものであるかどうかを確認できます。以前にこの機能を使用したことがない場合は、上記のリンクを確認してください。

さて、Checkクラスのインスタンスのみをデバッグしています。プロパティが正しく設定されているかどうかを確認することから始めましょう。プロパティの値を確認する必要があるポイントがいくつかあります。次に例を示します。

  1. Paint条件があるハンドラー。

  2. Usedメソッド呼び出し時のプロパティのセッターInvalidate_used間違いなくあるはずtrueです。

  3. Ruzzle_selectedハンドラーの最後。Usedプロパティはtrueここにある必要があり、チェックする必要があります。そうであればtrue、少なくとも正しく設定されていると結論付けることができます。

プロパティUsedが にリセットされていないかどうかを確認してみましょうfalse。あなたのコードを見る限り、実際にリセットしたい場所はないはずです。つまり、そのような動作が見つかった場合は、探しているバグである可能性があります。_usedプロパティ以外の場所にフィールドにアクセスしないと仮定しますUsed。この場合、この可能性のある問題のデバッグは非常に簡単です。プロパティのセッターにブレークポイントを配置し、それが設定されているかどうかを確認するだけですfalse。ブレークポイントを設定したときにブレークポイントにヒットするのを避けるために、ブレークポイント条件true機能を使用できます。あなたの場合、状態は次のようになります。value == false && _used == true

これらの手順を使用してデバッグを試し、問題が解決するかどうかお知らせください。それ以外の場合は、私が見逃している可能性があります。この場合、回答を拡張します。

于 2013-03-21T12:21:24.430 に答える