Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kółko i Krzyżyk, dopracowanie komputerowego AI

Ostatnio zmodyfikowano 2023-02-04 23:21
Autor Wiadomość
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 = "";
            }

        }
    }

}
P-170452
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?
P-179931
« 1 »
  Strona 1 z 1