Tic Tac Toe,帮助/确定获胜者

时间:2014-01-26 21:00:56

标签: c# console

我正在创建一个包含3乘3矩形整数数组的TicTacToe类。由2名人类玩家扮演。 “1”用于第一个玩家的移动& “2”用于第二个玩家的移动。目前,我陷入困境,并且不知道如何确定/检查游戏是否已获胜,或者在每次移动完成后是否抽签。

不幸的是,在每位玩家进行一次移动后,我一直在检查游戏是赢还是抽出。希望有人可以提供帮助。

到目前为止,这是我的代码: 主要课程:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            TicTacToe game = new TicTacToe();
            game.PrintBoard();
            game.Play();
        }
    }
}

TicTacToe课程:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ConsoleApplication1
{
    class TicTacToe
    {
        private const int BOARDSIZE = 3; //size of the board
        private int[,] board = new int [BOARDSIZE,BOARDSIZE]; // board representation
        string player1row, player1column, player2row, player2column;
        enum DONE {win1, win2, win3, win4, win5, win6, win7,win8,
                   win9, win10, win11, win12, win13, win14, win15, win16};


        //Default Constructor
        public TicTacToe(){
            board = new int [3,3] { {0,0,0},{0,0,0},{0,0,0} };
        }

        int win1 = 1;  

        public void PrintBoard(){
            Console.WriteLine("-----------------------\n"+
                              "|       |       |       |\n"+
                              "|   {0}   |   {1}   |   {2}   |\n" +
                              "|_______|_______|_______|\n"+
                              "|       |       |       |\n"+
                              "|   {3}   |   {4}   |   {5}   |\n" +
                              "|_______|_______|_______|\n"+
                              "|       |       |       |\n"+
                              "|   {6}   |   {7}   |   {8}   |\n" +
                              "|_______|_______|_______|\n",
                              board[0,0],board[0,1],board[0,2],
                              board[1,0],board[1,1],board[1,2],
                              board[2,0],board[2,1],board[2,2]);
        }// end PrintBoard method

        public void Play(){
            while (true)
            {
                Console.WriteLine("Player 1's turn.");
                Console.Write("Player 1: Enter row ( 0 <= row < 3 ): "); //prompt user
                player1row = Console.ReadLine(); //get string from user           
                Console.Write("Player 1: Enter column ( 0 <= row < 3 ): "); //prompt user 
                player1column = Console.ReadLine(); //get string from user

                //Convert string to ints
                int p1r = Convert.ToInt32(player1row);
                int p1c = Convert.ToInt32(player1column);
                // assign marker to desired position
                board[p1r, p1c] = 1;

                PrintBoard(); // Update board
                checkWinner();

                Console.WriteLine("\nPlayer 2's turn.");
                Console.Write("Player 2: Enter row ( 0 <= row < 3 ): ");
                player2row = Console.ReadLine(); //get string from user     
                Console.Write("Player 2: Enter column ( 0 <= row < 3 ): ");
                player2column = Console.ReadLine(); //get string from user

                //Convert string to ints
                int p2r = Convert.ToInt32(player2row);
                int p2c = Convert.ToInt32(player2column);
                // assign marker to desired position
                board[p2r, p2c] = 2;

                PrintBoard(); // Update board
                checkWinner();

            }
        }//end Play method

        private bool checkWinner()
        {
            for (int i = 0; i < 3; i++)
                for (int j = 0; j < 3; j++)

                    //I WANT TO CHECK FOR A WIN OR DRAW HERE BUT DONT KNOW HOW TO






    }}// end class

我想使用2 for循环检查获胜者,第一次检查行,然后检查列,然后添加2个单独的if语句来检查对角线,但我真的不知道如何&amp;已经被困了一段时间了。

5 个答案:

答案 0 :(得分:2)

您可以使用.Net Framework 4.5找到C#语言中流行游戏TicTacToe的代码。重点包括以下内容:

  • 使用WinForms在.Net Framework C#5语言中完美编写的完美代码。

  • 仅限程序员级别需要初学者。不是中级。不是专家。

  • 代码在写入之前立即解释。

  • 游戏的基本功能是它有两个玩家将他们的字母,X和O逐个放在9个可用的网格框中,玩家用3个字母组成一条直线获胜。

  • 游戏计算各个玩家的得分并且也可以重置得分。

  • 玩家可以重置当前游戏并在需要时开始新游戏。

上提供的源代码和说明

www.Code-Kings.blogspot.com

enter image description here

enter image description here

private void check_all_rows()

    {
        int countforP1 = 0;
        int countforP2 = 0;

        for (int i = 0; i < 3; i++)
        {
            countforP1 = 0;
            countforP2 = 0;
            for (int j = 0; j < 3; j++)
            {
                if (gridvalues[i, j] == 1)
                {
                    countforP1++;
                }
                if (gridvalues[i, j] == 2)
                {
                    countforP2++;
                }

                if (countforP1 == 3)
                {
                    MessageBox.Show("Player 1 Wins !!");
                    p1score.Text = Convert.ToString(Convert.ToUInt16(p1score.Text)+1);
                    start_new_game();
                    break;
                }
                if (countforP2 == 3)
                {
                    MessageBox.Show("Player 2 Wins !!");
                    p2score.Text = Convert.ToString(Convert.ToUInt16(p2score.Text) + 1);
                    start_new_game();
                    break;
                }
            }
        }
    }



private void check_all_diagonals()


    {           
        int countforP1 = 0;
        int countforP2 = 0;

        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                if (i == j && gridvalues[j, i] == 1)
                {
                    countforP1++;
                }

                if (i == j && gridvalues[j, i] == 2)
                {
                    countforP2++;
                }

                if (countforP1 == 3)
                {
                    MessageBox.Show("Player 1 Wins !!");
                    p1score.Text = Convert.ToString(Convert.ToUInt16(p1score.Text) + 1);
                    start_new_game();
                    break;
                }
                if (countforP2 == 3)
                {
                    MessageBox.Show("Player 2 Wins !!");
                    p2score.Text = Convert.ToString(Convert.ToUInt16(p2score.Text) + 1);
                    start_new_game();
                    break;
                }
            }
        }
    }

答案 1 :(得分:1)

我不会为你编码,但这是你可以使用的逻辑:

1)对于每一列,检查所有行是否相同,如果是,则声明获胜者。如果没有,请转到第2步。

2)对于每一行,检查所有列值是否相同,如果是,则声明获胜者。如果没有,请转到第3步。

3)现在检查对角线,这里只有两种可能性[0,0] [1,1] [2,2]以及[0,2] [1,1] [2,0]如果它们是相同的声明获胜者,如果没有检查数组中的所有值是否都被填充,如果是,则声明绘制,如果没有让用户输入值。

答案 2 :(得分:0)

一个简单的方法是尝试每个方格(对于i = 0; i <3;对于j = 0; j <3)然后如果该方格不是空白则进入八个可能方向中的每一个,计算每个方向在你离开董事会之前,同样的'颜色'的正方形。如果你的计数达到了三,那么你就可以获得起始广场颜色的胜利位置。

答案 3 :(得分:0)

作为Iiya has said,你将不得不通过所有的胜利案例。有很多方法可以做到这一点,但代码中的主要内容是

private bool checkWinner(int player)
{
    // check rows
    if (board[0, 0] == player && board[0, 1] == player && board[0, 2] == player) { return true; }
    if (board[1, 0] == player && board[1, 1] == player && board[1, 2] == player) { return true; }
    if (board[2, 0] == player && board[2, 1] == player && board[2, 2] == player) { return true; }

    // check columns
    if (board[0, 0] == player && board[1, 0] == player && board[2, 0] == player) { return true; }
    if (board[0, 1] == player && board[1, 1] == player && board[2, 1] == player) { return true; }
    if (board[0, 2] == player && board[1, 2] == player && board[2, 2] == player) { return true; }

    // check diags
    if (board[0, 0] == player && board[1, 1] == player && board[2, 2] == player) { return true; }
    if (board[0, 2] == player && board[1, 1] == player && board[2, 0] == player) { return true; }

    return false;
}

您可以按照您喜欢的方式(使用for循环或矩阵)对此进行优化。请注意,checkWinner()功能需要player输入。

答案 4 :(得分:0)

我将尝试回答如何检测抽奖,因为所有其他人只关注检查是否有人赢了。

只有在棋盘完全完成时才能绘制游戏,并且不会形成其他获胜组合。因此,在您检查获胜者并且没有找到胜利者之后检测并不困难。

  • 检查获胜者,如果没有找到,继续检测领带。
  • 扫描整个电路板,无论顺序如何。
  • 如果发现空位,则不是平局(可以进一步移动),中断循环并继续播放。
  • 一旦你到达循环结束,宣布一个平局(所有空格都填充没有获胜组合)。