Esempio n. 1
0
        /// <summary>
        /// AI浅层思考 不需要推理能确定是雷的点
        /// </summary>
        /// <param name="cnt"></param>
        public void _Think(int cnt)
        {
            for (int i = 0; i < cnt; i++)
            {
                mp[i].around = _Unopen(mp[i]);
            }
            for (int i = 0; i < cnt; i++)
            {
                for (int j = 0; j < cnt; j++)
                {
                    Pane pane1 = (Pane)this.Controls[Map[mp[i].x, mp[i].y]];
                    Pane pane2 = (Pane)this.Controls[Map[mp[j].x, mp[j].y]];
                    int  ui    = mp[i].around;
                    int  uj    = mp[j].around;
                    if (ui == uj)
                    {
                        if (pane1._Around < pane2._Around)
                        {
                            point t = mp[i]; mp[i] = mp[j]; mp[j] = t;
                        }
                    }
                    if (ui < uj)
                    {
                        point t = mp[i]; mp[i] = mp[j]; mp[j] = t;
                    }
                }
            }
            for (int i = 0; i < this.row; i++)
            {
                for (int j = 0; j < this.col; j++)
                {
                    if (_is_mine_rate[i, j] == 0 || _is_mine_rate[i, j] == 1)
                    {
                        continue;
                    }
                    _is_mine_rate[i, j] = -1;
                }
            }
            Queue <point> rec = new Queue <point>();

            rec.Clear();
            for (int i = 0; i < cnt; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    int   xx  = nx[j] + mp[i].x;
                    int   yy  = ny[j] + mp[i].y;
                    point pos = new point();
                    pos.x = xx;
                    pos.y = yy;
                    if (Canset(xx, yy))
                    {
                        Pane pane  = (Pane)this.Controls[Map[xx, yy]];
                        Pane pane2 = (Pane)this.Controls[Map[mp[i].x, mp[i].y]];
                        if (pane._Stat == 0)
                        {
                            double a = (double)((double)pane2._Around - _Possible_mine(pane2)) / ((double)_Unopen(mp[i]));
                            _is_mine_rate[xx, yy] = (a == 0)?0:this.max(a, (double)(_is_mine_rate[xx, yy]));
                            if (_is_mine_rate[xx, yy] == 1)
                            {
                                _is_mine[xx, yy] = 1;

                                pane._Mark();
                            }
                            else
                            {
                                if (_is_mine_rate[xx, yy] == 0 && _vis[xx, yy] == 0)
                                {
                                    point tmp = new point();
                                    tmp.x = xx;
                                    tmp.y = yy;
                                    rec.Enqueue(tmp);
                                }
                            }
                        }
                        if (pane._Stat == 2)
                        {
                            _is_mine_rate[pane._x, pane._y] = 1;
                            _is_mine[xx, yy] = 1;
                        }
                    }
                }
            }
            for (int i = 0; i < this.row; i++)
            {
                for (int j = 0; j < this.col; j++)
                {
                    if (_is_mine_rate[i, j] == 0)
                    {
                        point tmp = new point();
                        tmp.x = i;
                        tmp.y = j;
                        if (_vis[i, j] == 0)
                        {
                            _vis[i, j] = 1;
                        }
                    }
                    // Console.Write(Math.Round(_is_mine_rate[i, j], 3) + "  ");
                }
                // Console.WriteLine();
            }
            //Console.WriteLine();

            if (rec.Count == 0)
            {
                int flag = 1;
                for (int i = 0; i < this.row; i++)
                {
                    for (int j = 0; j < this.col; j++)
                    {
                        Pane pane = (Pane)this.Controls[Map[i, j]];
                        if (vis[i, j] == 0 && pane._Stat != 2)
                        {
                            flag = 0;
                        }
                    }
                }
                if (flag == 1)
                {
                    Form1._instance.led2.timer.Close();
                    Form1._instance.led2.t.Abort();
                    switch (Form1.status)
                    {
                    case 20:
                        MessageBox.Show("Defeat.");
                        Form1.status = 23;
                        break;

                    case 21:
                        MessageBox.Show("Defeat.");
                        Form1.status = 23;
                        break;

                    case 22:
                        MessageBox.Show("You win.");
                        break;
                    }
                    //MessageBox.Show("win");
                    gameStat = 1;
                    return;
                }
                Console.WriteLine("Can't Solve Now!");
                return;
            }
            while (rec.Count != 0)
            {
                Thread.Sleep(Delay);
                point fr = rec.Dequeue();
                AI_think(fr);
            }
        }