C++ 五子棋人机对战游戏设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
pDC->MoveTo(40+i*20,40);
pDC->LineTo(40+i*20,400);
}
//重画时显示存在的棋子
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can't create DC");
for(int n=0;n<19;n++)
如果几个棋子是同色的,无论黑白,它的绝对值必然大,而对于几个棋子中有黑棋和白棋的,其值必然相加而抵消变小。所以我们可以利用这种方法来寻找旁边有多个同色棋子的空位置(前面已经具体说明)。
在每一个棋盘位置,计算以它为起点的四个方向(横、竖、撇、捺),再比较这四个方向中哪个值最大,然后在这个方向上寻找落棋点。
4.
4.1
由于游戏的棋盘大小是一定的,不能改变大小的,是应该符合要求的。用如下函数设置窗口大小:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
for(int m=0;m<19;m++)
if(wzq[n][m]==1)
{
//显示白棋
Dc.SelectObject(m_bmwhite);
pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY);
}
else if(wzq[n][m]==-1)
{
//显示黑棋
//检查四个方向,各算出五个棋子的和并赋值
void CMy3_1View::bestputdown(int i,int j)
{
//四个方向的值
int num[4];
int a,k;
///////////////////////////////num[0] -->
a=0;
if(i<15)
for(k=0;k<5;k++)
{
putdown(wpointcan3);
return;
}
else if(bpointcan2.x!=-1)
{
putdown(bpointcan2);
return;
}
else if(wpointcan2.x!=-1)
{
putdown(wpointcan2);
return;
}
else
{
putdown(bpointcan1);
a=0;
if(i<15&&j<15)
最好落棋点void bestputdown(int i,int j);
计算机下棋void computerdown();
在位置point放下棋子void putdown(CPoint point);
人对机菜单afx_msg void OnCpmputer();
3.2.
新建工程,选择单文档,在Step 4 of 6中先中Windows Sockets复选框
1.3
开始制作游戏时,主要要解决的问题有以下几个方面:
1.如何设置整个游戏的界面;
2判断是否可以放下棋子;
3.如何让电脑选择最佳位置;
4.判断是黑棋胜还是白棋胜。
2.
关于五子棋游戏的功能描述如下:运行游戏并进行初始化工作,将整个游戏区域中纵线和横线相交的点坐标化,并且这些点是将来下棋的位置。玩家可以在任意没有放棋子的点放下棋子,直到一方有五个棋子连成一条线为胜方。
//黑棋下
void CMy3_1View::putdown(CPoint point)
{
CDC *pDC=GetDC();
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can't create DC");
Dc.SelectObject(m_bmblack);
wpointcan3,//这个位置空,它的旁边有三个白棋
bpointcan2,//这个位置空,它的旁边有两个黑棋
wpointcan2,//这个位置空,它的旁边有两个白棋
bpointcan1; //不是以上情况,这个位置空
在得到最大值和方向上寻找落棋点,其中i、j表示搜索起点,n表示方向
void searchcandown1(int i,int j,int n);
bpointcan1=(-1,-1);
//搜索最好的落棋点
for(int i=0;i<19;i++)
for(int j=0;j<19;j++)
bestputdown(i,j);
//判断放在哪里
//棋多的位置优先
//黑白一样多时黑先
//不是-1就表示已经被赋值!
if(bpointcan4.x!=-1)
a=a+wzq[i+k][j];
num[0]=abs(a);
////////////////////////////// num[1] "|"
a=0;
if(j<15)
for(k=0;k<5;k++)
a=a+wzq[i][j+k];
num[1]=abs(a);
/////////////////////////////// num[2] "\"
CPen mypen;
CPen*myoldPen;
mypen.CreatePen(PS_SOLID,1,RGB(0,0,0));
myoldPen=pDC->SelectObject(&mypen);
for(int i=0;i<19;i++)
{
pDC->MoveTo(40,40+i*20);
pDC->LineTo(400,40+i*20);
{
putdown(bpointcan4);
return;
}
else if(wpointcan4.x!=-1)
{
putdown(wpointcan4);
return;
}
else if(bpointcan3.x!=-1)
{
putdown(bpointcan3);
return;
}
else if(wpointcan3.x!=-1)
// the CREATESTRUCT cs
cs.dwExStyle=cs.dwExStyle|WS_EX_TOPMOST; //
cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;//;
//设置窗口大小:400*340
cs.cx=450;
cs.cy=500;
CPoint overpoint;
overpoint.x=point.x*20+30;
overpoint.y=point.y*20+30;
over(overpoint);
colorwhite=true;
}
搜索最佳落棋点:
现在还有void bestputdown(int i,int j)函数没有定义。它的实现原理是:在四个方向上,各自计算那个方向上棋子的状态,利用原来定义的白棋为1,黑棋为-1的思想,让同个方向上的五个棋子的值相加,取绝对值并赋值给为这个方向定义的局部变量num[i]。
游戏的整体运行效果如图1.1。
图1.1
3.
3.1
在view类中添加变量函数如下:
保存vscomputer时白棋位置CPoint vspoint;
CPoint bpointcan4,//这个位置空,它旁边有四个黑棋
wpointcan4,//这个位置空,它旁边有四个白棋
bpointcan3,//这个位置空,它的旁边有三个黑棋
bpointcan1;//不是以上情况,这个位置空
并在搜索之前都赋值为(-1,-1),然后,进行搜索,并把相应的值保存在相应变量里面,而如果前面已经对变量赋值,我们依然赋值,用新值代替旧值。注意:只保存最后一个值,这样的一个好处是,避免了每次都从左上角开始,并且它的随机性比随机函数还随机。
全盘搜索完之后,由于上面的变量中至少有一个已经被赋值,即不是(-1,-1),可以采用多数优先的方法,让已经有多个同色棋子的位置先下棋。
五子棋人机对战游戏
摘要:本文用visual c++来设计与实现简单的五子棋人机对战游戏的基本功能,玩家可以在游戏区域中适当的位置来放棋子,通过程序设计让电脑选择最佳的落棋点,来实现人机对战。
文中对该游戏的算法进行了详细的介绍,其中核心内容包括界面的设计、最佳落棋位置的判断以及游戏胜利判断功能的实现。程序实现起来较简单,同时也比较实用。
其原理是,如果已经有四个黑棋,计算机再下一个黑棋就赢了;否则,如果人已经有四个白棋,那么计算机就必须放下一个黑棋,阻止白棋下一步赢;如果已经有三个黑棋,再下一个黑棋,变成四个;否则,如果已经有三个白棋,下一个黑棋,破坏它;两个棋子的同理;否则,在刚才白棋下的地方,顺便找一个位置,下棋。computerdown()函数如下:
//轮到计算机下棋
void CMy3_1View::computerdown()
{
//把各种情形赋值为如下
bpointcan4=(-1,-1);
wpointcan4=(-1,-1);
bpointcan3=(-1,-1);
wpointcan3=(-1,-1);
bpointcan2=(-1,-1);
wpointcan2=(-1,-1);
ASSERT_VALID(pDoc);
//画背景
CBrush mybrush1;
mybrush1.CreateSolidBrush(RGB(192,192,192));
CRect myrect1(0,0,1200,800);
pDC->FillRect(myrect1,&mybrush1);
//画棋盘框线
Dc.SelectObject(m_bmblack);
pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY);
}
}
棋盘的效果如图
5.
5.1搜索最佳落棋位置
计算机是怎样下棋?这就是定位的问题了。即搜索棋盘,找出一个最佳点,放下黑棋。我们实现的方法是:全盘搜索,并把搜索到的位置,保存在变量。由于有多种情况,我们定义变量如下:
return;
}
}
上面又有两个新函数,分别定义为空函数,如下:
搜索最佳位置void bestputdown(int i,int j);
放下黑棋void putdown(CPoint point);
现在,对上面两个空函数进行定义
在指定位置下棋:
由于putdown(CPoint poBiblioteka Baidunt)函数的原理非常简单,我们先说明如下:
CPoint bpointcan4, //这个位置空,它旁边有四个黑棋
wpointcan4,//这个位置空,它旁边有四个白棋
bpointcan3,//这个位置空,它的旁边有三个黑棋
wpointcan3,//这个位置空,它的旁边有三个白棋
bpointcan2,//这个位置空,它的旁边有两个黑棋
wpointcan2,//这个位置空,它的旁边有两个白棋
return TRUE;
}
画棋盘:
在OnDraw(CDC* pDC)函数中画棋盘,由于在游戏过程中有可能重画棋盘,而那时棋盘上面有棋子,所以,我们在这个函数里面必须有画棋子的语句。在此用数组的做为1表示白棋,-1表示黑棋。
void CMy3_1View::OnDraw(CDC* pDC)
{
CMy3_1Doc* pDoc = GetDocument();
关键词:五子棋,vc,人机对战游戏
1.
1.1
五子棋是一种很受人们喜爱的智力游戏,它的规则简单,但玩法变化多端,富有趣味性,特别锻炼人的智力,适合人们消遣。
1.2
网络小游戏制作的目的是满足了人们休闲的需要,在紧张工作之余休闲类的小游戏能够给人带来最大程度的放松,也可以增进人们之间的交流,沟通,通过游戏还可以认识更多的朋友,也可以到达跨省、跨市,甚至跨国间人们互相娱乐的目的。
void searchcandown2(int i,int j,int n);
void searchcandown3(int i,int j,int n);
void searchcandown4(int i,int j,int n);
计算最大值及方向CPoint maxnum(int a,int b,int c,int d);
pDC->BitBlt(point.x*20+32,point.y*20+32,160,160,&Dc,0,0,SRCCOPY);
wzq[point.x][point.y]=-1;
//由于原来我们检查是否结束时用的是鼠标点下的坐标,而现在
//putdown(CPoint point)函数用的是数组棋盘的坐标,所以必须转换
相关文档
最新文档