To generator tic tac toe. Komputer kontra komputer, trochę inny niż zwykły gracz kontra komputer. Mam większość mojego kodu napisanego na ten temat, ale kwestią, którą mam, jest czasami, kiedy generuję grę, cała tablica wypełnia się, a pojawi się linia X i linia O, a pojawi się jako remis . Czasami generowane są dwie linie X lub dwóch linii O, a gra nie zatrzymuje się po pierwszym wierszu z 3 w rzędzie ... żadnych wglądów? Dziękuję Ci.Tic Tac Toe - Wykrywanie wygranej, przegranej lub remisu
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; }
}
}
Twoje przekątnych posiada bug, jesteś sprawdzania '0 == 4 == 8' , ale także '2 == 4 == 8 (zamiast 6)' – Nolonar
Jeśli chcesz ćwiczyć, to chciałbym spróbować zaimplementować całą twoją logikę gry oddzielnie od twojego interfejsu użytkownika. Możesz tworzyć klasy dla samej gry, graczy, każdej reguły wygrywającej itd. Możesz wtedy łatwiej bawić się z AI i innymi rzeczami. Tylko sugestia, choć ... – Jobo
Chciałbym zagłosować na komentarz Jobo, gdybym mógł. Jeśli utworzysz klasę, która obsługuje grę, możesz umieścić ją w innym interfejsie użytkownika, np. jeden dla komputera kontra komputera lub inny dla gracza kontra gracz lub gracz kontra komputer. – SteveP