资源预览内容
第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
第9页 / 共18页
第10页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
附件1:学 号: 课 程 设 计课程名称可视化编程(VC)学 院计算机科学与技术学院专 业软件工程专业班 级姓 名指导教师20102011学年 第2学期目录1、摘要-22、关键字-23、正文-2 (1)功能描述-2 必备功能-2 绚丽功能-3 (2)操作实现-4(3)详细剖析-6 (4)所遇问题-11 (5)未解决问题-13 (6)设计总结-144、参考资料-14五子棋系统实现【摘要】此五子棋系统用户可以选择棋子颜色和样式,有黑白两种颜色的选取,备有计时功能,如果超时系统则做出让步处理。该系统有人机对战和人人对战的模式,五子相连时能自动判断胜负。此次的五子棋系统界面良好,绚丽,有创新意识。功能完善,功能多样,其中有很多人性化以及趣味设计,如声音的提示等。【关键字】 五子棋 计时 超时 让步处理 人机对战 人人对战 界面 功能 声音 趣味设计【正文】一、 功能描述1、必备功能(1)用户可以选择棋子的颜色(黑、白),可以选择对战的模式(人人对战、人机对战),当为选棋子和模式时,系统默认人机对战,玩家执白棋,选择不同的模式,计时卡上的内容也会相应的显示(2)拥有计时功能(下棋思考时间以及游戏总时间),如果超过规定时间没有落棋,则会有惩罚(超过25秒未落棋,出现提醒对话框后默认判定让步处理)(3)当五子相连时,系统自动判定输赢(4)菜单相应的还有“重来”、“重置”、“退出”等功能2、绚丽功能(1)界面绚丽(2)当按下“开始”时,弹出计时卡供计时,分布棋盘两边(3)当开始时、落棋时、输赢时、超时时系统会发出声音(4)当人机对战时,电脑落棋时,会有闪烁的功能(5)当五子相连时,五子会同时闪烁,提醒棋局已完未开始时界面截图开始时界面截图(很多同学问我为什么要画这样一个图放在界面,我觉得这刚好与黑白棋相呼应,所以就果断的画了,此次看来效果还不错)(桌面背景可以忽视)菜单栏二、操作实现1、未开始点击棋盘会出现提示2、超时处理让步前(白棋超时) 让步后(白棋超时)3、游戏时是无法改变游戏模式和棋子颜色的,如要改变,则需要点击游戏中的“重置”,被选择的模式以及棋子菜单项将会变灰4、若要放弃当前棋局,可单击“重来”,单击“重来”,则按原来的模式以及棋子颜色进行游戏5、若要结束游戏,则从“游戏”选择“退出”即可,或者单击右上角的6、若要查看作者相关信息,单击菜单栏“关于”即可三、详细剖析1、界面如何绘制(1)获取父窗口的宽cxClient,高cyClient以及每一个格子的宽cxBlock,高cyBlock(2)画棋盘:DrawLine()的关键代码第一个for循环为画列,第二个for循环为画航当未开始时,则绘制出界面上的“八卦图”,代码如下2、如何获取坐标并在特定区域画棋子在WM_LBUTTONDOWN消息下,获取纵横坐标,经过转化,化为矩阵matrixxy的下标x,y画棋子函数以及代码如下3、如何进行黑白棋的转化(1)当为人人对战(RRStart=TRUE)模式时,黑白棋的转化,用全局变量count进行控制(2)当为人机对战(RJStart=TRUE)模式时,响应一次WM_LBUTTONDOWN消息,则完成玩家与电脑各一步操作以上代码包括了电脑落棋后的闪烁效果以及声音效果。(3)其中FIRST,SECOND为选择黑白棋进行变化的中间变量,实现方式如下其中EnableMenuItem()函数控制该菜单的可选与不可选(变灰)4、如何控制电脑下棋的函数POINT Opinion(BYTE tapROWCOLS, ChessCount note);void computer(BYTE tapROWCOLS, POINT *computerXY);此次电脑下棋的算法参考了网络资源。5、判断输赢(1)int IsWin(HWND hwnd,BYTE tapROWCOLS, BYTE Color,int cxBlock,int cyBlock)hwnd:窗口句柄,tapROWCOLS:标志棋盘个位置是否被占的矩阵,Color:棋子颜色,cxBlock,cyBlock为一个方格的宽高(2)若五子相连,则调用shine(hwnd,x,y,Color,cxBlock,cyBlock,flag);闪烁函数hwnd:窗口句柄,Color:棋子颜色,cxBlock,cyBlock为一个方格的宽高,flag标志其胜利的方式,有4种情况,五子一列,五子一横,五子左下到右上,五子左上到右下。(3)若棋盘已满则调用BOOL IsFull(BYTE tapROWCOLS)扫描整个棋盘。6、时间如何控制LRESULT CALLBACK ChildWndProc1 (HWND, UINT, WPARAM, LPARAM) ;LRESULT CALLBACK ChildWndProc2 (HWND, UINT, WPARAM, LPARAM) ;调用2个子窗口的处理函数进行时间的控制以及2个窗口相关内容的设置,(1) 时间如何控制当窗口创立是,调用一个一秒触发一次的定时器时间函数的代码如下其中定义2个全局变量ThinkTime1和ThinkTime2控制双方的思考时间(2) 让步处罚如何进行(3)如何进行时间重置开始时,重来时,重置时,输赢时调用函数若思考结束,即已经落棋,则将思考时间置0(ThinkTime1=0或ThinkTime2=0)四、所遇问题1、引入位图出现错误解决:通过改变图片格式,正确引入2、位图与棋盘大小不符合解决:获取位图的宽高从而以此宽高位标准,定义棋盘的大小3、旗子在棋盘的位置出现偏差通过调整,引入一个误差,从而进行改善如BitBlt (hdc, cxBlock * x+2, cyBlock * y+2, (x+1)*cxBlock-2, (y+1)*cyBlock-2, hdc1, 0, 0, SRCCOPY);此函数就引入一个2的误差调整位置。4、如何解决闪烁的问题问题描述:为实现此绚丽的功能,曾经用过空白来覆盖棋子实现,但是会使棋盘背景颜色以及棋盘线条覆盖,不自然美观。解决:利用与棋子交替覆盖的方法来实现棋子的闪烁,可以很好解决这问题5、三窗口如何同时关闭问题描述:建立2个小窗口计时,在关闭主窗口的时候无法关闭2个计时窗口。解决方案:(1)可以用SendMessage(),函数实现,如SendMessage(hwnd, WM_DESTROY, 0, 0);(2)将2个小窗口归为主窗口的子窗口就可以完美的解决这个问题,此方法应用于此程序。6、两个计时卡上的游戏总时间每次+2,而不是+1问题描述:如上所述解决方案:因为2个子窗口的处理函数调用同一个时间函数GTime()导致此函数每相隔一秒响应2次,导致如上的问题。通过在每个WM_TIMER消息下执行Second减一解决问题。7、问题描述:当超时弹出提醒对话框后,时间无法停止,继续计时。解决方案:调用KillTimer()函数移除定时器,在对话框之后重新调用SetTimer()函数,重新设置定时器,如下所示8、细节问题问题描述:当进行游戏时本应该不能选择游戏模式以及棋子颜色等其他菜单的细节操作解决方案:调用函数EnableMenuItem(GetMenu(hwnd), ID_MENUITEM_BLACK, MF_GRAYED);必要时,使特定的菜单变灰无法选择。五、未解决问题1、电脑下棋算法的实现电脑下棋算法自己的源代码参考了网络资源,但是电脑算法还不够完善2、若进行人机对战,第一步玩家超时,让步处理后,无法显示让步后的那一步棋子,但是有声音发出3、当进行人人对战时,当超时的为玩家2时,提示的即将超时的声音有相隔一秒连续出现的问题4、当从人人对战的模式切换到人机对战时,计时卡的显示信息出现重叠的情况,如下图所示六、设计总结此程序用API编写完成,虽然比较麻烦,但是这让我对API有了更深的了解。在进行设计的过程中曾多次想放弃,做更简单的计算器,但是最后自己还是坚持下来了,回想起来还是觉得很庆幸自己做了坚持的选择,虽然从中遇到了很多问题,但是通过上网查资料和与同学讨论,最终还是把大部分问题解决了。此程序唯一令我不满意的地方就是电脑下棋的算法,此算法不是完全由自己写出,参考了网上的许多资料,这是整个程序的一个败笔,在暑假期间,这个将会完全改变。同时有了此次设计的经验,也给自己定了下一个任务,希望自己能设计出“象棋”游戏。继续努力。【参考资料】Visual C+面向对象与可视化程序设计(第二版) 黄维通编著百度百科MSDN本科课程论文评分标准班级学号姓名论文题目评阅点评分标准(细则)分值给分功能及算法(40分)正确实现本程序所需全部功能,算法设计正确合理且有一定创意40分实现所需功能,算法正确30分基本实现所需功能15分有明显重大错误5分无法实现程序功能0分界面和操作性(20分)界面美观、合理,可操作性强20分界面合理,可操作15分界面尚可,基本可操作10分可操
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号