Пример #1
0
        private static void BalanceNimTree(int sum, INimRow[] rows)
        {
            if (rows.Where(row => row.TokenCount > 0).Count() == 1) // Victory Condition; just take all but the last token.
            {
                INimRow row = rows.Where(r => r.TokenCount > 0).Single();

                while (row.TokenCount > 1)
                {
                    _dispatcher.BeginInvoke(() => {
                        row.RemoveToken();
                    });
                    Thread.Sleep(500);
                }

                return;
            }
            else if (rows.Where(row => row.TokenCount > 0).Count() == 2 &&
                     rows.Where(row => row.TokenCount == 1).Count() == 1) // Victory Condition; just remove all the tokens in the large row leaving a single token in the remaining row.
            {
                INimRow row = rows.Where(r => r.TokenCount > 1).Single();

                while (row.TokenCount > 0)
                {
                    _dispatcher.BeginInvoke(() =>
                    {
                        row.RemoveToken();
                    });
                    Thread.Sleep(500);
                }

                return;
            }
            else if (rows.Where(row => row.TokenCount > 0).Count() == 3 &&
                     rows.Where(row => row.TokenCount == 1).Count() == 2) // Victory condition; Leave 3 tokens on the board;
            {
                INimRow row = rows.Where(r => r.TokenCount > 1).Single();

                while (row.TokenCount > 1)
                {
                    _dispatcher.BeginInvoke(() =>
                    {
                        row.RemoveToken();
                    });
                    Thread.Sleep(500);
                }

                return;
            }
            else
            {
                CalculatePlay(sum, rows);
            }
        }
Пример #2
0
        private static void CalculatePlay(int sum, INimRow[] rows)
        {
            if (sum == 0) //the tree is balanced, just pick a row and remove some tokens
            {
                Random    rand    = new Random();
                INimRow[] valrows = rows.Where(row => row.TokenCount > 0).ToArray();

                INimRow randrow = valrows[rand.Next(0, valrows.Length - 1)];
                while (randrow.TokenCount > rand.Next(0, randrow.TokenCount))
                {
                    _dispatcher.BeginInvoke(() =>
                    {
                        randrow.RemoveToken();
                    });
                    Thread.Sleep(500);
                }

                return;
            }
            else if (rows.Where(row => (row.TokenCount & sum) == sum).Count() > 0)
            {
                INimRow row = rows.Where(r => (r.TokenCount & sum) == sum).First();

                for (int i = 0; i < sum; i++)
                {
                    _dispatcher.BeginInvoke(() =>
                    {
                        row.RemoveToken();
                    });
                    Thread.Sleep(500);
                }

                return;
            }
            else if (rows.Where(row => row.TokenCount >= sum).Count() > 0)
            {
                INimRow row = rows.Where(r => r.TokenCount == sum).Count() > 0 ? rows.Where(r => r.TokenCount == sum).First() : rows.Where(r => r.TokenCount > sum).First();

                for (int i = 0; i < sum; i++)
                {
                    _dispatcher.BeginInvoke(() =>
                    {
                        row.RemoveToken();
                    });
                    Thread.Sleep(500);
                }

                return;
            }
            else
            {
                INimRow row = rows.Where(r => r.TokenCount == (from i in rows
                                                               select i.TokenCount).Max()).Single();

                do
                {
                    _dispatcher.BeginInvoke(() =>
                    {
                        row.RemoveToken();
                    });
                    Thread.Sleep(500);
                }while (CalculateNimSum(rows) != 0 && row.TokenCount > 0);
            }

            return;
        }