我如何在多解决方案的棋盘游戏中防止内存溢出并提高性能

我有以下矩阵:

0XXXX XXXXX XX @ XX XXXXX XXXXX

这是一个棋盘游戏的表示。 0是红色的棋子。 X是普通的棋子。 @是板上的空白区域。您可以通过跳过另一个棋子(而不是红色)来移动棋子(红色或正常)。可以在任何方向上水平,垂直进行此操作。

当中间只有红色的棋子而没有其他棋子时,游戏结束。

有太多解决方案,当我仅运行同步时,我会出现错误溢出。 我需要父母和解决方案。我的一举一动都有很多可能性...

我首先做了一个董事会(免费,有人居住,红色)(枚举)

然后我制作了一个带有矩阵boardstate [,]的板 它有两个构造函数...一个是以游戏作为参数, 另一个带板。 当然有一个母板属性。

所以...当游戏成为参数时,它才开始,我生成矩阵。 当一块板成为参数时,我只需在矩阵上运行,然后将值复制到新的一块即可。

我具有功能“ losOp”(MakeSolution)。我在第一个创建的板上运行它。

如果此板未列为“无解决方案”(以后) 这将生成所有可能的新板(通过对每个可能的pawn进行每个可能的步骤)。然后,这些解决方案全部进入堆栈。 从那里我一次又一次地调用“ losOp”函数,直到堆栈中没有更多的解决方案为止。或在Board类的参数解决方案中。

当董事会不是解决方案时,我打电话给我的父母将我从解决方案中删除。如果我父母中没有其他解决方案了,他也叫他的父母也将他遣散...

但是不是解决方案的每个解决方案都放在游戏的noSolutions列表中(作为矩阵),因此我们可以检查是否必须计算此板。

但是...。事情一直在继续。 否则我会出现内存溢出...

我是一个自动整理者,第一次使用线程尝试异步处理,但这也给我带来了错误溢出...

我真的不知道这件事是否有解决方案...

Bordvakjes类只是一个对象  带有enum vrij,bezet,rood(空闲,已占用,红色)

我从一个表格开始运行,那只是在开始一个新游戏

public class Game
    {
        public Form1 TheForm;
        public Bord Start;
//Onoplosbaar = no solutions
        public List<Bordvak[,]> Onoplosbaar = new List<Bordvak[,]>();

        public Game(Form1 form)
        {
            Onoplosbaar = new List<Bordvak[,]>();
            Start = new Bord(this,form);

        }
    }
public class Bord
    {
        //not needed
        Form1 form;
        //game running
        Game theGame;
        //current board setup
        Bordvak[,] Vakjes;
        //current round
        int Beurt = 0;
        //not needed
        int formBeurt = 0;
        //will list all possible solutions for this board
        public List<Bord> MijnOplossingen;
        //get txt with represent board easily instead of matrix
        public string afbeelding;
        //not needed
        public int FormBeurt { get { return formBeurt; } set { formBeurt = value; if (MyParent != null) { MyParent.FormBeurt = value; MyParent.form.Beurt = value; } else { form.setvalue(value); } } }
        //board from where this board occurred
        public Bord MyParent { get; set; }
        /// <summary>
        /// I'm a solution of a previous board
        /// </summary>
        /// <param name="parent"></param>
        /// 
        public Bord(Bord parent)
        {
            theGame = parent.theGame;
            //form in fact is unessecary,is already in game
            form = parent.form;
            Vakjes = new Bordvak[5,5];
            for (int rij = 0; rij < 5; rij++)
            {
                for (int col = 0; col < 5; col++)
                {
                    Vakjes[rij,col] = new Bordvak(parent.Vakjes[rij,col].MyStatus);
                }
            }
                MyParent = parent;
                Beurt = parent.Beurt + 1;


            //tried for async but still got error overflow
            //that's why now with stack
            //code still ok i presume

                Form1.setPointer pointer = parent.form.setvalue;
                pointer.Invoke(Beurt);
                Application.DoEvents();


        }

        /// <summary>
        /// Im the first board to start,put matrix
        /// </summary>
        public Bord(Game game,Form1 _form)
        {
            theGame = game;
            form=_form;
            form.Show();
            Application.DoEvents();
            Vakjes = new Bordvak[5,5];
            for (int rij = 0; rij < 5; rij++)
            {
                for (int col = 0; col < 5; col++)
                {
                    if (rij == 0 && col == 0)
                        Vakjes[0,0] = new Bordvak(Bordvak.Status.rood);
                    if (rij == 2 && col == 2)
                        Vakjes[2,2] = new Bordvak(Bordvak.Status.vrij);
                    //is this the best way ????
                    if (!(rij == 0 && col == 0) && !(rij == 2 && col == 2))
                        Vakjes[rij,col] = new Bordvak(Bordvak.Status.bezet);
                }
            }

            LosOp();
        }

        /// <summary>
        /// Returns true if this board is the end solution
        /// it also generates the string to show the board
        /// instead of checking the matrix
        /// </summary>
        /// <param name="afbeelding"></param>
        /// <returns></returns>
        public bool Done(ref string afbeelding)
        {
            bool done = true;

            for (int rij = 0; rij < 5; rij++)
            {
                for (int col = 0; col < 5; col++)
                {

                        if (Vakjes[rij,col].MyStatus == Bordvak.Status.bezet)
                        {

                                done = false;

                            afbeelding += "X";
                        }else
                        {
                            if (Vakjes[rij,col].MyStatus == Bordvak.Status.rood)
                            {
                                afbeelding += "O";

                            }
                            else
                            {
                                afbeelding += "@";
                            }
                        }

                }
                afbeelding += "\n";
            }
            if (done)
                if (Vakjes[2,2].MyStatus == Bordvak.Status.rood)
                    done = true;
                else
                    done = false;
            return done;
        }

        /// <summary>
        /// Check if this is the end solution
        /// if not,do all possible moves
        /// 
        /// </summary>
        public void LosOp()
        {
            afbeelding = "";
            if (Done(ref afbeelding))
            {
                MessageBox.Show(afbeelding);
                return;
            }

            //do all possible moves
            MijnOplossingen = Oplossingen();
            //if i have solutions
            if (MijnOplossingen.Count>0)
            {

                int start = MijnOplossingen.Count - 1;
                //loop over every solution
                for (int i = start; i > 0; i--)
                {
                    //put solution in stack
                    Stack<Bord> stack = new Stack<Bord>();
                    stack.Push(MijnOplossingen[i]);

                    //loop all solutions in stack
                    while (stack.Count > 0)
                    {
                        Bord current = stack.Pop();
                        //if this board isn't handled yet,handle
                        if (!theGame.Onoplosbaar.Contains(current.Vakjes))
                        { 
                            //check solutions (this fuction)
                            current.LosOp();
                            //put every solution back in stack
                        foreach (Bord bord in current.MijnOplossingen)
                        {
                            stack.Push(bord);
                        }
                        }
                    }
                    //async doesnt work... error overflow
                       // Task.Factory.StartNew(MijnOplossingen[i].LosOp);

                    //we made af move
                        form.Beurt = Beurt;
                    //update form
                        Application.DoEvents();

                }//go back to stack


            }
            else //there are no solutions
            {
                //remove me from my parent's solutions
                MyParent.RemoveMe(this);
            }
        }

        public void RemoveMe(Bord me)
        {
            //i wasn't a solution,put me in memory "unsolved"
            theGame.Onoplosbaar.Add(me.Vakjes);
            //remove move from possible solutions
            MijnOplossingen.Remove(me);
            //if i don't have other solutions,//remove me from my parent's parent too..
            if (MijnOplossingen.Count == 0)
                MyParent.RemoveMe(this);
        }
        public List<Bord> Oplossingen()
        {
            //get all solutions,//check below,above,left and right
            List<Bord> oplossingen = new List<Bord>();
            for (int rij = 0; rij < 5; rij++)
            {
                for (int col = 0; col < 5; col++)
                {
                    //spring naar beneden
                    if (rij <= 2)
                    {
                        //als ik pion of rood ben
                        if ((Vakjes[rij,col].MyStatus == Bordvak.Status.bezet || Vakjes[rij,col].MyStatus == Bordvak.Status.rood))
                        {
                            if (Vakjes[rij + 1,col].MyStatus == Bordvak.Status.bezet && Vakjes[rij + 2,col].MyStatus == Bordvak.Status.vrij)
                            {
                                Bord bord = new Bord(this);  
                                bord.Vakjes[rij + 1,col].MyStatus = Bordvak.Status.vrij;
                                bord.Vakjes[rij + 2,col].MyStatus = Vakjes[rij,col].MyStatus;
                                bord.Vakjes[rij,col].MyStatus = Bordvak.Status.vrij;
                                oplossingen.Add(bord);
                            }
                        }
                    }

                    //spring naar boven
                    if (rij >= 2)
                    {
                        //als ik pion of rood ben
                        if ((Vakjes[rij,col].MyStatus == Bordvak.Status.rood))
                        {
                            if (Vakjes[rij - 1,col].MyStatus == Bordvak.Status.bezet && Vakjes[rij - 2,col].MyStatus == Bordvak.Status.vrij)
                            {
                                Bord bord = new Bord(this);

                                bord.Vakjes[rij - 1,col].MyStatus = Bordvak.Status.vrij;
                                bord.Vakjes[rij - 2,col].MyStatus = Bordvak.Status.vrij;
                                oplossingen.Add(bord);
                            }
                        }
                    }
                    //spring naar link
                    if (col >= 2)
                    {
                        //als ik pion of rood ben
                        if ((Vakjes[rij,col].MyStatus == Bordvak.Status.rood))
                        {
                            if (Vakjes[rij,col - 1].MyStatus == Bordvak.Status.bezet && Vakjes[rij,col - 2].MyStatus == Bordvak.Status.vrij)
                            {
                                Bord bord = new Bord(this);

                                bord.Vakjes[rij,col - 1].MyStatus = Bordvak.Status.vrij;
                                bord.Vakjes[rij,col - 2].MyStatus = Vakjes[rij,col].MyStatus = Bordvak.Status.vrij;
                                oplossingen.Add(bord);
                            }
                        }
                    }
                    //spring naar rechts
                    if (col <= 2)
                    {
                        //als ik pion of rood ben
                        if ((Vakjes[rij,col + 1].MyStatus == Bordvak.Status.bezet && Vakjes[rij,col + 2].MyStatus == Bordvak.Status.vrij)
                            {
                                Bord bord = new Bord(this);

                                bord.Vakjes[rij,col + 1].MyStatus = Bordvak.Status.vrij;
                                bord.Vakjes[rij,col + 2].MyStatus = Vakjes[rij,col].MyStatus = Bordvak.Status.vrij;
                                oplossingen.Add(bord);
                            }
                        }
                    }



                }
            }
            return oplossingen;
        }

}

异步:错误溢出 同步:错误溢出 堆栈:非常慢

这是处理我的问题的最好方法吗?

xceo123 回答:我如何在多解决方案的棋盘游戏中防止内存溢出并提高性能

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3155283.html

大家都在问