一个图案小方块都有与其对应的完全一样的另外一个小方块,如图 4-1 所示。
图 4-1 游戏地图设计图 如图 4.1 所示,整个游戏游戏区域被抽象成一个有坐标位置属性的平面,平面上零散地分布着若干个小方块,并且这些小方块的物种起码是成对出现的。
经过前面的描述和分析后,可以把游戏区域地图用一个数组 m_map 来表示。
m_map是把地图设计成一个动态分配的 int 整形一维数组,对地图中的行列数的表达,用一个转换法则即可。
可以在 LinkToLinkDlg 类对象定义中添加地图核心数据的成员变量,具体如下: //地图位置相关属性组 int m_map //动态地图数据头指针一维数组 int m_nRow //地图的行数虚拟 int m_nCol //地图的列数虚拟 上面的成员变量中定义了一个整形指针标量 m_map,用于记录动态分配出来的一维数组地图空间的首地址。
对于地图区域中的某个小方块的类型,可以用一个整形的 ID 来进行识别。
这里为标识地图的行列位置分别添加 m_nRow 和m_nCol 变量。
现在,地图的数据结构已经设计好。
下面对游戏进行初始化。
由于方块需要成对地出现,因此在做地图的初始化时,不仅仅是对动物种类做简单的随机取数,然后将该随机选取出来的物件放到地图区域中去就了事,而是需要成对地对物种进行成对选取,就是说地图中的小方块必须是偶数个。
前面提到过,把地图数组设置成动态分配方式,目的是让其数据空间可以根据行列数的需求动态地获取,而对于实际不同大小比例的地图可以预先定义几组关于行列数的宏来实现。
当需要创建时,根据宏值的不同分配不同大小的地图空间即可。
接下来在 LinkToLinkDlg 类的构造函数对地图数据进行相关的初始化: define ROWCOUNT 8 //行数 define COLCOUNT 12 //列数 CLinkToLinkDlg::CLinkToLinkDlgCWnd pParent /NULL/ : CDialogCLinkToLinkDlg::IDD pParent …… //初始化行列数 m_nRowROWCOUNT m_nColCOLCOUNT //根据行列数动态分配内核数据数组空间 m_mapnew intm_nRowm_nCol CLinkToLinkDlg::CLinkToLinkDlg //释放动态数组空间 delete m_map 在 LinkToLinkDlg 类对象的实现中,定义了一些关于地图行列数的宏,如ROWCOUNT 和 COLCOUNT,并且在 LinkToLinkDlg 类对象的构造函数中,进行了行列的真实确认赋值,并根据当前行列数的大小对地图数据空间进行动态创建。
因为地图数据是用 new 在堆栈动态创建的,所以在销毁该对象时要将这些内存空间释放,如代码所示在 LinkToLinkDlg 类对象的析构函数中调用 delete 将m_map 指向的所有空间都释放掉。
4.2 初始化工作 接下来,再分配好的空间中放上适当的图案方块物件,对数据进行初始化。
即需要对地图空间内的数据进行成对性的随机布局,因此可以将该功能的实现封装在 StartNewGame 函数里面,其代码如下: void CLinkToLinkDlg::StartNewGame //初始化地图将地图中所有方块区域位置置为空方块状态 forint iNum0iNum