6 svar
161 visningar
Anto 258
Postad: 22 nov 2023 11:57

Test för datorn i tre i rad

namespace Tre_i_Rad_Test_6._0
{
    internal class Program
    {
        static Random slump = new Random();
        static string notation = "";
        static int matcher = 1000000;
        static int antalMatcher = 0;
        static int antalLika = 0;
        static int antalDatorVinster = 0;
        static int antalSpelarVinster = 0;
        static bool slut = false;
        static bool vinst(char[,] bräde, char markör)
        {
            bool vinst = false;
            for (int i = 0; i < 3; i++)
            {
                if (bräde[i, 0] == markör && bräde[i, 1] == markör && bräde[i, 2] == markör)
                    vinst = true;
                if (bräde[0, i] == markör && bräde[1, i] == markör && bräde[2, i] == markör)
                    vinst = true;
            }
            if (bräde[0, 0] == markör && bräde[1, 1] == markör && bräde[2, 2] == markör)
                vinst = true;
            if (bräde[2, 0] == markör && bräde[1, 1] == markör && bräde[0, 2] == markör)
                vinst = true;
            return vinst;
        }
        static void vinstUtskrift(char[,] bräde, char markör)
        {
            if (vinst(bräde, markör) == true)
            {
                antalMatcher++;
                Console.WriteLine(Convert.ToString(antalMatcher) + ". " + notation + "# " + Convert.ToString(markör));
                if (markör == 'X')
                    antalDatorVinster++;
                if (markör == 'O')
                    antalSpelarVinster++;
            }
        }
        static bool lika(char[,] bräde)
        {
            bool lika = false;
            bool finnsTomRuta = false;
            for (int i = 0; i < 3; i++)
                for (int j = 0; j < 3; j++)
                    if (bräde[i, j] == ' ')
                        finnsTomRuta = true;
            if (finnsTomRuta == false)
                lika = true;
            return lika;
        }
        static void likaUtskrift(char[,] bräde)
        {
            if (lika(bräde) == true)
            {
                antalMatcher++;
                Console.WriteLine(Convert.ToString(antalMatcher) + ". " + notation + "=");
                antalLika++;
            }
        }
        static void efterDragDator(char[,] bräde, int rad, int kolumn, string med)
        {
            bräde[rad, kolumn] = 'X';
            Console.WriteLine("Datorn spelar: " + Convert.ToString(Convert.ToChar(kolumn + 65)).ToLower() + (rad + 1).ToString() + " " + med);
            notation = notation + Convert.ToString(Convert.ToChar(kolumn + 65)).ToLower() + (rad + 1).ToString() + " ";
            vinstUtskrift(bräde, 'X');
            likaUtskrift(bräde);
        }
        static char[,] datorDrag(char[,] bräde)
        {
            char[,] brädeKopia = bräde;
            for (int rad = 0; rad < 3; rad++) //Vinst
            {
                for (int kolumn = 0; kolumn < 3; kolumn++)
                {
                    if (bräde[rad, kolumn] == ' ')
                    {
                        brädeKopia[rad, kolumn] = 'X';
                        if (vinst(brädeKopia, 'X') == true)
                        {
                            efterDragDator(bräde, rad, kolumn, "(vinst)");
                            return bräde;
                        }
                        brädeKopia[rad, kolumn] = ' ';
                    }
                }
            }
            for (int rad = 0; rad < 3; rad++) //Blockera
            {
                for (int kolumn = 0; kolumn < 3; kolumn++)
                {
                    if (bräde[rad, kolumn] == ' ')
                    {
                        brädeKopia[rad, kolumn] = 'O';
                        if (vinst(brädeKopia, 'O') == true)
                        {
                            efterDragDator(bräde, rad, kolumn, "(blockera)");
                            return bräde;
                        }
                        brädeKopia[rad, kolumn] = ' ';
                    }
                }
            }
            for (int rad1 = 0; rad1 < 3; rad1++) //Två vinster
            {
                for (int kolumn1 = 0; kolumn1 < 3; kolumn1++)
                {
                    if (bräde[rad1, kolumn1] == ' ')
                    {
                        brädeKopia[rad1, kolumn1] = 'X';
                        int antalVinster = 0;
                        for (int rad2 = 0; rad2 < 3; rad2++)
                        {
                            for (int kolumn2 = 0; kolumn2 < 3; kolumn2++)
                            {
                                if (brädeKopia[rad2, kolumn2] == ' ')
                                {
                                    brädeKopia[rad2, kolumn2] = 'X';
                                    if (vinst(brädeKopia, 'X') == true)
                                        antalVinster++;
                                    brädeKopia[rad2, kolumn2] = ' ';
                                }
                            }
                        }
                        if (antalVinster >= 2)
                        {
                            efterDragDator(bräde, rad1, kolumn1, "(två vinster)");
                            return bräde;
                        }
                        brädeKopia[rad1, kolumn1] = ' ';
                    }
                }
            }
            if (bräde[1, 1] == 'X') //Motsatta-hörn-försvar 
            {
                if ((bräde[2, 0] == 'O' && bräde[0, 2] == 'O') || (bräde[0, 0] == 'O' && bräde[2, 2] == 'O'))
                {
                    if (bräde[0, 0] == ' ' || bräde[0, 2] == ' ' || bräde[2, 0] == ' ' || bräde[2, 2] == ' ')
                    {
                        if (bräde[1, 0] == ' ')
                            efterDragDator(bräde, 1, 0, "(motsatta-hörn-försvar (1))");
                        else if (bräde[2, 1] == ' ')
                            efterDragDator(bräde, 2, 1, "(motsatta-hörn-försvar (2))");
                        else if (bräde[1, 2] == ' ')
                            efterDragDator(bräde, 1, 2, "(motsatta-hörn-försvar (3))");
                        else
                            efterDragDator(bräde, 0, 1, "(motsatta-hörn-försvar (4))");
                        return bräde;
                    }

                }
            }
            if (bräde[1, 1] == 'O') //Motsatt-motsatta-hörn-försvar 
            {
                if ((bräde[2, 0] == 'X' && bräde[0, 2] == 'O') || (bräde[0, 0] == 'X' && bräde[2, 2] == 'O') || (bräde[2, 0] == 'O' && bräde[0, 2] == 'X') || (bräde[0, 0] == 'O' && bräde[2, 2] == 'X'))
                {
                    if (bräde[0, 0] == ' ' || bräde[0, 2] == ' ' || bräde[2, 0] == ' ' || bräde[2, 2] == ' ') //Hörna
                    {
                        if (bräde[0, 0] == ' ')
                            efterDragDator(bräde, 0, 0, "(motsatt-motsatta-hörn-försvar (1))");
                        else if (bräde[2, 0] == ' ')
                            efterDragDator(bräde, 2, 0, "(motsatt-motsatta-hörn-försvar (2))");
                        else if (bräde[2, 2] == ' ')
                            efterDragDator(bräde, 2, 2, "(motsatt-motsatta-hörn-försvar (3))");
                        else
                            efterDragDator(bräde, 0, 2, "(motsatt-motsatta-hörn-försvar (4))");
                        return bräde;
                    }
                }
            }
            for (int rad1 = 0; rad1 < 3; rad1++) //Två blockader
            {
                for (int kolumn1 = 0; kolumn1 < 3; kolumn1++)
                {
                    if (bräde[rad1, kolumn1] == ' ')
                    {
                        brädeKopia[rad1, kolumn1] = 'O';
                        int antalVinster = 0;
                        for (int rad2 = 0; rad2 < 3; rad2++)
                        {
                            for (int kolumn2 = 0; kolumn2 < 3; kolumn2++)
                            {
                                if (brädeKopia[rad2, kolumn2] == ' ')
                                {
                                    brädeKopia[rad2, kolumn2] = 'O';
                                    if (vinst(brädeKopia, 'O') == true)
                                        antalVinster++;
                                    brädeKopia[rad2, kolumn2] = ' ';
                                }
                            }
                        }
                        if (antalVinster >= 2)
                        {
                            efterDragDator(bräde, rad1, kolumn1, "(två blockader)");
                            return bräde;
                        }
                        brädeKopia[rad1, kolumn1] = ' ';
                    }
                }
            }
            if (bräde[1, 1] == ' ') //Mitten
            {
                efterDragDator(bräde, 1, 1, "(mitten)");
                return bräde;
            }
            if (bräde[0, 0] == ' ' || bräde[0, 2] == ' ' || bräde[2, 0] == ' ' || bräde[2, 2] == ' ') //Hörna
            {
                if (bräde[0, 0] == ' ')
                    efterDragDator(bräde, 0, 0, "(hörna (1))");
                else if (bräde[2, 0] == ' ')
                    efterDragDator(bräde, 2, 0, "(hörna (2))");
                else if (bräde[2, 2] == ' ')
                    efterDragDator(bräde, 2, 2, "(hörna (3))");
                else
                    efterDragDator(bräde, 0, 2, "(hörna (4))");
                return bräde;
            }
            for (; ; ) //Kant
            {
                if (bräde[1, 0] == ' ')
                    efterDragDator(bräde, 1, 0, "(kant (1))");
                else if (bräde[2, 1] == ' ')
                    efterDragDator(bräde, 2, 1, "(kant (2))");
                else if (bräde[1, 2] == ' ')
                    efterDragDator(bräde, 1, 2, "(kant (3))");
                else
                    efterDragDator(bräde, 0, 1, "(kant (4))");
                return bräde;
            }
        }
        static char[,] väljFörstaBästaDrag(char[,] bräde, char markör)
        {
            if (bräde[2, 0] == ' ')
                bräde[2, 0] = markör;
            else if (bräde[2, 1] == ' ')
                bräde[2, 1] = markör;
            else if (bräde[2, 2] == ' ')
                bräde[2, 2] = markör;
            else if (bräde[1, 0] == ' ')
                bräde[1, 0] = markör;
            else if (bräde[1, 1] == ' ')
                bräde[1, 1] = markör;
            else if (bräde[1, 2] == ' ')
                bräde[1, 2] = markör;
            else if (bräde[0, 0] == ' ')
                bräde[0, 0] = markör;
            else if (bräde[0, 1] == ' ')
                bräde[0, 1] = markör;
            else if (bräde[0, 2] == ' ')
                bräde[0, 2] = markör;
            return bräde;
        }
        static void spelaAllaDrag(char[,] bräde, bool datorsTur)
        {
            if (vinst(bräde, 'X') || vinst(bräde, 'O') || lika(bräde))
            {
                vinstUtskrift(bräde, 'X');
                vinstUtskrift(bräde, 'O');
                likaUtskrift(bräde);
                return;
            }
            if (datorsTur == true)
            {
                bräde = datorDrag(bräde);
                datorsTur = false;
            }
            if (datorsTur == false)
            {
                väljFörstaBästaDrag(bräde, 'O');
                vinstUtskrift(bräde, 'O');
                likaUtskrift(bräde);
                datorsTur = true;
            }
            spelaAllaDrag(bräde, datorsTur);

        }
        static void Main(string[] args) //Datorns markör: X. Spelarens markör O.
        {
            char[,] bräde = { { ' ', ' ', ' ' }, { ' ', ' ', ' ' }, { ' ', ' ', ' ' } }; // [rad, kolumn]
            spelaAllaDrag(bräde, true);
            Console.WriteLine("Dator: " + antalDatorVinster);
            Console.WriteLine("Spelare: " + antalSpelarVinster);
            Console.WriteLine("Lika: " + antalLika);
            Console.ReadLine();
        }
    }
}
Anto 258
Postad: 22 nov 2023 11:59

Hej! Förstår att det är mycket men problemet ligger i metoden spelaAllaDrag. Metoden datorDrag är gjord för att hitta bästa möjliga draget i en given position. I spelaAllaDrag vill jag att alla positioner som finns ska spelas för att bevisa att datorn är ostoppbar. Men jag får inte det att funka på rätt sätt. Ser någon felet? Jag vet själv att den inte avslutas på rätt sätt. Hur ska man göra då: 1. Någon vinner. 2. Det blir lika?

Bedinsis 2894
Postad: 22 nov 2023 14:09

Du kanske skall nämna vad för problem som du får.

Strukturen skulle kunna förbättras; vore det inte bättre att t.ex. ha en funktion som anropar vinst och lika-funktionerna och kalla den någonting i stil med spelSlut? Där kan du även lägga in anrop till utskriftsfunktionerna för att skriva ut vilket sätt som spelet tagit slut på.

Anto 258
Postad: 22 nov 2023 14:10

Istället för att spela typ 800 matcher blir det bara 22 stycken. 

Bedinsis 2894
Postad: 22 nov 2023 14:22 Redigerad: 22 nov 2023 15:26

Jaha.

Ett fel som jag ser är att brädet efter avslutat parti inte tycks nollställas. Och att första if-satsen i spelaAllaDrag kommer göra att inga fler partier spelas, oavsett hur många som hittills spelats.

Om jag får föreslå en förändring i strukturen:

Skapa en funktion, spelaEttParti, som alternerar mellan att låta datorn och spelaren göra drag tills att någon vunnit eller att inga drag kan göras. Låt den funktionen ha som returvärde vem som vann.

Skapa en annan funktion, spelaPartier(int antalPartier) som anropar spelaEttParti i en for-loop som gås igenom antalPartier varv, och efter varje parti noterar den vem som vann och för in detta i statistiken. Den kan ha en int[] som returtyp som kommer innehålla antal datorvinster, antal oavgjort och antal spelarvinster. Funktionerna lika och vinstUtskrift bör inte få lov att ändra på den övergripande statistiken utan endast returnera true eller false beroende på resultatet.

Jag föreslår detta så att det är mer avgränsat, så att du har ett kodavsnitt som är till för att spela ett parti och ett som är till för att hantera resultatet av alla partierna.

Anto 258
Postad: 25 nov 2023 12:19

Skapa en funktion, spelaEttParti, som alternerar mellan att låta datorn och spelaren göra drag tills att någon vunnit eller att inga drag kan göras. Låt den funktionen ha som returvärde vem som vann.

Men hur ska jag göra detta för att försäkra att alla partier spelas på ett metodiskt sätt?

Bedinsis 2894
Postad: 27 nov 2023 08:54

Jag föreslår förändringen eftersom att du då kan ändra om i koden så att du kan spela ett parti i taget, och se efter om någondera spelare vid något tillfälle gör ett drag som du tycker att hen inte skulle göra. Mao. eftersom det gör det lättare att debugga. Att dela upp funktioner i underfunktioner tenderar att göra det lättare.

spelaAllaDrag-funktionen, om dess syfte var att spela ett antal partier, tycks inte göra detta. Sedan är strukturen en smula underlig; i nuvarande utformning så anropas den alltid med datorsTur=true vilket den andra if-satsen i funktionen kommer omvandla till false och därmed anropas tredje if-satsen som gör den true ånyo, vilket gör att om datorn vann på sitt drag så kommer spelaren ändå få lov att göra ett drag.

Svara
Close