Kółko i Krzyżyk, dopracowanie komputerowego AI
Ostatnio zmodyfikowano 2023-02-04 23:21
Cukiernik Temat założony przez niniejszego użytkownika |
Kółko i Krzyżyk, dopracowanie komputerowego AI » 2018-04-04 04:05:31 Witam serdecznie, Niestety moje obecne SI w grze zawsze przegrywa w 2 określonych przypadkach. 1.Jeżeli zacznę w lewym górnym rogu, a następnie w prawym dolnym. 2.Jeżeli zacznę w prawym górnym rogu, a następnie prawy środkowy. W innych przypadkach jest niepokonany. Potrzebuję pomocy, rad w stworzeniu niepokonanego gracza komputerowego. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;
namespace Kółko_i_Krzyżyk {
public partial class Form1 : Form { bool tura = true; int licz_tury = 0; bool kontra_komputer = false;
public Form1() { InitializeComponent(); }
private void infoToolStripMenuItem_Click(object sender, EventArgs e) { MessageBox.Show("Aby grać przeciwko SI należy nazwać drugiego gracza komputer", "Kółko i Krzyżyk"); }
private void wyjścieToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit(); }
private void Klik(object sender, EventArgs e) { { Button b = (Button)sender; if (tura) b.Text = "X"; else b.Text = "O";
tura = !tura; b.Enabled = false; licz_tury++;
Zwyciezca();
} if ((!tura) && (kontra_komputer)) { ruch_komputera(); } }
private void ruch_komputera() { //Priorytet 1: Wygraj //Priorytet 2: Blokuj //Priorytet 3: Wolna przestrzeń na krawędzi //Priorytet 4: Wolna przestrzeń jakakolwiek
Button move = null;
//look for tic tac toe opportunities move = spróbuj_wygrać_lub_blokuj("X"); //look for block if (move == null) { move = spróbuj_wygrać_lub_blokuj("O"); //look for win if (move == null) { move = spróbuj_zająć_krawędź(); if (move == null) { move = zajmij_wolną_przestrzeń(); }//end if }//end if }//end if
if (licz_tury != 9) move.PerformClick(); }
private Button zajmij_wolną_przestrzeń() { Console.WriteLine("Looking for open space"); Button b = null; foreach (Control c in Controls) { b = c as Button; if (b != null) { if (b.Text == "") return b; }//end if }//end if
return null; }
private Button spróbuj_zająć_krawędź() { Console.WriteLine("Szukanie wolnej krawędzi"); if (A1.Text == "O") { if (A3.Text == "") return A3; if (C3.Text == "") return C3; if (C1.Text == "") return C1; }
if (A3.Text == "O") { if (A1.Text == "") return A1; if (C3.Text == "") return C3; if (C1.Text == "") return C1; }
if (C3.Text == "O") { if (A1.Text == "") return A3; if (A3.Text == "") return A3; if (C1.Text == "") return C1; }
if (C1.Text == "O") { if (A1.Text == "") return A3; if (A3.Text == "") return A3; if (C3.Text == "") return C3; }
if (A1.Text == "") return A1; if (A3.Text == "") return A3; if (C1.Text == "") return C1; if (C3.Text == "") return C3;
return null; }
private Button spróbuj_wygrać_lub_blokuj(string mark) { Console.WriteLine("Szukanie możliwej wygranej lub blok " + mark); //HORIZONTAL TESTS if ((A1.Text == mark) && (A2.Text == mark) && (A3.Text == "")) return A3; if ((A2.Text == mark) && (A3.Text == mark) && (A1.Text == "")) return A1; if ((A1.Text == mark) && (A3.Text == mark) && (A2.Text == "")) return A2;
if ((B1.Text == mark) && (B2.Text == mark) && (B3.Text == "")) return B3; if ((B2.Text == mark) && (B3.Text == mark) && (B1.Text == "")) return B1; if ((B1.Text == mark) && (B3.Text == mark) && (B2.Text == "")) return B2;
if ((C1.Text == mark) && (C2.Text == mark) && (C3.Text == "")) return C3; if ((C2.Text == mark) && (C3.Text == mark) && (C1.Text == "")) return C1; if ((C1.Text == mark) && (C3.Text == mark) && (C2.Text == "")) return C2;
//VERTICAL TESTS if ((A1.Text == mark) && (B1.Text == mark) && (C1.Text == "")) return C1; if ((B1.Text == mark) && (C1.Text == mark) && (A1.Text == "")) return A1; if ((A1.Text == mark) && (C1.Text == mark) && (B1.Text == "")) return B1;
if ((A2.Text == mark) && (B2.Text == mark) && (C2.Text == "")) return C2; if ((B2.Text == mark) && (C2.Text == mark) && (A2.Text == "")) return A2; if ((A2.Text == mark) && (C2.Text == mark) && (B2.Text == "")) return B2;
if ((A3.Text == mark) && (B3.Text == mark) && (C3.Text == "")) return C3; if ((B3.Text == mark) && (C3.Text == mark) && (A3.Text == "")) return A3; if ((A3.Text == mark) && (C3.Text == mark) && (B3.Text == "")) return B3;
//DIAGONAL TESTS if ((A1.Text == mark) && (B2.Text == mark) && (C3.Text == "")) return C3; if ((B2.Text == mark) && (C3.Text == mark) && (A1.Text == "")) return A1; if ((A1.Text == mark) && (C3.Text == mark) && (B2.Text == "")) return B2;
if ((A3.Text == mark) && (B2.Text == mark) && (C1.Text == "")) return C1; if ((B2.Text == mark) && (C1.Text == mark) && (A3.Text == "")) return A3; if ((A3.Text == mark) && (C1.Text == mark) && (B2.Text == "")) return B2;
return null; }
private void Zwyciezca() { bool Wygrana = false;
if ((A1.Text == A2.Text) && (A2.Text == A3.Text) && (!A1.Enabled)) Wygrana = true; else if ((B1.Text == B2.Text) && (B2.Text == B3.Text) && (!B1.Enabled)) Wygrana = true; else if ((C1.Text == C2.Text) && (C2.Text == C3.Text) && (!C1.Enabled)) Wygrana = true; else if ((A1.Text == B1.Text) && (B1.Text == C1.Text) && (!A1.Enabled)) Wygrana = true; else if ((A2.Text == B2.Text) && (B2.Text == C2.Text) && (!A2.Enabled)) Wygrana = true; else if ((A3.Text == B3.Text) && (B3.Text == C3.Text) && (!A3.Enabled)) Wygrana = true; else if ((A1.Text == B2.Text) && (B2.Text == C3.Text) && (!A1.Enabled)) Wygrana = true; else if ((A3.Text == B2.Text) && (B2.Text == C1.Text) && (!A3.Enabled)) Wygrana = true;
if (Wygrana) { String winner = ""; if (tura) { winner = textBox2.Text; win_o.Text = (Int32.Parse(win_o.Text) + 1 ).ToString(); }
else { winner = textBox1.Text; win_x.Text = (Int32.Parse(win_x.Text) + 1 ).ToString(); }
MessageBox.Show(winner + " Wygrywa!", "KONIEC");
A1.Enabled = false; A2.Enabled = false; A3.Enabled = false; B1.Enabled = false; B2.Enabled = false; B3.Enabled = false; C1.Enabled = false; C2.Enabled = false; C3.Enabled = false; } else { if (licz_tury == 9) { MessageBox.Show("Remis!", "KONIEC"); draw.Text = (Int32.Parse(draw.Text) + 1 ).ToString();
} }
}
private void nowaGraToolStripMenuItem_Click(object sender, EventArgs e) { tura = true; licz_tury = 0;
A1.Text = ""; A2.Text = ""; A3.Text = ""; B1.Text = ""; B2.Text = ""; B3.Text = ""; C1.Text = ""; C2.Text = ""; C3.Text = "";
A1.Enabled = true; A2.Enabled = true; A3.Enabled = true; B1.Enabled = true; B2.Enabled = true; B3.Enabled = true; C1.Enabled = true; C2.Enabled = true; C3.Enabled = true; }
private void Oznaczenie(object sender, EventArgs e) { Button b = (Button)sender; if (b.Enabled) { if (tura) b.Text = "X"; else b.Text = "O"; } }
private void textBox2_TextChanged(object sender, EventArgs e) { if (textBox2.Text == "Komputer") kontra_komputer = true; else kontra_komputer = false; }
private void ustawDomyślneToolStripMenuItem_Click(object sender, EventArgs e) { textBox1.Text = "Gracz"; textBox2.Text = "Komputer"; }
private void Form1_Load(object sender, EventArgs e) { ustawDomyślneToolStripMenuItem.PerformClick(); }
private void Odznaczenie(object sender, EventArgs e) { Button b = (Button)sender; if (b.Enabled) { b.Text = ""; }
} }
}
|
|
tBane |
» 2023-02-04 23:21:06 Rozpatrz wszystkie przypadki ruchu twojego "AI". Swoją drogą, co to za gra w której tylko się przegrywa lub w najlepszym przypadku remisuje? |
|
« 1 » |