2013-03-07 16 views
6

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; } 
    } 
} 
+3

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 gerekecektir

8' Ayrıca, 2 == 4 == 8 (6 yerine) – Nolonar

+2

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

+0

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

cevap

3
if (winning_line == 0 || winning_line > 1) 

İki satır varsa, bir bağlantı kuracaktır. Bir satır yapıldığında durmak isterseniz, tüm hamle bittikten sonra değil, her hamlede bir kazanan kazanmanız gerekir.

+0

Evet, bir sembol yerleştirildiğinde her zaman işaretlerseniz, sadece son yerleştirilen sembolden gelen çizgileri kontrol etmeniz gerekir. – MrFox

+0

@SteveP - Ben bu konuda oldukça yeniyim, bu, denemek için okuduğum kitap tarafından önerilen yeni başlayan bir egzersiz. Her bir ifadeden sonra kontrol etmeme kadar daha fazla yardımcı olursanız, çok takdir edilecektir. Ne yaptığınızı anlıyorum, sadece bir araya getirme sorunları yaşadım ... Teşekkürler. – TomandGeriatric

+0

temel olarak, gerçek bir oyunu simüle etmek için, şu anki pozisyonunu alırsınız, bir oyuncuya hareket eder ve o hamlenin oyunu kazanıp kazanmadığını kontrol edin. Kazanan çekleri herhangi bir kazanan satırın, daha önce yapılmış olan hareketi içermesi gerektiğinden optimize edebilirsiniz. – SteveP

2

ikinci diyagonal kazanan çek yerine 6 8.

Şu anda kontrol ediyoruz olmalıdır
OOX
OXO
OOX

Açıkçası son x solda olmalıdır.

Diğerleri de gönderdik. İki çizgi yapmak bir bağ ile sonuçlanmamalıdır. Bir oyuncu tek başına iki satır bile yapabilir ve bu da bir kravat yaratır.
Kazanan bir satır bulduğunda sonucu hemen döndürmek için işlevi değiştirin ve her hareketinden sonra bunu kontrol edin.

+0

Bu bir sorun. Ama şimdiki problemini çözmeyecek. –

1

Bu çalışır: (winning_line == 0 || winning_line> 1)

bu üç parça kod o çizgiyi değiştirmek eğer ...

kurtulmak gerekir Kodları:

if (winnerX == " X ") 
    { 
     theWinner = winnerX; 
    } 
    if (winnerO == " O ") 
    { 
     theWinner = winnerO; 
    } 
    if(winnerX == " X " && winnerO == " O ") 
    { 
     winnerT = " T "; 
     theWinner = winnerT; 
    } 

Yaptığım şey birkaç şeyi değiştirmekti. "Winner_line ++" yi kullanmadım. kod biraz. yerine if deyim kontrolleri için böyle bir şey yaptım.

if (cell[2, 0].Equals(cell[1, 1]) && cell[2, 0].Equals(cell[0, 2])) 
     { 
      if (cell[2, 0] == 0) 
      { 
       winnerX = " X "; 
      } 

      else if (cell[2, 0] == 1) 
      { 
       winnerO = " O "; 
      } 
     } 

Yani X O. aynı olan bir kazanan çizgi varsa tek takip etmek için, ben kullanıyorum 4 dizeleri varKravatın izini sürdüğümde kazananT dizesi var. Sadece eski kravat kontrol ifadesinin nerede olduğu yerine kullanılır.

Eğer tamsayılar
switch (checkWinner()) 
     { 
      case " X ": 
       textBox1.Text = "X Wins!"; 
       break; 
      case " O ": 
       textBox1.Text = "O Wins!"; 
       break; 
      case " T ": 
       textBox1.Text = "It's a tie!"; 
       break; 
     } 
İlgili konular