コード例 #1
0
ファイル: AI.cs プロジェクト: JanRunge/Chess-Bitboards
        public virtual UInt64[] giveBestMove(int layers, Move move)
        {
            List <UInt64[]> possibleMove;

            if (transpTable.TryGetValue(move.toString(), out possibleMove))
            {
                // Key was in dictionary;
            }
            else
            {
                possibleMove = Calculator.AllPossible(move, this.Color);
                transpTable.Add(move.toString(), possibleMove);
            }


            int i = 0;
            int best;

            if (Color)
            {
                best = -999999999;
            }
            else
            {
                best = 999999999;
            }

            Move newerMove;
            int  besti = 0;

            movesCount = possibleMove.Count;
            firstLayer = movesCount;
            int ret;

            while (i < movesCount)
            {
                newerMove = move.MakeAMove(possibleMove[i][0]
                                           , possibleMove[i][1]
                                           , false);
                if (move.num >= 9 &&
                    move.toString() == move.previousMove.previousMove.previousMove.previousMove.toString() &&
                    move.toString() == move.previousMove.previousMove.previousMove.previousMove.previousMove.previousMove.previousMove.previousMove.toString()
                    )        //der dritte move in folge ist gleich
                {
                    ret = 0; //patt
                    Console.WriteLine("instant patt"); Console.Read();
                }
                else
                {
                    if (move.promotion)
                    {
                        move.promote("queen");
                    }

                    ret = findBestMove(layers - 1, newerMove, -999999999, 999999999);
                }
                if (!Color)
                {
                    if (ret < best)
                    {
                        besti = i;
                        if (ret == -999999999)
                        {
                            return(possibleMove[i]);
                        }
                        best = ret;
                    }
                }
                else
                {
                    if (ret > best)
                    {
                        besti = i;
                        if (ret == 999999999)
                        {
                            return(possibleMove[i]);
                        }
                        best = ret;
                    }
                }
                move.reset();
                this.percentFinished = (float)i / movesCount * 100;
                myForm.Invoke(myForm.DelegateCount);
                i++;
            }
            this.percentFinished = 100;
            myForm.Invoke(myForm.DelegateCount);
            if (i != 0)
            {
                return(possibleMove[besti]);
            }
            else
            {
                return(new UInt64[] { 0, 0 });
            }
        }
コード例 #2
0
ファイル: AI.cs プロジェクト: JanRunge/Chess-Bitboards
        protected int findBestMove(int layer, Move move, int alpha, int beta)
        {
            if (layer == 0)
            {
                evaluatedPositions++;
                return(evaluateBoard(move.BoardAfter));
                //return evaluateBoardPlus(move);
            }
            else
            {
                Move            newerMove;
                List <UInt64[]> possibleMove;
                int             movecount;
                if (transpTable.TryGetValue(move.toString(), out possibleMove))
                {
                    // Key was in dictionary; "value" contains corresponding value
                }
                else
                {
                    possibleMove = Calculator.AllPossible(move, move.turn);
                    transpTable.Add(move.toString(), possibleMove);
                }
                movecount = possibleMove.Count;
                if (move.turn)//weiss
                {
                    for (var i = 0; i < movecount; i++)
                    {
                        newerMove = move.MakeAMove(possibleMove[i][0]
                                                   , possibleMove[i][1]
                                                   , false);
                        if (move.num >= 9 &&
                            move.toString() == move.previousMove.previousMove.previousMove.previousMove.toString() &&
                            move.toString() == move.previousMove.previousMove.previousMove.previousMove.previousMove.previousMove.previousMove.previousMove.toString()
                            )          //der dritte move in folge ist gleich
                        {
                            return(0); //patt
                        }
                        if (newerMove.promotion)
                        {
                            newerMove.promote("queen");
                        }

                        alpha = Math.Max(alpha, findBestMove(layer - 1, newerMove, alpha, beta));
                        move.reset();
                        if (beta < alpha)
                        {
                            break;
                        }
                    }
                    if (movecount == 0)
                    {
                        if (move.AmIInCheck())
                        {
                            return(-999999999);
                        }
                        else
                        {
                            return(0);
                        }
                    }
                    return(alpha);
                }
                else
                {
                    for (var i = 0; i < movecount; i++)
                    {
                        newerMove = move.MakeAMove(possibleMove[i][0]
                                                   , possibleMove[i][1]
                                                   , false);
                        beta = Math.Min(beta, findBestMove(layer - 1, newerMove, alpha, beta));
                        move.reset();
                        if (beta < alpha)
                        {
                            break;
                        }
                    }
                    if (movecount == 0)
                    {
                        if (move.AmIInCheck())
                        {
                            return(999999999);
                        }
                        else
                        {
                            return(0);
                        }
                    }
                    return(beta);
                }
            }
        }
コード例 #3
0
        //-----------------------------------------------------------------------------------------------------------------------
        private void kaartTekenen(string columnName, DataTable table, string zijde)
        {
            Dictionary <ProvincieEnum, int> provincieScore2 = new Dictionary <ProvincieEnum, int>();

            for (int provincieIndex = 0; provincieIndex < Constants.aantalProvincies; provincieIndex++)
            {
                var huidigeProvincieScore = Convert.ToInt32(table.Rows[provincieIndex][columnName]);
                var provincie             = (ProvincieEnum)provincieIndex;
                provincieScore2[provincie] = huidigeProvincieScore;
            }

            var drentheScore      = provincieScore2[ProvincieEnum.Drenthe];
            var flevolandScore    = provincieScore2[ProvincieEnum.Flevoland];
            var frieslandScore    = provincieScore2[ProvincieEnum.Friesland];
            var gelderlandScore   = provincieScore2[ProvincieEnum.Gelderland];
            var groningenScore    = provincieScore2[ProvincieEnum.Groningen];
            var limburgScore      = provincieScore2[ProvincieEnum.Limburg];
            var noordBrabantScore = provincieScore2[ProvincieEnum.NoordBrabant];
            var noordHollandScore = provincieScore2[ProvincieEnum.NoordHolland];
            var overijsselScore   = provincieScore2[ProvincieEnum.Overijssel];
            var utrechtScore      = provincieScore2[ProvincieEnum.Utrecht];
            var zeelandScore      = provincieScore2[ProvincieEnum.Zeeland];
            var zuidHollandScore  = provincieScore2[ProvincieEnum.ZuidHolland];

            var maximum = drentheScore;
            var minimum = drentheScore;

            for (int count = 1; count < Constants.aantalProvincies; count++)
            {
                maximum = Calculator.Maximum(maximum, Convert.ToInt32(table.Rows[count][columnName]));
                minimum = Calculator.Minimum(minimum, Convert.ToInt32(table.Rows[count][columnName]));
            }


            var newDrentheScore      = Calculator.Difference(minimum, maximum, drentheScore);
            var newflevolandScore    = Calculator.Difference(minimum, maximum, flevolandScore);
            var newfrieslandScore    = Calculator.Difference(minimum, maximum, frieslandScore);
            var newgelderlandScore   = Calculator.Difference(minimum, maximum, gelderlandScore);
            var newgroningenScore    = Calculator.Difference(minimum, maximum, groningenScore);
            var newlimburgScore      = Calculator.Difference(minimum, maximum, limburgScore);
            var newnoordBrabantScore = Calculator.Difference(minimum, maximum, noordBrabantScore);
            var newnoordHollandScore = Calculator.Difference(minimum, maximum, noordHollandScore);
            var newoverijsselScore   = Calculator.Difference(minimum, maximum, overijsselScore);
            var newutrechtScore      = Calculator.Difference(minimum, maximum, utrechtScore);
            var newzeelandScore      = Calculator.Difference(minimum, maximum, zeelandScore);
            var newzuidHollandScore  = Calculator.Difference(minimum, maximum, zuidHollandScore);

            System.Resources.ResourceManager resourceManager = Properties.Resources.ResourceManager;

            var drentheObj    = resourceManager.GetObject("DR" + newDrentheScore);
            var flevolandObj  = resourceManager.GetObject("FL" + newflevolandScore);
            var frieslandObj  = resourceManager.GetObject("FR" + newfrieslandScore);
            var gelderlandObj = resourceManager.GetObject("GL" + newgelderlandScore);
            var groningenObj  = resourceManager.GetObject("GR" + newgroningenScore);
            var limburgObj    = resourceManager.GetObject("LB" + newlimburgScore);
            var noordbObj     = resourceManager.GetObject("NB" + newnoordBrabantScore);
            var noordhObj     = resourceManager.GetObject("NH" + newnoordHollandScore);
            var overijsselObj = resourceManager.GetObject("OV" + newoverijsselScore);
            var utrechtObj    = resourceManager.GetObject("UT" + newutrechtScore);
            var zeelandObj    = resourceManager.GetObject("ZL" + newzeelandScore);
            var zuidhObj      = resourceManager.GetObject("ZH" + newzuidHollandScore);

            if (zijde == "rechts")
            {
                RechterKaart(drentheObj, flevolandObj, frieslandObj, gelderlandObj, groningenObj, limburgObj, noordbObj, noordhObj, overijsselObj, utrechtObj, zeelandObj, zuidhObj);
            }
            else if (zijde == "links")
            {
                LinkerKaart(drentheObj, flevolandObj, frieslandObj, gelderlandObj, groningenObj, limburgObj, noordbObj, noordhObj, overijsselObj, utrechtObj, zeelandObj, zuidhObj);
            }
        }