五子棋设计粗略.docx
- 文档编号:12612102
- 上传时间:2023-04-20
- 格式:DOCX
- 页数:34
- 大小:21.21KB
五子棋设计粗略.docx
《五子棋设计粗略.docx》由会员分享,可在线阅读,更多相关《五子棋设计粗略.docx(34页珍藏版)》请在冰豆网上搜索。
五子棋设计粗略
五子棋游戏设计
本游戏旨在巩固VC++中的图形处理组件WIN32,熟悉在WIN32中图片,做图,消息处理等基本操作,提高C++编程能力,锻炼自己的逻辑编程能力。
由于书上有完整的利用加权思路做出的AI五子棋,特此,在此次游戏编程中,主要探索用for循环来进行游戏中AI的编写,以下,将对游戏的具体实现做以简单说明:
第一节:
游戏实现思路
首先明确五子棋的胜负规则:
即无论哪方(以下简称“人”,“机”)只要“人”或“机”先达到五连珠,则先达到的获胜。
基于这一基本目地,紧接着就得做到,如何才能记录是“人”还是“机”的棋子,为此,我将五子棋的棋盘设为二维字符型数组,初始化数组为’N’,当“人”走过的位置对应数组值赋为‘O’,当“机”走后的数组位置设为‘T’,“人”方以鼠标控制,可以在任意位置触发,但计算机会判断此处数组是否为‘N’,只有在为‘N’的情况下才可以落子成功。
判断胜利时,全局扫描,倘有五连珠,则游戏结束。
以下给出落子代码:
“人”:
boolchessXO(HDCmdc,intXX,intYY)
{
intxpos=0,ypos=0,x=0,y=0;boolYESNO=false;
x=xpos=XX/45;
y=ypos=YY/45;
if(x<680&&y<680&&POSiQ[xpos][ypos]=='N')
{
xpos=xpos*45+3;
ypos=ypos*45+3;
SelectObject(QinPan,CHESS0);
BitBlt(CHESSyDC,xpos,ypos,38,38,QinPan,0,0,SRCCOPY);
BitBlt(mdc,6,6,680,680,CHESSyDC,0,0,SRCCOPY);
POSiQ[x][y]='O';YESNO=true;
}
else
YESNO=false;
returnYESNO;
}
说明:
落子成功返回“真”
调用部分:
caseWM_LBUTTONDOWN:
//鼠标控制方下
if(stop==false&&f==1&&GAMETURN==0)
{
intx,y;charQQ='O';
x=LOWORD(lParam),y=HIWORD(lParam);
if(chessXO(hdc,x,y)==true)
{
GAMETURN=1;
COUNTWIN(QQ);//数组字符比较函数
}
else
GAMETURN=0;//标志该哪方落子的变量,1“机”,0“人”
}//当落子成功,则标志顺序的GAMETURN=1,意味着该计算机下了
“机”:
boolDianNao(HDCmdc,intgameturn)//判断在何处落子的函数
调用部分:
caseWM_LBUTTONUP:
if(stop==false&&f==1&&GAMETURN==1)
{
charQQ='T';
if(DianNao(hdc,GAMETURN)==true)
{
GAMETURN=0;
COUNTWIN(QQ);
}
else
GAMETURN=1;
}
判断胜利:
voidCOUNTWIN(charPT)//PT参数“机”‘T’,“人”‘O’
{
intSHUNXU=1;
intxp,yp;inti,j,Game=0;
for(i=1;i<5;i++)
{
if(!
stop)
{
switch(SHUNXU)
{
case1:
{
for(xp=0;xp<11;xp++)
{
for(yp=0;yp<15;yp++)
{
Game=0;
for(j=0;j<5;j++)
{
if(PanDd(xp+j,yp,PT))
{
Game+=1;
}
else
break;
}
if(Game>=5)
{
stop=true;
break;
}
}
if(Game>=5)
{
break;
}
else
{
stop=false;
continue;
}
}
if(Game<5)
{
stop=false;
SHUNXU=2;
}
else
stop=true;
}
break;
case2:
{
for(yp=0;yp<11;yp++)
{
for(xp=0;xp<15;xp++)
{
Game=0;
for(j=0;j<5;j++)
{
if(PanDd(xp,yp+j,PT))
{
Game+=1;
}
else
break;
}
if(Game>=5)
{
stop=true;
break;
}
else
{
stop=false;
continue;
}
}
if(Game>=5)
{
break;
}
else
{
stop=false;
continue;;
}
}
if(Game<5)
{
stop=false;
SHUNXU=3;
}
else
stop=true;
}
break;
case3:
{
for(xp=0;xp<11;xp++)
{
for(yp=14;yp>=0;yp--)
{
Game=0;
for(j=0;j<5;j++)
{
if(PanDd(xp+j,yp-j,PT))
{
Game+=1;
}
else
break;
}
if(Game>=5)
{
stop=true;
break;
}
else
{
stop=false;
continue;
}
}
if(Game>=5)
{
break;
}
else
{
stop=false;
continue;;
}
}
if(Game<5)
{
stop=false;
SHUNXU=4;
}
else
stop=true;
}
break;
case4:
{
for(xp=14;xp>3;xp--)
{
for(yp=14;yp>3;yp--)
{
Game=0;
for(j=0;j<5;j++)
{
if(PanDd(xp-j,yp-j,PT))
{
Game+=1;
}
else
break;
}
if(Game>=5)
{
stop=true;
break;
}
else
{
stop=false;
continue;
}
}
if(Game>=5)
{
break;
}
else
{
stop=false;
continue;;
}
}
if(Game<5)
{
stop=false;
SHUNXU=6;
}
else
stop=true;
}
break;
default:
stop=false;
;
}
}
else
{
stop=true;
break;
}
}
if(Game>=5)
{
charzhou[30]="";
switch(PT)
{
case'T':
{
strcpy(zhou,"电脑胜了");
TextOut(hdc,690,100,zhou,strlen(zhou));
strcpy(zhou,"按F1键开始");
TextOut(hdc,690,250,zhou,strlen(zhou));
}
break;
case'O':
{
strcpy(zhou,"您胜了");
TextOut(hdc,690,100,zhou,strlen(zhou));
strcpy(zhou,"按F1键开始");
TextOut(hdc,690,250,zhou,strlen(zhou));
}
break;
default:
;
}
}
else
{
Print(PT);
stop=false;
}
}
第二节:
AI的算法基础
为了实现计算机AI,得以人的思维去思考。
在落子前,计算机的的查看以下,棋盘中“机”有没有缺一成五连珠的,如果有,则在对应位置“机”落子,否则,查看“人”方有没有缺一连五,倘使有则在缺一处落“机”子;倘使两方均无缺一连五的情况,扫描全局,看“机”有没有缺一满四的,倘使有,则在缺处落子,否则,查看对方,即“人”有没有缺一满四的棋局,有则在缺处落子,然后扫描全局,看“机”缺一满三,缺一满二,倘使有则在缺处落子,并推出查找循环,否则局中任找一处未落子的落下一子。
以下是Ai的代码:
落子代码:
boolDianNao(HDCmdc,intgameturn)
{
intx=0,y=0;intxpos=0,ypos=0;charWCHESS='T';
intCF=0;
intGame=51;boolyesno=false,YESNO=false;
for(inti=1;i<7;i++)
{
if(!
YESNO)
{
switch(Game)
{
case51:
{
WCHESS='T';
for(x=0;x<15;x++)
{
for(y=0;y<15;y++)
{
if(PanDd(x,y,'N'))
{
if(DianNao2(mdc,x,y,WCHESS,5))
{
YESNO=true;yesno=true;
break;
}
else
{
continue;
}
}
}
if(yesno)
{
break;
}
else
continue;
}
if(!
yesno)
{
Game=52;
}
}
break;
case52:
{WCHESS='O';
for(x=0;x<15;x++)
{
for(y=0;y<15;y++)
{
if(PanDd(x,y,'N'))
{
if(DianNao2(mdc,x,y,WCHESS,5))
{
YESNO=true;yesno=true;
break;
}
else
{
continue;
}
}
}
if(yesno)
{
break;
}
else
continue;
}
if(!
yesno)
{
Game=41;
}
}
break;
case41:
{
WCHESS='O';
for(x=0;x<15;x++)
{
for(y=0;y<15;y++)
{
if(PanDd(x,y,'N'))
{
if(DianNao2(mdc,x,y,WCHESS,4))
{
YESNO=true;yesno=true;
break;
}
else
{
continue;
}
}
}
if(yesno)
{
break;
}
else
continue;
}
if(!
yesno)
{
Game=42;
}
}
case42:
{
WCHESS='T';
for(x=0;x<15;x++)
{
for(y=0;y<15;y++)
{
if(PanDd(x,y,'N'))
{
if(DianNao2(mdc,x,y,WCHESS,4))
{
YESNO=true;yesno=true;
break;
}
else
{
continue;
}
}
}
if(yesno)
{
break;
}
else
continue;
}
}
if(!
yesno)
{
Game=31;
}
break;
case31:
{
WCHESS='T';
for(x=0;x<15;x++)
{
for(y=0;y<15;y++)
{
if(PanDd(x,y,'N'))
{
if(DianNao2(mdc,x,y,WCHESS,3))
{
YESNO=true;yesno=true;
break;
}
else
{
continue;
}
}
}
if(yesno)
{
break;
}
else
continue;
}
if(!
yesno)
{
Game=2;
}
}
break;
case2:
{
if(WCHESS=='T')
{
for(x=0;x<15;x++)
{
for(y=0;y<15;y++)
{
if(PanDd(x,y,'N'))
{
if(DianNao2(mdc,x,y,WCHESS,2))
{
YESNO=true;yesno=true;
break;
}
else
{
continue;
}
}
}
if(yesno)
{
break;
}
else
continue;
}
if(!
yesno)
{
WCHESS='O';
}
}
if(WCHESS=='O')
{
for(x=0;x<15;x++)
{
for(y=0;y<15;y++)
{
if(PanDd(x,y,'N'))
{
if(DianNao2(mdc,x,y,WCHESS,2))
{
YESNO=true;yesno=true;
break;
}
else
{
continue;
}
}
}
if(yesno)
{
break;
}
else
continue;
}
}
}
default:
;
}
}
else
break;
}
returnYESNO;
}
全局扫描函数
boolDianNao2(HDCmdc,intx,inty,charCth,intCishu)
{
intx1,y1;intGame=1,i;boolYesNo=true;boolFAN=false;
intComeTurn=1;intj;boolyesno=true;
for(i=1;i<5;i++)
{
if(FAN==false)
{
if(PanDd(x,y,'N'))
{
switch(ComeTurn)
{
case1:
{
if(x-1>=0)
{
x1=x-1;y1=y;
}
else
{
YesNo=false;
yesno=false;
x1=x+1,y1=y;
}
for(j=0;j { if(PanDd(x1,y1,Cth)) { Game+=1; if(YesNo==true) x1=x1-1; if(YesNo==false) x1=x1+1; } if(! PanDd(x1,y1,Cth)) { if(yesno) { YesNo=false; yesno=false; x1=x+1; } else break; } } if(Game>=Cishu) { x1=x*45+3,y1=y*45+3; SelectObject(QinPan,CHESS1); BitBlt(CHESSyDC,x1,y1,38,38,QinPan,0,0,SRCCOPY); BitBlt(mdc,6,6,680,680,CHESSyDC,0,0,SRCCOPY); GAMETURN=0;POSiQ
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋 设计 粗略