五子棋实验报告(含代码).doc

上传人:wj 文档编号:66664 上传时间:2023-04-28 格式:DOC 页数:11 大小:811KB
下载 相关 举报
五子棋实验报告(含代码).doc_第1页
第1页 / 共11页
五子棋实验报告(含代码).doc_第2页
第2页 / 共11页
五子棋实验报告(含代码).doc_第3页
第3页 / 共11页
五子棋实验报告(含代码).doc_第4页
第4页 / 共11页
五子棋实验报告(含代码).doc_第5页
第5页 / 共11页
五子棋实验报告(含代码).doc_第6页
第6页 / 共11页
五子棋实验报告(含代码).doc_第7页
第7页 / 共11页
五子棋实验报告(含代码).doc_第8页
第8页 / 共11页
五子棋实验报告(含代码).doc_第9页
第9页 / 共11页
五子棋实验报告(含代码).doc_第10页
第10页 / 共11页
五子棋实验报告(含代码).doc_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

五子棋实验报告(含代码).doc

《五子棋实验报告(含代码).doc》由会员分享,可在线阅读,更多相关《五子棋实验报告(含代码).doc(11页珍藏版)》请在冰点文库上搜索。

五子棋实验报告(含代码).doc

实验报告

实验一五子棋游戏

北方工业大学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、界面操作部分代码:

word文档可自由复制编辑

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];

#endre

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2