出于学校AI课程的设置,有一项可选的大作业是五子棋游戏,由于我比较倾向于实用主义,觉得做出来的东西可以玩才是王道,所以便选择了五子棋。由于之前的数据结构课程设计已经有了C#的使用基础再加之一个学期软件工程课程的锻炼,于是乎这次的设计我就想以非常标准化的方法来实现。
我这次并不会给出完整的游戏源代码,但整个游戏的结构我一定会力求完整的展现给大家,这样做也是希望大家能留有足够的思考空间,根据我自己的经验,看了别人的代码之后再自己写,多半也是循着那套思路在走,这样不利于学习。
五子棋大家都很熟悉,老少皆宜,规则相对比较简单,上手容易,但是要想成为高手,也是要下很大一番努力的。大家所熟悉的五子棋规则中主要分为“有禁手”,和“无禁手”两种,考虑到课程作业的简单性原则,以及其使用者(我?)五子棋水平有限,故在判断输赢方面,以“无禁手”的规则为标准。
五子棋的棋盘是一个15 * 15的方格棋盘,如下图所示:

棋盘

由黑方执棋者先行,黑白两方交替放子,先使五个棋子连珠成线者获得当盘的胜利。
从这里我们就已经能够分析出游戏所需的最核心的两部分:

  • 游戏规则 – 两个玩家交替行棋,在棋盘上放置各自的棋子,并在放置后对输赢加以判断
  • 棋盘 – 一个能够放置棋子,保存棋局的空间

由此我们已经可以得知,游戏最基本的数据结构就是棋盘了,而游戏规则则是依赖于棋盘的游戏流程控制的一系列方法。
根据上面的分析,我们可以构造出这样一个类图:
类图
为了保存棋盘上每个格子的独特信息,棋盘类还包含了一个“棋盘格”嵌套类,主要用于标识棋盘格上的棋子类型(黑、白或空)。这两个类属于依赖关系,在游戏类要保存当前棋局的状态以及当前的行棋人,玩家可以通过放置棋子的方法来在棋盘上进行下子,并且在下子之后立刻进行输赢判断并且在未获胜的情况下自动地将行棋人切换为另一位玩家。

在这个格局下,我们需要设计一个UI,这个UI依赖于游戏类,它使用游戏类所提供的各式方法,以完成用户和游戏的各种交互操作,UI用C#很容易实现,并且也能够很方便的加入一些小特性,不过最基本的功能必须要有:

  1. 开始一盘游戏
  2. 利用鼠标在棋盘上放置棋子
  3. 结束一盘游戏

UI
我们知道,在用户界面上不应该有过多的游戏逻辑操作,所以上面的这些功能都是依赖于游戏类提供的方法来实现的。
上面的类在实现过程中,我们还需要一个工具类,主要用于存储游戏所需的各种常量、资源以及工具函数,这个类目前大致是下面这个样子,其内容的含义大家稍微看看就能看懂,这里额外要说的就是那几个工具函数中的C2I等,这其实是将鼠标坐标离散为棋盘格坐标的函数,用于UI类,相应的I2C等则是转换出一个根据棋盘坐标绘制棋子及相应标识图片坐标的函数,其余的这里就不再赘述了。
工具类
至此,我们这个五子棋游戏的整体框架就已经构造好了,我们只需要在这个框架下将其方法进行实现,就可以完成最基本的目标:双人对战。关于这部分,我将在下一篇博客中讲述。

说点什么

您将是第一位评论人!

  Subscribe  
提醒