Search code examples
c#visual-studiotic-tac-toe

Diagonal and Up/Down Tic Tac Toe Algorithm C# Wpf


So I have programmed the horizontal win for Tic Tac Toe, however I haven't been successful with the others.

Here is the code for the horizontal win.

 private void CheckWinner(int row, int col)
    {
        if (aIntNaughtsCrosses[row, 0] == aIntNaughtsCrosses[row, 1])
        {
            if (aIntNaughtsCrosses[row, 0] == aIntNaughtsCrosses[row, 2])
            {
                MessageBox.Show("Yay");
            }

         }

aIntNaughtsCrosses is the array.

 else if(aIntNaughtsCrosses[col, 0] == aIntNaughtsCrosses[row, 0])
        {
            if(aIntNaughtsCrosses[col, 0] == aIntNaughtsCrosses[row, 0])
            {
                if(aIntNaughtsCrosses[col, 0] == aIntNaughtsCrosses[row, 1])
                {
                    if(aIntNaughtsCrosses[col, 0] == aIntNaughtsCrosses[row, 2])
                    {
                        MessageBox.Show("yay");
                    }
                }
            }


        }

That is the code I planned for the vertical/down win. With it also being applied to column 1 and 2.


Solution

  • You got it right for horizontal, keeping same row and making the column change.
    Now, you have to keep the same column and make the row change to check for vertical:

    if (aIntNaughtsCrosses[row, 0] == aIntNaughtsCrosses[row, 1] && // horizontal
        aIntNaughtsCrosses[row, 0] == aIntNaughtsCrosses[row, 2] || // horizontal
        aIntNaughtsCrosses[0, col] == aIntNaughtsCrosses[1, col] && // vertical
        aIntNaughtsCrosses[0, col] == aIntNaughtsCrosses[2, col])   // vertical
    {
        MessageBox.Show("Yay");
    }
    

    This means:

    IF (row,0) equals (row,1) equals (row,2) OR   // horizontal
       (0,col) equals (1,col) equals (2,col) THEN // vertical
    DISPLAY "Yay"
    

    For diagonals, note that there are only 2 diagonals so you could do (shortening aIntNaughtsCrosses to arr):

    if (col == row &&     // top-left to bottom-right
        arr[0, 0] == arr[1, 1] &&
        arr[0, 0] == arr[2, 2] ||
        col == 2 - row && // top-right to bottom-left
        arr[0, 2] == arr[1, 1] &&
        arr[0, 2] == arr[2, 0])
    {
        MessageBox.Show("Yay");
    }
    

    This means:

    IF (row,col) is in diag1 AND (0,0) equals (1,1) equals (2,2) OR   // diag1
       (row,col) is in diag2 AND (0,2) equals (1,1) equals (2,0) THEN // diag2
    DISPLAY "Yay"
    

    In summary, the following should work:

    if (arr[row, 0] == arr[row, 1] && // horizontal
        arr[row, 0] == arr[row, 2] ||
        arr[0, col] == arr[1, col] && // vertical
        arr[0, col] == arr[2, col] ||
        col == row &&     // top-left to bottom-right
        arr[0, 0] == arr[1, 1] &&
        arr[0, 0] == arr[2, 2] ||
        col == 2 - row && // top-right to bottom-left
        arr[0, 2] == arr[1, 1] &&
        arr[0, 2] == arr[2, 0])
    {
        MessageBox.Show("Yay");
    }
    

    This means:

    IF (row,0) equals (row,1) equals (row,2) OR // horizontal 
       (0,col) equals (1,col) equals (2,col) OR // vertical
       (row,col) in diag1 AND (0,0) equals (1,1) equals (2,2) OR   // diag1
       (row,col) in diag2 AND (0,2) equals (1,1) equals (2,0) THEN // diag2
    DISPLAY "Yay"