title: Tic Tac Toe - Detecting win, lose, or draw
body: <p>This is a tic tac toe generator. Computer vs. Computer only, a little different than the usual Player vs. Computer. I have most of my code written for this, but the issue I am having is sometimes when I generate the game, the whole board fills up and there will be a line of X's and a line of O's and it will come up as a tie. Sometimes there is two lines of X's or two lines of O's generated, and the game doesn't stop after the first line with 3 in a row...any insights? Thank you.</p>
  
  <pre><code>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 &lt; 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 &lt; 5; i++)
              {
                  int temp = rn.Next(9);
                  for (int j = 0; j &lt; 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 &lt; 5; i++)
              {
                  cell[positions[i]] = firstPlayer;
              }
  
              for (int i = 0; i &lt; 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]) &amp;&amp; cell[0].Equals(cell[2]))
              {
                  winning_line++;
                  winner = cell[0];
              }
              if (cell[3].Equals(cell[4]) &amp;&amp; cell[3].Equals(cell[5]))
              {
                  winning_line++;
                  winner = cell[3];
              }
              if (cell[6].Equals(cell[7]) &amp;&amp; cell[6].Equals(cell[8]))
              {
                  winning_line++;
                  winner = cell[6];
              }
  
              //check for column wins
              if (cell[0].Equals(cell[3]) &amp;&amp; cell[0].Equals(cell[6]))
              {
                  winning_line++;
                  winner = cell[0];
              }
              if (cell[1].Equals(cell[4]) &amp;&amp; cell[1].Equals(cell[7]))
              {
                  winning_line++;
                  winner = cell[1];
              }
              if (cell[2].Equals(cell[5]) &amp;&amp; cell[2].Equals(cell[8]))
              {
                  winning_line++;
                  winner = cell[2];
              }
              //check for diagonal winner
              if (cell[0].Equals(cell[4]) &amp;&amp; cell[0].Equals(cell[8]))
              {
                  winning_line++;
                  winner = cell[0];
              }
              if (cell[2].Equals(cell[4]) &amp;&amp; cell[2].Equals(cell[8]))
              {
                  winning_line++;
                  winner = cell[2];
              }
  
              if (winning_line == 0 || winning_line &gt; 1)
              winner = 'T';
  
              return winner;
          }
  
          public int i { get; set; }
      }
  }
  </code></pre>