コード例 #1
0
        /*
         * A GameEnd függyvény megvizsgálja a beérkező x, y pozíciók alapján, hogy a lépést végrehajtó játékosnak összegyűlt-e a szükséges mennyiségű szomszédos lépése.
         * Igaz értéket ad vissza ha összegyűlt, tehát a játéknak vége.
         * Hamis értéket ad vissza ha még nem gyűlt össze.
         * Paraméterei:
         * x: Amely sorba a játékos megtette lépését.
         * y: Amely oszlopba a játékos megtette lépését.
         * step: Ahány szomszédos lépésnek össze kell gyűlnie a nyereséghez.
         */
        static bool GameEnd(GridModel table, int x, int y, int step)
        {
            int testx = x, testy = y, borderx = 0, bordery = 0;
            int sum = 0;

            int[] testdirx = { 0, 0, 1, -1, -1, 1, 1, -1 };
            int[] testdiry = { 1, -1, 0, 0, 1, -1, 1, -1 };

            FieldState prev = table[x, y];

            for (int i = 0; i < 8; i++)
            {
                switch (testdirx[i])
                {
                case -1:
                    borderx = -1;
                    break;

                case 0:
                    borderx = -2;
                    break;

                case 1:
                    borderx = table.Height;
                    break;
                }
                switch (testdiry[i])
                {
                case -1:
                    bordery = -1;
                    break;

                case 0:
                    bordery = -2;
                    break;

                case 1:
                    bordery = table.Width;
                    break;
                }

                while (!(testy == bordery || testx == borderx || table[testx, testy] != prev || sum == step))
                {
                    sum++;
                    testx += testdirx[i];
                    testy += testdiry[i];
                }

                if ((i + 1) % 2 == 0 && (sum - 1) >= step)
                {
                    return(true);
                }
                else if ((i + 1) % 2 == 0 && (sum - 1) < step)
                {
                    sum = 0;
                }

                testx = x;
                testy = y;
            }

            return(false);
        }
コード例 #2
0
        /*
         * Az AI függvény a megkapott tábla alapján a referencia szerint érkező aix, aiy pozíciók értékét meghatározza,
         * így ad választ a játékosok lépéseire.
         * Paraméterei:
         * -CPU: az a FieldState változó ami az AIhoz tartozik.
         */
        static void AI(GridModel table, FieldState CPU, ref int aix, ref int aiy)
        {
            List <int> lx = new List <int>();
            List <int> ly = new List <int>();

            int[]  testdirx = { 0, -1, -1, -1, 0, 1, 1, 1 };
            int[]  testdiry = { -1, -1, 0, 1, 1, 1, 0, -1 };
            Random rnd      = new Random();
            int    choice;

            //Összegyűjti a már meglévő lépéseket a táblán.
            for (int i = 1; i < table.Height - 1; i++)
            {
                for (int j = 1; j < table.Width - 1; j++)
                {
                    if (table[i, j] != FieldState.None)
                    {
                        for (int k = 0; k < 8; k++)
                        {
                            if (table[i + testdirx[k], j + testdiry[k]] == FieldState.None)
                            {
                                lx.Add(i + testdirx[k]);
                                ly.Add(j + testdiry[k]);
                            }
                        }
                    }
                }
            }

            for (int i = 1; i < table.Height - 1; i++)
            {
                if (table[i, 0] != FieldState.None && table[i, 1] == FieldState.None)
                {
                    lx.Add(i);
                    ly.Add(1);
                }
                if (table[i, table.Width - 1] != FieldState.None && table[i, table.Width - 2] == FieldState.None)
                {
                    lx.Add(i);
                    ly.Add(table.Width - 2);
                }
            }

            for (int i = 1; i < table.Width - 1; i++)
            {
                if (table[0, i] != FieldState.None && table[1, i] == FieldState.None)
                {
                    lx.Add(0);
                    ly.Add(i);
                }
                if (table[table.Height - 1, i] != FieldState.None && table[table.Height - 2, i] == FieldState.None)
                {
                    lx.Add(table.Height - 2);
                    ly.Add(i);
                }
            }

            if (table[0, 0] != FieldState.None)
            {
                for (int i = 4; i <= 6; i++)
                {
                    if (table[0 + testdirx[i], 0 + testdiry[i]] == FieldState.None)
                    {
                        lx.Add(0 + testdirx[i]);
                        ly.Add(0 + testdiry[i]);
                    }
                }
            }
            if (table[0, table.Width - 1] != FieldState.None)
            {
                for (int i = 6; i <= 8; i++)
                {
                    if (table[0 + testdirx[i % 8], table.Width - 1 + testdiry[i % 8]] == FieldState.None)
                    {
                        lx.Add(0 + testdirx[i % 8]);
                        ly.Add(table.Width - 1 + testdiry[i % 8]);
                    }
                }
            }
            if (table[table.Height - 1, 0] != FieldState.None)
            {
                for (int i = 2; i <= 4; i++)
                {
                    if (table[table.Height - 1 + testdirx[i], 0 + testdiry[i]] == FieldState.None)
                    {
                        lx.Add(table.Height - 1 + testdirx[i]);
                        ly.Add(0 + testdiry[i]);
                    }
                }
            }
            if (table[table.Height - 1, table.Width - 1] != FieldState.None)
            {
                for (int i = 0; i <= 2; i++)
                {
                    if (table[table.Height - 1 + testdirx[i], table.Width - 1 + testdiry[i]] == FieldState.None)
                    {
                        lx.Add(table.Height - 1 + testdirx[i]);
                        ly.Add(table.Width - 1 + testdiry[i]);
                    }
                }
            }

            //Ha nem üres a tábla, random választ egy elemet az összegyűjtött pozíciók listájából.
            //Ha üres akkor a tábla közepére helyezi lépését.
            if (lx.Count == 0)
            {
                aix = table.Height / 2;
                aiy = table.Width / 2;
            }
            else
            {
                choice = rnd.Next(0, lx.Count);
                aix    = lx[choice];
                aiy    = ly[choice];
            }
        }