我有以下矩阵:
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;
}
}
异步:错误溢出 同步:错误溢出 堆栈:非常慢
这是处理我的问题的最好方法吗?