Пример #1
0
        /// <summary>
        ///     Funkce minimaxu
        /// </summary>
        /// <param name="gb">instance tridy hraci desky</param>
        /// <param name="depth">hloubka minimaxu</param>
        /// <returns></returns>
        private double minimax(Gameboard gb, int depth)
        {
            // pokud je na tahu bily hrac
            if (gb.PlayingWhite)
            {
                // a vitez je nastaven na bileho hrace vrat MAX
                if (gb.Winner == status.whitePlayer)
                {
                    return(-GlobalVariables.MAX);
                }
                // a vitez je nastaven na cerneho hrace vrat -MAX
                if (gb.Winner == status.blackPlayer)
                {
                    return(GlobalVariables.MAX);
                }
                // a je remiza, vrat 0
                if (gb.Winner == status.draw)
                {
                    return(0);
                }
            }
            // pokud je na tahu cerny hrac
            else
            {
                // a je vitez nastaven na cerneho hrace, vrat MAX
                if (gb.Winner == status.blackPlayer)
                {
                    return(-GlobalVariables.MAX);
                }
                // a je vitez nastaven na bileho hrace, vrat -MAX
                if (gb.Winner == status.whitePlayer)
                {
                    return(GlobalVariables.MAX);
                }
                // a je remiza, vrat 0
                if (gb.Winner == status.draw)
                {
                    return(0);
                }
            }

            if (depth == 0)
            {
                return(evalFunction(gb));
            }
            else
            {
                List <Fairway> moves = generateMoves(gb);
                double         rank  = -GlobalVariables.MAX;

                for (int i = 0; i < moves.Count; i += 2)
                {
                    // potomek <- zahraj(pozice, tah)
                    Gameboard potomek = gb.gameboardCopy();
                    rules.makeMove(moves[i], moves[i + 1], potomek, true);
                    rank = Math.Max(rank, -minimax(potomek, depth - 1));
                }
                return(rank);
            }
        }
Пример #2
0
        private void fw_2ndClick(object sender, EventArgs e)
        {
            var form                      = Form.ActiveForm as Friska_dama;
            BackgroundWorker bw           = form.bw;
            var            fwClicked      = (Fairway)sender;
            List <Fairway> playersFigures = rules.choosableFigures(this);
            List <string>  posMoves       = possibleMoves(From);

            if (fwClicked == From)
            {
                foreach (var fw in Board)
                {
                    fw.Click -= fw_2ndClick;
                    fw.Click += fw_1stClick;
                }
                if (ShowMoveHelp)
                {
                    colorUp();
                }
                From = null;
                form.statusBarLabel.Text = "Vyberte figurku, kterou chcete táhnout";
            }
            else if (fwClicked != From && playersFigures.Contains(fwClicked))
            {
                From = fwClicked;
                fairwayColorUp(this, From);
            }
            else if (posMoves.Contains(fwClicked.Name))
            {
                addHistory(From, fwClicked);

                rules.makeMove(From, fwClicked, this, false);
                Winner = rules.checkWinner(this);

                from = null;
                foreach (var fw in Board)
                {
                    fw.Click -= fw_2ndClick;
                    fw.Click += fw_1stClick;
                }
                if (ShowMoveHelp)
                {
                    colorUp();
                }
                form.Activate();
                form.FriskaDama_Activated(sender, e);
            }
        }
Пример #3
0
        /// <summary>
        ///     Funkce provadejici nacteni hry a zkontrolovani, zda se jedna o korektni ulozeni
        /// </summary>
        /// <param name="filePath">cesta k souboru</param>
        /// <param name="gb">Hraci deska, na niz maji byt zmeny provedeny</param>
        /// <returns>Hraci desku s odehratou hrou</returns>
        public Gameboard loadGame(string filePath, Gameboard gb)
        {
            string  from = "";
            string  to   = "";
            Fairway fwFrom;
            Fairway fwTo;
            var     rules = new Rules();

            gb.Board = gb.newBoard();

            using (XmlReader reader = XmlReader.Create(filePath))
            {
                while (reader.Read())
                {
                    if (reader.IsStartElement())
                    {
                        switch (reader.Name)
                        {
                        // nacteme si obtiznost bileho hrace a nastavime
                        case "WHITE":
                            if (reader.Read())
                            {
                                int whitePlayer = Convert.ToInt32(reader.Value.Trim());
                                gb.WhitePlayer = whitePlayer;
                            }
                            break;

                        // nacteme si obtiznost cerneho hrace a nastavime
                        case "BLACK":
                            if (reader.Read())
                            {
                                int blackPlayer = Convert.ToInt32(reader.Value.Trim());
                                gb.BlackPlayer = blackPlayer;
                            }
                            break;

                        // nacteme si zacinajiciho hrace a nastavime
                        case "STARTS":
                            if (reader.Read())
                            {
                                bool startsWhite = Convert.ToBoolean(reader.Value.Trim());
                                gb.StartsWhite = startsWhite;
                            }
                            break;

                        //
                        case "SHOWHELP":
                            if (reader.Read())
                            {
                                bool showHelp = Convert.ToBoolean(reader.Value.Trim());
                                gb.ShowMoveHelp = showHelp;
                            }
                            break;

                        case "FROM":
                            if (reader.Read())
                            {
                                from = reader.Value.Trim();
                            }
                            break;

                        case "TO":
                            if (reader.Read())
                            {
                                to = reader.Value.Trim();
                            }
                            fwFrom = gb.getFigure(from);
                            fwTo   = gb.getFigure(to);
                            rules.generateMoves(gb);
                            rules.makeMove(fwFrom, fwTo, gb, false);
                            gb.addHistory(fwFrom, fwTo);
                            break;

                        default:
                            break;
                        }
                    }
                }
            }

            return(gb);
        }
Пример #4
0
        /// <summary>
        /// Funkce provadejici nacteni hry a zkontrolovani, zda se jedna o korektni ulozeni
        /// </summary>
        /// <param name="filePath">cesta k souboru</param>
        /// <param name="gb">Hraci deska, na niz maji byt zmeny provedeny</param>
        /// <returns>Hraci desku s odehratou hrou</returns>
        public Gameboard loadGame(string filePath, Gameboard gb)
        {
            string from = "";
            string to = "";
            Fairway fwFrom;
            Fairway fwTo;
            Rules rules = new Rules();

            gb.Board = gb.newBoard();

            using (XmlReader reader = XmlReader.Create(filePath))
            {
                while (reader.Read())
                {
                    if (reader.IsStartElement())
                    {
                        switch (reader.Name)
                        {
                            // nacteme si obtiznost bileho hrace a nastavime
                            case "WHITE":
                                if (reader.Read())
                                {
                                    int whitePlayer = Convert.ToInt32(reader.Value.Trim());
                                    gb.WhitePlayer = whitePlayer;
                                }
                                break;
                            // nacteme si obtiznost cerneho hrace a nastavime
                            case "BLACK":
                                if (reader.Read())
                                {
                                    int blackPlayer = Convert.ToInt32(reader.Value.Trim());
                                    gb.BlackPlayer = blackPlayer;
                                }
                                break;

                            // nacteme si zacinajiciho hrace a nastavime
                            case "STARTS":
                                if (reader.Read())
                                {
                                    bool startsWhite = Convert.ToBoolean(reader.Value.Trim());
                                    gb.StartsWhite = startsWhite;
                                }
                                break;
                            //
                            case "SHOWHELP":
                                if (reader.Read())
                                {
                                    bool showHelp = Convert.ToBoolean(reader.Value.Trim());
                                    gb.ShowMoveHelp = showHelp;
                                }
                                break;

                            case "FROM":
                                if (reader.Read())
                                    from = (string)reader.Value.Trim();
                                break;

                            case "TO":
                                if (reader.Read())
                                    to = (string)reader.Value.Trim();
                                fwFrom = gb.getFigure(from);
                                fwTo = gb.getFigure(to);
                                rules.generateMoves(gb);
                                rules.makeMove(fwFrom, fwTo, gb, false);
                                gb.addHistory(fwFrom, fwTo);
                                break;

                            default:
                                break;
                        }
                    }
                }
            }

            return gb;
        }