IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Program hrající piškvorky

C# .NET

using static System.Console;

namespace Piškvorky
{
    class Program
    {
        static void Main(string[] args)
        {
            Počítač pc = new Počítač('J', 'O', 3);
            char[,] pole = new char[2, 1];
            Tah t = pc.Hraj(pole);
            WriteLine($"{t.X} {t.Y}");
            WriteLine($"{pole[0, 0]} {pole[1, 0]}");
            ReadKey();
        }
    }
}







namespace Piškvorky
{
    struct Tah
    {
        public int X, Y, hodnota;
        public char[,] vyslednePole;
        public Tah(int X, int Y, int hodnota, char[,] vyslednePole)
        {
            this.X = X;
            this.Y = Y;
            this.hodnota = hodnota;
            this.vyslednePole = vyslednePole;
        }
    }
}






using System;
namespace Piškvorky
{
    class Počítač
    {
        public char ja, on;
        public int obtiznost;
        public Počítač(char ja, char on, int obtiznost)
        {
            this.ja = ja;
            this.on = on;
            this.obtiznost = obtiznost;
        }
        public Tah Hraj(char[,] pole)
        {
            return MiniMax(pole, obtiznost, true, ja, on);
        }

        private int Ohodnot(char[,] pole)
        {
            int body = 0;

            //vodorovná kontrola všech pětic ve všech řádcích
            for (int y = 0; y < pole.GetLength(1); y++)
            {
                for (int si = 0; si <= pole.GetLength(0) - 5; si++)
                {
                    int petice = 0;
                    for (int i = si; i < si + 5; i++)
                    {
                        if (pole[i, y] == on && petice > 0 || pole[i, y] == ja && petice < 0)
                        { petice = 0; break; }
                        if (pole[i, y] == ja) petice++;
                        if (pole[i, y] == on) petice--;
                    }
                    body += petice;
                }
            }

            //svislá kontrola všech pětic ve všech sloupcích
            for (int x = 0; x < pole.GetLength(0); x++)
            {
                for (int si = 0; si <= pole.GetLength(1) - 5; si++)
                {
                    int petice = 0;
                    for (int i = si; i < si + 5; i++)
                    {
                        if (pole[x, i] == on && petice > 0 || pole[x, i] == ja && petice < 0)
                        { petice = 0; break; }
                        if (pole[x, i] == ja) petice++;
                        if (pole[x, i] == on) petice--;
                    }
                    body += petice;
                }
            }

            //kontrola rostoucích vrchních diagonál
            for (int i = 4; i < pole.GetLength(1) - 1; i++)
            {
                for (int j = i, k = 0; j >= 4 && k <= pole.GetLength(0) - 5; j--, k++)
                {
                    int petice = 0;
                    for (int l = j, m = k; l > j - 5 && m < k + 5; l--, m++)
                    {
                        if (pole[m, l] == on && petice > 0 || pole[m, l] == ja && petice < 0)
                        { petice = 0; break; }
                        else if (pole[m, l] == ja) petice += 1;
                        else if (pole[m, l] == on) petice -= 1;
                    }
                    body += petice;
                }
            }

            //rostoucí spodní
            for (int i = 0; i <= pole.GetLength(0) - 5; i++)
            {
                for (int j = i, k = pole.GetLength(1) - 1; j <= pole.GetLength(0) - 5 && k >= 4; j++, k--)
                {
                    int petice = 0;
                    for (int l = j, m = k; l < j + 5 && m > k - 5; l++, m--)
                    {
                        if (pole[l, m] == on && petice > 0 || pole[l, m] == ja && petice < 0)
                        { petice = 0; break; }
                        else if (pole[l, m] == ja) petice += 1;
                        else if (pole[l, m] == on) petice -= 1;
                    }
                    body += petice;
                }
            }

            //klesající spodní
            for (int i = 1; i <= pole.GetLength(1) - 5; i++)
            {
                for (int j = i, k = 0; j <= pole.GetLength(1) - 5 && k < pole.GetLength(0) - 5; j++, k++)
                {
                    int petice = 0;
                    for (int l = j, m = k; l < j + 5 && m < k + 5; l++, m++)
                    {
                        if (pole[m, l] == on && petice > 0 || pole[m, l] == ja && petice < 0)
                        { petice = 0; break; }
                        else if (pole[m, l] == ja) petice += 1;
                        else if (pole[m, l] == on) petice -= 1;
                    }
                    body += petice;
                }
            }

            //klesající vrchní
            for (int i = 0; i <= pole.GetLength(0) - 5; i++)
            {
                for (int j = i, k = 0; j <= pole.GetLength(0) - 5 && k < pole.GetLength(1) - 5; j++, k++)
                {
                    int petice = 0;
                    for (int l = j, m = k; l < j + 5 && m < k + 5; l++, m++)
                    {
                        if (pole[l, m] == on && petice > 0 || pole[l, m] == ja && petice < 0)
                        { petice = 0; break; }
                        else if (pole[l, m] == ja) petice += 1;
                        else if (pole[l, m] == on) petice -= 1;
                    }
                    body += petice;
                }
            }

            return body;
        }
        private char[,] Tahni(char[,] pole, int X, int Y, char hraje)
        {
            pole[X, Y] = hraje;
            return pole;
        }

        private Tah MiniMax(char[,] pole, int cislo, bool max, char hraje, char nehraje)
        {
            Tah vysledek = new Tah();
            vysledek.X = -1;

            if (cislo == 0)
            {
                vysledek.hodnota = Ohodnot(pole);
            }
            else
            {
                int sirka = pole.GetLength(0), vyska = pole.GetLength(1);
                for (int x = 0; x < sirka; x++)
                {
                    for (int y = 0; y < vyska; y++)
                    {
                        if ((int)pole[x, y] == 0) //pokud je políčko prázdné
                        {
                            Tah aktualni = new Tah();
                            aktualni.X = x; aktualni.Y = y;
                            aktualni.vyslednePole = Tahni(pole, x, y, hraje);
                            aktualni.hodnota = MiniMax(aktualni.vyslednePole, cislo - 1, !max, nehraje, hraje).hodnota;

                            if (aktualni.hodnota > vysledek.hodnota && max || aktualni.hodnota < vysledek.hodnota && !max || vysledek.X == -1)
                            {
                                vysledek = aktualni;
                            }
                        }
                    }
                }
            }
            return vysledek;
        }
    }
}

Neformátovaný

Přidáno: 29.3.2016
Expirace: Neuvedeno

Aktivity