7

これは三目並べジェネレーターです。コンピューター対コンピューターのみ、通常のプレーヤー対コンピューターとは少し異なります。私はこのためにほとんどのコードを書いていますが、私が抱えている問題は、ゲームを生成するときにボード全体がいっぱいになり、Xの行とOの行があり、タイとして表示されることがあります。2行のXまたは2行のOが生成され、3行が続く最初の行の後でゲームが停止しない場合があります...何か洞察はありますか?ありがとうございました。

namespace TicTacToe
{
    public partial class Form1 : Form
    {
        private Random rn = new Random();

        const int SIZE = 9;
        char[] cell = new char[SIZE];
        char firstPlayer = ' ', secondPlayer = ' ';

        private void button1_Click(object sender, EventArgs e)
        {
            //Clear the labels and starting values

            for (int i = 0; i < SIZE; i++)
            {
                cell[i] = ' ';
            }
            label10.Text = "";

            //Pick X or O to go first
            switch (rn.Next(2))
            {
                case 0: firstPlayer = 'O'; secondPlayer = 'X'; break;
                case 1: firstPlayer = 'X'; secondPlayer = 'O'; break;
            }

            //Get five non-repeating numbers from 0 to 8
            int[] positions = new int[5];
            positions[0] = rn.Next(9);
            for (int i = 1; i < 5; i++)
            {
                int temp = rn.Next(9);
                for (int j = 0; j < i; j++)
                {
                    if (temp == positions[j])
                    {
                        i--;
                        break;
                    }
                    else
                    {
                        positions[i] = temp;
                    }
                }
            }

            //Set each position found to have first players letter
            for (int i = 0; i < 5; i++)
            {
                cell[positions[i]] = firstPlayer;
            }

            for (int i = 0; i < SIZE; i++)
            {
                if (cell[i] != firstPlayer)
                {
                    cell[i] = secondPlayer;
                }
            }
            //Place cell values into the labels
            label1.Text = cell[0].ToString();
            label2.Text = cell[1].ToString();
            label3.Text = cell[2].ToString();
            label4.Text = cell[3].ToString();
            label5.Text = cell[4].ToString();
            label6.Text = cell[5].ToString();
            label7.Text = cell[6].ToString();
            label8.Text = cell[7].ToString();
            label9.Text = cell[8].ToString();

            //Check for a winner
            switch(checkWinner())
            {
                case 'T' : label10.Text = "It's a tie!"; break;
                case 'O' : label10.Text = "O Wins!"; break;
                case 'X' : label10.Text = "X Wins!"; break;
                default: label10.Text = "This will never appear"; break;
            }
        }

        private char checkWinner()
        {
            //return either 'T' for tie, 'O' for O wins, and 'X' for X wins
            char winner = ' ';
            int winning_line = 0;
            //check for a row win
            if(cell[0].Equals(cell[1]) && cell[0].Equals(cell[2]))
            {
                winning_line++;
                winner = cell[0];
            }
            if (cell[3].Equals(cell[4]) && cell[3].Equals(cell[5]))
            {
                winning_line++;
                winner = cell[3];
            }
            if (cell[6].Equals(cell[7]) && cell[6].Equals(cell[8]))
            {
                winning_line++;
                winner = cell[6];
            }

            //check for column wins
            if (cell[0].Equals(cell[3]) && cell[0].Equals(cell[6]))
            {
                winning_line++;
                winner = cell[0];
            }
            if (cell[1].Equals(cell[4]) && cell[1].Equals(cell[7]))
            {
                winning_line++;
                winner = cell[1];
            }
            if (cell[2].Equals(cell[5]) && cell[2].Equals(cell[8]))
            {
                winning_line++;
                winner = cell[2];
            }
            //check for diagonal winner
            if (cell[0].Equals(cell[4]) && cell[0].Equals(cell[8]))
            {
                winning_line++;
                winner = cell[0];
            }
            if (cell[2].Equals(cell[4]) && cell[2].Equals(cell[8]))
            {
                winning_line++;
                winner = cell[2];
            }

            if (winning_line == 0 || winning_line > 1)
            winner = 'T';

            return winner;
        }

        public int i { get; set; }
    }
}
4

4 に答える 4

4
if (winning_line == 0 || winning_line > 1)

2つの回線がある場合は、タイを移植します。ラインができたときに停止したい場合は、ボード全体がいっぱいになった後ではなく、移動するたびに勝者を確認する必要があります。

于 2013-03-07T09:22:30.040 に答える
2

2番目の対角勝者チェックは8ではなく6にする必要があります。

あなたは現在チェックしています:
XOO
OXO
OOX

および:
OOX
OXO
OOX

明らかに、最後のxは左側にあるはずです。

さらに、他の人が投稿したように。2行を作成しても、同点になることはありません。1人のプレーヤーが1人で2行を作ることさえでき、引き分けになります。
関数を変更して、勝者の行が見つかったらすぐに結果を返し、移動するたびに結果を確認します。

于 2013-03-07T09:20:47.163 に答える
1

これは機能します:あなたは...を取り除く必要があります

if(winning_line == 0 || wining_line> 1)

そのコード行を次の3つのコードに置き換えます。

    if (winnerX == " X ")
    {
        theWinner = winnerX;
    }
    if (winnerO == " O ")
    {
        theWinner = winnerO;
    }
    if(winnerX == " X " && winnerO == " O ")
    {
        winnerT = " T ";
        theWinner = winnerT;
    }

だから私がしたことはいくつかのことを変えることでした。「winning_line++;」は使用しませんでした。コードのビット。代わりに、ifステートメントのチェックごとにこのようなことをしました。

    if (cell[2, 0].Equals(cell[1, 1]) && cell[2, 0].Equals(cell[0, 2]))
        {
            if (cell[2, 0] == 0)
            {
                winnerX = " X ";
            }

            else if (cell[2, 0] == 1)
            {
                winnerO = " O ";
            }
        }

したがって、使用している文字列は4つあり、1つはXが勝ち線を持っているかどうかを追跡するためのもので、Oも同じです。次に、タイを追跡するためのwinnerT文字列があります。古いネクタイがステートメントがあったかどうかをチェックする場所の代わりにのみ使用されます。

整数の代わりに文字列を使用する場合は、switchステートメントも変更する必要があります。

    switch (checkWinner())
        {
            case " X ": 
                textBox1.Text = "X Wins!";
                break;
            case " O ":
                textBox1.Text = "O Wins!";
                break;
            case " T ": 
                textBox1.Text = "It's a tie!";
                break;
        }
于 2013-10-21T21:24:37.727 に答える
0

こんにちは、グリッドと新しいポーンを指定してゲームが終了したかどうかを通知する関数が必要だと思います。その後、ゲームが終了すると、勝者が最後にプレイされたポーンであることがわかります。

MarthyiのオープンソースプロジェクトMikMakには、それが完全に実装されていると思います。を参照してください。

bool IsFinished(Grid currentState, Pawn newPawn)

の:

https://github.com/Marthyi/MikMak/blob/master/MikMakSolution/Morpion/MorpionManager.cs

幸運を!

于 2013-03-07T09:32:20.687 に答える