Bu bir tic tac toe üretecidir. Sadece Bilgisayar vs Bilgisayar, her zamanki Oyuncu ve Bilgisayardan biraz farklı. Kodumun çoğunu bunun için yazdım, ama sahip olduğum konu bazen oyunu oluşturduğumda, tüm kart doluyken, X'in bir satırı ve O'nun bir satırı olacak ve bir kravat olarak ortaya çıkacak. . Bazen iki satır X ya da iki satır O üretilir, ve oyun bir satırda 3 ile ilk satırdan sonra durmuyor ... herhangi bir anlayış? Teşekkür ederim.
XOO
OXO
OOXTic Tac Toe - Kazanma, kaybetme veya çizme
ve:
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; }
}
}
Sizin köşegenleri
, sen '0 == 4 == için bir hata kontrol ediyoruz gelmiş yani yerine dizeleri kullanmaya karar durumunda da senin de switch deyimi değiştirmeniz gerekecektir8' Ayrıca, 2 == 4 == 8 (6 yerine) – Nolonar
Eğer egzersiz yapmak istiyorsanız, tüm oyun mantığınızı UI'nizden ayrı olarak uygulamaya çalışmayı düşünürdüm. Oyunun kendisi, oyuncular, her bir kazanma kuralı vs. için sınıflar oluşturabilirsiniz. Daha sonra AI ile oynayabilir ve daha kolay şeyler yapabilirsiniz. Sadece bir öneri, ancak ... – Jobo
Eğer yapabilirsem Jobo'nun yorumunu oylarım. Oyunu işleyen bir sınıf oluşturursanız, bunu farklı kullanıcı arayüzleri içine koyabilirsiniz. bilgisayar vs bilgisayar, ya da oyuncu ya da oyuncu vs için oyuncu için farklı bir tane. – SteveP