软件工程毕业设计(论文)基于VC++的中国象棋网上对弈系统设计(含源程序).doc

上传人:laozhun 文档编号:2386185 上传时间:2023-02-17 格式:DOC 页数:26 大小:556.50KB
返回 下载 相关 举报
软件工程毕业设计(论文)基于VC++的中国象棋网上对弈系统设计(含源程序).doc_第1页
第1页 / 共26页
软件工程毕业设计(论文)基于VC++的中国象棋网上对弈系统设计(含源程序).doc_第2页
第2页 / 共26页
软件工程毕业设计(论文)基于VC++的中国象棋网上对弈系统设计(含源程序).doc_第3页
第3页 / 共26页
软件工程毕业设计(论文)基于VC++的中国象棋网上对弈系统设计(含源程序).doc_第4页
第4页 / 共26页
软件工程毕业设计(论文)基于VC++的中国象棋网上对弈系统设计(含源程序).doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《软件工程毕业设计(论文)基于VC++的中国象棋网上对弈系统设计(含源程序).doc》由会员分享,可在线阅读,更多相关《软件工程毕业设计(论文)基于VC++的中国象棋网上对弈系统设计(含源程序).doc(26页珍藏版)》请在三一办公上搜索。

1、中国象棋网上对弈系统摘要随着信息技术的发展,人民生活水平的不断提高。联网游戏作为一种娱乐手段,正以其独特的魅力吸引着越来越多的玩家。为了满足广大象棋爱好者也可以享受到网络所带来的便利,本设计在当前局域网条件下实现了中国象棋的网络对战。鉴于局域网的特点和游戏本身的要求,本设计采用两层C/S架构来实现相互之间的通信。它主要包含以下几大模块:网络通信模块,图像绘制模块和规则设置模块。网络通信模块使得玩家可以方便的迅速建立起网络连接,从而实现联机对弈和聊天功能;图像绘制模块实现棋盘更新以及棋子动态表示等功能;规则设置模块用于约束玩家的棋步。电脑游戏是计算机应用领域的一个重要主题,而当前网上最热门的休闲

2、对战类游戏当属棋牌游戏。通过对象棋的数据结构,相关算法与网络联机,以及对网络对战平台系统的分析,设计成一套基于VC+平台的棋牌类对战系统。关键词:网络通信;联机对弈;图像绘制;消息响应需源程序,外文翻译,PPT答辩联系QQ153893706CHINESE CHESS ONLINE GAME SYSTEMAbstractWith the development of information technology, peoples standard of living have improved constantly. On-line game as a means of entertainmen

3、t has a unique charm to attract more and more players. To meet chess lovers ,this design has realized the Challenges of Chinese-chess between players under the current LAN environment.In view of the characteristics of local area networks and the requirements of the game itself, the design uses a two

4、-tier C/S structure to achieve mutual communication. It contains the following major modules: the network communication module, image rendering module and the rules set up module. Network Communication Module allows gamers can quickly set up a convenient network connection in order to achieve an onl

5、ine game and chat function; image rendering module to update the board as well as functional pieces, such as the dynamic that; rules binding settings module for step-by-step players game. Computer games is the field of computer applications as an important subject, and present the most popular casua

6、l online games war among board games. By the data structure, algorithms and network online, as well as the network platform for systematic analysis of the war, designed a set of VC + + platform based on the category Card battle system.Keywords: Network Communication; Online game; Image Rendering; Me

7、ssage Response目 录摘要IAbstractII1绪论31.1课题背景31.2课题发展概况31.3本文主要工作42系统介绍52.1系统简介52.2 系统构成52.3相关技术52.3.1 点对点通信52.3.2 TCP/IP协议62.3.3 UPD基础72.3.4屏幕作图与用户交互72.3.5远程控制原理83设计与实现93.1数据结构93.1.1棋盘93.1.2棋子信息数组103.1.3变量与函数113.2图像绘制123.2.1主窗口123.2.2棋盘的绘制123.2.3棋子的绘制及初始化133.2.4动态显示143.2.5回看功能153.3规则设置153.3.1棋子规则153.3.

8、2规则算法153.4网络通信173.4.1CCOM类173.4.2数据代码183.4.3数据更新193.4.4聊天功能193.5棋子操作203.5.1获取点击203.5.2走棋判断213.5.3光标变化214总结与展望234.1总结234.2展望23参考文献24致 谢251绪论1.1课题背景电脑游戏就是以计算机为操作平台,通过人机互动形式实现的能够体现当前计算机技术较高水平的一种新形式的娱乐方式。电脑游戏是必须依托于计算机操作平台的,不能在计算机上运行的游戏,肯定不会属于电脑游戏的范畴。至于现在大量出现的游戏机模拟器,原则上来讲,还是属于非电脑游戏的。游戏必须具有高度的互动性。所谓互动性是指游

9、戏者所进行的操作,在一定程度及一定范围上对计算机上运行的游戏有影响,游戏的进展过程根据游戏者的操作而发生改变,而且计算机能够根据游戏者的行为做出合理性的反应,从而促使游戏者对计算机也做出回应,进行人机交流。游戏在游戏者与计算机的交替推动下向前进行。电脑游戏比较能够体现目前计算机技术的较高水平。一般当计算机更新换代的同时,计算机游戏也会相应的发生较大的变更。电脑游戏按类型可分为:单机游戏、网络游戏、flash小游戏、电子竞技等。按内容可分为:即时战略类、角色扮演类、模拟经营类、冒险动作类,棋牌休闲类等。本系统属于网络棋牌休闲类游戏。1.2课题发展概况在人们逐步进入信息时代后,电脑游戏使得人生变成

10、了真正的游戏。在传统中国社会中,文化、教育与知识是神圣的,庄严的,是天地君亲师。这种传统的体制,使人们在接受教育的过程中,就受到了束缚。如果谁把这种神圣的东西与游戏连在一起,就会被认为是对圣贤的一种亵渎。而现在,网络技术和数字技术把文化、教育和知识都变成了娱乐变成了游戏,将它们从神坛上请下来,使它们变成了大众的、平民的东西,可爱的、容易接受的东西。作为融合高科技的文化艺术产品,电脑除给人们的生活带来联想之外,它更能给使用者带来更多现实中不能拥有的体验,这正是当今世上被看好的体验型经济的典型代表。随着人民生活水平的提高,人们的生活模式和思想模式都发生着变化。电脑游戏业经过多年发展,跌跌撞撞地走过

11、来。应该看到人们在电脑和互联网带来的时代标志性变化中,电脑游戏市场的逐步完善与巨大的潜在能量,作为一种现代娱乐形式,其正在世界范围内创造巨大的市场空间和受众群体。传统的单机游戏曾风靡一时,游戏爱好者在简单的打斗中获得了虚幻世界的满足,但过了一段时间后,单机游戏的模式由于不能满足人们相互交流的愿望以及其内容的简单重复,面对电脑的独孤求败总让人有一种自以为是而又百无聊赖的感觉。逐渐失去了对用户的吸引力,游戏爱好者期待着新的游戏模式出现。于是,电脑游戏开始朝着网络游戏发展,随着网络建设快速发展,人们生活方式随着时代发展而改变,网络游戏迅速取代单机游戏成为了游戏玩家新的宠儿。1.3本文主要工作主要工作

12、内容如下:1设计程序良好的用户界面,尽可能真实模拟象棋环境,双方对局过程中所显示的界面应一致。2基于TCP/IP协议,结合象棋对弈的特点,设计一套切实可行网络实时数据通信协议。3制定棋盘及状态数据结构,方便实时通信及屏幕作图及与用户的交互。4制定出详细的棋子操作规则。2系统介绍2.1系统简介中国象棋,古代叫“象戏”是一种由两人轮流走子,以“将死”或“困毙”对方将(帅)为胜的一种棋类运动。它不仅能丰富文化生活,陶冶情操,更有助于开发智力,启迪思维,锻炼辨证分析能力和培养顽强的意志。象棋是中华民族的传统文化,不仅在国内深受群众喜爱,而且流传国外。本系统为中国象棋网上对弈系统,其以网络通信原理结合中

13、国象棋的规则设计完成,是一款能够实现局域网内双人联机对弈的电脑游戏程序,使用MicroSoft Visual C+ 6.0开发,运行与Windows平台。2.2 系统构成中国象棋网上对弈系统是主要由:数据结构、图像绘制、规则设置、网络通信、棋子操作五部分构成。软件本身即可以作为服务器端,又可以作为客户端,双方建立连接后即可以进行象棋对弈。2.3相关技术2.3.1 点对点通信从OSI参考模型的应用层来看,可认为网络是由工作站和服务器组成的,但从传输层和网络层的角度看,工作站和服务器没有本质的区别,它们都是连接到网络上的一台机器,都可以用网络地址或名称来代替。它们之间的通信就是所谓的点对点通信,也

14、叫对等通信。在局域网上,点点通信意味着两个工作站可以直接对话而不用经过文件服务器中转。通信的基础是套接口(Socket),一个套接口是通讯的一端。socket通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过套接字向网络发出请求或者应答网络请求。Socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须各自拥有一台电话机一样。在网间网内部,每一个socket用一个半相关描述:(协议,本地地址,本地端口)。一个完整的socket有一个本地唯一的socket号,由系统分配。最重要的是,

15、socket是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的socket 系统调用。客户随机申请一个socket (相当于一个想打电话的人可以在任何一台入网电话上拨号呼叫),系统为之分配一个socket号;服务器拥有全局公认的 socket ,任何客户都可以向它发出连接请求和信息请求(相当于一个被呼叫的电话拥有一个呼叫方知道的电话号码)。socket利用客户/服务器模式巧妙地解决了进程之间建立通信连接的问题。服务器socket 半相关为全局所公认非常重要。假如通信双方没有任何一方的socket固定,就好比打电话的双方彼此不知道对方的电话号码,要通话是不可能在这一端上你可以找到与其

16、对应的一个名字。一个正在被使用的套接口都有它的类型和与其相关的进程。套接口存在于通讯域中。通讯域是为了处理一般的线程通过套接口通讯而引进的一种抽象概念。套接口通常和同一个域中的套接口交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。Windows Sockets规范支持单一的通讯域,即Internet域。各种进程使用这个域互相之间用Internet协议族来进行通讯。局域网中工作站之间的通信程序的开发一般通过四种途径:第一种是通过改造网络原有通信软件来实现。但这种改造必须以对该软件充分了解为基础,否则改造后很难保证不影响网络的整体性能,甚至会造成系统运行不可靠,而改造后的通信

17、质量不一定理想。第二种是利用Novell网本身的网络协议IPX/SPX来实现,由于这种方法开发比较麻烦,采用的并不多。第三种是通过NetBIOS功能调用来实现,NetBIOS是PC LAN的通信接口标准,广泛适用于多种微机网络,使得以它为基础的设计和应用开发可移植性好。它不依赖于任何网络硬件,是一个介于网络硬件和用户应用程序之间的接口协议。其通信原理是:两个要进行通信的工作站通过名字建立一个虚电路,然后向相应的虚电路号发送或接收信息,这样通过虚电路实现了两个工作站之间的对等通信。利用NetBIOS实现工作站之间的实时通信,功能比较强,编程实现比较容易,所以应用比较广泛。第四种是通过TCP/IP

18、协议来实现。2.3.2 TCP/IP协议TCP协议(Transmission Control Protocol 传输控制协议):是一种流传输控制协议,它提供可靠的、有序的、双向的、面向连接的数据传输,是一种面向连接的协议。TCP协议是一种端对端的协议,使用TCP没有任何广播或类似的概念,要用TCP协议与另一台计算机通信,两台机之间必须像打电话一样连接在一起,每一端都为通话做好准备。TCP协议每发送一个数据包都将会收到一个确认信息,这种发送/应答模式是提供可靠的协议的唯一方法:你必须让对方知道你是否收到了数据。当然,这也会造成一些性能损失,人们为了改善系统效率不高的状况,引入了“捎带确认(pig

19、gybacking)”的方法。TCP协议之所以是全双工的就是因为这个“捎带确认”信息,因为它允许双方同时发送数据。这是通过在当前的数据包中携带以前收到的数据的确认信息方式实现的,从提高网络利用率的角度看,这比单纯发送一个通知对方“信息已收到”的数据包要好得多。最后,还有一个批量确认的概念:也即一次确认一个以上的数据包,表示“我收到了包括这个数据包在内的全部数据包”。在IP协议中,我们处理的单个数据包是一个更大的数据报的一部分,一个TCP段就是一个单个的TCP数据包。TCP是一个数据流,因此,除了“连接”之外,没有任何需要真正担心的其它概念。最大报文段长度(MSS)是在连接的时候协商的,但是,它

20、总是在不断地改变。默认的最大报文段长度是536字节,这是576字节(IP协议保证的最小数据包长度)减去用于IP头的20个字节和用于TCP头的20个字节以后的长度。TCP协议要设法避免在IP级别上的分段。因此,TCP协议总是从536字节开始的。TCP/IP协议的核心部分是传输层协议(TCP、UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中实现。因此用户一般不涉及,编程时,编程界面有两种形式:一、是由内核直接提供的系统调用;二、使用以库函数方式提供的各种函数。前者为核内实现,后者为核外实现。用户服务要通过核外的应用程序才能实现,所以要使用套接字(socket)来实现。2.3.

21、3 UPD基础UDP协议(User Datagram Protocol 用户数据报协议):是一种保护消息边界的,不保障可靠数据传输的无连接的协议。主要用来支持那些需要在计算机之间传输数据的网络连接。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。尤其是在需要很强的实时交互性的场合,如网络游戏、视频会议等,UDP协议更是显示出极强的威力。UDP协议是一种面向非连接的协议,面向非连接指的是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。至于对方是否可以接收到这些数据内容,UDP协议无法

22、控制,因此说UDP协议是一种不可靠的协议。与TCP协议一样,UDP协议直接位于IP协议之上,实际上,IP协议属于OSI参考模型的网络层协议,而UDP和TCP都属于传输层协议。UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。因为UDP协议是面向非连接的协议,没有建立连接的过程,因此它的通信效率高;但也正因为如此,它的可靠性不如TCP协议高。UDP协议的主要作用是完成网络数据流量和数据报之间的转换:在信息的发送端,UDP协议将网络数据流量封装数据报,然后将数据报发送出去;在信息的接收端,UDP协议将数据报转换成实际数据内容。实际上,我们可以认为基于UDP协议的Socket类似于一个码头

23、,该码头的作用就是负责发送、接收集装箱,一个数据报类似于一个集装箱。因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器端的概念。2.3.4屏幕作图与用户交互屏幕作图与用户的交互为用户提供了一个交互工作环境,称交互界面。通常在图形显示方式,把屏幕划分成图形区、菜单区和提示区。菜单功能的好坏直接影响到交互界面的友好性。交互绘图操作命令是通过某单表达,菜单的设计需考虑到交互方便和提高交互效率。常见的菜单有文宇菜单和图标菜单两大类,图标菜单较为直观、形象,不受文种不同的限制等优点。屏幕作图与用户的交互的基本功能一般可归结为绘图功能、图形编辑、尺寸标准、作图工具、显示功能、询问功能、信息转换

24、和二次开发工具等八大功能。绘图功能是屏幕作图与用户的交互的核心部分,它主要包括绘图环境的设置、实体绘图命令和尺寸、文字标注等功能。绘图环境的设置主要包括:图层、线型、颜色、作图单位和图幅大小设定等。实体绘图是生成图形的基本命令集,如点、直线、圆、圆弧等的绘图命令。信息转换功能实现图形到图形文本文件的双向转换,图形文件按图形转换文件的标准格式书写。 开发工具是一种用户编程语言,通常是由高级编程语言,如 C+、C#、VC、VB,通过绘图系统接口调用图形函数库。用户借助于软件系统提供的用户编程语言,建立常用的图形库、常用的标准件图库和专用的应用程序等二次开发工作,提高绘图效率。2.3.5远程控制原理

25、远程控制软件一般分两个部分:一部分是客户端程序Client,另一部分是服务器端程序Server,在使用前需要将客户端程序安装到主控电脑上,将服务器端程序安装到被控电脑上。它的控制的过程一般是先在主控电脑上执行客户端程序,像一个普通的客户一样向被控电脑中的服务器端程序发出信号,建立一个特殊的远程服务,然后通过这个远程服务,使用各种远程控制功能发送远程控制命令,控制被控电脑中的各种应用程序运行,我们称这种远程控制方式为基于远程服务的远程控制。通过远程控制软件,我们可以进行很多方面的远程控制,包括获取目标电脑屏幕图像、窗口及进程列表;记录并提取远端键盘事件(击键序列,即监视远端键盘输入的内容);可以

26、打开、关闭目标电脑的任意目录并实现资源共享;提取拨号网络及普通程序的密码;激活、中止远端程序进程;管理远端电脑的文件和文件夹;关闭或者重新启动远端电脑中的操作系统;修改Windows注册表;通过远端电脑上、下载文件和捕获音频、视频信号等。3设计与实现3.1数据结构3.1.1棋盘图3-1棋盘棋子活动的场所,叫作“棋盘”。在长方形的平面上,绘有九条平行的竖线和十条平行的横线相交组成,共有九十个交叉点,棋子就摆在交叉点上。中间部分,也就是棋盘的第五,第六两横线之间末画竖线的空白地带称为“河界”。两端的中间,也就是两端第四条到第六条竖线之间的正方形部位,以斜交叉线构成“米”字方格的地方,叫作“九宫”(

27、它恰好有九个交叉点)。整个棋盘以“河界”分为相等的两部分。为了比赛记录和学习棋谱方便起见,现行规则规定:按九条竖线从右至左用中文数字一至九来表示红方的每条竖线,用阿拉伯数字19来表示黑方的每条竖线。对弈开始之前,红黑双方应该把棋子摆放在规定的位置。任何棋子每走一步,进就写“进”,退就写“退”,如果像车一样横着走,就写“平”。纵线方式,它是中国象棋常用的表示方法,即棋子从棋盘的哪条线走到哪条线。中国象棋规定,对于红方来说的纵线从右到左依次用“一”到“九”表示,黑方则是“”到“”,这种表示方式体现了古代中国象棋研究者的智慧。 坐标方式,它是国际象棋常用的表示方法,把每个格子按坐标编号,只要知道起始

28、格子和到达格子,就确定了着法,这种表示方式更方便也更合理,而且还可以移植到其他棋类游戏中。中国象棋也可以用这种方法来表示,本程序将采用坐标方式。本系统定义了一个int型的二维数组xArray910用来表示棋盘上每个格点在窗口的横坐标,和一个用来表示棋盘每个格点在窗口纵坐标的int型二维数组yArray910。两个数组组合用来表示棋盘每个格点在整个窗口的具体位置。对xArray910、yArray910的初始化代码如下:for(int i=0;i9;i+) for(int j=0;j10;j+) xArrayij=cX+50*i; yArrayij=cY+50*j; 其中(cX、cY)表示棋盘坐

29、上就在窗口的坐标。如图2-1中红方帅的坐标可以用(xArray49,yArray49)来表示该棋子在窗口中实际的坐标,以便与在该位置准确绘制图形。另外系统设置相临坐标点的间隔增量为50个象素点,如|xArray00-xArray01|=50,这样以来整个棋盘映射到主窗口的像素范围被限制在(0,0)-(400,450)之间(单位:象素)。3.1.2棋子信息数组中国象棋作为一种双方对阵的棋牌类竞技项目,棋子共有三十二个,分为红黑两组,各有十六个,由对弈的双方各执一组。兵种是一样的,分为七种:帅(将)、仕、相(象)、车、马、炮、兵(卒)。红方持有棋子:帅一个,仕、相、车、马、炮各两个,兵五个。黑方持

30、有棋子:黑方有将一个,士、象、车、马、炮各两个,卒五个。其中帅与将;仕与士;相与象;兵与卒的作用完全相同,仅仅是为了区别红棋和黑棋而已。为了更加方便的表示棋子的类型,除了用于保存坐标信息的二维数组xArray910、yArray910外,我们还需要引进一个二维数组用来保存该坐标点的棋子信息,比如:在(xArray02、xArray02)上的是哪颗棋子?亦或着是空位?本系统引入了新的一个int型二维的数组InfoArray910,很显然它也是一个910的数组,用来保存棋盘上所有90个格点的棋子信息。现将InfoArray数组的取值范围极其定义列与下表:表3-1InfoArray01234567D

31、EF空位红车红马红相红士红帅红炮红兵InfoArray011121314151617DEF空位黑车黑马黑象黑仕黑将黑炮黑卒根据上表,位于坐标点(xArray49,yArray49)位置的红帅的棋子类型表示为InfoArray49=5。当棋面改变,形成有效走棋时,只需更新对应坐标点的InfoArray的值即可,如红方走棋“炮二平五”对应的原信息InfoArray77=6,InfoArray47=0改变为InfoArray77=0;InfoArray47=6,以实现走棋的数据更新。3.1.3变量与函数表3-1 部分变量定义变量类型定义xArrayInt型二维数组保存棋盘格点的横坐标yArrayIn

32、t型二维数组保存棋盘格点的纵坐标InfoArrayInt型二维数组保存棋盘格点的棋子类型GetChessmanstatic int判断棋子是否选中RedOrBlackstatic int判断轮到哪方走棋Prei,Prejstatic int前一个坐标点preceding i,jMytrunstatic int联机时用于判断是否本方走棋UpdateAllDatalong int棋盘更新的信息ReplayX1-Y2Int保存棋子行走路径,回看之用CUpdateAllDataChar转换成char型的UpdateAllData,用做网络传输WinBool判断是否已有一方胜利OnlineBool判断是

33、否联机AcceptBool网络联机接受对方邀请Accept=trueAccept2Bool网络联机邀请对方,对方接受Accept2=trueNetExitBool当用户强行退出时,这个变量决定是否向对方发送消息表3-2 部分函数定义函数定义bool ChessRule(int x1,int y1,int x2,int y2,int info1,int info2)判断走棋规则bool Connect()网络联接void Draw(int x,int y,int info)绘图函数void DrawChessman()绘制棋位对应棋子void DynamicChessman(int x,int

34、y)实现拿起的棋子动态显示void Graphics(int x,int y,int RorB,LPCTSTR ChessmanName)绘制棋子void InitChessBoard()初始化棋盘函数bool Listen(int PortNum)Ccomm类数据接受函数bool SendMsg(char *Msg,int Len,char *host,short port)Ccomm类数据发送函数3.2图像绘制3.2.1主窗口VC+6.0提供了多种窗口样式,这里选用比较简洁的WS_POPUPWINDOW样式,WS_POPUPWINDOW创建一个和WS_BORDER, WS_POPUP和WS

35、_SYSMENU一起使用的弹出式窗体,WS_DISABLED创建一个初始不可用的窗体,WS_POPUP创建一个弹出式窗体,WS_SYSMENU创建一个在标题栏有控件菜单框的窗体,窗口大小为650550象素,在InitInstance()中交由CreateWindow()实现。至于棋盘底纹在PhotoShop中手工绘制保存为bmp格式(注意:格点间距应保持50象素),在WM_PAINT消息响应中交由BitBlt()函数输出至窗口。窗口中的按钮,对话框等则在WM_CREATE消息响应中创建。3.2.2棋盘的绘制使用photoshop绘制带有底纹棋盘,保存为bmp格式,并且设置每一格的增量为50像素

36、,便于棋盘上每个格点坐标的表示。在WM_PAINT消息响应中交由BitBlt()函数输出至窗口。如图:图3-2 棋盘3.2.3棋子的绘制及初始化在Windows中有各种图形用户界面GUI(Graphics User Interface)对象,当我们在进行绘图时就需要利用这些对象。窗口中的开始(重设)按钮负责初始化棋盘,通过调用InitChessBoard()函数来实现:InitChessBoard()函数中首先通过一个for循环将棋盘90个格点的屏幕坐标赋值给xArrayij和yArrayij,同样用一个for循环给InfoArrayij赋值全部清零,再按照棋盘棋子的初始位置给InfoArra

37、yij赋上相应的值(如InfoArray00=InfoArray80=11,表示黑方两个车位)。完成上述操作后调用InvalidateRect(hWnd,NULL,1)函数更新视图,当调用这个函数的时候,Windows会在WM_PAINT消息响应中完成对窗口的重绘,我们在此加入绘制棋子函数DrawChessman()。这个函数只是绘制棋子的一个入口,具体过程如下:DrawChessman()Draw()Graphics()开始其中DrawChessman()函数通过一个for循环遍历数组InfoArray,传递InfoArrayij数值并调用Draw()函数Draw()函数根据InfoArra

38、yij的数值选择所要绘制的棋子,并将信息传递给函数Graphics()Graphics()根据传递过来的信息(包括绘制点坐标信息,所绘棋子信息)调用绘图函数Ellipse()和TextOut()来完成棋子最终在窗口中的显示。Ellipse()和TextOut()均为系统函数,前者用来绘制椭圆,后者用与输出字符,两个函数配合即可绘制出棋子。void InitChessBoard()实现对棋盘各格点初始化(InfoArray赋值)InvalidateRect(hWnd,NULL,1)刷新视图WM_PAINT消息响应中调用绘制棋子入口函数DrawChessman()绘制棋位对应棋子绘制棋位对应棋子v

39、oid Draw(int x,int y,int info)传递绘制信息void Graphics()完成最终图形绘制图3-3 棋盘初始化3.2.4动态显示有时候当用户拿起棋子后,不一定急着放下去,而短暂的思考后未必能记得住刚刚拿起的棋子是哪颗,应该给拿起的棋子做非常规显示,本系统采用动态显示。这段动态显示的代码应该放在WM_MOUSEMOVE消息响应中,如果一时忘记自己选择了那颗棋子,只要移动一下鼠标,拿起的棋子就会动态显示,而条件就是变量get=1(在操作时为其赋值)。当用户移动鼠标时,根据get是否为1判断是否调用DynamicChessman来实现棋子动态显示。来看一下DynamicC

40、hessman,它带有两个参数Prei和Prej,即棋子的坐标i,j值,根据这个值可以得到该棋子屏幕坐标ArrayPreiPrej,棋子信息InfoArrayPreiPrej。动态显示就是通过一个for循环将棋子的底格半径(EllipseSize)由23以步进1增长至28,字体大小FontSize由30以步进2增长至40,如此循环。3.2.5回看功能为了方便玩家,本系统还加入了会看功能,使玩家可以回看对方刚走过的起步。玩家落棋后,将棋子原坐标(xArrayPrei Prej,yArrayPrej Prei)和更新后的坐标(xArrayij,xArrayij),分别保存在(xArrayRepla

41、yX1ReplayY1,yArrayReplayX1ReplayY1)和(xArrayReplayX2ReplayY2,yArrayReplayX2ReplayY2),玩家选择回看时系统调用所保存的两个坐标点,调用函数Polyline()将其用白线连接,以提示玩家。图3-4 回看3.3规则设置3.3.1棋子规则在对局时,由执红棋的一方先走,双方轮流各走一步,直至分出胜负为止。轮到走棋的一方,将某个棋子从一个交叉点到另一个交叉点,或者吃掉对方棋子而占领交叉点,都算走了一步。双方各走一步,成为一回合。任何棋子在走动时,如果一方棋子可以到达的位置有对方的棋子,就可以把对方棋子拿出棋盘(称为吃子)而换

42、上自己的棋子。只有炮的吃子方式与它的走法不同:它和对方棋子之间必须隔一个子(无论是自己的还是对方的),具备此条件才能吃掉人家。一定要注意,中隔一个棋子,这个棋子俗称“炮架子”。一方的棋子攻击对方的将(帅),并且在下一步能把它吃掉,俗称“将军”。被“将军”的一方必须立即“应将”,即用自卫的步法曲化解被“将军”的状态。如果被“将军”而无法“应将”,就算被“将死”,输掉本局。轮到走棋的一方将(帅)虽没被对方“将军”,却被禁在一个位置上无路可走,同时己方其他棋子也都不能动,就算被“困死”,同样输掉本局。将(帅):将和帅是棋中的首脑,是双方竭力争夺的目标。它只能在“九宫”之内活动,可上可下,可左可右,每

43、次走动只能按竖线和横线走动一格。江河帅不能在同一竖线上直接面对,否则判走方输棋。士(仕):士(仕)是将(帅)的贴身保镖,它也只能在“九宫”内走动。它的行棋路径只能是“九宫”内的斜线。象(相):象(相)的主要作用是防守,保护自己的将(帅)。它的走法是每次循对角线走两格。俗称“象走田”。象(相)的活动范围限于“河界”以内的本方阵地,不能过河,且如果它走的“田”字中央有一个棋子的时候,就不能走,俗称“塞象眼”。车:车在象棋中威力最大,无论横线、竖线均可行走,只要无子阻拦,部署不受限制。因此一车可以控制十七个点,故有“一车十子寒”之称。炮:炮在不吃子的时候,走动与车完全相同。马:马在走动的方法是一直一

44、斜,即先横着或竖着走一格,然后再斜着走一个对角线,俗称“马走日”。马一次可走的选择点可以达到四周的八个点。故有“八面威风”之说。如果在要去得方向有别的棋子挡住,马就无法走过去,俗称“蹩马腿”。卒(兵):兵(卒)在未过河前,只能向前一步步走,过河以后,除不能后退外,允许左右移动,但也只能一次一步,即使这样,兵(卒)的威力也大大增强,故有“过河的卒子顶半个车”之说3.3.2规则算法马走日字,相飞田字,七种棋子,七种不同的走法,映射到程序中来,必须有一个函数来约束其行动。本系统中的运用bool型ChessRule()函数来设置规则约束,当用户点击拿起棋子,在再次点击目的地时程序将调用函数ChessR

45、ule()来判断着法是否可行,不可行返回false,反之则返回true。函数的参数(x1,y1)为原棋子坐标,(x2,y2)为目的坐标,info1,2 为两坐标点信息,当info1表示的棋子颜色同与info2时(红色值:1-7,黑色值:11-17),即“吃”己方子,直接返回false。将(帅):首先判断走步是超出活动范围,将(帅)的活动范围为“九宫”,当x25超出活动范围,同理y22、y24,黑象的活动范围为x25。若超出活动范围,系统提示走棋错误。若在活动范围之内,根据规则,当|x2-x1|=2、|y2-y1|=2时,判断是否“塞象眼”,InfoArray(x1+x2)/2(y1+y2)/2=0时,表示没有塞象眼,走棋成功,否则系统提示走棋错误。车:当不满足x1=x2或y1=y2时,系统提示走棋错误。当满足条件时,判断两子之间是否还有其他棋子存在,用for循环语句对格点(xArrayx1y1,yArrayx1y1)和格点(xArrayx2y2,yArrayx2y2)之间的所有格点进行扫描,若之间所有格点的类型值InfoArrayij=0,表示两子之间没有其他棋

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号