ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:1.43MB ,
资源ID:4364047      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4364047.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C语言游戏2五子棋人机对战.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C语言游戏2五子棋人机对战.docx

1、C语言游戏2五子棋人机对战五子棋人机对战,AI很低,做参考用,仅仅为大家提供一下思路。如果有什么好的建议或发现什么问题,希望能告诉我,我的邮箱是caoweizhou开发环境:Visual C+ 6.0游戏界面:C语言游戏2-五子棋(人机对战)一、开始工作 2二、画图 5三、下棋 8四、判断胜负 10五、人工智能 13六、附加功能 17一、开始工作新建工程,选MFC AppWizard(exe),添上工程名,确定。选基于对话框,完成,确定。插入位图网上的源码一般都是将棋盘和棋子用画图程序画出来,但我不会弄。我的方法是直接贴图。先插入位图(BMP格式),以下是我用的位图,当然你也可以用自己的位图:

2、插入位图流程:有时会弹出下面这个窗口,这是完全没有问题的:位图插入后会自动赋予ID值,我们可以修改一下:二、画图/Draw 函数/添加成员函数Draw:Draw(int x, int y, UINT bitmap, CDC *pDC)解释一下:x,y是画图的坐标bitmap是图片ID,比如我的黑棋图片ID就是IDB_BLACKpDC是显示图片窗口的句柄我的画图函数是下面这样的,其中要注意两个函数BitBlt和TransparentBlt,程序后有解释:void CMyDlg:Draw(int x, int y, UINT bitmap, CDC *pDC) /装载图片 CBitmap m_bm

3、p; m_bmp.LoadBitmap(bitmap); /创建画布,比如要在窗口显示,则pDC为窗口句柄 CDC dc; dc.CreateCompatibleDC(pDC); /将位图选到dc中,顺便保存画刷到pOldbmp /保存画刷、恢复画刷为规范操作,但可以不用 CBitmap *pOldbmp=dc.SelectObject(&m_bmp); /创建bm,用来获取图片信息,这里是为了获取图片尺寸 BITMAP bm; m_bmp.GetObject(sizeof(BITMAP),&bm); /画图 if(IDB_BOARD=bitmap)/画棋盘 pDC-BitBlt(x,y,bm

4、.bmWidth,bm.bmHeight,&dc,0,0,SRCCOPY); else /每个图片里有4X4个棋子,我只要画出一个就行了 int w=bm.bmWidth/4; int h=bm.bmHeight/4; TransparentBlt(pDC-m_hDC,x,y,w,h,dc.m_hDC,0,0,w,h,RGB(255,255,255); dc.SelectObject(pOldbmp);/恢复画刷pDC-BitBlt(x,y,bm.bmWidth,bm.bmHeight,&dc,0,0,SRCCOPY);功能是贴图:将dc中的位图,截取大小bm.bmWidth,bm.bmHei

5、ght,粘贴到pDC所指的设备,贴图坐标x,y。最后一个参数为粘贴方式,我们是直接粘贴,所以是SRCCOPYTransparentBlt(pDC-m_hDC,x,y,w,h,dc.m_hDC,0,0,w,h,RGB(255,255,255);功能也是贴图,但图片背景透明:将dc中的位图(dc.m_hDC是dc的句柄),截取大小w,h,粘贴到pDC所指的设备,贴图坐标x,y,贴图大小为w,h,如果图片大小不符则拉伸或压缩图片。最后一项是背景色,可以将图片背景透明化。使用TransparentBlt必须包含头文件和类库,否则编译错误:#include #pragma comment (lib,ms

6、img32.lib)函数弄好后就调用这个函数画图了。先在OnInitDialog函数中加入以下代码,调整对话框大小,并隐藏按钮: / TODO: Add extra initialization here MoveWindow(0,0,520,540);/窗口定位 CenterWindow(); /居中窗口 GetDlgItem(IDOK)-ShowWindow(SW_HIDE); GetDlgItem(IDCANCEL)-ShowWindow(SW_HIDE);或者直接在资源窗口中调整对话框:然后在OnPaint函数中加入以下代码画图: CDC *pDC=GetDC();/获取当前窗口句柄

7、Draw(13,13,IDB_BOARD,pDC);/画棋盘 /Draw(0,0,IDB_BLACK,pDC);/画黑棋,只是为了查看显示效果调整一下界面,希望你没有强迫症,可不要在调整上花太多时间了。下面是我做出的效果:三、下棋现在要将棋子准确下到各个点上,我用的棋盘,间距为34,点击鼠标时获取点击坐标x,y,然后x/34,y/34,确定棋子下到了哪个点上。/OnLButtonUp 函数/添加消息处理函数:我用的消息是WM_LBUTTONUP,也就是当鼠标左键抬起来的时候,函数响应:以下是函数代码:void CMyDlg:OnLButtonUp(UINT nFlags, CPoint poi

8、nt) / TODO: Add your message handler code here and/or call default if(point.x0&point.x0&point.y480) int j=point.x/34; int i=point.y/34; int x=j*34; int y=i*34; CDC *pDC=GetDC();/获取当前设备句柄 Draw(x,y,IDB_BLACK,pDC); CDialog:OnLButtonUp(nFlags, point);函数中,point.x,point.y为点击鼠标时的坐标现在可以将棋子准确地下到点上了,可是就算点上有已经

9、有棋子了,点鼠标后也会下棋。所以我们用一个二维数组存储棋盘上的棋子。添加成员变量:初始化成员变量,在OnPaint函数里加入下面代码。画完棋盘的同时,初始化棋盘。for(int i=0;i15;i+) for(int j=0;j0&point.x0&point.y0 & tempi0 & tempj0 & tempi0 & tempj=5)return 5; else if(alive1 & alive2)return count; else if(alive1 | alive2) & count!=1)return count+4; return 0;函数的参数i,j是下棋的位置,m,n表示

10、扫描的方向。比如从左下角往右上角扫描,坐标上是x+1,y-1,对应的n=1,m=-1(x对应的是j,n,y对应的x,m)。m,n与方向的对应关系:/m,n/1,0 从上到下/0,1 从左到右/1,1 左上到右下/1,-1 右上到左下还有count的值,活2、3、4还有5都直接返回值,死的返回count+4 /返回8 死4:deadfour /返回7 死3:deadthree /返回6 死2:deadtwo /返回5 成5:five /返回4 活4:alivefour /返回3 活3:alivethree /返回2 活2:alivetwo /返回0,完成搜索函数search后,在iswin函数中

11、调用,如果search返回的是5,赢了:BOOL CMyDlg:iswin(int i, int j) if(search(i,j,0,1)=5 | search(i,j,1,0)=5 | search(i,j,1,1)=5 | search(i,j,1,-1)=5) return TRUE; return FALSE;判断胜负功能完成五、人工智能/ AIplay函数/添加成员函数AIplay,电脑下棋函数每次人下完后,电脑就下。所以把AIplay放进OnLButtonUp函数的if(0=chessij)下面:if(0=chessij) Draw(x,y,IDB_BLACK,pDC); che

12、ssij=1; AIplay(); 此时的AIplay函数还是个空函数。电脑下棋应该找到最有利的位置,不仅要找电脑有利的位置,还要找人有利的位置,然后比较谁更有利。如果电脑有利,电脑进攻;如果人有利,电脑防守。为了寻找这个有利位置,添加成员函数searchvalue。searchvalue(int &best_i, int &best_j, int color)best_i,best_j是最有利的位置,注意这里用的是&best_i,&best_j,即“引用参数”,引用参数可以在函数中改变参数数据,普通参数不行。color是棋子的颜色,1为黑,-1为白。在AIplay函数中调用searchval

13、ue函数:void CMyDlg:AIplay() /白棋和黑棋的分数 int white_value,black_value; /白棋和黑棋的有利位置 int wi,wj,bi,bj; /得到分数和有利位置 white_value=searchvalue(wi,wj,-1); black_value=searchvalue(bi,bj,1); /准备画棋 CDC *pDC=GetDC(); int x,y; /如果黑棋更有利,电脑防守 if(white_valueblack_value) x=bj*34;y=bi*34; Draw(x,y,IDB_WHITE,pDC); chessbibj=

14、-1; if(iswin(bi,bj) MessageBox(电脑胜利,结束战斗!,提示,MB_OK); Invalidate(FALSE); /如果白棋更有利,电脑进攻 else x=wj*34;y=wi*34; Draw(x,y,IDB_WHITE,pDC); chesswiwj=-1; if(iswin(wi,wj) MessageBox(电脑胜利,结束战斗!,提示,MB_OK); Invalidate(FALSE); 为了测试,我们先为这个researchvalue函数设置一些值: int CMyDlg:searchvalue(int &best_i, int &best_j, int

15、 color) /白棋,有利位置设为(1,1),返回值设为0。 if(-1=color) best_i=1;best_j=1; return 0; /黑棋,有利位置设为(2,2),返回值设为0. if(1=color) best_i=2;best_j=2; return 1; 因为黑棋的分数高,所以白棋防守,应该下到(2,2)位置。/ getscore函数/为了得到黑棋和白棋的分数,添加成员函数getscore:这个函数的代码非常多,我分开讲。首先是声明变量,这个是根据实际情况变的:/状态 /返回8 死4:deadfour /返回7 死3:deadthree /返回6 死2:deadtwo /

16、返回5 成5:five /返回4 活4:alivefour /返回3 活3:alivethree /返回2 活2:alivetwo /返回0, int deadfour=0,deadthree=0,deadtwo=0; int five=0,alivefour=0,alivethree=0,alivetwo=0; int status4,score;然后,在这个位置下个棋,用search函数判断这个棋子各个方向的状态。判断结束后记得把chessij变回0。chessij=color; /从左到右 status0=search(i,j,0,1); /从上到下 status1=search(i,j

17、,1,0); /从左上到右下 status2=search(i,j,1,1); /从左下到右上 status3=search(i,j,1,-1); chessij=0统计各种情况的数目(活2、3、4,死2、3、4,成5) for(int n=0;n=2)score=10000; /死4活3 else if(deadfour & alivethree) score=10000; /双活3 else if(alivethree=2)score=5000; /活3双活2 else if(alivethree & alivetwo=2) score=5000; /活3死3 else if(alivet

18、hree & deadthree) score=1000; /单死4 else if(1=deadfour)score=500; /单活3 else if(1=alivethree)score=200; /双活2 else if(alivetwo=2)score=100; /双死3 else if(deadthree=2)score=50; /单活2 else if(1=alivetwo)score=10; /单死3 else if(1=deadthree)score=5; return score;getscore函数完成/ searchvalue函数/然后修改searchvalue函数:i

19、nt CMy1Dlg:searchvalue(int &best_i, int &best_j, int color) int maxvalue=0,value; for(int i=1;i14;i+) for(int j=1;j14;j+) if(color=chessij) for(int m=i-1;m=i+1;m+) for(int n=j-1;n=j+1;n+) if(0=chessmn) value=getscore(m,n,color); if(maxvalueMoveWindow(10,500,50,20); GetDlgItem(IDC_OPEN)-MoveWindow(70,500,50,20);查看-建立类向导给两个按钮添加关联函数/ OnSave函数/存档函数:void CMyDlg:OnSave() / TODO: Add your control notification handler code here /设置保存的文件,后缀名为.wzq CFileDialog dlg(FALSE,wzq, NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, (*.WZQ)|*.wzq|All Files|*.*|,this); /如果

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1