C#实现的算24点游戏算法实例分析
本文实例讲述了C#实现的算24点游戏算法。分享给大家供大家参考。具体如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.IO;
namespaceCalc24Points
{
publicclassCell
{
publicenumType
{
Number,
Signal
}
publicintNumber;
publiccharSignal;
publicTypeTyp;
publicCellRight;
publicCellLeft;
///<summary>
///符号优先级
///</summary>
publicintPriority
{
get
{
if(Typ==Type.Signal)
{
switch(Signal)
{
case'+':return0;
case'-':return0;
case'*':return1;
case'/':return1;
default:return-1;
}
}
return-1;
}
}
///<summary>
///基本单元构造函数
///</summary>
///<paramname="t">单元类型,数值或符号</param>
///<paramname="num">数值</param>
///<paramname="sig">符号</param>
publicCell(Typet,intnum,charsig)
{
Right=null;
Left=null;
Typ=t;
Number=num;
Signal=sig;
}
publicCell()
{
Right=null;
Left=null;
Number=0;
Typ=Type.Number;
}
publicCell(Cellc)
{
Right=null;
Left=null;
Number=c.Number;
Signal=c.Signal;
Typ=c.Typ;
}
}
publicclassCalc24Points
{
stringm_exp;
boolm_stop;
Cell[]m_cell;
int[]m_express;
StringWriterm_string;
publicCalc24Points(intn1,intn2,intn3,intn4)
{
m_cell=newCell[8];
m_cell[0]=newCell(Cell.Type.Number,n1,'?');
m_cell[1]=newCell(Cell.Type.Number,n2,'?');
m_cell[2]=newCell(Cell.Type.Number,n3,'?');
m_cell[3]=newCell(Cell.Type.Number,n4,'?');
m_cell[4]=newCell(Cell.Type.Signal,0,'+');
m_cell[5]=newCell(Cell.Type.Signal,0,'-');
m_cell[6]=newCell(Cell.Type.Signal,0,'*');
m_cell[7]=newCell(Cell.Type.Signal,0,'/');
m_stop=false;
m_express=newint[7];
m_string=newStringWriter();
m_exp=null;
}
publicoverridestringToString()
{
if(m_exp==null)
{
PutCell(0);
m_exp=m_string.ToString();
}
if(m_exp!="")returnm_exp;
returnnull;
}
///<summary>
///在第n位置放置一个单元
///</summary>
///<paramname="n"></param>
voidPutCell(intn)
{
if(n>=7)
{
if(Calculate())
{
m_stop=true;
Formate();
}
return;
}
intend=8;
if(n<2)end=4;
for(inti=0;i<end;++i)
{
m_express[n]=i;
if(CheckCell(n))PutCell(n+1);
if(m_stop)break;
}
}
///<summary>
///检查当前放置是否合理
///</summary>
///<paramname="n"></param>
///<returns></returns>
boolCheckCell(intn)
{
intnums=0,sigs=0;
for(inti=0;i<=n;++i)
{
if(m_cell[m_express[i]].Typ==Cell.Type.Number)++nums;
else++sigs;
}
if(nums-sigs<1)returnfalse;
if(m_cell[m_express[n]].Typ==Cell.Type.Number)
//数值不能重复,但是符号可以重复
{
for(inti=0;i<n;++i)if(m_express[i]==m_express[n])returnfalse;
}
if(n==6)
{
if(nums!=4||sigs!=3)returnfalse;
if(m_cell[m_express[6]].Typ!=Cell.Type.Signal)returnfalse;
returntrue;
}
returntrue;
}
///<summary>
///计算表达式是否为24
///</summary>
///<returns>返回值true为24,否则不为24</returns>
boolCalculate()
{
double[]dblStack=newdouble[4];
intindexStack=-1;
for(inti=0;i<7;++i)
{
if(m_cell[m_express[i]].Typ==Cell.Type.Number)
{
++indexStack;
dblStack[indexStack]=m_cell[m_express[i]].Number;
}
else
{
switch(m_cell[m_express[i]].Signal)
{
case'+':
dblStack[indexStack-1]=dblStack[indexStack-1]+dblStack[indexStack];
break;
case'-':
dblStack[indexStack-1]=dblStack[indexStack-1]-+dblStack[indexStack];
break;
case'*':
dblStack[indexStack-1]=dblStack[indexStack-1]*dblStack[indexStack];
break;
case'/':
dblStack[indexStack-1]=dblStack[indexStack-1]/dblStack[indexStack];
break;
}
--indexStack;
}
}
if(Math.Abs(dblStack[indexStack]-24)<0.1)returntrue;
returnfalse;
}
///<summary>
///后缀表达式到中缀表达式
///</summary>
voidFormate()
{
Cell[]c=newCell[7];
for(inti=0;i<7;++i)c[i]=newCell(m_cell[m_express[i]]);
int[]cStack=newint[4];
intindexStack=-1;
for(inti=0;i<7;++i)
{
if(c[i].Typ==Cell.Type.Number)
{
++indexStack;
cStack[indexStack]=i;
}
else
{
c[i].Right=c[cStack[indexStack]];
--indexStack;
c[i].Left=c[cStack[indexStack]];
cStack[indexStack]=i;
}
}
ToStringFormate(c[cStack[indexStack]]);
}
voidToStringFormate(Cellroot)
{
if(root.Left.Typ==Cell.Type.Number)
{
m_string.Write(root.Left.Number);
m_string.Write(root.Signal);
}
else
{
if(root.Priority>root.Left.Priority)
{
m_string.Write("(");
ToStringFormate(root.Left);
m_string.Write(")");
}
elseToStringFormate(root.Left);
m_string.Write(root.Signal);
}
if(root.Right.Typ==Cell.Type.Number)m_string.Write(root.Right.Number);
else
{
if(root.Priority>=root.Right.Priority)
{
m_string.Write("(");
ToStringFormate(root.Right);
m_string.Write(")");
}
elseToStringFormate(root.Right);
}
}
}
}
希望本文所述对大家的C#程序设计有所帮助。