下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 五子五子棋五子棋

五子五子棋五子棋.doc

五子五子棋五子棋

刘潇潇虾
2017-11-11 0人阅读 举报 0 0 暂无简介

简介:本文档为《五子五子棋五子棋doc》,可适用于综合领域

五子五子棋五子棋届毕业设计说明书五子棋论文院(系)、部:学生姓名:指导教师:职称专业:班级:完成时间:摘要五子棋游戏以其优秀的人工智能深受广大玩家的喜爱而对于初步探究网络编成的编程爱好者来说编制五子棋程序因其规则简单而大受欢迎然而它却要求程序员对五子棋规则有相当深入的了解。程序员考虑得越周到其五子棋程序就越智能。五子棋游戏软件设计的主要内容是:根据五子棋的基本规则要让对方客户端知道该在哪一点下子就要根据盘面的形势并把棋盘棋子的重新绘制绘制也就是更新该点的位置然后再通过监听网络传递的消息,直到新的位置放在棋盘的什么位置上,在进行修改,并通过计算,得出玩家是否获得胜利因此玩家就能反复的进行联机游戏。本文论述了采用联机对战的方式体现出五子棋程序的分析与设计并采用面向对象的开发工具VC来具体实现。关键词:五子棋VC面向对象AbstractWuziqigamewithexcellentartificialintelligencebythevastnumberofplayerswho,fortheinitialresearchnetworkorganizationprogrammingenthusiasts,Wuziqiproceduresforthepreparationoftherulessimpleandpopular,butitrequiresprogrammertoWuziqigamehasadeepunderstandingoftherulesOtherthoughtfulconsiderationtheytreattheirWuziqigameproceduresmorewisdomWuziqigamesoftwaredesignisthemaincontent:AccordingWuziqibasicrulestoknoweachother'scustomersinviolationoftheWest,wemustunderPermiansituation,andtheboardpawnremappingmapping,thatisupdatingthepointposition,andthenthroughthemonitoringnetworknewsuntilthenewlocationontheboardwhatposition,FollowingchFIR”(FiveinaRow的缩写)亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。五子棋不仅能增强思维能力提高智力而且富含哲理有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”又有古典哲学的高深学问“阴阳易理”它既有简单易学的特性为人民群众所喜闻乐见又有深奥的技巧和高水平的国际性比赛它的棋文化源渊流长具有东方的神秘和西方的直观既有“场”的概念亦有“点”的连接。它是中西文化的交流点是古今哲理的结晶。五子棋起源于古代中国发展于日本风靡于欧洲。对于它与围棋的关系有两种说法一说早于围棋早在“尧造围棋”之前民间就已有五子棋游戏一说源于围棋是围棋发展的一个分支。在中国的文化里倍受人们的青睐。古代的五子棋的棋具与围棋相同纵横各十七道。五子棋大约随围棋一起在我国南北朝时先后传入朝鲜、日本等地。据日本史料文献介绍中国古代的五子棋是经由高丽(朝鲜)于年至年的日本元禄时代传到日本的。到日本明治年(公元年)经过公开征名“连珠”这一名称才被正式确定下来取意于“日月如合壁五星如连珠”。从此连珠活动经过了不断的改良主要是规则的变化(即对执黑棋一方的限制)例如年规定禁止黑白双方走“双三”年规定只禁止黑方走“双三”年规定黑方被迫走“双三”亦算输年规定黑方不许走“长连”年规定黑方不许走“四、三、三”年规定黑方不许走“双四”并规定将×的围棋盘改为×的连珠专用棋盘。本世纪初五子棋传入欧洲并迅速风靡全欧。通过一系列的变化使五子棋这一简单的游戏复杂化、规范化而最终成为今天的职业连珠五子棋同时也成为一种国际比赛棋。五子棋游戏的规则(一)棋盘棋子,(棋盘为十五路正中一点为“天元”周围四点为小星。,(棋子分黑白两色黑子,,,枚白子,,,枚共,,,枚。(二)比赛规则,(黑先白后从天元开始落子。然后执白棋的一方在黑棋周围的交叉点上落子白第二着棋应布在自己河界的一侧。此后执黑方在以天元为中心的,,个交叉点的范围内布盘面的第三着棋。,(最先在横向竖向斜向形成连续的相同色五个棋子的一方为胜。,(黑棋禁手判负白棋无禁手。黑棋禁手包括“三三”“四四”,“长连”。黑方只能“四三”胜。所谓禁手是指黑方一子落下同时形成两个或两个以上的活三冲四及长连禁手。长连禁手是指黑方形成六个或六个以上的连续棋子。,(双方均不能形成五连为和棋。,(对局中拔子中途退场均判为负。,(五连与禁手同时形成先五为胜。因黑方已形成五连故禁手失效黑方胜。,(黑方禁手形成时白方应立即指出禁手点黑方即负。若白方继续应子则黑方禁手不成立。,(高段位职业比赛的特殊规定:“三手可交换”:黑下完第,手执白者可提出交换。即执白方变为执黑方。“五手两打法”:执黑下第五手时必须下两手棋执白者从这两手棋中任选一步。种方式进行的。本文所论述的联机五子棋系统就是依照这开发系统的几点建议()、开发系统不必贪大求全力争简单实用。应从大处着眼小处着手循序渐进逐步完善。()、对开发过程中的各种文档应当注意保存。这是系统开发所要求的必要条件。()、尽可能取得对程序设计重视使用简化的程序代码保证整个系统开发的清晰。相关技术介绍结构化生命周期法简介结构化生命周期法是一种传统的系统开发方法其基本思想是把整个系统开发过程分成若干个阶段每个阶段进行若干活动每项活动应用一系列标准、规范、方法和技术完成一个或多个任务形成符合给定规范的产品。开发系统时应遵循的主要原则:采用结构化生命周期法来()、用户参与的原则()、“先逻辑后物理”的原则()、“自顶向下”的原则()、工作成果描述(主要指文档)标准化的原则其具体开发步骤可分为以下四步:a系统规划b系统开发c系统的运行及维护d系统评价其中系统开发又分为以下四个步骤:(a)系统分析系统初步调查系统可行性研究现行系统的详细调查新系统逻辑方案的提出(b)系统设计系统总体结构设计系统总体功能设计系统总体物理结构设计系统详细设计代码设计输入输出设计(c)系统实施程序设计系统测试开发技术快速原型法简介快速原型法是年代发展起来的旨在缩短开发周期提高开发效率和用户对系统的满意程度。其基本思想是在系统开发的初期尽快构造出系统的原型使用户能及早地运行这个系统原型通过使用它、熟悉它受到启发并取得经验然后对系统的目标和功能提出更精确、具体的要求研制人员据此逐渐修改和完善原型使它满足用户的需求最后完成系统的开发。该方法大大提高了系统开发效率弥补了结构化生命周期法来开发的时间长的缺陷。通常采用原型法需要以下四个阶段:()、明确用户的基本要求()、研制系统的原型()、使用、评价系统原型()、修改和完善原型本系统开发方法的选择基于以上开发方法的优劣和本系统的实际情况本系统总体上采用结构化生命周期法进行系统规则、系统分析和系统设计但在系统实施阶段采用原型法。在开发程序的方法上本系统将采用,,,,,C开发工具编制一个五子棋联机游戏的软件用以实现客户端与服务端管理。第二章系统目标五子棋联机游戏系统主要致力于为提供联机双方进行联机游戏联络以及提供准确可靠用户操作动作的信息。具体目标如下:选择连接到服务器的客户端进行记录。记录客户机的键盘动作。分析是否已经取得胜利。第三章系统需求分析系统需求()满足记录客户机的游戏动作的基本要求。()满足连接数据到客户端的基本要求。()满足服务器实时获得客户端游戏状态的基本要求。()在服务器端分析双方是否胜利。功能需求基于系统需求分析该系统需要实现以下基本功能:()动作记录:当客户端程序启动的时候程序自动加载键盘钩子对客户端的网络的连接和操作进行记录并提示给游戏双方。()对连接到客户端数据的基本要求:能够将要发送的聊天记录发送至对方手上能够完成数据的连接。。()实时显示:当从游戏一方将数据传入另一方系统中将五子棋的表格进行重新的刷新和更改。()通过控制鼠标点击五子棋表格:进入控制模式加载鼠标钩子截取鼠标的按件动作并把该动作发送到游戏另一方并判断是否胜利。系统运行环境系统运行环境:Windows及其以上MFC简述MFC(MicrosoftFoundationClass)指的是Microsoft基础类是用来为Windows开发CGUI应用程序。MFC是一种十分优秀的工具,使得面向对象的软件函数包装技术演变成为一种可以进行代码复用、简化了程序的复杂性并使程序更加有效的软件开发环境对于使用WindowsAPI进行应用程序开发的人员来说,MFC使程序员大大你不必创建GDU对象,不必编写许多代码行对这些对象进行初提高了程序开发效率始化,并且小心地跟踪其生命周期的运行情况,你只需建立一个MFC类的实例,使用其默认值,然后让撤消程序来清除系统资源即可服务器与客户端SOCKET设计本程序都采用tcpsock的DLL模型该模型允许应用程序以Windows消息的形式接收网络事件通知。这个模型是为了适应Windows的消息驱动环境而设置的用于对性能要求不高的网络应用程序最大可连接个客户端。使用该模型基本满足本程序要求。协议设计:move鼠标移动leftdown鼠标左件按下leftup鼠标左件弹起rightdown鼠标右件按下rightup鼠标右件弹起send发送数据stop停止发送quick实时发送第四章系统设计概要设计本次毕业设计的内容就是设计出联机五子棋系统在此基础上实现系统模型各个子系统的基本功能。此系统用建立一个tcpsock的DLL文件来进行联机的游戏的网络数据。主要是运用了strListen类进行联机数据的传输在系统功能需求分析的基础上结合VisualC程序编制的特点得到下图所示的系统功能模块图。监听连接发送棋子命令接受棋子消息服务器端实时更新棋盘截取鼠标动作图五子棋服务端模块连接远程服务器发送棋子消息接受棋子消息客户端实时更新棋盘截取鼠标动作图五子棋客户端主模块流程图下面用我们用数据流图(DFD,DataFlowDiagram),也就是从数据传递和加工的角度以图形的方式刻画数据流从输入到输出的移动变换过程。如下图所示:开始用户选择角色服务器客户机判断角色类型在服务端口监连接服务器直接听直到有连接到服务器接受连的请求接请求接受连接请求初始化棋盘数据信息等待轮到自己下棋等待用户点击棋盘区域无获胜将点击位置转化为棋盘位置方将坐标数据发送给对方机子判断双方有无获胜有一方获胜显示获胜信息本图只是画出了系统得一部分的功能流程图因为本程序是一个windows程序由较多的功能主要是基于消息驱动的所以有一些功能不能有流程图表达出来如消息的传递当系统接到客户端传递来的信息后就调用一个函数将随机的产生出一些信息。提示在提示框内。让下棋一方了解到现在该我下子了。当然传递对方下棋的棋子位置等数据的接受处理也是基于消息的当有传递数据到达的时候系统会触发一个消息程序调用函数读取数据并进行相应的处理。如果是对方棋子位置的信息则在屏幕上找到对应期盼坐标画出对方棋子同时判断对方是否获胜。详细设计钩子的使用本程序使用了以个钩子他们分别是鼠标钩子。客户段使用的是键盘钩子拦截WHKEYBOARD消息服务器使用的鼠标钩子当服务器要获得客户端操作的时候鼠标钩子将用户的鼠标信息以消息的形式发送到服务器端服务器再通过socket发送到客户端进行控制操作因此我们必须首先了解钩子的使用函数:HHOOKSetWindowsHookEx(intidHook,HOOKPROClpfn,HINSTANCEhMod,DWORDdwThreadID)参数说明:idHook:钩子的类型lpfn:钩子处理函数地址hMod:包含钩子函数的模块句柄dwThreadID:钩子的线程函数说明:函数将在系统中挂上一个由idHook指定类型的钩子处理相应的特定消息。BOOLUnhookWindowsHookEx(HHOOKhhk)函数说明:函数将撤销由hhk指定的钩子。LRESULTCallNextHookEx(HHOOKhhk,intnCode,WPARAMwParam,LPARAMlParam)函数说明:函数将消息向下传递下一个钩子处理将截获这一消息。HHOOKSetWindowsHookEx(intidHook,HOOKPROClpfn,HINSTANCEhMod,DWORDdwThreadID)参数说明:idHook:钩子的类型lpfn:钩子处理函数地址hMod:包含钩子函数的模块句柄dwThreadID:钩子的线程函数说明:函数将在系统中挂上一个由idHook指定类型的钩子监控并处理相应的特定消息。BOOLUnhookWindowsHookEx(HHOOKhhk)函数说明:函数将撤销由hhk指定的钩子。LRESULTCallNextHookEx(HHOOKhhk,intnCode,WPARAMwParam,LPARAMlParam)函数说明:函数将消息向下传递下一个钩子处理将截获这一消息。程序设计程序窗口的设计由于此应用程序采用的是基于对话框的开发系统应用程序的各个不同功能是通过选择主对话框窗口中的不同按钮来完成的每个功能模块由一个或多个对话框实现。该应用程序的主对话框(即运行应用程序后出现的对话框)如图所示:本文系统得棋盘是由本文设定的画笔进行绘画而成的。布尔值对数据进行更新和计算将棋盘和棋子很好的合并在一起。这样整个五子棋的程序将很轻易的展现在人们的面前建立好后就可以输入代码:voidCMyChessDlg::DrawNowBlack(intx,inty){画当前的黑子CClientDCdc(this)CDCmdcmdcCreateCompatibleDC(dc)mdcSelectObject(mbblack)dcBitBlt(x*x,y*y,,,mdc,,,MERGEPAINT)mdcSelectObject(mblastblackchess)dcBitBlt(x*x,y*y,,,mdc,,,SRCAND)}voidCMyChessDlg::DrawNowWhite(intx,inty){画当前的白子CClientDCdc(this)CClientDC类负责在构造时调用Windows函数GetDC,在析构时调用ReleaseDCCDCmdcmdcCreateCompatibleDC(dc)CreateCompatibleDC()函数创建一个与dc指定的设备兼容的内存设备描述表mdcSelectObject(mbblack)SelectObject()将一个对象引入设备描述表dcBitBlt(x*x,y*y,,,mdc,,,MERGEPAINT)MERGEPAINT用布尔OR操作符将反相的源位图与目标位图结合起来mdcSelectObject(mblastwhitechess)dcBitBlt(x*x,y*y,,,mdc,,,SRCAND)SRCAND用布尔AND操作符将目标位图象素与源位图象素结合起来}voidCMyChessDlg::GetBoard(inttempboard,intnowboard)获取当前棋盘状态{inti,jfor(i=i<i)for(j=j<j){if(i==)i=tempboardij=nowboardij}}voidCMyChessDlg::InitializeBoard()初始化{初始化函数inti,j,count=,kmpclastposx=mpclastposy=mpplastposx=mpplastposy=start=true判断哪方先开始if(mbwfirst)计算机先{player=falsecomputer=true}else人先{player=truecomputer=false}pwin=cwin=false初始化计算机和玩家的获胜组合情况for(i=i<i)for(j=j<j)for(k=k<k){ptableijk=falsectableijk=false}for(i=i<i)for(j=j<j)winij=for(i=i<i)for(j=j<j)boardij=for(i=i<i)for(j=j<j){for(k=k<k){ptablejkicount=truectablejkicount=true}count}for(i=i<i)for(j=j<j){for(k=k<k){ptableijkcount=truectableijkcount=true}count}for(i=i<i)for(j=j<j){for(k=k<k){ptablejkikcount=truectablejkikcount=true}count}for(i=i<i)for(j=j>=j){for(k=k<k){ptablejkikcount=truectablejkikcount=true}count}}voidCMyChessDlg::OnLButtonDown(UINTnFlags,CPointpoint){intx,y,tx,tyTODO:Addyourmessagehandlercodehereandorcalldefaultif(playerpointx<=pointy<=)判断是否在有效区域{tx=x=pointxty=y=pointywhile(tx>=)tx=while(ty>=)ty=tx=xty=yif(tx>)x=xelsex=xif(ty>)y=yelsey=y将坐标换算成棋盘上的格子。if(boardxy==){boardxy=设为玩家的棋子if(mpplastposx!=mpplastposy!=){if(!mbwfirst)DrawWhiteChess(mpplastposx,mpplastposy)elseDrawBlackChess(mpplastposx,mpplastposy)}if(!mbwfirst)DrawNowWhite(x,y)elseDrawNowBlack(x,y)mpplastposx=x将当前棋子的信息装入记录移动棋子的结构中mpplastposy=yfor(inti=i<i){修改玩家下子后棋盘状态的变化if(ptablexyiwini!=)winiif(ctablexyi){ctablexyi=falsewini=}}player=falsecomputer=true}}CDialog::OnLButtonDown(nFlags,point)}voidCMyChessDlg::OnPaint(){if(IsIconic())IsIconic()函数指出此CWnd是否最小化{CPaintDCdc(this)CPaintDC为设备描述表类SendMessage(WMICONERASEBKGND,(WPARAM)dcGetSafeHdc(),)SendMessage()函数向此窗口发送指定的消息CentericoninclientrectangleintcxIcon=GetSystemMetrics(SMCXICON)intcyIcon=GetSystemMetrics(SMCYICON)CRectrectGetClientRect(rect)GetClientRect(rect)函数把此CWnd客户区的客户坐标拷贝到rect所指向的结构中intx=(rectWidth()cxIcon)inty=(rectHeight()cyIcon)DrawtheicondcDrawIcon(x,y,mhIcon)}else{CDialog::OnPaint()当Windows或应用程序申请绘制应用程序窗口的某一部分时此函数被调用}CClientDCdc(this)CClientDC类负责在构造时调用Windows函数GetDC,在析构时调用ReleaseDCCDCmdcmdcCreateCompatibleDC(dc)CreateCompatibleDC()函数创建一个与pDC指定的设备兼容的内存设备描述表mdcSelectObject(mbboard)SelectObject()函数将一对象选入设备描述表dcBitBlt(,,,,mdc,,,SRCCOPY)BitBlt()函数将一个位图从源设备描述表拷贝到此当前设备描述表中SRCCOPY将源位图拷贝到目标位图上for(inti=i<i)for(intj=j<j){玩家的棋子if(boardij==){if(mpplastposx==impplastposy==j){if(!mbwfirst)DrawNowWhite(mpplastposx,mpplastposy)elseDrawNowBlack(mpplastposx,mpplastposy)continue}if(!mbwfirst)DrawWhiteChess(i,j)elseDrawBlackChess(i,j)}计算机的棋子if(boardij==){if(mpclastposx==impclastposy==j){if(!mbwfirst)DrawNowBlack(mpclastposx,mpclastposy)elseDrawNowWhite(mpclastposx,mpclastposy)continue}if(!mbwfirst)DrawBlackChess(i,j)elseDrawWhiteChess(i,j)}}dcDrawdRect(,,,,RGB(,,),RGB(,,))画*的棋盘}先查看客户端的状态然后依照客户端的变化在更新五子棋的程序第五章结论关键技术本系统开发过程中用到的关键技术主要有:,钩子程序的使用,对网络联机的知识总结在设计过程中出现过不同的问题开始的时候解决起来有一些困难经过两个月的不断学习和实践基本上都已经解决而且通过解决问题的过程总结出一些需要注意的事项:、网络知识相对来说并不是很容易理解在网络的开发中我们必须要注意到消息的获得和判断例如winsock的开发机制和传输数据的内容我们必须要注意。、在系统开发的时候我们使用的是MFC进行数据的封装其代码量使用比Winsock要小而编写windows应用程序大多基于事件机制对windows系统的事件机制需要能够透彻的理解我们才能进行完善的系统设计和开发第六章设计总结由于以前对VisualC的接触并不是很多对它的开发环境不是非常了解所以在程序的开发过程中遇到了很多的困难但经过同学和指导老师的帮助一一化解了困难并从中学到了很多编程方面的知识。但是由于经验方面的原因以及对库存方面的操作流程了解不足该系统还有许多不尽如人意的地方和功能上的缺陷这些都有待于进一步改善。第七章谢辞此毕业设计为时两个月由于时间和能力的限制难免出现许多不足之处敬请各位老师批评指正。但是这一段的实践和学习大大提高了我解决实际问题的能力确实使我收获很多提高很大想信对我以后的学习生活都会大有裨益。在此首先要感谢我的指导老师***老师不辞劳苦的知道使我们得以顺利完成毕业设计其次系里的其他的一些老师和机房的老师在毕业设计的过程中给予我们的大力支持我从这些老师那里获益很多在此一并表示感谢。最后要感谢和我同组做毕业设计的同学这份毕业设计的成果是大家共同努力的结果。谢谢大家。参考文献伍俊良《VisualC课程设计与系统开发案例》清华大学出版社杨小平《VisualC项目案例导航》科学出版社邓宗明,张晓竞《VisualC编程实用技术与案例》清华大学出版社郑阿奇《VisualC实用教程》电子工业出版社王艳平张越《WINDOWS网络与通信程序设计》。人民邮电出版社郑人杰殷人昆陶永雷(实用软件工程(清华大学出版社(附录、棋盘程序MyChessDlgh#if!defined(AFXMYCHESSDLGHDACFEAABACFFCINCLUDED)#defineAFXMYCHESSDLGHDACFEAABACFFCINCLUDED#ifMSCVER>#pragmaonce#endifMSCVER>MyChessDlgh:headerfileCMyChessDlgdialogclassCMyChessDlg:publicCDialog{Constructionpublic:boolSearchBlank(inti,intj,intnowboard)voidIsWin()voidInitializeBoard()intGiveScore(inttype,intx,inty)voidGetBoard(inttempboard,intnowboard)voidDrawWhiteChess(intx,inty)voidDrawNowWhite(intx,inty)voidDrawNowBlack(intx,inty)voidDrawBlackChess(intx,inty)voidComTurn()intboardboolcomputerboolctableboolcwinCBitmapmbblackCBitmapmbwhitechessCBitmapmbblackchessCBitmapmbboardCBitmapmblastwhitechessCBitmapmblastblackchessboolmbinit判断游戏是否是处于刚开始阶段boolmbwfirst谁先走为电脑先走为玩家先走CPointmpplastpos玩家走的前一步棋CPointmpclastpos计算机走的前一步棋boolplayerboolptableboolpwinboolstartintwinCMyChessDlg(CWnd*pParent=)standardconstructorDialogData{{AFXDATA(CMyChessDlg)enum{IDD=IDDESTDLG}NOTE:theClassWizardwilladddatamembershere}}AFXDATAOverridesClassWizardgeneratedvirtualfunctionoverrides{{AFXVIRTUAL(CMyChessDlg)protected:virtualvoidDoDataExchange(CDataExchange*pDX)DDXDDVsupport}}AFXVIRTUALImplementationprotected:HICONmhIconvoidOnUpdateSetPerson(CCmdUI*pCmdUI)voidOnTimer(UINTnIDEvent)voidOnSysCommand(UINTnID,LPARAMlParam)voidOnSetPerson()HCURSOROnQueryDragIcon()voidOnPaint()voidOnLButtonDown(UINTnFlags,CPointpoint)Generatedmessagemapfunctions{{AFXMSG(CMyChessDlg)afxmsgvoidOnGameStart()}}AFXMSGDECLAREMESSAGEMAP()private:public:afxmsgvoidOnBnClickedEffect()afxmsgvoidOnBnClickedListen()}Appcommandtorunthedialog{{AFXINSERTLOCATION}}MicrosoftVisualCwillinsertadditionaldeclarationsimmediatelybeforethepreviousline#endif!defined(AFXMYCHESSDLGHDACFEAABACFFCINCLUDED)MyChessDlgcppMyChessDlgcpp:implementationfile#include"stdafxh"#include"fchessh"#include"MyChessDlgh"#include"mychessdlgh"#ifdefDEBUG#definenewDEBUGNEW#undefTHISFILEstaticcharTHISFILE=FILE#endifCMyChessDlgdialogCMyChessDlg::CMyChessDlg(CWnd*pParent*=*)gjl:CDialog(CMyChessDlg::IDD,pParent){{{AFXDATAINIT(CMyChessDlg)NOTE:theClassWizardwilladdmemberinitializationhere}}AFXDATAINITmhIcon=AfxGetApp()>LoadIcon(IDRMAINFRAME)AfxGetApp获取一个指向CWinApp对象指针}CMyChessDlg::CMyChessDlg(CWnd*pParent*=*):CDialog(CMyChessDlg::IDD,pParent){{{AFXDATAINIT(CMyChessDlg)NOTE:theClassWizardwilladdmemberinitializationhere}}AFXDATAINITNotethatLoadIcondoesnotrequireasubsequentDestroyIconinWinmhIcon=AfxGetApp()>LoadIcon(IDRMAINFRAME)AfxGetApp获取一个指向CWinApp对象指针}voidCMyChessDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX)DoDataExchange()框架调用此函数以交换和有效化对话数据pDX是指向一个CDataExchange对象的指针{{AFXDATAMAP(CMyChessDlg)NOTE:theClassWizardwilladdDDXandDDVcallshere}}AFXDATAMAP}BEGINMESSAGEMAP(CMyChessDlg,CDialog){{AFXMSGMAP(CMyChessDlg)ONCOMMAND(IDGAMESTART,OnGameStart)}}AFXMSGMAPONBNCLICKED(IDCEFFECT,OnBnClickedEffect)ONBNCLICKED(IDCLISTEN,OnBnClickedListen)ENDMESSAGEMAP()CMyChessDlgmessagehandlersvoidCMyChessDlg::OnGameStart(){InitializeBoard()Invalidate()此函数使CWnd的整个客户区无效SetTimer(,,):为一个非的定时器标识符。:为以毫秒数指出限时值:为WMTIMER消息将被放到应用程序的队列中并由此CWnd对象来处理}voidCMyChessDlg::ComTurn()寻找下棋的空白位置并下棋子{bestx,besty为当前最佳位置ij是人能下的各种位置cicj是计算机能下的各种位置intbestx,besty,i,j,ci,cj,ptemp,ctemp,pscore=,cscore=,ctempboard,ptempboardintm,n,temp,temp暂存第一步搜索的信息if(start){if(board==)如果棋盘为空{bestx=besty=}else{bestx=besty=}start=false}else{寻找最佳位置GetBoard(ctempboard,board)while(SearchBlank(i,j,ctempboard)){n=pscore=GetBoard(ptempboard,board)ctempboardij=标记已被查找ctemp=GiveScore(,i,j)for(m=m<m){暂时更改玩家信息if(ptableijm){tempn=mptableijm=falsetempn=winmwinm=n}}ptempboardij=ci=icj=jwhile(SearchBlank(i,j,ptempboard)){ptempboardij=标记已被查找ptemp=GiveScore(,i,j)if(pscore>ptemp)此时为玩家下子运用极小极大法时应选取最小值pscore=ptemp}for(m=m<nm){恢复玩家信息ptablecicjtempm=truewintempm=tempm}if(ctemppscore>cscore)此时为计算机下子运用极小极大法时应选取最最大值{cscore=ctemppscorebestx=cibesty=cj}}}boardbestxbesty=if(mpclastposx!=mpclastposy!=){画前一棋子if(!mbwfirst)DrawBlackChess(mpclastposx,mpclastposy)elseDrawWhiteChess(mpclastposx,mpclastposy)}if(!mbwfirst)DrawNowBlack(bestx,besty)elseDrawNowWhite(bestx,besty)mpclastposx=bestxmpclastposy=bestyfor(i=i<i){修改计算机下子后棋盘的变化状况if(ctablebestxbestyiwini!=)winiif(ptablebestxbestyi){ptablebestxbestyi=falsewini=}}computer=falseplayer=true}voidCMyChessDlg::DrawBlackChess(intx,inty){CClientDCdc(this)CClientDC类负责在构造时调用Windows函数GetDC,在析构时调用ReleaseDCCDCmdc定义设备描述表对象mdcCreateCompatibleDC(dc)mdcSelectObject(mbblack)SelectObject()将一个对象引入设备描述表dcBitBlt(x*x,y*y,,,mdc,,,MERGEPAINT)MERGEPAINT用布尔OR操作将反相的源位图和和目标位图结合起来mdcSelectObject(mbblackchess)dcBitBlt(x*x,y*y,,,mdc,,,SRCAND)SRCAND用布尔AND操作将目标位图象素和源位图象素结合起来}voidCMyChessDlg::DrawNowBlack(intx,inty){画当前的黑子CClientDCdc(this)CDCmdcmdcCreateCompatibleDC(dc)mdcSelectObject(mbblack)dcBitBlt(x*x,y*y,,,mdc,,,MERGEPAINT)mdcSelectObject(mblastblackchess)dcBitBlt(x*x,y*y,,,mdc,,,SRCAND)}voidCMyChessDlg::DrawNowWhite(intx,inty){画当前的白子CClientDCdc(this)CClientDC类负责在构造时调用Windows函数GetDC,在析构时调用ReleaseDCCDCmdcmdcCreateCompatibleDC(dc)CreateCompatibleDC()函数创建一个与dc指定的设备兼容的内存设备描述表mdcSelectObject(mbblack)SelectObject()将一个对象引入设备描述表dcBitBlt(x*x,y*y,,,mdc,,,MERGEPAINT)MERGEPAINT用布尔OR操作符将反相的源位图与目标位图结合起来mdcSelectObject(mblastwhitechess)dcBitBlt(x*x,y*y,,,mdc,,,SRCAND)SRCAND用布尔AND操作符将目标位图象素与源位图象素结合起来}voidCMyChessDlg::DrawWhiteChess(intx,inty){CClientDCdc(this)CDCmdcmdcCreateCompatibleDC(dc)mdcSelectObject(mbblack)dcBitBlt(x*x,y*y,,,mdc,,,MERGEPAINT)mdcSelectObject(mbwhitechess)dcBitBlt(x*x,y*y,,,mdc,,,SRCAND)}voidCMyChessDlg::GetBoard(inttempboard,intnowboard)获取当前棋盘状态{inti,jfor(i=i<i)for(j=j<j){if(i==)i=tempboardij=nowboardij}}intCMyChessDlg::GiveScore(inttype,intx,inty){inti,score=for(i=i<i){计算机下if(type==){if(ctablexyi){switch(wini){case:score=breakcase:score=breakcase:score=breakcase:score=breakdefault:break}}}人下else{if(ptablexyi){switch(wini){case:score=breakcase:score=breakcase:score=breakcase:score=breakdefault:break}}}}returnscore}voidCMyChessDlg::InitializeBoard()初始化{初始化函数inti,j,count=,kmpclastposx=mpclastposy=mpplastposx=mpplastposy=start=true判断哪方先开始if(mbwfirst)计算机先{player=falsecomputer=true}else人先{player=truecomputer=false}pwin=cwin=false初始化计算机和玩家的获胜组合情况for(i=i<i)for(j=j<j)for(k=k<k){ptableijk=falsectableijk=false}for(i=i<i)for(j=j<j)winij=for(i=i<i)for(j=j<j)boardij=for(i=i<i)for(j=j<j){for(k=k<k){ptablejkicount=truectablejkicount=true}count}for(i=i<i)for(j=j<j){for(k=k<k){ptableijkcount=truectableijkcount=true}count}for(i=i<i)for(j=j<j){for(k=k<k){ptablejkikcount=truectablejkikcount=true}count}for(i=i<i)for(j=j>=j){for(k=k<k){ptablejkikcount=truectablejkikcount=true}count}}voidCMyChessDlg::IsWin(){intifor(i=i<i){if(wini==)玩家赢{pwin=truebreak}if(wini==){cwin=true电脑赢break}}}voidCMyChessDlg::OnLButtonDown(UINTnFlags,CPointpoint){intx,y,tx,tyTODO:Addyourmessagehandlercodehereandorcalldefaultif(playerpointx<=pointy<=)判断是否在有效区域{tx=x=pointxty=y=pointywhile(tx>=)tx=while(ty>=)ty=tx=xty=yif(tx>)x=xelsex=xif(ty>)y=yelsey=y将坐标换算成棋盘上的格子。if(boardxy==){boardxy=设为玩家的棋子if(mpplastposx!=mpplastposy!=){if(!mbwfirst)DrawWhiteChess(mpplastposx,mpplastposy)elseDrawBlackChess(mpplastposx,mpplastposy)}if(!mbwfirst)DrawNowWhite(x,y)elseDrawNowBlack(x,y)mpplastposx=x将当前棋子的信息装入记录移动棋子的结构中mpplastposy=yfor(inti=i<i){修改玩家下子后棋盘状态的变化if(ptablexyiwini!=)winiif(ctablexyi){ctablexyi=falsewini=}}player=falsecomputer=true}}CDialog::OnLButtonDown(nFlags,point)}voidCMyChessDlg::OnPaint(){if(IsIconic())IsIconic()函数指出此CWnd是否最小化{CPaintDCdc(this)CPaintDC为设备描述表类SendMessage(WMICONERASEBKGND,(WPARAM)dcGetSafeHdc(),)SendMessage()函数向此窗口发送指定的消息CentericoninclientrectangleintcxIcon=GetSystemMetrics(SMCXICON)intcyIcon=GetSystemMetrics(SMCYICON)CRectrectGetClientRect(rect)GetClientRect(rect)函数把此CWnd客户区的客户坐标拷贝到rect所指向的结构中intx=(rectWidth()cxIcon)inty=(rectHeight()cyIcon)DrawtheicondcDrawIcon(x,y,mhIcon)}else{CDialog::OnPaint()当Windows或应用程序申请绘制应用程序窗口的某一部分时此函数被调用}CClientDCdc(this)CClientDC类负责在构造时调用Windows函数GetDC,在析构时调用ReleaseDCCDCmdcmdcCreateCompatibleDC(dc)CreateCompatibleDC()函数创建一个与pDC指定的设备兼容的内存设备描述表mdcSelectObject(mbboard)SelectObject()函数将一对象选入设备描述表dcBitBlt(,,,,mdc,,,SRCCOPY)BitBlt()函数将一个位图从源设备描述表拷贝到此当前设备描述表中SRCCOPY将源位图拷贝到目标位图上for(inti=i<i)for(intj=j<j){玩家的棋子if(boardij==){if(mpplastposx==impplastposy==j){if(!mbwfirst)DrawNowWhite(mpplastposx,mpplastposy)elseDrawNowBlack(mpplastposx,mpplastposy)continue}if(!mbwfirst)DrawWhiteChess(i,j)elseDrawBlackChess(i,j)}计算机的棋子if(boardij==){if(mpclastposx==impclastposy==j){if(!mbwfirst)DrawNowBlack(mpclastposx,mpclastposy)elseDrawNowWhite(mpclastposx,mpclastposy)continue}if(!mbwfirst)DrawBlackChess(i,j)elseDrawWhiteChess(i,j)}}dcDrawdRect(,,,,RGB(,,),RGB(,,))画*的棋盘}ThesystemcallsthistoobtainthecursortodisplaywhiletheuserdragstheminimizedwindowHCURSORCMyChessDlg::OnQueryDragIcon()没有定义类图标的最小化窗口调用此函数{return(HCURSOR)mhIcon}voidCMyChessDlg::OnSetPerson(){TODO:Addyourcommandhandlercodeherembwfirst=!mbwfirstCMenu*pMenu=GetMenu()CMenu*pSubMenu=pMenu>GetSubMenu()检取(此菜单中)一个弹出式菜单的CMenu对象(!mbwfirst)pSubMenu>CheckMenuItem(IDSETPERSON,MFCHECKED):pSubMenu>CheckMenuItem(IDSETPERSON,MFUNCHECKED)CheckMenuItem()函数将检取标志放在此弹出式菜单中菜单项的旁边或去掉菜单菜单旁边的检取标志InitializeBoard()Invalidate()SetTimer(,,)}voidCMyChessDlg::OnSysCommand(UINTnID,LPARAMlParam)当用户从Control菜单中选择了一项命令时或用户选择了最大或最小化按钮时OnSysCommand()被调用{if((nIDxFFF)==IDDABOUTBOX){CAboutDlgdlgAboutdlgAboutDoModal()DoModal()函数激活模式对话框完成后返回对话框结果}else{CDialog::OnSysCommand(nID,lParam)}}voidCMyChessDlg::OnTimer(UINTnIDEvent){TODO:AddyourmessagehandlercodehereandorcalldefaultIsWin()if(pwin){KillTimer()KillTimer()函数消除原先调用SetTimer()设置的nIDEvent标识的定时器事件MessageBox("您真厉害我们再来决战到天亮!")player=falsecomputer=falsembinit=true}elseif(cwin){KillTimer()返回值标识消除了该事件MessageBox("小样就这点水平还想赢我!!!")player=falsecomputer=falsembinit=true}else{if(computer)ComTurn()}CDialog::OnTimer(nIDEvent)OnTimer():安装定时器时SetTimer成员函数中指定的时间逝去后此函数被调用}voidCMyChessDlg::OnUpdateSetPerson(CCmdUI*pCmdUI)CCmdUI类只用于CCmdTarget派生类的ONUPDATECOMMANDUI处理函数内当菜单被拉下时框架查找并调用各ONUPDATECOMMANDUI处理函数{TODO:AddyourcommandupdateUIhandlercodehereif(player)pCmdUI>SetCheck(true)调用SetCheck()成员函数将命令的拥护截面设置成恰当的检取状态。这个成员函数用于菜单项和工具条按扭}boolCMyChessDlg::SearchBlank(inti,intj,intnowboard)寻找空白可以下棋处{intx,yfor(x=x<x)for(y=y<y){if(nowboardxy==nowboardxy!=){i=xj=yreturntrue}}returnfalse}voidCMyChessDlg::OnBnClickedEffect(){TODO:在此添加控件通知处理程序代码}voidCMyChessDlg::OnBnClickedListen(){TODO:在此添加控件通知处理程序代码

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/57

五子五子棋五子棋

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利