编写主类Main
接下来编写主类Main的代码。按照之前的设计,主程序主要有以下两个功能:
创建棋盘
处理用户的交互动作
下面先来实现***个功能。
1.创建棋盘
上一节使用了二维矩阵来描述地图数据,其实编写代码没那么复杂,直接用一个二维数组就可以实现这个功能,代码如下:
- var gameMap:Array = new Array();
- //每一行用一维数组来表示
- gameMap[0] = [BLACK, WHITE, WHITE, BLACK];
- gameMap[1] = [WHITE, BLACK, BLACK, WHITE];
- gameMap[2] = [WHITE, BLACK, BLACK, WHITE];
- gameMap[3] = [BLACK, WHITE, WHITE, BLACK];
BLACK和WHITE是两个常量,这样看起来更直观。利用数组,正好将地图上的信息全面展示出来,从中可以看到每个棋子的初始状态及在棋盘上的位置,创建棋盘的工作就变得简单多了,如代码清单2-2所示。
代码清单2-2 创建棋盘
- column_number = 4;
- var rowCount:uint = gameMap.length;
- var rowArray:Array;
- var i:uint, len:uint;
- var grid:Grid;
- //棋子的间距
- var space:int = 10;
- //根据数组创建棋盘
- for ( var row:uint = 0; row < rowCount; row++)
- {
- //获取每一行的数据
- rowArray = gameMap[row];
- len = rowArray.length;
- for ( i = 0; i < len; i++)
- {
- //创建Grid,并赋予初始值。GRID_RADIUS常量定义了棋子的尺寸
- grid = new Grid(rowArray[i], GRID_RADIUS);
- //计算出棋子在棋盘上的编号
- grid.id = row * column_number + i;
- //设置棋子的坐标
- grid.x = i * (GRID_RADIUS*2 + space);
- grid.y = row * (GRID_RADIUS*2 + space);
- //将棋子放在一个容器中,方便管理
- grid_container.addChild(grid);
- //按照编号将棋子保存在数组中,待以后查找
- grids[grid.id] = grid;
- }
- }
在创建棋盘时,使用数组grids保存了对所有棋子的引用,且棋子在数组中的索引和棋子在棋盘上的编号一一对应,这样在查找周边棋子时,只需要计算出周边棋子的id即可。
棋盘创建完毕后,接下来处理用户交互动作。
2.处理用户交互动作
由于所有的棋子都被放在同一个容器中,因此可以只对容器添加监听器,而不用监听每个棋子的鼠标事件,如代码清单2-3所示。
代码清单2-3 处理用户交互动作
- grid_container.addEventListener(MouseEvent.CLICK, onClickHandler);
- private function onClickHandler(e:MouseEvent):void
- {
- //由于没有其他地方监听对象的鼠标事件,因此中止冒泡事件
- e.stopImmediatePropagation();
- var grid:Grid = e.target as Grid;
- //只有单击对象是棋子才执行后面的代码
- if ( grid == null) return;
- //翻转当前单击的棋子
- grid.doFlip();
- //翻转周围的四个棋子,用一个临时数组存放周围棋子的id
- var ids:Array = new Array(grid.id - column_number, grid.id + column_number);
- //如果棋子是在最左端,则左边是空的,反之左边存在棋子
- if ( grid.id % column_number != 0 )
- {
- ids.push(grid.id - 1);
- }
- //如果棋子是在最右端,则右边是空的,反之右边存在棋子
- if ( grid.id % column_number != (column_number-1) )
- {
- ids.push(grid.id + 1);
- }
- //记录下棋子的总数
- var totalGrid:int = grids.length;
- //循环数组,翻转周围棋子
- for ( var i:uint = 0, len:uint = ids.length; i < len; i++)
- {
- var index:int = ids[i];
- //上面或下面的棋子可能不存在,需要判断,如果超过数组界限,则不存在
- if (index <0 || index >= totalGrid) continue;
- grid = grids[index];
- if ( grid != null )
- {
- grid.doFlip();
- }
- }
- //处理完棋子的翻转后,***检查当前棋子是不是都变白了
- if ( isAllWhite() )
- {
- //game over
- gameOver();
- }
- }