• 沒有找到結果。

第四章 數位化數學遊戲的程式碼說明

第二節 河東獅吼遊戲

河東獅吼遊戲設計流程:(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 = "乙輸了!(因為沒有樹木可點選)";}}}

相關文件