当前位置:文档之家› c课程设计报告五子棋

c课程设计报告五子棋

C++面向对象课程设计报告院(系):专业:学生姓名:__班级:___学号:题目:五子连珠棋_________起迄日期:2010-12-20_________设计地点:指导教师:完成日期: 2010 年 12 月31 日课程设计报告内容一、需求分析1.选做此课题目的五子棋游戏是一历史悠久,对抗性强,技巧性高的棋类游戏。

而且我对五子棋有着独特的爱好,希望自己也可以编写出一款可以实现人机对战的五子棋游戏。

把自己的思想付给电脑,让自己有些成就感,给自己继续努力的动力。

借此次课程设计的机会,把想法变成现实。

而且五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。

它是中西文化的交流点,是古今哲理的结晶。

所以此次c++课程设计选择五子棋这个题目。

2.程序所实现的功能通过给电脑赋予人工智能,利用电脑运算速度快的特点,结合五子棋的游戏规则,给电脑设定固定的扫描方式,设定权值,使电脑能够选择最合适的落子点,然后调用加载已做好的棋盘棋子图像,最终实现简单的人机对弈。

3.该游戏为普通玩家使用,只要连成五子即获胜,没有禁手、RIF(国际连珠连盟)正式规则、“Yamaguchi”、”Tarannikov”、“Taraguchi”等规则。

二、设计内容1.根据所选题目,给出模块图2.画出主程序及其主要模块的流程图3.编写程序代码加载位图(棋盘和棋子):m_board->m_hObject = (HBITMAP)::LoadImage(NULL,"checkerboard.bmp",IMAGE_BITMAP,320,320,LR_LOADFROMFILE);m_white->m_hObject = (HBITMAP)::LoadImage(NULL,"bai.bmp",IMAGE_BITMAP,20,20,LR_LOADFROMFILE);m_black->m_hObject = (HBITMAP)::LoadImage(NULL,"hei.bmp",IMAGE_BITMAP,20,20,LR_LOADFROMFILE);m_temp->m_hObject = (HBITMAP)::LoadImage(NULL,"mask1.bmp",IMAGE_BITMAP,20,20,LR_LOADFROMFILE);m_red->m_hObject=(HBITMAP)::LoadImage(NULL,"dred.bmp",IMAGE_BITMAP,20,20,LR_LOADFROMFILE);响应左键:LButtonDown(UINT nFlags, CPoint point){ int m ,n;CDC thmem1 ;CClientDC dc(this);thmem1.CreateCompatibleDC(&dc);int curx = point.y;int cury = point.x;m =int((curx-5)/20);n = int((cury-15)/20);}没有五子连珠时简单显示棋子:显示白色棋子:if(board[i][j]==0){ thmem2.SelectObject (m_temp);dc.BitBlt(j*20+15,i*20+5,20,20,&thmem2,0,0,MERGEPAINT);thmem2.SelectObject (m_black);dc.BitBlt (j*20+15,i*20+5,20,20,&thmem2,0,0,SRCAND);m_byColour = white ;}显示黑色棋子:if(board[i][j] == 1){ thmem2.SelectObject (m_temp);dc.BitBlt(j*20+15,i*20+5,20,20,&thmem2,0,0,MERGEPAINT);thmem2.SelectObject (m_white);dc.BitBlt (j*20+15,i*20+5,20,20,&thmem2,0,0,SRCAND);m_byColour = black;}五子连珠时红色显示棋子:人赢时:if(ptable[ii][jj][j] == true){ thmem2.SelectObject(m_temp);dc.BitBlt(jj*20+15,ii*20+5,20,20,&thmem2,0,0,MERGEPAINT);thmem2.SelectObject(m_red);dc.BitBlt(jj*20+15,ii*20+5,20,20,&thmem2,0,0,SRCAND); }// MessageBox("你赢了");计算机赢时:if(ctable[ii][jj][j] == true){ thmem2.SelectObject (m_temp);dc.BitBlt(jj*20+15,ii*20+5,20,20,&thmem2,0,0,MERGEPAINT);thmem2.SelectObject (m_red);dc.BitBlt(jj*20+15,ii*20+5,20,20,&thmem2,0,0,SRCAND);}电脑扫描棋盘:for(i = 0 ; i<15; i++)for(j= 0 ;j <15 ;j++)board[i][j] = 2; // 初始化棋盘数组for(i = 0 ; i <15 ; i++) //对列进行隔行扫描,for(j=0 ; j <11 ; j++){for( k = 0 ; k <5 ;k++){ptable[j+k][i][count] = true;ctable[j+k][i][count] = true;} count ++;}for(i = 0 ; i <15 ; i++) //对行进行隔行扫描for(j=0 ; j <11 ; j++){for( k = 0 ; k <5 ;k++){ptable[i][j+k][count] = true;ctable[i][j+k][count] = true;}count ++;}for(i = 0 ; i <11; i++) //对交叉的情况-东南-西北走向-进行扫描for(j=0 ; j <11 ; j++){for( k = 0 ; k <5 ;k++){ptable[j+k][i+k][count] = true;ctable[j+k][i+k][count] = true;}count ++;}for(i = 0 ; i <11 ; i++) //对交叉的情况-东北-西南走向-进行扫描for(j=14 ; j >= 4 ; j--){for( k = 0 ; k <5 ;k++){ptable[j-k][i+k][count] = true;ctable[j-k][i+k][count] = true;}count ++;}Start:void CMyDlg::Onstart(){MessageBox("请落子");m_byColour = black;}Restart:再次初始化棋盘,函数类似于扫描{for(i = 0 ; i<15; i++)for(j= 0 ;j <15 ;j++)board[i][j] = 2;for(i = 0 ; i <15 ; i++)for(j=0 ; j <11 ; j++){for( k = 0 ; k <5 ;k++){ptable[j+k][i][count] = true;ctable[j+k][i][count] = true;}count ++;}for(i = 0 ; i <15 ; i++)for(j=0 ; j <11 ; j++){for( k = 0 ; k <5 ;k++){ptable[i][j+k][count] = true;ctable[i][j+k][count] = true;}count ++;}for(i = 0 ; i <11; i++)for(j=0 ; j <11 ; j++){for( k = 0 ; k <5 ;k++){ptable[j+k][i+k][count] = true;ctable[j+k][i+k][count] = true;}count ++;}for(i = 0 ; i <11 ; i++)for(j=14 ; j >= 4 ; j--){ for( k = 0 ; k <5 ;k++){ ptable[j-k][i+k][count] = true;ctable[j-k][i+k][count] = true; }count ++; }三、调试分析1.实际完成的情况说明能够判断胜负,没下一子,都要进行胜负判断,赋予电脑人工智能,玩家通过点击鼠标左键落子,电脑会根据预设的方式扫描,计算每一点的权值,从而找到最佳落子点,实现人机对弈。

2.程序的性能分析。

四个方向(从左到右,从上到下,从左到右斜向下,从右到左斜向下)依次扫描所有可能的赢法;15*15的棋盘共有572中可能的赢法,所有点对这572种赢法依次扫描,通过赋权值,找出人与电脑权值最大的点。

比较人与电脑的最大权值,以确定最佳落子点。

棋盘如下3.上机过程中出现的问题及其解决方案。

1)游戏界面内光标作用域溢出。

通过修改程序内控制光标作用域的像素值,使光标作用域与棋盘有格线处吻合。

2)加载的棋子图片与棋盘格线不完全吻合。

修改加载棋子图片函数的参数,棋盘边界长的数据要精确。

4.程序中可以改进的地方说明。

电脑寻找最佳落子点的方法有些简单,使得电脑的人工智能不高。

游戏使用一段时间后会发现电脑的漏洞,使得游戏的挑战性降低。

游戏界面比较单一,可以多加一些色彩元素。

5.程序中可以扩充的功能及设计实现构想。

可以再增加保存和读取功能,保存当前游戏的状态,我们为自己的文件定义一个后缀名为: .wzq。

wzq;接着是打开保存文件的公共对话框,如果确定,则表示保存,那么就先获取文件名,然后按照一定的顺序保存各个点的数组的值,最后保存当前是哪种颜色下棋。

相关主题