AIR Android:編寫(xiě)主類(lèi)Main(2)
編寫(xiě)主類(lèi)Main
在翻轉(zhuǎn)周邊棋子時(shí),由于要驗(yàn)證棋子的真實(shí)性,代碼稍顯煩瑣??偟恼f(shuō)來(lái),就是先獲取上下兩個(gè)棋子的id,以及左右存在的棋子的id,然后對(duì)棋子進(jìn)行翻轉(zhuǎn)。
翻轉(zhuǎn)完畢后,判斷棋子是否全部變白的代碼也很簡(jiǎn)單。代碼如下:
- var grid:Grid;
- for ( var i:uint = 0, len:uint = grids.length; i < len; i++)
- {
- grid = grids[i];
- //只要發(fā)現(xiàn)有一個(gè)棋子不是白色,則表明游戲還沒(méi)有結(jié)束
- if( grid.isWhite() == false )
- {
- //只要一個(gè)為false,則表示游戲還沒(méi)有結(jié)束
- }
- }
- }
我們的游戲只有一關(guān),因此用戶(hù)過(guò)關(guān)就意味著游戲結(jié)束。gameOver函數(shù)中,使用了一個(gè)文本框來(lái)顯示提示信息,由于和程序邏輯沒(méi)有聯(lián)系,這里略去不提。
至此,主程序的主要代碼介紹完畢,完整的代碼見(jiàn)代碼清單2-4。
代碼清單2-4 FlipIt項(xiàng)目的Main.as文件
- package
- {
- import flash.display.Sprite;
- import flash.display.StageScaleMode;
- import flash.display.StageAlign;
- import flash.events.Event;
- import flash.events.MouseEvent;
- import flash.text.TextField;
- import flash.text.TextFormat;
- import flash.text.TextFormatAlign;
- [SWF(backgroundColor="#B6B5C1")]
- public class Main extends Sprite
- {
- //使用常量增強(qiáng)程序的靈活性和可讀性
- private const BLACK:Boolean = false;
- private const WHITE:Boolean = true;
- private const GRID_RADIUS:int = 30;
- private var grid_container:Sprite;
- private var game_tip:TextField;
- //在數(shù)組元素的類(lèi)型確定的情況下,盡量使用Vector,而不用Array,性能更佳
- private var grids:Vector.<Grid> = new Vector.<Grid>();
- private var column_number:uint;
- public function Main():void
- {
- init();
- }
- private function init():void
- {
- //設(shè)置舞臺(tái)屬性,為了自動(dòng)適應(yīng)屏幕尺寸,必須設(shè)置
- stage.scaleMode = StageScaleMode.NO_SCALE;
- stage.align = StageAlign.TOP_LEFT;
- //創(chuàng)建棋子容器
- grid_container = new Sprite();
- addChild(grid_container);
- //創(chuàng)建文本框,用來(lái)顯示游戲結(jié)果
- game_tip = new TextField();
- var tf:TextFormat = new TextFormat("Droid Serif", 24);
- tf.align = TextFormatAlign.CENTER;
- game_tip.defaultTextFormat = tf;
- game_tip.width = stage.stageWidth;
- game_tip.y = 500;
- game_tip.selectable = false;
- addChild(game_tip);
- //創(chuàng)建棋盤(pán)
- createMap();
- //將棋盤(pán)屏幕居中放置
- grid_container.x = (stage.stageWidth - grid_container.width) / 2;
- grid_container.y = 120;
- //利用事件流的冒泡機(jī)制,只監(jiān)聽(tīng)容器的鼠標(biāo)單擊事件
- grid_container.addEventListener(MouseEvent.CLICK, onClickHandler);
- }
- private function createMap():void
- {
- 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];
- //列數(shù)
- column_number = 4;
- //總行數(shù)
- var rowCount:uint = gameMap.length;
- //臨時(shí)變量
- var rowArray:Array;
- var i:uint, len:uint;
- var grid:Grid;
- //棋子的間距
- var space:int = 10;
- //根據(jù)數(shù)組創(chuàng)建棋盤(pán)
- for ( var row:uint = 0; row < rowCount; row++)
- {
- //獲取每一行的數(shù)據(jù)
- rowArray = gameMap[row];
- len = rowArray.length;
- for ( i = 0; i < len; i++)
- {
- //創(chuàng)建Grid,并賦予初始值。GRID_RADIUS常量定義了棋子的尺寸
- grid = new Grid(rowArray[i], GRID_RADIUS);
- //計(jì)算出棋子在棋盤(pán)上的編號(hào)
- grid.id = row * column_number + i;
- //設(shè)置棋子的坐標(biāo)
- grid.x = i * (GRID_RADIUS*2 + space);
- grid.y = row * (GRID_RADIUS*2 + space);
- grid_container.addChild(grid);
- //按照編號(hào)將棋子保存在數(shù)組中,待以后查找
- grids[grid.id] = grid;
- }
- }
- }
- private function onClickHandler(e:MouseEvent):void
- {
- e.stopImmediatePropagation();
- var grid:Grid = e.target as Grid;
- //只有單擊的對(duì)象是棋子才執(zhí)行后面的代碼
- if ( grid == null) return;
- //翻轉(zhuǎn)當(dāng)前單擊的棋子
- grid.doFlip();
- //同時(shí)翻轉(zhuǎn)周?chē)?個(gè)棋子
- 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();
- }
- }
- private function gameOver():void
- {
- grid_container.removeEventListener(MouseEvent.CLICK, onClickHandler);
- game_tip.text = "順利過(guò)關(guān)!";
- }
- private function isAllWhite():Boolean
- {
- var grid:Grid;
- for ( var i:uint = 0, len:uint = grids.length; i < len; i++)
- {
- grid = grids[i];
- if( grid.isWhite() == false )
- {
- return false;
- }
- }
- return true;
- }
- }
- }