五子棋实验报告含代码.docx
- 文档编号:26775258
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:35
- 大小:610.92KB
五子棋实验报告含代码.docx
《五子棋实验报告含代码.docx》由会员分享,可在线阅读,更多相关《五子棋实验报告含代码.docx(35页珍藏版)》请在冰豆网上搜索。
五子棋实验报告含代码
实验报告
实验一五子棋游戏
北方工业大学2013级计算机技术米鹏
一、实验原理及方法
五子棋游戏开发借用VisualStudio2012软件开发平台,选用C#语言进行编写。
整体程序主要分为三部分:
界面操作部分、AI逻辑部分和棋子定点分析部分。
1、界面操作部分
界面操作部分代码主要针对图像呈现、对应矩阵存储、下棋过程控制等可见的操作环节进编写。
同时负责整个程序的初始化工作。
图像呈现采用C#中Graphics进行绘制。
棋盘被划分为15行15列,每个划分出的小方格均为30*30的正方形,棋盘可操作的范围规定在(20,20)、(460,460)两点的确定的正方形区域内。
通过鼠标左击来确定下子地点。
程序会根据鼠标鼠标点击的位置进行计算,计算得到时对应矩阵的行列,之后再改变对应矩阵的内容后,在通过行列值乘以小方格边长计算得到在显示区域中的具体位置,再稍加变动后画到显示区域中。
以X点坐标为例,下面是计算X(Column)的流程图:
在对应矩阵存储方面,后面AI逻辑和棋子分析所用到的矩阵都是来源这里。
同时AI逻辑和棋子分析不能去修改对应矩阵内容。
图像呈现点的位置、重绘的根据都是来源这里。
在下棋过程控制方面采用信号亮的机制,当操作者下过后,根据信号AI会立即计算将要下点的位置同时改变信号亮变量。
当AI下过棋子后,由于信号亮的的限制就等待操作者去下棋,同时改变信号亮变量内容。
AI和操作者的所有下子、修改矩阵、显示棋子的过程都是统一的。
在每一盘游戏开始时程序会对一些重要的变量进行初始化这里包括矩阵、信号亮、第一步棋子颜色、呈现图像等内容进行初始化。
同时AI会在棋盘中央下第一子。
2、AI逻辑部分
AI逻辑部分算是整个程序策略的灵魂。
其中的一些关键性判别的前后关系将影响AI的下棋的结果。
同时加大和降低AI的难度也是这里。
下面是我设计的策略过程:
从下棋者的考虑角度进行考虑,尽可能保证每一次下子都是有必要的、都是在情理当中的。
我所设计的策略并不是完整,漏洞在与没有考虑三棋子连续的情况。
3、棋子定点分析部分
棋子定点分析部分是这个程序策略的支撑。
分析的正确与否直接影响AI下子是否真的有意义、是否真的可以达到所需目的。
这里的代码也是最复杂。
这里包括了检测是否输赢的五棋子连续的状态、四子状态(再补一子,五子连续)存在与否、每个棋子的上到下、左到右、左上到右下、右上到左下,四个方向上棋子排列情况和可落子情况,同时分析出落子情况的优先级。
对于优先级较高额在AI逻辑部分会优先选择下子。
下面列举在从左到右这个方向上可下子的区域情况流程图:
二、源程序清单:
1、界面操作部分代码:
publicpartialclassForm1:
Form
{
boolisBlack=true;
boolIsAI=true;
int[,]bg={
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
intchange=0;
publicForm1(){
InitializeComponent();
this.Width=497;
}
privatevoidInitPanel(){
intindex=60;
Graphicsgs=panel1.CreateGraphics();
PenmyPen=newPen(Color.Black,2);
gs.DrawLine(myPen,newPoint(30,30),newPoint(30,450));
gs.DrawLine(myPen,newPoint(30,30),newPoint(450,30));
gs.DrawLine(myPen,newPoint(450,30),newPoint(450,450));
gs.DrawLine(myPen,newPoint(30,450),newPoint(450,450));
myPen.Width=1;
while(index<=420){
gs.DrawLine(myPen,newPoint(30,index),newPoint(450,index));
gs.DrawLine(myPen,newPoint(index,30),newPoint(index,450));
index+=30;
}
SolidBrushbursh=newSolidBrush(Color.Black);
gs.FillEllipse(bursh,240-4,240-4,8,8);
for(inti=0;i<15;i++){
for(intj=0;j<15;j++){
if(bg[i,j]==1){
gs.DrawImage(Resources.Black,newPoint((j+1)*30-10,(i+1)*30-10));
}
elseif(bg[i,j]==-1){
gs.DrawImage(Resources.White,newPoint((j+1)*30-10,(i+1)*30-10));
}
}
}
myPen.Dispose();
bursh.Dispose();
gs.Dispose();
gs=null;
bursh=null;
myPen=null;
}
privatevoidPutOn(introw,intcolume){
Imagem=null;
if(bg[row-1,colume-1]==0){
Graphicsgs=panel1.CreateGraphics();
if(isBlack){
m=Resources.Black;
isBlack=false;
change=1;
}
else{
m=Resources.White;
isBlack=true;
change=-1;
}
gs.DrawImage(m,newPoint(colume*30-10,row*30-10));
bg[row-1,colume-1]=change;
m.Dispose();
gs.Dispose();
m=null;
gs=null;
IsFiveChessmanchess=newsFiveChessman(bg);
if(chess.AllSelect()){
if(IsAI){
MessageBox.Show("AI胜!
");
}
else{
MessageBox.Show("你胜!
");
}
}
elseif(!
IsAI){
IsAI=true;
AImyAI=newAI(bg,1);
stringstr=myAI.AIMain();
myAI.DisArraylist();
PutOn(Convert.ToInt32(str.Split('#')[0])+1,Convert.ToInt32(str.Split('#')[1])+1);
}
}
}
privatevoidForm1_Load(objectsender,EventArgse){
IsAI=true;
isBlack=true;
change=0;
PutOn(8,8);
}
privatevoidpanel1_Paint(objectsender,PaintEventArgse){
InitPanel();
}
privatevoidpanel1_MouseUp(objectsender,MouseEventArgse){
introw=-1;
intcolume=-1;
intp=0;
intq=0;
if(e.X>20&&e.X<460&&e.Y>20&&e.Y<460&&e.Button==MouseButtons.Left){
p=e.X%30;
q=e.X/30;
if(q<1||q>14){
if(q<1){q=1;}
else{q=15;}
}
else{
if(p>=15){q=q+1;}
}
colume=q;
q=e.Y/30;
p=e.Y%30;
if(q<1||q>14){
if(q<1){q=1;}
else{q=15;}
}
else{
if(p>15){q=q+1;}
}
row=q;
IsAI=false;
this.PutOn(row,colume);
}
}
}
2、AI逻辑部分
classAI:
IsFiveChessman{
protectedintAIValue=0;
protectedintfirstX=-1;
protectedintfirstY=-1;
ArrayListlistAI=newArrayList();
ArrayListlistP=newArrayList();
publicAI(int[,]bg,intvalue){
base.BG=bg;
AIValue=value;
}
privatevoidSetFirst(intx,inty,intcurrent){
firstX=x;
firstY=y;
BG[x,y]=current;
}
privatevoidBackFirst()
{
BG[firstX,firstY]=0;
firstX=-1;
firstY=-1;
}
privateArrayListSelectCountOfSame(ArrayListlist){
inti=0;
stringtempStr="";
inttempCount=0;
for(i=0;i tempStr=list[i].ToString(); for(intj=0;j if(tempStr==list[j].ToString()){ tempCount++; } } tempStr+="#"+tempCount.ToString(); list[i]=tempStr; tempCount=0; tempStr=""; } returnlist; } privateArrayListBetweenSame(ArrayListlistA,ArrayListlistB){ ArrayListarry=newArrayList(); for(inti=0;i for(intj=0;j if(listA[i].ToString()==listB[j].ToString()){ if(arry.Contains(listA[i])==false){ arry.Add(listA[i]); break; } } } } returnarry; } privatestringSelects(ArrayListarry,intflag,intcounts){ inttempCount=0; inti=0;intj=0;intk=0; intx=0;inty=0; stringtempStr=""; if(arry.Count>0){ tempStr=""; tempCount=0; for(i=0;i k=0; SetFirst(Convert.ToInt32(arry[i].ToString().Split('#')[1]),Convert.ToInt32(arry[i].ToString().Split('#')[2]),flag*AIValue); tempStr+=this.DirectionA(firstX,firstY,flag*AIValue); tempStr+=this.DirectionB(firstX,firstY,flag*AIValue); tempStr+=this.DirectionC(firstX,firstY,flag*AIValue); tempStr+=this.DirectionD(firstX,firstY,flag*AIValue); for(j=0;j if(tempStr[j].ToString()=="T"||tempStr[j].ToString()=="F"){ k++; } } if(k>tempCount){ x=firstX; y=firstY; tempCount=k; } BackFirst(); } if(tempCount>counts){ returnx.ToString()+"#"+y.ToString(); } else{ Randomrg=newRandom(); i=rg.Next(0,arry.Count-1); returnarry[i].ToString().Split('#')[1]+"#"+arry[i].ToString().Split('#')[2]; } } return""; } publicstringAIMain(){ inti=0;intj=0;intk=0; stringallP=""; stringallAI=""; stringtempStr=""; ArrayListarry=newArrayList(); #regionAI可放棋子位置allAI for(i=0;i<15;i++){ for(j=0;j<15;j++){ if(BG[i,j]==AIValue){ allAI+=this.DirectionA(i,j,AIValue); allAI+=this.DirectionB(i,j,AIValue); allAI+=this.DirectionC(i,j,AIValue); allAI+=this.DirectionD(i,j,AIValue); } } } #endregion #region人可放棋子位置allP for(i=0;i<15;i++){ for(j=0;j<15;j++){ if(BG[i,j]==-AIValue){ allP+=this.DirectionA(i,j,-AIValue); allP+=this.DirectionB(i,j,-AIValue); allP+=this.DirectionC(i,j,-AIValue); allP+=this.DirectionD(i,j,-AIValue); } } } #endregion #regionAI放子后必赢(五连) if(allAI.IndexOf("T")>=0){ intTstartIndexOfAI=allAI.IndexOf("T"); intTendIndexOfAI=allAI.IndexOf("$",TstartIndexOfAI); tempStr=allAI.Substring(TstartIndexOfAI+2,TendIndexOfAI-TstartIndexOfAI-2); returntempStr.Split('#')[0]+"#"+tempStr.Split('#')[1]; } #endregion #region人放子后必赢(五连) if(allP.IndexOf("T")>=0){ intTstartIndexOfP=allP.IndexOf("T"); intTendIndexOfP=allP.IndexOf("$",TstartIndexOfP); tempStr=allP.Substring(TstartIndexOfP+2,TendIndexOfP-TstartIndexOfP-2); returntempStr.Split('#')[0]+"#"+tempStr.Split('#')[1]; } #endregion #region可放棋子结果统计 string[]temp=allAI.Split('$'); for(k=0;k listAI.Add(temp[k]); } temp=allP.Split('$'); for(k=0;k listP.Add(temp[k]); } listAI.RemoveAt(listAI.Count-1); listP.RemoveAt(listP.Count-1); listAI=this.SelectCountOfSame(listAI); listP=this.SelectCountOfSame(listP); #endregion #regionAI放子后四连 arry.Clear(); for(i=0;i if(listAI[i].ToString()[0].ToString()=="F"){ if(arry.Contains(listAI[i])==false){ arry.Add(listAI[i]); } } } tempStr=this.Selects(arry,1,1); if(tempStr! =""){ arry=null; returntempStr; } #endregion #region人放子后四连 arry.Clear(); for(i=0;i if(listP[i].ToString()[0].ToString()=="F"){ if(arry.Contains(listP[i])==false){ arry.Add(listP[i]); } } } tempStr=this.Selects(arry,-1,1); if(tempStr! =""){ arry=null; returntempStr; } #endregion #region两子内可以四连,同时影响对手落子 arry.Clear(); arry=this.BetweenSame(listAI,listP); tempStr=this.Selects(arry,-1,0); if(tempStr! =""){ arry=null; returntempStr; } #endregion #region在AI区域内随意落子 Randomrg3=newRandom(); i=rg3.Next(0,listAI.Count-1); returnlistAI[i].ToString().Split('#')[1]+"#"+listAI[i].ToString().Split('#')[2]; #endregion } publicvoidDisArraylist(){ listAI.Clear(); listAI=null; listP.Clear(); listP=null; } } } 3、棋子定点分析部分 classIsFiveChessman{ protectedint[,]BG=newint[15,15]; publicIsFiveChessman(){} publicIsFiveChessman(int[,]bg){ BG=bg; } publicboolIsExistFull(intx,inty,intcount){ intxIndex=x; intyIndex=y; int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋 实验 报告 代码