当我们想写一个棋类游戏的时候,不难发现,很多棋类游戏的棋盘都可以用一个二维数组表示,比如:
井字棋(3*3的二维数组)、黑白棋(8*8的二维数组)、五子棋(15*15的二维数组)等等
使用二维数组表示棋盘,数组的下标就是棋子的坐标,数组中的值就是棋子的状态。
好处就是数据访问比较直观,可直接根据下标快速找到某个位置的棋子的状态。
但缺点也是很明显的
比如:
首先是遍历棋盘需要用双重循环处理横坐标跟纵坐标;
其次是判断棋子状态,比如以上所说的三种棋子,需要判断行、列以及斜线8个方向上的棋子状态,因为根据行、列和斜线的下标变化特点,加上判断的算法不统一,需要用多套不同的方法来处理。
针对这种情况,我来给大家介绍一种方法,正如标题所示,用一维数组来表示棋盘状态,那么用一维数组该怎样才能表示一个二维数组呢?
我们用井字棋做为例子来说:
首先来看看用二维数组表示井字棋棋盘:
0 1 2
0 x x x
1 x x x
2 x x x
其中X就是代表棋盘的每个位置,0、1、2就是每个位置的坐标,比如第二个棋子的坐标是(0,1),第六个棋子的坐标是(1,2)
假如起点在第一个棋子,即(x = 0,y = 0)这个位置,那向下走就需要执行一次x + 1, y + 0,才能向下走一格。其他方向同理,都需要处理两个值。
好了,用二维数组表示的就不多说了,相信大家都知道怎么做的,下面来讲讲这次的主题:用一维数组表示,用一维数组表示的有两种方法:
第一种:
0 1 2
3 4 5
6 7 8
直接有多少个棋子就开多大的数组,例如:井字棋有3*3 = 9个,所以用长度为9的一维数组表示棋盘,这样在二维数组中的第一行编号为0 1 2,第二行编号为3 4 5,第三行编号为6 7 8.。即一维数组中的6个元素表示二维数组中的第3行第1个。
这样虽然损失了数据访问的直观性,但它处理数据更加简洁,只需一层遍历就能搜索整个棋盘,不需要关注两个下标。那它是怎么向各个方向走的呢?
其实看上面那个图就不难找到个规律,
向左步进量为1,
向下步进量为3,
向右下步进量为4,
向左下步进量为2,
跟以上各自相反方向的步进量则取负;
这样我们就可以用一个一维数组来表示步进量:
int dir[4] = {1,3,4,2};