-1

重複の可能性:
ボタンに2D配列を使用するC#

私は7x6に拡張される2x2ボードを使用してゲームに取り組んでいます。

私は現在、勝者の検出を行っていますが、長い道のりを行っていると思います。はるかに短い方法があるはずです。

勝者

  1. 水平方向
  2. 垂直方向
  3. 対角線

これがゲームボードの写真です:

ここに画像の説明を入力してください

これは私が現在勝者を検出している方法です

if (btns[0, col].BackColor.Equals(Color.Red) && btns[1, col].BackColor.Equals(Color.Red))
{
    MessageBox.Show("Red Win");
}

if (btns[0, col].BackColor.Equals(Color.Blue) && btns[1, col].BackColor.Equals(Color.Blue))
{
    MessageBox.Show("Blue Win");
}

この方法では、すべての組み合わせをリストする必要があるようです。7x6に拡張する場合はあまり理想的ではありません。

これがプログラムのコード全体です

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        private Button[,] btns;

        public Form1()
        {
            InitializeComponent();

            btns = new Button[,] { { button2 , button1 },
                                   { button4 , button3 }};
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (var btn in btns)
            {
                btn.Enabled = false;
            }
        }
        int cc = 0;


        private void button5_Click(object sender, EventArgs e)
        {
          // Button[] row1 = new Button[] {button2, button1};

            for (int col = 0; col < btns.GetLength(1); ++col)
            {
                var btn = btns[0, col];

                if (!btn.Enabled)
                {
                    btn.Enabled = true;

                    if (cc == 0)
                    {
                        cc = 1;
                        btn.BackColor = Color.Red;
                    }
                    else
                    {
                        cc = 0;
                        btn.BackColor = Color.Blue;
                    }

                    if (btns[0, col].BackColor.Equals(Color.Red) && btns[1, col].BackColor.Equals(Color.Red))
                    {
                        MessageBox.Show("Red Win");
                    }

                    if (btns[0, col].BackColor.Equals(Color.Blue) && btns[1, col].BackColor.Equals(Color.Blue))
                    {
                        MessageBox.Show("Blue Win");
                    }

                    return;
                }
            }
        }


        private void button6_Click(object sender, EventArgs e)
        {
           // Button[] row2 = new Button[] { button4, button3 };
            for (int col = 0; col < btns.GetLength(1); ++col)
            {
                var btn = btns[1, col];

                if (!btn.Enabled)
                {
                    btn.Enabled = true;

                    if (cc == 0)
                    {
                        cc = 1;
                        btn.BackColor = Color.Red;
                    }
                    else
                    {
                        cc = 0;
                        btn.BackColor = Color.Blue;
                    }

                    if (btns[1, col].BackColor.Equals(Color.Red) && btns[0, col].BackColor.Equals(Color.Red))
                    {
                        MessageBox.Show("Red Win");
                    }

                    if (btns[1, col].BackColor.Equals(Color.Blue) && btns[0, col].BackColor.Equals(Color.Blue))
                    {
                        MessageBox.Show("Blue Win");
                    }
                    return;
                }
            }
        }
    }
}

私は他の多くの方法を試しましたが、うまくいかないようです。

4

3 に答える 3

2

たぶん、この答えは複雑で、多くの反対票を得るでしょうが、これを可能な限り最適に解決することに抵抗できませんでした。このコードを詳細に調べてみてください:

        int n; //dimension of the matrix
        Button [,] btns;
        public Form1()
        {
            InitializeComponent();
            n = 2;/*You should set here the dimension of your matix. I considered it nxn because of diagonals. If you want nxm matrix than the code is a little bit complicated but not too much*/
            btns = new Button[n, n];
            for(int i = 0;i<n;i++)
               for(int j = 0; j<n; j++)
               {
                   Button btn = new Button();
                   btn.Location = new Point(i*20,j*40);
                   btn.Size = new Size(18,38);
                   btns[i,j] = btn;
                   this.Controls.Add(btn);
               }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            int mainDiag = 0;
            int secDiag = 0;
            int i = 0;
            int j = 0;
            int [] cols = new int[n];
            int winner = 0; //no winner
            while(winner == 0 && i<n)
            {
                int row = 0;
                j = 0;
                while(j<n)
                {
                    if (btns[i, j].BackColor == Color.Blue)
                    {

                        if (i == j)
                            mainDiag++;//inrement main diagonal
                        if(i + j == n-1)
                            secDiag++;//increment second diagonal
                        row++; //increment row
                        cols[i]++; //increment column
                    }
                    else if (btns[i, j].BackColor == Color.Red)
                    {
                        if (i == j)
                            mainDiag--;
                        if(i + j == n-1)
                            secDiag--;
                        row--;
                        cols[i]++;
                    }
                    j++;
                }
                if(row == n) //if row value == n whole row is blue and blue player wins
                    winner = 1;
                else if(row == -n)
                    winner = -1; //if row value == -n whole row is red and red player wins
                i++;
            }
            if(winner == 0)
            {
                if(mainDiag == n)
                    winner = 1; //similar for the diagonal
                else if(mainDiag == -n)
                    winner = -1; 
                else if(secDiag == n)
                    winner = 1;//similar for the second diagonal
                else if(secDiag == -n)
                    winner = -1;
                else
                {
                    i = 0;
                    while (winner == 0 && i < n)
                    {
                        if (cols[i] == n)
                            winner = 1; //i-th column is whole blue and blue player wins
                        else if (cols[i] == -n)
                            winner = -1; //i-th column is whole red and red player wins
                    }
                }
            }
            if (winner == 1)
                MessageBox.Show("Blue wins");
            else if(winner == -1)
                MessageBox.Show("Red wins");


        }
于 2012-11-01T21:49:18.963 に答える
1

コメントで人々が言っ​​ているように、これを行うにはおそらくループを使用したいと思うでしょう。

ここではあまり詳しく説明しませんが、勝利条件の検出を実現するためのいくつかのアルゴリズムについて説明します。

アルゴリズム1:
各セルについて、それが水平、垂直、または斜めの行の一部であるかどうかを検出します。このための時間計算量はO(n ^(3/2))になります。必要に応じて重複チェックを考慮することができますが、そうする必要はありません。

アルゴリズム2:
すべての垂直行、すべての水平行、およびすべての対角行をチェックし、それらの行に勝利条件があるかどうかを確認します。このメソッドの時間計算量は、おおよそO(n)である必要があります。勝利条件を保持するのに十分な大きさではない対角線の行をチェックしないことで、おそらく少し時間を節約できますが、そうする必要はありません。

于 2012-11-01T21:13:50.343 に答える
1

本当に基本的な答えが必要な場合は、次のことを検討します

各行を配列に追加する

各列を配列に追加する

配列内の各アイテムについて、それらがすべて単一の色に等しい場合、あなたは勝ちです

より大きな数 (つまり 6x6 グリッド) に移動する場合は、多次元配列を使用することをお勧めします。

于 2012-11-01T21:40:28.627 に答える