中国象棋游戏开发实战(C#)【三】

rufengit 2017-08-02 06:50:09
三、具体功能实现
1、绘制棋盘
千里之行始于足下,玩象棋首先要有棋盘,怎么绘制棋盘呢?我们在主窗体上添加一个PictureBox控件(命名为chessboard),就是图4中左侧的那个木纹控件,在他的上面用GDI+来画棋盘即可。提到GDI+绘图,就离不开OnPaint事件,这个事件对于C#程序员来说不算陌生吧?每当界面需要刷新时,就会调用OnPaint事件,我们需要做的就是在这个事件的处理方法中添加自己的绘图代码就可以了。

大家想一下,绘制棋盘是谁的职责呢?我们知道,在面向对象程序设计思想中,有一条很重要的规则,就是SRP(单一职责原则),一个类尽量只负责自己需要负责的职责,该谁的责任就是谁的责任,一个方法应该归属于他应该归属的类。很显然,棋盘类负责绘制棋盘,这一点我们在前面也说过。
OK,我们建立一个棋盘类,命名为ChessBoard,在该类中添加一个Draw方法,来负责绘制棋盘基本结构。Draw方法的声明如下:
  /// <summary>
/// 绘制棋盘
/// </summary>
/// <param name="g">Graphics对象</param>
public void Draw(Graphics g)
{
}

要绘制棋盘,首先要先把网格线画出来,就是中国象棋棋盘的10行9列的网格(图5)。原理很简单,就是调用Graphics对象的DrawRectangle、DrawLine等方法。

在这里需要先声明几个属性或变量:
BoradWidth:棋盘的宽度;
BoradHeight:高度;
LINE_WEIGHT:线条宽度;
sW:棋盘中每个小格子的宽度;
sH:棋盘中每个小格子的高度;
这里需要着重强调一下LINE_WEIGHT变量,为什么要声明线条宽度呢?因为我们平时用GDI+绘制矩形或直线时,很少会注意到线条的宽度,但在绘制棋盘的过程中,线条是会占用宽度的,只不过默认是1像素。图6表示了GDI+绘制直线时线条是占用宽度的,其中,AB之间的部分是代表线条宽度,红线为AB的中线,GDI+绘制直线时,以中线C为直线的X坐标,根据指定的宽度,在中线两侧渲染直线。

所以,绘制棋盘最外侧矩形边框的代码如下所示,需要考虑到线条宽度和外边框矩形和最外侧的留白部分(图7中的A、B两部分)。
  //绘制外边框
g.DrawRectangle(pen,
LINE_WEIGHT / 2 + sW / 2,
LINE_WEIGHT / 2 + sH / 2,
BoradWidth - LINE_WEIGHT - sW,
BoradHeight - LINE_WEIGHT - sH);

同理,绘制平行横线和平行竖线通过两个循环即可实现,如下。在绘制过程中,同样要考虑到线条宽度的影响。
//绘制纵向线段
for (float i = sW / 2 + LINE_WEIGHT / 2; i < BoradWidth; i += (sW + LINE_WEIGHT))
{
g.DrawLine(pen,
i,
sH / 2 + LINE_WEIGHT / 2,
i,
(LINE_WEIGHT + sH) * (BOARD_META_HEIGHT / 2 - 1) + sH / 2 + LINE_WEIGHT / 2);
g.DrawLine(pen,
i,
(LINE_WEIGHT + sH) * (BOARD_META_HEIGHT / 2) + sH / 2 + LINE_WEIGHT / 2,
i,
BoradHeight - sH / 2 - LINE_WEIGHT / 2);
}

//绘制横向线段
for (float j = sH / 2 + LINE_WEIGHT / 2; j < BoradHeight; j += (sH + LINE_WEIGHT))
{
g.DrawLine(pen, sW / 2 + LINE_WEIGHT / 2, j, BoradWidth - sW / 2 - LINE_WEIGHT / 2, j);


现在我们已经绘制好了棋盘的格子,至于九宫格、“楚河汉界”字样、炮位、兵位,道理都是一样的,这里就不再赘述了。OK,到现在为止,我们已经把棋盘的整体绘制完毕了。
在介绍如何绘制棋子之前,还要在棋盘类ChessBoard中添加一个byte类型的静态二维数组Matrix,定义如下,该数组用于记录棋盘矩阵各个位置处有没有棋子,有棋子的地方为1,没有则为0。
 /// <summary>
/// 棋盘矩阵
/// </summary>
public static byte[,] Matrix = new byte[BOARD_META_HEIGHT, BOARD_META_WIDTH];
...全文
188 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
基于Unity3D多平台网络斗地主的设计与实现毕业设计 目录 前言 1 第1章 概述 2 1.1 系统开发背景 2 1.2 设计的目的 3 1.3 设计的意义 3 第2章 开发环境及相关技术介绍 4 2.1 开发环境介绍 4 2.1.1 Unity3D简介 4 2.1.2 Visual Stdio2010和MonoDevelop 5 2.1.3 Xcode简介 5 2.2 C#语言和Javascript脚本 6 2.2.1 C#语言 6 2.2.2 Javascript语言 6 2.3 IOCP框架简介 7 2.3.1 IOCP内部工作队列图 7 2.3.2 程序实现IOCP模型的基本步骤 8 2.3.3 使用IOCP模型和不使用IOCP模型通讯的对比 8 2.4 本章小结 10 第3章 系统需求分析 10 3.1 用户功能需求分析 10 3.2 系统性能要求 10 3.3 可行性分析 10 第4章 总体方案设计 11 4.1 纸牌设计 11 4.1.1 牌型设计 11 4.1.2 出牌类型(游戏规则)设计 12 4.2 C/S模式 12 4.2.1 基于C/S模式的服务器端设计流程图 12 4.2.2 基于C/S模式的客户端设计流程图 12 4.3 游戏逻辑程序结构 13 4.3.1 数据层 13 4.3.2 控制层 13 4.3.3 显示层 14 4.4 游戏设计流程图 14 4.5 数学建模 15 第5章 详细设计与系统实现 16 5.1 斗地主洗牌算法 16 5.2 斗地主之"排序"算法 16 5.3 基于IOCP的Socket通讯 18 5.4 User对象的设计 19 5.4.1 玩家状态设计 19 5.4.2 玩家的属性以及手牌的操作方法 20 5.5 Table对象的设计 21 5.5.1 桌子状态设计 21 5.5.2 Table的属性及方法 21 5.6 粘包问题 23 5.6.1 TCP和UDP的介绍以及区别 23 5.6.2 粘包介绍及处理 23 第6章 发布和测试 25 6.1 服务器端性能检测 25 6.2 打包发布Android应用 27 6.2.1 导出Android设置 27 6.2.2 真机效果图 28 6.3 打包发布IOS应用 29 6.3.1导出IOS设置 29 6.3.2真机效果图 31 6.4 打包发布Web应用 32 6.4.1 关于UnityWebPlayer的SandBox Security(安全沙盒机制) 32 6.4.2 导出Web设置 32 6.4.3 运行结果 33 6.5 打包发布PC/Linux应用 34 6.6 整体测试效果 34 结束语 40 致谢 42 参考文献 43 附录A 网络斗地主的游戏规则 44 附录B 部分程序代码 47 前言 近年来,随着科技和互联网的飞速发展、智能手机的迅速普以及性能的不断提升,游 戏行业也突飞猛进,游戏已经逐渐成为人们公认的第九种艺术。现在各个平台上的游戏 逐渐涌现,从最初的红白机,到PC机再到XBox平台发展到如今的手机移动平台,从端游 到页游再到手游甚至是体感游戏等表现形式也逐渐丰富,当然成功的也数不胜数。比较 大型的游戏有:反恐精英、星际争霸、使命召唤,生化危机等。当然也涌现了诸多经典 的网络小游戏,比如麻将、拖拉机、中国象棋等。此外手机游戏,如愤怒的小鸟、保卫 萝卜、FlappyBird、切水果、捕鱼达人等也赢得许多人的青睐。这些各种各样形式的游 戏给如今生活在网络时代的人们带来了无限的生活乐趣。 斗地主是一款相当经典的游戏,当然前人也做了不少版本,有移动端,pc端甚至是W eb端的。可能他们在设计的过程中只是正对某一平台然后使用特性的开发技术来开发, 这样的话如果想要实现多平台的设计就需要极大的时间成本和劳力成本。而Unity3D引擎 的问世,最大的解决了这一问题,它能够实现一次开发多平台发布的特点,这也是为什 么Unity3D引擎在短暂的时间里能够发展的如此迅速的原因。将斗地主游戏从单机版到网 络化,使得现实中的多个玩家能够在同一个虚拟房间里面进行对局,并且能够实时的聊 天,同时还不会受到平台的限制,你可以选择pc,web或者是移动端,从而能更好的体验 游戏,娱乐生活。 第1章 概述 1.1 系统开发背景 随着Unity3D引擎的横空出世,游戏开发技术也变得越来越成熟,这款引擎也逐渐改 变了整个游戏圈的开发格局,之前火遍了全球的神庙逃亡就是基于Unity引擎开发的一款 比较成功的手游大作,这也更很好的证明了Unity作为一款游戏引擎还是值得开发者的信 赖。Unity相比较之前大家都熟悉的Unreal虚幻引擎,我认为Unity做的更好,它最值得 人称赞的就是它的跨平台性是其他游戏引擎无法匹敌的,Unity能够做到一次

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧