1

ここまではすべてうまくいっています。誰かが勝ったかどうかを確認するメソッドを作成するだけです。

この問題に効果的に取り組む方法について何か提案はありますか?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TresEnRaya
{
    public partial class Form1 : Form
    {
        string[,] tablero;
        bool jugador = true;

        public Form1()
        {
            InitializeComponent();
            AsignarTags();
            tablero = new string[3, 3];

            button1.Click += clickHandler;
            button2.Click += clickHandler;
            button3.Click += clickHandler;
            button4.Click += clickHandler;
            button5.Click += clickHandler;
            button6.Click += clickHandler;
            button7.Click += clickHandler;
            button8.Click += clickHandler;
            button9.Click += clickHandler;
        }

        private void AsignarTags()
        {
            button1.Tag = new Posicion() { X = 0, Y = 0 };
            button2.Tag = new Posicion() { X = 0, Y = 1 };
            button3.Tag = new Posicion() { X = 0, Y = 2 };
            button4.Tag = new Posicion() { X = 1, Y = 0 };
            button5.Tag = new Posicion() { X = 1, Y = 1 };
            button6.Tag = new Posicion() { X = 1, Y = 2 };
            button7.Tag = new Posicion() { X = 2, Y = 0 };
            button8.Tag = new Posicion() { X = 2, Y = 1 };
            button9.Tag = new Posicion() { X = 2, Y = 2 };
        }

        private void CambiarSimbolo(Button button)
        {
            Posicion objPosicion = (Posicion)button.Tag;

            if (jugador == true)
            {
                tablero[objPosicion.X, objPosicion.Y] = "X";
                button.Text = "X";
                button.Enabled = false;
                jugador = false;
            }
            else
            {
                tablero[objPosicion.X, objPosicion.Y] = "Y";
                button.Text = "Y";
                button.Enabled = false;
                jugador = true;
            }

            VerificarGanador();
        }

        private void VerificarGanador()
        {
            //THE MAGIC GOES HERE. WINGARDIUM LEVIO-Sah
        }

        private void clickHandler(object sender, EventArgs e)
        {
            Button myButton = (Button)sender;
            switch (myButton.Name)
            {
                case "button1":
                    CambiarSimbolo(myButton);                    
                    break;

                case "button2":
                    CambiarSimbolo(myButton);
                    break;

                case "button3":
                    CambiarSimbolo(myButton);
                    break;

                case "button4":
                    CambiarSimbolo(myButton);
                    break;

                case "button5":
                    CambiarSimbolo(myButton);
                    break;

                case "button6":
                    CambiarSimbolo(myButton);
                    break;

                case "button7":
                    CambiarSimbolo(myButton);
                    break;

                case "button8":
                    CambiarSimbolo(myButton);
                    break;

                case "button9":
                    CambiarSimbolo(myButton);
                    break;
            }
        }        
    }
}

助けてくれてありがとう。

4

7 に答える 7

3

私はかつて、勝利の方向ごとに 1 つずつ、8 つの異なるカウンターを保持するテクニックを見たことがあります。

カウンターをゼロに初期化します。X
が配置され たら、その行、列、および対角線のカウンターに 1 を追加します。Oが置かれ たら、行、列、および対角線のカウンターから 1 を引きます。

いずれかのカウンターが 3 または -3 に達した場合、勝者がいることがわかります。
+3 はXが勝ったことを意味します。
-3 はOが勝ったことを意味します。

どのカウンターが +/-3 に達したかによって、どの行/列/対角線が勝ったかがわかります。

于 2010-09-28T16:54:23.647 に答える
1

最も効果的な方法は、ボードに配置された最後のXまたはOの位置を知り、この位置を含む方向のみを確認することです。このように、プレイヤーが勝ったかどうかを判断するためにブルートフォースを使用していません。

于 2010-09-28T16:22:17.953 に答える
1

他の人が言っているように、ブルートフォースは良いです。

ただし、@ Kendrickのようにノードをループするのではなく、ノードを一覧表示したいと思います。

例えば:

TicTacVector winVectors[] = 
{
    {"Top Row",    {0,0}, {0,1}, {0,2}},
    {"Middle Row", {1,0}, {1,1}, {1,2}},
    [...]
    {"Diagonal 1", {0,2}, {1,1}, {2,0}}
};   

(注:擬似コード。実際にはコンパイルされません!)

ハンドコーディングはもう少し集中的ですが、何が起こっているのかを確認するのも簡単だと思います。

于 2010-09-28T16:23:27.060 に答える
1

徹底的な検索。

于 2010-09-28T16:50:27.553 に答える
1

勝ちの組み合わせは 8 つしかありません。それぞれの組み合わせを、勝ちポジションを表す一連のテンプレートと照合するだけで済みます。

振り返ってみると、実際にはデータ構造を文字列ではなく数値の MD 配列に変更します。

  0 => 空白セル
  1 => プレーヤー A (X)
 -1 => プレーヤー B (O)

次に、任意の行、列、または対角線の合計が +3 または -3 に等しいかどうかを確認できます。

于 2010-09-28T16:16:50.910 に答える
0

これはどうですか?

Button[][] matrix = new[]
{
    new []{ button1, button2, button3 },
    new []{ button4, button5, button6 },
    new []{ button7, button8, button9 },
    new []{ button1, button5, button9 },
    new []{ button3, button5, button7 },
    new []{ button1, button4, button7 },
    new []{ button2, button5, button8 },
    new []{ button3, button6, button9 }
};
var result = matrix.FirstOrDefault(set => 
    set.All(button => button.Text == "X") || 
    set.All(button => button.Text == "Y"));
if(result != null)
{
    string winner = result.First().Text;
}
else
{
    // tie
}
于 2010-09-28T16:21:47.323 に答える
0

3x3 の場合は、力ずくで行います。より良い答えがあるはずですが、勝利条件は 8 つしかありません (vert1、vert2、vert3、horiz1、horiz2、horiz3、左上からクロス、左下からクロス)

for x = 0 to 2
   If pos(x,0)==pos(x,1)==pos(X,2)
        return pos(x,0)
for y = 0 to 2
    If pos(0,y)==pos(1,y)==pos(2,y)
        return pos(0,y)
if(pos(0,0)==pos(1,1)==Pos(2,2) || pos(0,2)==pos(1,1)==pos(2,0))
    return pos(1,1)
else
    return null
于 2010-09-28T16:17:27.320 に答える