下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、设计一个简单的五子棋游戏一、设计目标与内容1 . 了解Windows编程的基础知识,掌握 MF*用程序的基本知 识;2 .基本掌握面向对象程序设计的基本思路和方法;3 .掌握用VC+钎发应用程序的的一般步骤和方法;4 .能够利用所学的基本知识,设计一个简单的五子棋游戏,具 有以下功能:数据结构的设计;五子棋棋盘的绘制。两 人下棋时,两人下棋算法的设计。两人下棋时 ,判断任一方 获胜的算法的设计。二、设计要求1.用VC+进行编码,实现应用程序的功能。注重编码质量,代码要有适当的注释;提交设计报告一份(课程设计任务书、目录、主要的数据结构、 设计的基本思路、设计的步骤及主要代码、心得体会、参考文献
2、)总体设计运行时效果如下:% _ Ame_v/zq口 |回 班图3-1这个程序只能进行两个人之间的对弈, 不能进行人机对弈,由 于时间和个人能力的原因所以人机对弈的算法就没有写出。 同时 程序中也存在着很多漏洞, 但基本的功能都已经实现, 还有待继 续改进。详细设计新建工程game_wzq选择单文档应用程序,在Step 4 of 6中先中 WindowsSockets复选框。如下图:即F匚,五号程序向导-步技J共8声我是否希望包含以下特点;斤爵薇工具隹F初始化状态栏打印和杆印谓览r上下文相关尊胁F 3D外观r MAPI Messaging API (I)V Windows Sockets (W
3、)矮的工具税的样式;商普通广类似IE念的最近文件列表数目;上一步下一步完成取消m高级因图3-2资源编辑黑白位图Bitmap以表示棋盘上面的棋子:IDB_BLACKDB_WHITE黑白鼠标Cursor以替换当前鼠标:IDC_CURSOR1 黑棋子IDC_CURSOR2 白棋子黑白图标Icon以显示在状态栏供以提示IDI_BLACKIDI_WHITE菜单以供操作:开始:ID_START保存:ID_SAVE打开:ID_OPEN如下图所示:3-game_wzq resources+ _J Accelerslor-TBitmapKIDBBLACK蛹 IDB .WHITE- J CursorSi IDC
4、CURS0R1法 IDCJCURSOR?- jDlalaym IDD_ABOUTBOX- -_3 lean口 IDI BLACK IDlWHITr IDR GAME WTYPEj idrImainframe- 口 Menu+ 口 String lable+ _| Todlbar* £j Version图3-3: 口骷跖 圜 Rgjunj 宜 FieM$| "NZ变量函数首先,为了实现状态栏的应用,我们必须更改它的变量:在 MainFrm.h 文件里面,把 CStatusBar m_wndStatusBar 为public接着是在game_wzqView.h文件里面添加变量函
5、数:/两个鼠标HCURSOR hcursorwhite;HCURSOR hcursorblack;/棋盘数组int wzq1919;/ colorwhite TRUE 时白棋下,否则黑棋下bool colorwhite;/棋子位图CBitmap m_bmblack;CBitmap m_bmwhite;/保存文件void Save();/检查是否结束void over(CPoint point);/鼠标操作afx_msg void OnLButtonUp(UINT nFlags, CPoint point);/鼠标图形更换afx_msg BOOL OnSetCursor(CWnd* pWnd,
6、UINT nHitTest, UINT message);/菜单的开始afx_msg void OnStart();/菜单的保存afx_msg void OnSave();/菜单的打开afx_msg void OnOpen();具体实现1、由于我们的游戏的棋盘大小是一定的,不能改变大小的,是应该符合要求的。在如下函数添加设置窗口大小的语句:BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)if( !CFrameWnd:PreCreateWindow(cs)return FALSE;/ TODO: Modify the Window cla
7、ss or styles here by modifying/ the CREATESTRUCT cscs.dwExStyle=cs.dwExStyle|WS_EX_TOPMOST;cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;/设置窗口大小:400*340cs.cx=450;cs.cy=500;return TRUE;2、初始化变量:在构造函数里添加初始代码:CGame_wzqView:CGame_wzqView()/Load鼠标图像和棋子位图hcursorblack=AfxGetApp()->LoadCursor(IDC_CURSO
8、R1);hcursorwhite=AfxGetApp()->LoadCursor(IDC_CURSOR2);m_bmwhite.LoadBitmap(IDB_WHITE);m_bmblack.LoadBitmap(IDB_BLACK);/清理棋盘/数组值为0表示没有棋子for(int i=0;i<19;i+)for(int j=0;j<19;j+)wzqij=0;/ 白棋先下colorwhite=true;教育资料3、画棋盘:在OnDraw(CDC* pDC眄数中画棋盘,由于在游戏过程中有可能 重画棋盘,而那时棋盘上面有棋子,所以,我们在这个函数里面 必须有画棋子的语句。我们
9、用数组的做为1表示白棋,-1表示黑棋。void CGame_wzqView:OnDraw(CDC* pDC)CGame_wzqDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/画背景CBrush mybrushl;mybrush1.CreateSolidBrush(RGB(192,192,192);CRect myrect1(0,0,1200,800);pDC->FillRect(myrect1,&mybrush1);/ 画棋盘框线CPen mypen;CPen*myoldPen;mypen.CreatePen(PS_SOLID,1,RG
10、B(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);pDC->MoveTo(40+i*20,40);pDC->LineTo(40+i*20,400);/重回时显7K存在的棋子CDC Dc;if(Dc.CreateCompatibleDC(pDC)=FALSE)AfxMessageBox("Can't create DC");for(int n=0;n&
11、lt;19;n+)for(int m=0;m<19;m+)if(wzqnm=1)/显示白棋Dc.SelectObject(m_bmwhite);pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY) ;else if(wzqnm=-1)/显示黑棋Dc.SelectObject(m_bmblack);pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY);4、设置鼠标:棋盘画好了,接下来就是下棋了。但鼠标弁没有像我们上面说的那样变成白棋,加函数如下:BOOlCGa
12、me_wzqView:OnSetCursor(CWnd*pWnd, UINT nHitTest,UINT message)if(nHitTest=HTCLIENT)/白棋下,显示白棋鼠标if(colorwhite)/调用主框架里面的状态栏CMainFrame*pFrm=(CMainFrame*)AfxGetApp()->m_pMainWnd;CStatusBar*pStatus=&pFrm->m_wndStatusBar;if(pStatus) pStatus->GetStatusBarCtrl().SetIcon(0,AfxGetApp()->L oadIco
13、n(IDI_WHITE);pStatus->SetPaneText(0,"白棋下");SetCursor(hcursorwhite);/显示黑棋鼠标elseSetCursor(hcursorblack);CMainFrame*pFrm=(CMainFrame*)AfxGetApp()->m_pMainWnd ;CStatusBar*pStatus=&pFrm->m_wndStatusBar;if(pStatus)/显示图像pStatus->GetStatusBarCtrl().SetIcon(0,AfxGetApp()->L oadIc
14、on(IDI_BLACK);/显示文字pStatus->SetPaneText(0,"黑棋下");return 1;return CView:OnSetCursor(pWnd, nHitTest, message); 5 、下棋操作:这就涉及到 OnLButtonDown(UINT nFlags, CPoint point)和 OnLButtonUp(UINT nFlags, CPoint point)两个函数了。要用哪一个或用两个?用 Down函数时是在鼠标按下时放下棋子,可是,要是我们按下后意识到按错了怎么办;那就改用 Up函数,表示 当鼠标键松开时放下棋子。OK
15、添加函数如下:void CGame_wzqView:OnLButtonUp(UINT nFlags, CPoint point)CView:OnLButtonUp(nFlags, point);CDC *pDC=GetDC();CDC Dc;if(Dc.CreateCompatibleDC(pDC)=FALSE) AfxMessageBox("Can't create DC");/是否在棋盘内if(point.x>30&&point.x<410&&point.y>30&&point.y<410)
16、int px=(point.x-30)/20;int py=(point.y-30)/20;/是否已经有棋子if(colorwhite&&wzqpxpy=0)Dc.SelectObject(m_bmwhite);pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);/表示存在白棋wzqpxpy=1;/检查是否结束over(point);/换黑棋下colorwhite=false;else if(wzqpxpy=0)Dc.SelectObject(m_bmblack);pDC->BitBlt(px*20+
17、32,py*20+32,160,160,&Dc,0,0,SRCCOPY);wzqpxpy=-1;over(point);colorwhite=true;由上面可以看出,当鼠标键松开时判断,如果那个位置没有棋子,则放下,弁把棋盘数组赋相应的值:1或-16、是否结束:接着是用一个over ()函数判断是否结束,是则结束弁重新开始;否则,接着把鼠标变成对方棋子,表示对方下棋。那over ()函数又是怎样的呢?此函数是利用刚下棋的位置为中心,检查它各个方向上的连续五个棋子是否同色,是则结束弁重新开始。然而,我们又是怎样判断一个方向上的五个棋子的同色的?这就涉及地为什么我要把五子棋数组赋值为1和
18、-1的问题。因为这样有一个好处:利用连续五个棋子的值相加,如果它们的值的绝对值等于5,则说明是同色。当然,这只是这样赋值的一点作用,真正的作用将在后面介绍。添加如下:void CGame_wzqView:over(CPoint point)/获取鼠标指向数组位置,即中心位置int x=(point.x-30)/20;int y=(point.y-30)/20;/ 计算开始判断的坐标xx,yyint xx,yy;if(x<4)xx=0;elsexx=x-4;if(y<4)AfxMessageBox("黑棋胜!");elseyy=y-4;int i,j,a;/ 横向
19、判断for(i=xx;i<15;i+)a=0;for(j=i;j<i+5;j+)a=a+wzq皿y;/五个都是白棋if(a=5)AfxMessageBox("白棋胜!");/重新开始OnStart();return;/五个都是黑棋if(a=-5)OnStart();return;/ 竖向判断for(i=yy;i<15;i+)a=0;for(j=i;j<i+5;j+)a=a+wzqxjif(a=5)AfxMessageBox("白棋胜!");OnStart();return;if(a=-5)教育资料AfxMessageBox(&qu
20、ot;OnStart();return;/向右下角/判断起点位置if(x<y)if(xx=0)yy=y-x;elseif(yy=0)xx=x-y;/ 参数over=1时退出循环int over=0;黑棋胜!”);doa=0;for(i=0;i<5;i+)if(xx+i)<19|(yy+i)<19)a=a+wzqxx+iyy+i;if(a=5)AfxMessageBox("白棋胜!");OnStart();return;if(a=-5)AfxMessageBox("黑棋胜!");OnStart();return;/到了边界else教
21、育资料over=1;xx+=1;yy+=i;while(over=0);/向左下角if(y>(18-x)if(x>13)yy=y-(18-x);xx=18;elseyy=y-4;xx=x+4;else教育资料if(y<5)(xx=x+y;yy=0;)else(yy=y-4;xx=x+4;)over=0;do(a=0;for(i=0;i<5;i+)(if(xx-i)>=0|(yy+i)<19)(a=a+wzqxx-iyy+i;if(a=5)(教育资料AfxMessageBox("白棋胜!");OnStart();return;if(a=-5
22、)AfxMessageBox("黑棋胜!");OnStart();return;/到了边界elseover=1;xx-=1;yy+=i;while(over=0);教育资料文件保存和读取1、保存文件函数是一个菜单选项。它的作用就是保存当前游戏的状态。首先,我们应该为我们自己的文件定义一个后缀名:.wzq;接着是打开保存文件的公共对话框,如果确定,则表示保存,那么就先获取文件名,然后按照一定的顺序保存各个点的数组的值,最后保存当前是哪种颜色下棋。void CGame_wzqView:OnSave()/设置保存的文件,后缀名 wzqCFileDialogdlg(FALSE,&q
23、uot;wzq",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*WZQ)|*.wzq|All Files|*|",this);/如果公共类对话框为确定if(dlg.DoModal()=IDOK)/获取文件名dlg.GetFileName();/否则,退出elsereturn;/字符串变量CString str;int i,j;CStdioFile file;/如果有问题,退出if(file.Open(dlg.GetFileName(),CFile:modeCreate|CFi le:modeWrite|CFile:typeText)=0)AfxMessageBox("save error!"); return;/循环把棋盘数组的值写进文件for(i=0;i<19;i+) for(j=0;j<19;j+)if(wzqij=-1)file.WriteString("-1n");if(wzqij=0)file.WriteString("0n");if(wzqij=1)file.WriteString("1n");/保存当前下棋颜色if(colorwhite=true)file.WriteString("
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人车位租赁协议书2024年
- 2024年合同履约保证书
- 服装加工业务合同
- 合租住宅协议合同样本
- 统编版四年级下册语文第五单元 习作游-公开课一等奖创新教学设计
- 2024年摩托车买卖协议范例
- 商业贷款抵押借款合同样本
- 临时挡土墙施工合同样本
- 室内装修项目管理合同
- 标准版夫妻分手协议样本
- 中国省市区统计表
- 义务教育数学课程标准2022年版
- 小学生国旗下演讲《让梦想扬帆起航》(20篇)
- M7.5砂浆配合比设计计算书
- 砂浆回弹计算表(正算)
- 花馍背后的文化隐喻
- 《新时代劳动教育》新时代劳动价值观
- 数控机床控制系统装调学习通超星课后章节答案期末考试题库2023年
- 联营项目管理办法(法务-合同-人力-策划-资金-结算)
- 学生公寓建设项目设计任务书
- 建筑工程资料员聘用合同范本(5篇)
评论
0/150
提交评论