课程设计五子棋设计_第1页
课程设计五子棋设计_第2页
课程设计五子棋设计_第3页
课程设计五子棋设计_第4页
课程设计五子棋设计_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计说明书题目: 五子棋 姓 名: 院 (系): 专业班级: 学 号: 指导教师: 成 绩: 时间: 年 月 日至 年 月 日课程设计任务书题目 五子棋 专业、班级 学号 姓名 五子棋:又名五子连珠棋,是一项有趣、益智的棋类游戏,易学难精,但妙趣横生。下一局棋所费时间不多,工余饭后“杀上一盘”,开发智力,勤于动脑,调剂感情,有利于开发智商居家必备。 故此利用已学知识在Visual c+6.0上写出五子棋程序。完 成 期 限:2015年12月4日 指导教师签名: 课程负责人签名: 2018年 月 日 目录1. 设计目标与内容.12. 设计要求.2u 2.1新建工程game_wzq.3u 2.

2、2资源编辑.4u 2.3变量函数.5u 2.4具体实现.6u 2.5文件保存和读取.223. 附录.274. 参考文献.29 第一章 设计目标与内容1. 了解Windows编程的基础知识,掌握MFC应用程序的基本知识;2. 基本掌握面向对象程序设计的基本思路和方法;3. 掌握用VC+开发应用程序的的一般步骤和方法;4. 能够利用所学的基本知识, 设计一个简单的五子棋游戏,具有以下功能:数据结构的设计;五子棋棋盘的绘制。两人下棋时,两人下棋算法的设计。两人下棋时,判断任一方获胜的算法的设计。 第二章 设计要求 用VC进行编码,实现应用程序的功能。注重编码质量,代码要有适当的注释;提交设计报告一份

3、(课程设计任务书、目录、主要的数据结构、设计的基本思路、设计的步骤及主要代码、心得体会、参考文献)。总体设计 运行时效果如下: 图1 这个程序只能进行两个人之间的对弈,不能进行人机对弈,由于时间和个人能力的原因所以人机对弈的算法就没有写出。同时程序中也存在着很多漏洞,但基本的功能都已经实现,还有待继续改进。 详细设计第一节 新建工程game_wzq 选择单文档应用程序,在Step 4 of 6中先中Windows Sockets复选框。如下图: 图2 第二节 资源编辑 黑白位图Bitmap以表示棋盘上面的棋子: IDB_BLACK DB_WHITE 黑白鼠标Cursor以替换当前鼠标: IDC

4、_CURSOR1 黑棋子 IDC_CURSOR2 白棋子黑白图标Icon以显示在状态栏供以提示 IDI_BLACK IDI_WHITE菜单以供操作:开始: ID_START 保存: ID_SAVE打开: ID_OPEN如下图所示: 图3第三节 变量函数首先,为了实现状态栏的应用,我们必须更改它的变量: 在MainFrm.h文件里面,把CStatusBar m_wndStatusBar 为public 接着是在game_wzqView.h文件里面添加变量函数: /两个鼠标 HCURSOR hcursorwhite;HCURSOR hcursorblack;/棋盘数组 int wzq1919; /

5、 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, UINT nHitTest, UINT message);/菜单的开始afx_msg void OnStart();/菜单的保存

6、afx_msg void OnSave(); /菜单的打开 afx_msg void OnOpen();第四节 具体实现1、由于我们的游戏的棋盘大小是一定的,不能改变大小的,是应该符合要求的。在如下函数添加设置窗口大小的语句:BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)if( !CFrameWnd:PreCreateWindow(cs) )return FALSE;/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT cs cs.d

7、wExStyle=cs.dwExStyle|WS_EX_TOPMOST; cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX; /设置窗口大小:400*340 cs.cx=450; cs.cy=500; return TRUE;2、初始化变量: 在构造函数里添加初始代码:CGame_wzqView:CGame_wzqView()/Load鼠标图像和棋子位图 hcursorblack=AfxGetApp()->LoadCursor(IDC_CURSOR1); hcursorwhite=AfxGetApp()->LoadCursor(IDC

8、_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)函数中画棋盘,由于在游戏过程中有可能重画棋盘,而那时棋盘上面有棋子,所以,我们在这个函数里面必须有画棋子的语句。我们用数组的做为1表示白棋,-1表示黑棋。void CGame_wzqView:OnDra

9、w(CDC* pDC)CGame_wzqDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/画背景 CBrush mybrush1; 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,RGB(0,0,0); myoldPen=pDC->SelectObj

10、ect(&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); /重画时显示存在的棋子CDC Dc;if(Dc.CreateCompatibleDC(pDC)=FALSE) AfxMessageBox("Can't create DC"); for(int n=0;n<19;n+)for(int m=0;m<19

11、;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、设置鼠标:棋盘画好了,接下来就是下棋了。但鼠标并没有像我们上面说的那样变成白棋,加函数如下:BOOL CGame_wzqView:OnSetCursor(C

12、Wnd* 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()->LoadIcon(IDI_WHITE);pStatus

13、->SetPaneText(0,"白棋下");SetCursor(hcursorwhite);/显示黑棋鼠标elseSetCursor(hcursorblack);CMainFrame*pFrm=(CMainFrame*)AfxGetApp()->m_pMainWnd;CStatusBar*pStatus=&pFrm->m_wndStatusBar; if(pStatus)/显示图像pStatus->GetStatusBarCtrl().SetIcon(0,AfxGetApp()->LoadIcon(IDI_BLACK);/显示文字pS

14、tatus->SetPaneText(0,"黑棋下");return 1;return CView:OnSetCursor(pWnd, nHitTest, message); 5、下棋操作:这就涉及到OnLButtonDown(UINT nFlags, CPoint point)和OnLButtonUp(UINT nFlags, CPoint point)两个函数了。要用哪一个或用两个?用Down函数时是在鼠标按下时放下棋子,可是,要是我们按下后意识到按错了怎么办;那就改用Up函数,表示当鼠标键松开时放下棋子。OK!添加函数如下:void CGame_wzqView:

15、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)int px=(point.x-30)/20;

16、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+32,py*20+32,160,160,&a

17、mp;Dc,0,0,SRCCOPY); wzqpxpy=-1;over(point);colorwhite=true;由上面可以看出,当鼠标键松开时判断,如果那个位置没有棋子,则放下,并把棋盘数组赋相应的值:1或-1 6、是否结束: 接着是用一个over()函数判断是否结束,是则结束并重新开始;否则,接着把鼠标变成对方棋子,表示对方下棋。那over()函数又是怎样的呢? 此函数是利用刚下棋的位置为中心,检查它各个方向上的连续五个棋子是否同色,是则结束并重新开始。然而,我们又是怎样判断一个方向上的五个棋子的同色的?这就涉及地为什么我要把五子棋数组赋值为1和-1的问题。因为这样有一个好处:利用连续

18、五个棋子的值相加,如果它们的值的绝对值等于5,则说明是同色。当然,这只是这样赋值的一点作用,真正的作用将在后面介绍。添加如下:void CGame_wzqView:over(CPoint point)/获取鼠标指向数组位置,即中心位置 int x=(point.x-30)/20; int y=(point.y-30)/20; /计算开始判断的坐标 xx,yy int xx,yy; if(x<4) xx=0; else xx=x-4; if(y<4) yy=0; else yy=y-4; int i,j,a; /横向判断 for(i=xx;i<15;i+) a=0; for(j

19、=i;j<i+5;j+) a=a+wzqjy; /五个都是白棋 if(a=5) AfxMessageBox("白棋胜!"); /重新开始 OnStart();return; /五个都是黑棋 if(a=-5) AfxMessageBox("黑棋胜!"); OnStart();return; /竖向判断 for(i=yy;i<15;i+) a=0; for(j=i;j<i+5;j+) a=a+wzqxj; if(a=5) AfxMessageBox("白棋胜!"); OnStart();return; if(a=-5)

20、AfxMessageBox("黑棋胜!"); OnStart();return; /向右下角 /判断起点位置 if(x<y) if(xx=0) yy=y-x; else if(yy=0) xx=x-y; /参数over=1时退出循环 int over=0; do a=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(&q

21、uot;黑棋胜!"); OnStart(); return; /到了边界 else over=1; xx+=1; yy+=1; while(over=0); /向左下角 if(y>(18-x) if(x>13) yy=y-(18-x); xx=18; else yy=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) Af

22、xMessageBox("白棋胜!"); OnStart(); return; if(a=-5) AfxMessageBox("黑棋胜!"); OnStart(); return; /到了边界 else over=1; xx-=1; yy+=1; while(over=0);第五节 文件保存和读取保存文件函数是一个菜单选项。它的作用就是保存当前游戏的状态。首先,我们应该为我们自己的文件定义一个后缀名:.wzq;接着是打开保存文件的公共对话框,如果确定,则表示保存,那么就先获取文件名,然后按照一定的顺序保存各个点的数组的值,最后保存当前是哪种颜色下棋。vo

23、id CGame_wzqView:OnSave() /设置保存的文件,后缀名wzqCFileDialog dlg(FALSE,"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(f

24、ile.Open(dlg.GetFileName(),CFile:modeCreate|CFile: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("

25、1n");/保存当前下棋颜色if(colorwhite=true)file.WriteString("1n");elsefile.WriteString("0n");/关闭文件file.Close();读文件就是把我们以前保存的文件打开,读取当前打开文件的内容,并给数组赋值使和文件内容相同,然后可以继续进行游戏。void CGame_wzqView:OnOpen() CFileDialog dlg(TRUE,"wzq",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*.WZ

26、Q)|*.wzq|All Files|*.*|",this);if(dlg.DoModal()=IDOK) dlg.GetFileName();elsereturn;CString str;int i,j,m;CStdioFile file;if(file.Open(dlg.GetFileName(),CFile:modeRead)=0)AfxMessageBox("open error!");return; CArchive ar(&file,CArchive:load);for(i=0;i<19;i+)for(j=0;j<19;j+)ar.ReadString(str);sscanf(str,"%d",&m);if(m=-1)wzqij=-1;if(m=0)wzqij=0;if(m=1)wzqij=1;ar.ReadString(str);sscanf(str,"%d",&m);if(m=1)colorwhite=true;elsecolorwhite=false;file.Close();ar.Close(); Invalidate(false);OK,现在我们的程序已经完成了,可以两个人进行对弈了。附录:int over=0; do a=0; for(i=0;i<

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论