基于c的网络军棋设计毕业设计(编辑修改稿)内容摘要:

类类型、值类型和接口类型的概念形成了统一的类型系统。 尽管 C 提供了如此多的新鲜概念,但实际上,这些概念都是由 CLI 提出的。 因此当将一个 C源程序编译为可执行文件时,编译器做的工作相对而言并不多。 需要编译器代劳的是要将一个简单的委托定义语句翻译为一个继承 型定义 [10]。 C 微软在 20xx年的 6月份发布了 Visual Studio20xx的第一个 Beta 版,同时向开发者展示了 C语言的。 20xx年 4月,微软发布了 Visual Studio 20xx Beta2,这已经是具备了几乎全部功能的 VisualStudio,包括的产品有 SQL Server20xx、 Team Foundation Server 和 TeamSuite。 这时的 C编译器已经能够处理 C。 C 是泛型编程能力。 和面向对象思想一样,泛型思想也是 一种已经成熟的编程思想,但依然是没有哪一种主流开发语言能够支持完备的泛型概念。 这主要是因为泛型的概念在一定程度上对面向对象概念进行冲击,同时,由于在编译期间对类型参数的完全检测很难做到,很多问题会被遗留到运行时。 C 沈阳理工大学学士学位论文 9 别出心裁,对泛型类型参数提出了 “约束 ”的新概念,并以优雅的语法体现在语言之中。 有了约束,结合编译器强大的类型推断能力,可以在编译时发现几乎所有 “危险 ”的泛型应用。 C ,用来取代一些短小的并且仅出现一次 的委托,使得 语言结构更加紧凑。 匿名方法除了可以使得事件处理器的编写更加精简以外,还将开发者带入了程序设计的一个新的领域 ——函数式编程,曾经有高人就用匿名方法结合泛型编程实现了函数式编程中的重要结构 —— Lambda 表达式。 尽管这种实现显得很繁琐而且不易理解,但毕竟是实现了 [11]。 C(研发代号 “Orcas”) 20xx年 9 月份的 PDC 大会 ——C(研发代号 “Orcas”——魔鬼)的技术预览版。 说到 C , 就不得不提一下微软的 LINQ 项目, LINQ(语言集成查询, Language Integrat ed Query)提出了一种通过面向对象语法来实现对非面向对象数据源的查询技术,可查询的数据源从关系型数据库延伸到一般意义上的集合(如数组和列表)以及 XML。 而 C LINQ 的语言。 在 C ,可以用类似于 SQL 语句的语法从一个数据源中轻松地得到满足一定条件的对象集合。 例如要查找一个字符串数组 names 中所有长度大于 5的字符串,就可以写: var longname = from n in names 5 select n。 这样就 得到一个新的字符数组 longname,其中包含了所需要的结果。 这种语句称作查询语句,与 SQL 语句唯一的区别是 C中的查询语句往往把 select 子句放到最后(这反而倒有些类似于中文的阅读顺序了)。 初次看到这样一个语句,可能会有很大疑问:这还是 C语言吗。 这的确是合乎语法规则的 C代码,而且编译器可以识别这种语法。 然而实际上, C编译器并不会对这种语法进行实际的的编译,而是将其翻译为正常的方法调用。 C 动态编程 C 新增 dynamic 关键字,提供动态编程( dynamic programming),把既有的静态物件标 记为动态物件,类似 javascript, Python 或 Ruby[12]。 协议 在 命名空间下,有专门 UDP 编程的 UdpClient 类。 这个类提供更直观的易于使用的属性和方法,从而降低 UDP 编程的难度。 沈阳理工大学学士学位论文 10 UdpClient 类的构造函数有以下几种格式: UdpClient() UdpClient( int port) UdpClient( IPEndPoint iep) UdpClient( string remoteHost, int port) UdpClient 的常用方法如下。 ()方法 调用 Send()方法来实现发送数据,但是在将数据发送到远程主机后,不接受任何形式的确认。 该方法返回数据的长度,可用于检查数据是否已被正确发送。 常用格式: [格式 1]: Send( byte[] data, int length, IPEndPoint iep) 参数: data 为发送的数据(以字节数组表示), length 为发送的数据长度, iep 是一个IPEndPoint 对象,它表示要将数据发送到的主机和端口。 返回值是已发送的字节数。 知道远 程计算机 IP 地址使用此格式。 下面是用 UdpClient 发送 UDP 数据包的具体调用例子: IPAddress HostIP=new (“远程计算机 IP 地址 ”); IPEndPoint host=new IPEndPoint(HostIP , 8080)。 (“发送的字节 ”, “发送的字节长度 ”, host); [格式 2]: Send( byte[] data, int length, string HostName, int port) 参数: data 为发送的数据( 以字节数组表示), length 为发送的数据长度, hostname 为要连接到的远程主机的名称, port 为要与其通信的远程端口号,返回值是已发送的字节数。 () Public byte[] Receive( ref IPEndPoint remoteEP); 参数 remoteEP 是一个 IPEndPoint 类的实例,它表示网络中发送此数据包的节点。 如果指定了远程计算机要发送到本地机的端口号,也可以通过侦听本地端口号来实现对数据的获取,下面就是通过侦听本地端口号 “8080”来获取信息代码: Server=new UdpClient(); receivePoint=new IPEndPoint( new IPAddress( “”), 8080); Byte[] recData=( ref receivePoint); 用于在指定的本机端口上接收数据,并将接收到的数据作为 byte 数组返回。 沈阳理工大学学士学位论文 11 ()方法 添加对地址发送,用于连接一个多播组。 ()方法 关闭连接。 UDP 是无连接协议,客户端只需要将服务器的地址以及端口填写 正确,对方一定收得到。 就像你到邮局去寄信,你只要把收信人的地址写正确,不管写不写你的地址,别人一定都收得到 [13]。 的 UdpClient 类 UdpClient 类开发 UDP 程序要实现接收数据和发送数据。 具体过程如下。 ( 1) 在发送方,调用 Send 方法 UdpClient publisher=new UdpClient(“ ”, 8899); Byte[] buffer=null。 Encoding enc=。 String str =info。 //info 为 要传送的字符串信息 Buffer=(())。 (sddata,)。 //传送信息到指定的计算机 或者 UdpClient SendUp=new UdpClient()。 remoteIP=(“ ” ); IPEndPoint remoteep=new IPEndPoint( remoteIP, 8899); Byte[] buffer=null。 Encoding enc=。 String str=info。 Buffer=(())。 (buffer,remoteep)。 //传送信息 ( 2) 在接收方,调用 Receive 方法来接收数据; Udpclient=new UdpClient( 8899); //侦听本地的端口号 8899 Remote=null; Encoding enc=。 //设定编码类型 Byte[] data=(ref remote)。 //得到对方发送来的信息 沈阳理工大学学士学位论文 12 String strData=(data)。 //字节数据变换为字符串 strData P2P 技术 PeerToPeer 即点对点,通常简写为 P2P。 所谓网络中的点对点,其实可以看成是一种对等的网络模型。 P2P 其实是实现网络上不同计算机之间,不经过中继设备直接交换数据或服务的一种技术。 P2P 由于允许网络中任一台计算机可以直接连接到网络中其他计算机,并与之进行数据交换,这样既消除 了中间环节,也使得网络上的沟通变得更容易、更直接。 P2P 作为一种网络的模型,它有别于传统的客户 /服务器模型。 客户 /服务器一般都有预定义的客户机和服务器。 而在 P2P 模型中并没有明确的客户端和服务器,但其实在P2P 模型中,每一台计算机即可以看成是服务器,也可以看成是客户机。 在网络中,传统上的客户 /服务器模型中,发送服务请求或者发送数据的计算机,一般称为客户机;而接受、处理服务或接收数据的计算机称为服务器。 而在 P2P 网络模型中,计算机不仅接收数据,而且发送数据,不仅提出服务请求,还接受对方的服务请求。 P2P 是 一种用于不同 PC 用户之间,不经过中继设备直接交换数据或服务的技术,它允许 Inter 用户直接使用对方的文件。 每个人可以直接连接到其他用户的计算机,并进行文件的交换,而不需要连接到服务器上再进行浏览与下载。 因为消除了中间环节,P2P 技术使得网络上的沟通变得更容易、更直接。 P2P 改变了 Inter 现在的以大网站为中心的状态,重返 “非中心化 ”,并把权限交还给用户 [14]。 沈阳理工大学学士学位论文 13 4 软件整体设计 界面设计 下棋需要有棋盘,程序中通过在窗体激活时在图片框控件 qi_pan 上显示军棋棋盘图片文件。 有了盘还需要棋 子,这里使用图 中的图片表示棋子。 另外还有 和 两个图片表示红方和绿方暗子。 使用控件数组 Qizi_Pic[ ]的 Add 方法加载了我们所需要的棋子图片控件并使用相应图片。 Qizi_Pic[ ]中下标 i的含义是:如果 i 小于 24,那么说明它属于红方的棋子,否则是绿方的棋子。 同时 Qizi_Pic[i]的 tag 属性保存了棋子在控件数组的索引号。 在界面中要求用户输入对方 IP、端口(本地及对方远端),同时按图 添加 “联机 ”、“重新开始 ”、 “退出 ”、 “保存布阵 ”、 “读取布阵 ”、 “开始对战 ”6 个按钮 以及一些提示用的标签。 ( a)红方军棋棋子图片 ( b)绿方军棋棋子图片 图 沈阳理工大学学士学位论文 14 图 网络两人对战军棋设计界面 棋盘数据结构 棋盘的数据结构采用 1717 二维数组 Map 存储。 X, Y 坐标原点是棋盘左上角。 虽然使用四人玩的棋盘,本游戏主要是上下两个区域,其他区域可以走棋。 例如,上方玩家棋子布阵所在区域是( 7,1)到( 11,6)范围,下方玩家棋子布阵所在区域是( 7,12)到( 11,17)范围 [15]。 通信协议设计 网络程序设计的难点在于与对方需要通信,这里使用了 UDP( User Data Protocol)。 UDP 是用户数据文报协议的简称,两台计算机之间的传输类似于传递邮件;两台之间没有明确的连接,使用 UDP 协议建立对等通信。 这里虽然两台计算机不分主次,但我们设计时假设一台做主机(红方),等待其他人加入。 其他人想加入的时候输入主机的 IP。 为了区分通信中传送的是 “输赢信息 ”、 “下的棋子位置信息 ”、 “重新开始 ”等,在发送信沈阳理工大学学士学位论文 15 息的首部加上代号。 定义了如下协议: 命令 |参数 |参数 …… join| move|x, y, idx, old_x, old_y, old_idx 其中,棋子移动的目标位置坐标是( x, y),棋子移动的起始位置坐标是( old_x,old_y)。 old_idx 是被移动棋子的控件数组索引号, idx 是目标位置留下的棋子的控件数组索引号。 over|+赢方代号(赢了此局) reset| layout|布阵棋子信息 布阵棋子信息形式为 x, y, idx, x, y, idx…… idx 是( x, y)处的棋子的控件数组索引号。 注意本程序在传递布阵信息时,我们默认了是绿方在棋盘上方,红方在下。 但实际下棋如果棋手使用绿方, 这样看非累死不可,所以这里我们采取了个小技巧,在发送布阵数据时我们把坐标颠倒(把自己的棋盘颠倒),即( x, y)坐标以( 18x, 18y)坐标发给对方。 在下棋过程中,为了保存下过的棋子的位置使用了 Map 数组, Map 数组初值为 101,表示此处无棋子。 关于 0 到 24 的棋子含义如下在 qi_index()规定: private void qi_index() { Q = new int[25]。 Q[0] = 29。 //军旗 29 Q[1] = 30。 Q[2] = 30。 Q[3] = 30。 //地雷 30 沈阳理工大学学士学位论文 16 Q[4] = 31。 Q[5] = 3。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。