第四章 數位化數學遊戲的程式碼說明
第二節 河東獅吼遊戲
河東獅吼遊戲設計流程:(1)設定遊戲所需要的方格個數,再把這些方格依 序擺放到遊戲面板上,並賦予方格名稱以及平面座標。最後,將獅子擺放到所要 的位置,並設定這方格不可被點選。(2)將所有遊戲方格設定為按鈕,並寫入點 選方格後的動作:點擊一下滑鼠左鍵即選擇了長方形區域的一角,再點選任意一 個方格,就會針對所設定的規則條件做判斷,符合規則的就會圍出長方形區域。
(3)撰寫遊戲勝利條件:每次完成點選長方形區域後,會計算所以已經被圍住 的方格數目,當點選後累計數目達 35 的玩家,就是勝利者。
一、面版佈置-第一影格
h = 6; //設定面板長的格子數 v = 6; //設定面板寬的格子數 t = h*v; //設定操作面板總格數 target = 5; //設定獅子放置位置
//利用 for 迴圈將元件庫中的 cube 影片片段,提取擺放於遊戲面板中,並設定 每個方格的名稱、座標、擺放位置,依序命名為 cube1、cube2…cube36 for (a=0; a<t; a++) {
var tmp = _root.attachMovie("cube", "cube"+(a+1), _root.getNextHighestDepth());
var top = tmp._height; //方格的長度 var left = tmp._width; //方格的寬度 var x = a%v; //利用同餘(%)方法,決定 x 值
var y = Math.floor(a/h); //利用無條件捨去法(Math.floor),決定 y 值 tmp.id = a;
tmp.x = x+1; //設定方格的 x 座標(平面座標化)
tmp.y = y+1; //設定方格的 y 座標(平面座標化)
tmp.flag = true;
tmp._x = (x+1)*left+115; //設定方格在影片位置的 x 座標 tmp._y = (y+1)*top+55; //設定方格在影片位置的 y 座標
//如果是在先前設定的獅子位置時,則此方格出現獅子(第四影格),其餘的方 格停留在樹木狀態(第二影格)
if (target == a) { tmp.gotoAndStop(4);
targetObj = tmp;
} else { tmp.stop();
tmp.gotoAndStop(2);
}}
二、遊戲操作-第二影格
var player = 0; //遊戲開始,玩家甲的代表數值為 0 var s = 0;
var c = 1;
u = -1;
h = 6; //設定面板長的格子數 v = 6; //設定面板寬的格子數 t = h*v; //設定操作面板總格數 target = 5; //設定獅子放置位置
//利用 for 迴圈將元件庫中的 cube 影片片段,提取擺放於遊戲面板中,並設定 每個方格的名稱、座標、擺放位置,依序命名為 cube1、cube2…cube36 for (a=0; a<t; a++) {
var tmp = _root.attachMovie("cube", "cube"+(a+1), root.getNextHighestDepth());
var top = tmp._height; //方格的長度 var left = tmp._width; //方格的寬度 var x = a%v; //利用同餘(%)方法,決定 x 值
var y = Math.floor(a/h); //利用無條件捨去法(Math.floor),決定 y 值 tmp.id = a;
tmp.x = x+1; //設定方格的 x 座標 tmp.y = y+1; //設定方格的 y 座標
tmp.flag = true; //設定方格的標棋狀態,可點選的為 true tmp._x = (x+1)*left+115; //設定方格在影片位置的 x 座標 tmp._y = (y+1)*top+55; //設定方格在影片位置的 y 座標
//如果是在先前設定的獅子位置時,則此方格出現獅子(第四影格),其餘的方
格停留在樹木狀態(第二影格)
if (target == a) { tmp.gotoAndStop(4);
targetObj = tmp;
} else {
tmp.gotoAndStop(2);
//設定方格可以被點擊執行,且根據此方格的 x、y 座標,搭配自訂的 doCheck 函數來運算
tmp.onRelease = function() {
doCheck(this.x, this.y, this);};}}
times = null; //time 用來決定點擊方格次數,用以判斷是否完成點選動作 lastX = lastY = lastObj=null;
//設定 doCheck 函數,取方格的 x、y 座標來運算 function doCheck(x, y, o) {
if (times == 0) { //利用 if 邏輯來判斷點選長方形的對角
M_2 = Math.max(lastX+1, x+1); //判斷長方形點選範圍的最大 x 座標 M_3 = Math.min(lastY-1, y-1); //判斷長方形點選範圍的最小 y 座標 M_4 = Math.max(lastY+1, y+1); //判斷長方形點選範圍的最大 y 座標 var condition1 = targetObj.x>M_1 && targetObj.x<M_2;
var condition2 = targetObj.y>M_3 && targetObj.y<M_4;
if (condition1 && condition2) { //設定判斷獅子位置條件,避免違規 情況發生(點選後的長方形包含獅子),若發生則重新點選 txt = "不得包含獅子,請重新點選";
player = player-1;
lastObj._alpha = 100;
lastObj.enabled = true;
} else {
var list = new Array(); //設定一個新的陣列,統計所選取範圍的方格數目 var pass = true;
for (a=1; a<=t; a++) { //利用 for 迴圈,運算次數為所有方格總數 var tmp = eval("cube"+a); //將選取的方格命名為 tmp
var condition1 = tmp.x>M_1 && tmp.x<M_2; //界定方格的 x 座標範圍 var condition2 = tmp.y>M_3 && tmp.y<M_4; //界定方格的 y 座標範圍 var condition3 = tmp.flag; //判斷方格的標棋狀態為 true(可點選)或 false
(不可點選)
//如果滿足上述條件 1、2、3,則將範圍內 tmp 的數目統計至 list 矩陣中(push), 並傳回新的 list 陣列長度。
if (condition1 && condition2 && condition3) { list.push(tmp);
//如果所點選的方格範圍內有空格,則重新點選
} else if (condition1 && condition2 && !condition3) {
txt = "不得跨越空格,請重新點選";
player = player-1;
lastObj._alpha = 100;
lastObj.enabled = true;
pass = false;
for (a=0; a<list.length; a++) { list[a]._alpha = 20;
list[a].enabled = false;
list[a].flag = false;
list[a].gotoAndStop(c); //格子會輪流跳到影格 1(紅色,代表甲方)、影 格 3(綠色,代表乙方)}
//針對每次點選的所有方格加上外框
this.createEmptyMovieClip("square_mc", this.getNextHighestDepth());
square_mc.lineStyle(3, 0xFF00FF);
square_mc.moveTo((M_1+1)*left+115, (M_3+1)*top+55);
square_mc.lineTo((M_1+1)*left+115, (M_4)*top+55);
square_mc.lineTo((M_2)*left+115, (M_4)*top+55);
square_mc.lineTo((M_2)*left+115, (M_3+1)*top+55);
square_mc.lineTo((M_1+1)*left+115, (M_3+1)*top+55);
//針對每次點選的所有方格加上次數文字 u = u+1;
var my_fmt:TextFormat = new TextFormat();
my_fmt.bold = true;
my_fmt.font = "標楷體";
my_fmt.size = 14;
my_fmt.color = 0x3300CC;
var ttt = this.createTextField("my_txt"+u, this.getNextHighestDepth
(), (M_1+1+M_2)/2*left+93, (M_3+1+M_4)/2*top+45, 50, 50);
ttt.setNewTextFormat(my_fmt);
ttt.text = "第"+u+"次";}
//針對每次點選的所有方格,給予 box 數值=1,用以統計何時該停止遊戲 for (i=M_1+1; i<M_2; i += 1) {
for (j=M_3+1; j<M_4; j += 1) { box[i*10+j] = 1;}}}
//利用判斷 player 數值(0 或 1),決定輪流順序 player = player+1;
if (player == 1) { info_text = "輪到甲了";
} else { player = 0;
info_text = "輪到乙了";}
s = 0;}}
doCheck();
info_text = "甲先開始";
removeMovieClip(my_txt0);
三、判斷獲勝或停止條件
//利用 for 迴圈,運算次數為所有方格總數(總共可點選數為 35 格),統計累計 的 box 數值
for (i=0; i<67; i += 1) { s = s+box[i];
if (s == 35) { //當 s 累計到 35 時,遊戲停止 if (player == 1) {
info_text = "甲輸了!(因為沒有樹木可點選)";
} else { player = 0;
info_text = "乙輸了!(因為沒有樹木可點選)";}}}