C#检查TicTacToe的win功能

时间:2017-09-28 14:49:57

标签: c# for-loop if-statement boolean tic-tac-toe

我正在尝试创建一个函数来检查是否存在胜利(水平)。 所以我在纸面上想到了这一点,但却无法完全发挥作用。我的代码在这一点上有两个缺陷。

  1. 它只检查第一行。并且在那之后不起作用。
  2. 无论第一排是什么。让我们说点0,1 [X] 0,2 [O] 0,3 [X]它会回来说有一个“真实的”
  3. 这是代码。

    //Public Var
    int n = 3;
    
    //How I test if function is True and when. (every time an O or X is placed i do this:)
    
    if (checkwinnner() == true)
    {
        MessageBox.Show("Someone won.");
    }
    
    //Function
    public bool checkwinnner() 
    {  
        bool bw = true;
        for (int r = 0; r < n; r++)
        {
            bw = true;
            if (bar[r, 0].Text != "")
            {
                for (int c = 1; c < n; c++)
                {
                    if (bar[r, 0].Text != bar[r, c].Text)
                    {
                        bw = false; break;
                    }
                }
                bw = true;
            }
            else 
            { 
                bw = false; 
            }
        }
        return bw;
    }
    

    所以这就是迄今为止这个功能的全部内容。我忙着它atm。所以。我用bool检查是否有人赢了。真是赢,假是没有胜利。

    • N =身高和田地。它的3x3始终可以改变文本框。
    • R =行
    • C =列

    所以我先放入一个for循环来循环每一行。 然后我检查文本是否为空。因为如果它是空的,它不能在水平的3x3场中连续3次。之后我需要为每一列做一个f​​or循环。并检查第1列中的文本是否等于2和3.

    但是我在帖子的顶部说了我的bug,并想问:

    关于我可以修复或做错的任何提示。我想使用这个代码而不是一些if语句检查像if((0,1 && 0,2 && 0,3) == X || Y)这样的按钮或类似的东西。因为该字段可以是4x4和5x5到。

    提前谢谢你。我希望我的问题格式正确。

    快乐的编码。

3 个答案:

答案 0 :(得分:1)

部分问题是,在您循环c之后,您将bw设置回true。该行始终会被点击,因为break只会让您脱离for循环。这就是为什么你得到true而不管你在行中有什么。另一个问题是bw将在第一个循环重复时继续被覆盖 - 您将只能返回最后一个值。

以下内容应该可以使用,可扩展,并且尽可能地保持原始状态。它没有告诉你赢了 - 你需要返回bool以外的某种类型,如果你想要显示谁赢了。

public bool checkwinnner() 
{  
    bool bw = true;
    for (int r = 0; r < n; r++)
    {
        bw = true;
        if (bar[r, 0].Text != "")
        {
            for (int c = 1; c < n; c++)
            {
                if (bar[r, 0].Text != bar[r, c].Text)
                {
                    bw = false;
                }
            }
            //bw will remain true if and only if every cell in the row has the same symbol
            if (bw)
            {
                //if bw is true then someone wins, so return true so the method terminates
                return true;
            }
        }
    }
    //if we haven't already returned true, there is no winning row so return false
    return false;
}

答案 1 :(得分:0)

public bool checkwinnner() 
{  
    int size = n;

    //check rows
    bool okay = true;
    for (int i = 0; i < size; i++)
    {
        bool rowOkay = true;
        //start at 1, compare with previous
        for (int j=1; j<size;j++)
        {
           //this cell is blank or doesn't match it's neighbor
           if (bar[i,j].Text == "" || bar[i, j-1].Text != bar[i,j].Text)
           {
               rowOkay = false;
               j=size;
           }
        }
        if (rowOkay) return true;
    }

    //TODO (per Question OP): Implement columns and diagonals

    return false;
}

你也可以考虑改变这个,告诉你赢了(&#34; X&#34;,&#34; O&#34;或者&#34;&#34;)。否则你只需要再次通过游戏板来解决它。

public string checkwinnner() 
{  
    int size = n;

    //check rows
    bool okay = true;
    for (int i = 0; i < size; i++)
    {
        bool rowOkay = true;
        //start at 1, compare with previous
        for (int j=1; j<size;j++)
        {
           //this cell is blank doesn't match it's neighbor
           if (bar[i,j].Text == "" || bar[i, j-1].Text != bar[i,j].Text)
           {
               rowOkay = false;
               j=size;
           }
        }
        if (rowOkay) return bar[i,0].Text;
    }

    //TODO (per Question OP): Implement columns and diagonals

    return "";
}

var winner = checkwinnner();
if (winner != "")
{
    MessageBox.Show(winner + " won.");
}

对于列,只需反转i和j:bar[i,j]变为bar[j,i]。对于对角线,左上角到右下角很容易(bar[i,i])。另一条对角线需要考虑一下,但由于这看起来像是一个练习问题,我想先看看你先自己捅了一下。

答案 2 :(得分:0)

如果你不喜欢循环,我个人会使用LINQ

string[][] grid = new string[3][];

grid[0] = new string[3] { "X", "O", "X" };
grid[1] = new string[3] { "", "", "" };
grid[2] = new string[3] { "X", "X", "X" };

bool test = grid.Any(r => !r.Contains("") && r.Distinct().Count() == 1);

基本上,您正在查看值是否全部相同(但不是空)。

更新,添加了垂直测试。

int n = 3;

string[][] grid = new string[3][];

grid[0] = new string[3] { "X", "O", "X" };
grid[1] = new string[3] { "", "", "X" };
grid[2] = new string[3] { "X", "X", "X" };

bool test = grid.Any(r => !r.Contains("") && r.Distinct().Count() == 1);

// for each column, get the distinct elements from it
for(int i = 0; i < n; i++)
{
    bool vertTest = grid.Select(r => r[i]).Any(c=> !c.Contains("") && c.Distinct().Count() == 1);
}