2

ボード

上記はボードのイメージです

ブルートフォース列挙を使用せずに2色を連続して検出して勝者を決定する方法を見つけるのは難しい..

私はアルゴリズムを持っていて、それを実装しようとしていますが、それを機能させることができないようです..誰かがこれを行う方法を知っているでしょう..

勝者の斜めの垂直方向と水平方向を検出したい..

ps 通常は解決策を求めませんが、今回は本当に助けが必要です。どうもありがとう

これは、平和を置くことを可能にするプログラム用に私が持っているコードです

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        private Button[] btns;
        private Button[] btns2;
        private Button[] btns3;
        public Color[] col;
      //  public var x;

        public Form1()
        {
            InitializeComponent();

            btns = new Button[2] { button2, button3 };
            btns2 = new Button[2] { button4, button5 };
            btns3 = new Button[2] { button9, button8 };
            col = new Color[2] { Color.Red, Color.Yellow };
           Color x = col[0];
            Color y = col[1];


        }



        private void Form1_Load(object sender, EventArgs e)
        {

            foreach (var btn in btns)
            {
                btn.Enabled = false;
                btn.BackColor = Color.LightCyan;
            }

            foreach (var btn in btns2)
            {
                btn.Enabled = false;
                btn.BackColor = Color.LightCyan;
            }
            foreach (var btn in btns3)
            {
                btn.Enabled = false;
                btn.BackColor = Color.LightCyan;
            }
        }




        public int state;
        int cc = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            foreach (var btn in btns)
            {
                  {
                    if (!btn.Enabled)
                    {
                        btn.Enabled = true;

                        if (cc == 0)
                        {
                            cc = 1;
                            btn.BackColor = col[0];

                        }
                        else
                        {
                            cc = 0;
                            btn.BackColor = col[1];
                        }



                        return;
                    }

                }
            }       
        }


        private void button6_Click(object sender, EventArgs e)
        {
            foreach (var btn in btns2)
            {
                if (!btn.Enabled)
                {
                    btn.Enabled = true;

                    if (cc == 0)
                    {
                        cc = 1;
                        btn.BackColor = col[0];
                    }
                    else
                    {
                        cc = 0;
                        btn.BackColor = col[1];

                    }



                    return;
                }
            }
        }

        private void button7_Click(object sender, EventArgs e)
        {

            foreach (var btn in btns3)
            {
                if (!btn.Enabled)
                {
                    btn.Enabled = true;

                    if (cc == 0)
                    {
                        cc = 1;
                        btn.BackColor = col[0];
                    }
                    else
                    {
                        cc = 0;
                        btn.BackColor = col[1];

                    }



                    return;
                }
            }

        }
    }
}
4

5 に答える 5

4

ボタンを使用してこのロジックを実行するべきではありません。ロジックを実装し、XパラメーターとYパラメーターを含む関数呼び出しで制御できるゲームクラスを作成します。

game.MakeMove(0, 0);次に、ボタンをクリックするたびに、左上のボタンがクリックされた場合のようにゲームロジックを呼び出します。

これの利点:テスト可能であり、ユーザーインターフェイスを簡単に変更できます。

于 2012-11-01T15:26:21.357 に答える
1

データを表すために多次元配列を使用することを検討する必要があります-ボタン。言い換えれば、マトリックス。

基本的に、次のようにボタンを宣言できます。

private Button[,] buttons = new Button[2, 3];

MSDNページでは、多次元配列のしくみについて説明しています。

次に、配列を反復処理して、水平、垂直、対角線のマッチングなどのロジックを検出できます。次のように記述できます。

bool hasAWinner = false;
// for each line
for (int i = 0; i < 2; i++)
    Dictionary<Color, int> numberOfbuttonsWithColor = new Dictionary<Color, int>();
    numberOfbuttonsWithColor[Color.Red] = 0;
    numberOfbuttonsWithColor[Color.Yellow] = 0;

    // detect if there is at least two buttons of the same color
    for (int j = 0; j < 3; j++) {
        Color currentButtonColor = buttons[i,j].BackColor;
        numberOfbuttonsWithColor[currentButtonColor]++;
        if (numberOfbuttonsWithColor[currentButtonColor] == 2) {
            hasAWinner = true;
            break;
        }
    }

    if (hasAWinner) break;
}


// execute victory actions
if (hasAWinner) {
    Console.writeline(String.format("Color {0} wins!", currentButtonColor);
}
于 2012-11-01T15:25:36.740 に答える
1

2 つのオプション。より簡単な方法は、Button[][]配列を作成し、ボタンの実際の位置と一致するように配列を設定することです。次に、インデックスで他のボタンを確認できます。

より複雑なのはButton、グリッド (XおよびYプロパティ) 内の独自の位置を認識し、隣接するボタンを見つける方法を認識しているサブクラスを作成することです。次に、同じ色の隣接するすべてのボタンのリストを取得し、そのようにチェーンを構築できます。

于 2012-11-01T15:19:03.070 に答える
1

これは、私が現在仕事をしていて何もテストできないため、コードなしで論理的なアプローチになると私が思うものです。ボタンやピース、またはゲームが最終的に X 軸と Y 軸に対応する値を持つある種の 2 次元配列/コレクションになるものを配置する必要があります。

ボタンがクリックされたら、関連するタッチ ボタンをチェックして一致の可能性をチェックするだけで済みます。例えば。左下のボタンが位置 0,0 にあると想像してみましょう。クリックされた場合は、1,0 と 0,1 のボタンをチェックして、それらが同じ色であるかどうかを確認し、一致したことを確認する必要があります。

これは、有効なセットに必要な一致数に応じて簡単に拡張できます。また、「ブルート フォース」アプローチを回避することもできます。前とまったく同じシナリオで、連続して 4 を探していて、0,1 が同じ色でない場合、0,2 または 0,3 など、その軸に沿ってチェックする必要はありません。そこに一致はありません。

于 2012-11-01T15:19:19.153 に答える
0

これはどう。

各ボタンには、その列と行にちなんで名前を付けます。つまり、btn00(左上)、btnNN(右下、Nは行と列の量であり、正方形を想定)などです。

各イベントハンドラーで、クリックしたボタンの名前とその色を保存します。次に、クリックされたボタンの各色のコレクションを繰り返し、インデックスを比較します。次の基準に一致する2つのボタン名が見つかった場合、それは2つ続けて表示されます。

if ((Math.Abs(index0ButtonA - index0ButtonB) == 1 && index1ButtonA == index1ButtonB) || ( Math.Abs(index1ButtonA - index1ButtonB) == 1 && index0ButtonA == index0ButtonB)
{
     twoInARow = true;
}
于 2012-11-01T15:24:17.100 に答える