• 沒有找到結果。

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

第四節 鋸木板遊戲

鋸木板遊戲設計流程:(1)設定遊戲所需要的直、橫短柱數量,再將這些短 柱依序擺放到遊戲面板上,面板最底部放置木板圖片,可與短柱交織出一格一格 的方格木板。直、橫短柱同時也賦予方格名稱以及平面座標。(2)將所有短柱設 定為按鈕,並寫入點擊短柱之後的動作:變為白色實線,代表已經切割。(3)在 每個直短柱與橫短柱的交會處,設立一個偵測點,紀錄該點被鋸子切過的次數。

剛開始周遭的偵測點為藍色,內部偵測點為紅色,當鋸子切割到該處,偵測點將 轉變為藍色。(4)撰寫遊戲勝利條件:當偵測點由藍轉紅時,代表該處已被鋸子 切割兩次,木板將被分為兩半,就是輸家。

一、面版佈置-第一影格

stop(); //執行到該影格時停止動作 var info = "按 Star 開始";

h = 5; //設定參數 h v = 6; //設定參數 v

t = h*v; //設定參數 t,代表直的或橫的短柱個數

//利用 for 迴圈將元件庫中的 ht 影片片段,提取擺放於遊戲面板中,並設定每 個短柱的名稱、座標、擺放位置,依序命名 h1、h2…h30,深度自取

for (a=0; a<t; a++) {

var tmp = _root.attachMovie("ht", "h"+(a+1), _root.getNextHighestDepth

());

var top = tmp._width+6.5; //設定橫短柱擺放時的上下間隔 var left = tmp._width+6.5; //設定橫短柱擺放時的左右間隔

var x = Math.floor(a/v); //利用無條件捨去法(Math.floor)計算 x 值

var y = a%v; //利用同餘(%)方法,決定 y 值 tmp.x = x+1; //設定橫短柱的 x 座標(平面座標化)

tmp.y = y+1; //設定橫短柱的 y 座標(平面座標化)

tmp._x = (x+1)*left+104; //設定橫短柱在影片位置的 x 座標 tmp._y = (y+1)*top+72; //設定橫短柱在影片位置的 y 座標}

橫短柱位置、名稱對照圖 橫短柱位置、座標對照圖 //利用 for 迴圈將不必要的橫短柱隱藏,並使它們不能被當成按鈕點選

for (a=0; a<5; a++) {

var tmp1 = eval("h"+(a*6+1));

var tmp2 = eval("h"+((a+1)*6));

tmp1.enabled = false;

tmp1._alpha = 0;

tmp2.enabled = false;

tmp2._alpha = 0;}

//利用 for 迴圈將元件庫中的 vt 影片片段,提取擺放於遊戲面板中,並設定每 個短柱的名稱、座標、擺放位置,依序命名 h31、h32…h60,深度自取

for (a=0; a<t; a++) {

var tmp = _root.attachMovie("vt", "h"+(a+31), _root.getNextHighestDepth

());

var top = tmp._height+6.5; //設定直短柱擺放時的上下間隔 var left = tmp._height+6.5; //設定直短柱擺放時的左右間隔

var x = Math.floor(a/h); //利用無條件捨去法(Math.floor)計算 x 值 var y = a%h; //利用同餘(%)方法,決定 y 值

tmp.x = x+6; //設定直短柱的 x 座標(平面座標化)

tmp.y = y+1; //設定直短柱的 y 座標(平面座標化)

tmp._x = (x+1)*left+98; //設定直短柱在影片位置的 x 座標 tmp._y = (y+1)*top+77; //設定直短柱在影片位置的 y 座標}

直短柱位置、名稱對照圖 直短柱位置、座標對照圖 //利用 for 迴圈將不必要的直短柱隱藏,並使它們不能被當成按鈕點選

for (a=0; a<5; a++) {

var tmp1 = eval("h"+(a+31));

var tmp2 = eval("h"+(a+56));

tmp1.enabled = false;

tmp1._alpha = 0;

tmp2.enabled = false;

tmp2._alpha = 0;}

二、遊戲操作-第二影格

var info = "按 Return 重來";

times = 0; //遊戲開始,times 數值為 0 代表玩家甲正在進行遊戲 txt = "";

info_text = "甲先開始";

var matx = new Array(40); //設定一個新的陣列 matx,此陣列有 40 個元 素

var maty = new Array(40); //設定一個新的陣列 maty,此陣列有 40 個元 素

i = 0; //設定參數 i h = 5; //設定參數 h v = 6; //設定參數 v

t = h*v; //設定參數 t,代表直的或橫的短柱個數

//利用 for 迴圈將元件庫中的 ht 影片片段,提取擺放於遊戲面板中,並設定每 個短柱的名稱、座標、擺放位置,依序命名 h1、h2…h30,深度自取

for (a=0; a<t; a++) {

var tmp = _root.attachMovie("ht", "h"+(a+1), _root.getNextHighestDepth

());

var top = tmp._width+6.5; //設定橫短柱擺放時的上下間隔 var left = tmp._width+6.5; //設定橫短柱擺放時的左右間隔

var x = Math.floor(a/v); //利用無條件捨去法(Math.floor)計算 x 值 var y = a%v; //利用同餘(%)方法,決定 y 值

tmp.x = x+1; //設定橫短柱的 x 座標(平面座標化)

tmp.y = y+1; //設定橫短柱的 y 座標(平面座標化)

tmp._x = (x+1)*left+104; //設定橫短柱在影片位置的 x 座標

tmp._y = (y+1)*top+72; //設定橫短柱在影片位置的 y 座標

//設定橫短柱可以被點擊執行,且根據此方格的 x、y 座標,搭配自訂的 doCheck1 函數來運算

tmp.onRelease = function() {

doCheck1(this.x, this.y, this);};}

//利用 for 迴圈將不必要的橫短柱隱藏,使它們不能被當成按鈕點選 for (a=0; a<5; a++) {

var tmp1 = eval("h"+(a*6+1));

var tmp2 = eval("h"+((a+1)*6));

tmp1.enabled = false;

tmp1._alpha = 0;

tmp2.enabled = false;

tmp2._alpha = 0;}

//利用 for 迴圈將元件庫中的 vt 影片片段,提取擺放於遊戲面板中,並設定每 個短柱的名稱、座標、擺放位置,依序命名 h31、h32…h60,深度自取

for (a=0; a<t; a++) {

var tmp = _root.attachMovie("vt", "h"+(a+31), _root.getNextHighestDepth

());

var top = tmp._height+6.5; //設定直短柱擺放時的上下間隔 var left = tmp._height+6.5; //設定直短柱擺放時的左右間隔

var x = Math.floor(a/h); //利用無條件捨去法(Math.floor)計算 x 值 var y = a%h; //利用同餘(%)方法,決定 y 值

tmp.x = x+6; //設定直短柱的 x 座標(平面座標化)

tmp.y = y+1; //設定直短柱的 y 座標(平面座標化)

tmp._x = (x+1)*left+98; //設定直短柱在影片位置的 x 座標 tmp._y = (y+1)*top+77; //設定直短柱在影片位置的 y 座標

//設定直短柱可以被點擊執行,且根據此方格的 x、y 座標,搭配自訂的 doCheck2 函數來運算

tmp.onRelease = function() {

doCheck2(this.x, this.y, this);};}

//利用 for 迴圈將不必要的直短柱隱藏,並使它們不能被當成按鈕點選 for (a=0; a<5; a++) {

var tmp1 = eval("h"+(a+31));

var tmp2 = eval("h"+(a+56));

tmp1.enabled = false;

tmp1._alpha = 0;

tmp2.enabled = false;

tmp2._alpha = 0;} var i = Math.floor(a/v);

var j = a%v;

var tmp = _root.attachMovie("tb", "tb"+(j*10+(i+1)), _root.getNextHighestDepth());

var top = tmp._width+39;

var left = tmp._width+39;

var y = Math.floor(a/v);

var x = a%v;

tmp._x = (x+3)*left-40;

tmp._y = (y+3)*top-69;

tmp.gotoAndStop(1);

tmp._alpha = 0;}

//利用 for 迴圈將四周的的偵測點設定為藍色(tb 的第二影格),當這些藍色點 又變回紅色時,遊戲即結束(代表已鋸到木板邊緣,切成兩塊)

for (a=0; a<6; a++) {

var tmp1 = eval("tb"+(a+1));

var tmp2 = eval("tb"+(a+50));

var tmp3 = eval("tb"+((a*10)+1));

var tmp4 = eval("tb"+((a*10)+6));

tmp1.gotoAndStop(2);

tmp2.gotoAndStop(2);

tmp3.gotoAndStop(2);

tmp4.gotoAndStop(2); }

偵測點擺放位置及狀態

//設定 doCheck1 函數,取橫短柱的 x、y 座標來運算。由於剛開始遊戲,只能點

選木板周圍的橫短柱,因此只允許點選 h2、h3、h4、h5、h26、h27、h28、h29,

若符合才能進行運算。

function doCheck1(x, y, o) { if (times == 0) {

o.gotoAndStop(2); //短柱變為白色粗實線 var case1 = h2._currentframe;

var case2 = h3._currentframe;

var case3 = h4._currentframe;

var case4 = h5._currentframe;

var case5 = h26._currentframe;

var case6 = h27._currentframe;

var case7 = h28._currentframe;

var case8 = h29._currentframe;

if (case1 == 2 || case2 == 2 || case3 == 2 || case4 == 2 || case5 == 2

|| case6 == 2 || case7 == 2 || case8 == 2) {

times = 1;//times 數值為 1 代表執行動作後輪到玩家乙進行遊戲 txt = "請點選一邊";

info_text = "輪到乙";

removeMovieClip("cut"); //將鋸木板的人偶移除,以更換新位置 o.enabled = false; //已點選過的橫短柱,不能再被點選

置新鋸痕末端,並令人偶所在位置的偵測點變為藍色(tb 的第二影格)。 if (matx[i] == 1) {

tmp = _root.attachMovie("cut", "cut", _root.getNextHighestDepth());

tmp._x = o._x-30; //鋸木板人偶的 x 座標,參照橫短柱的 x 座標 tmp._y = o._y-65; //鋸木板人偶的 y 座標,參照橫短柱的 y 座標 tmp._alpha = 70; //鋸木板人偶的透明度 70%

tbnum = tx*10+ty; //計算人偶所在位置偵測點的 tb 數值

p = eval("tb"+tbnum)._currentframe; //令偵測點的影格數字為 p p = p+1; //偵測點的影格數字加 1,遊戲進行時通常為 2

eval("tb"+tbnum).gotoAndStop(p); //偵測點往下一個影格(紅→藍)

if (p != 2) { //若偵測點影格數字不為 2(等於 3),遊戲即

tmp = _root.attachMovie("cut", "cut", _root.getNextHighestDepth());

tmp._x = o._x-100; //鋸木板人偶的 x 座標,參照橫短柱的 x 座標 tmp._y = o._y-65; //鋸木板人偶的 y 座標,參照橫短柱的 y 座標 tmp._alpha = 70; //鋸木板人偶的透明度 70%

tbnum = (tx-1)*10+ty; //計算人偶所在位置偵測點的 tb 數值 p = eval("tb"+tbnum)._currentframe; //令偵測點的影格數字為 p p = p+1; //偵測點的影格數字加 1,遊戲進行時通常為 2

eval("tb"+tbnum).gotoAndStop(p); //偵測點往下一個影格(紅→藍)

if (p != 2) { //若偵測點影格數字不為 2(等於 3),遊戲即結束(藍→紅)

lose(); //執行 lose 函數,代表遊戲結束}}}

第一次點選橫短柱,人偶與偵測點情況 else {

//若非點選 h2、h3、h4、h5、h26、h27、h28、h29,則重新點選。

times = 0;

txt = "選擇錯誤!請重新點選!";

o.gotoAndStop(1); //短柱回復變為虛線 } } else {

//利用點選橫短柱 o 的 x、y 座標(o.x、o.y),加上前一次操作所存取的 tx、

ty 進行運算,判斷滿足六種 condition,若符合再進行後續運算。

o.gotoAndStop(2); //短柱變為白色粗實線 newObj = o;

o.x = x;

o.y = y;

var condition1 = o.x == tx-5 && o.y == ty+1;

var condition2 = o.x == tx+1 && o.y == ty;

var condition3 = o.x == tx-5 && o.y == ty;

var condition4 = o.x == tx-6 && o.y == ty;

var condition5 = o.x == tx-1 && o.y == ty;

var condition6 = o.x == tx-6 && o.y == ty+1;

if (condition1 || condition2 || condition3 || condition4 || condition5

|| condition6) {

times = 0;// times 值為 0 代表執行動作後輪到玩家甲進行遊戲 txt = "請點選另一邊";

info_text = "輪到甲";

o.enabled = false; //已點選過的橫短柱,不能再被點選 removeMovieClip("cut"); //將鋸木板的人偶移除,以更換新位置

//判斷 valx、valy 值,若滿足底下三個條件之一,則代表人偶將往右側橫短柱 方向切鋸

if (valx == 1 && valy == 0 || valx == -5 && valy == 1 || valx == -5 &&

valy == 0) {

tmp = _root.attachMovie("cut", "cut", _root.getNextHighestDepth());

tmp._x = o._x-30; //鋸木板人偶的 x 座標,參照橫短柱的 x 座標 tmp._y = o._y-65; //鋸木板人偶的 y 座標,參照橫短柱的 y 座標 tmp._alpha = 70; //鋸木板人偶的透明度 70%

tbnum = tx*10+ty; //計算人偶所在位置偵測點的 tb 數值

p = eval("tb"+tbnum)._currentframe; //令偵測點的影格數字為 p p = p+1; //偵測點的影格數字加 1,遊戲進行時通常為 2

eval("tb"+tbnum).gotoAndStop(p); //偵測點往下一個影格(紅→藍)

if (p != 2) { //若偵測點影格數字不為 2(等於 3),遊戲即結束(藍→紅)

tmp = _root.attachMovie("cut", "cut", _root.getNextHighestDepth());

tmp._x = o._x-100; //鋸木板人偶的 x 座標,參照橫短柱的 x 座標 tmp._y = o._y-65; //鋸木板人偶的 y 座標,參照橫短柱的 y 座標 tmp._alpha = 70; //鋸木板人偶的透明度 70%

tbnum = tx*10+ty; //計算人偶所在位置偵測點的 tb 數值

p = eval("tb"+tbnum)._currentframe; //令偵測點的影格數字為 p p = p+1; //偵測點的影格數字加 1,遊戲進行時通常為 2

eval("tb"+tbnum).gotoAndStop(p); //偵測點往下一個影格(紅→藍)

if (p != 2) { //若偵測點影格數字不為 2(等於 3),遊戲即結束(藍→紅)

lose(); //執行 lose 函數,代表遊戲結束}}

gotoAndStop(3); //前往遊戲操作第三影格 } else {

//若非點選上述六種 condition,則重新點選 times = 1;

txt = "選擇錯誤!請重新點選!";

o.gotoAndStop(1); //短柱回復變為虛線 }}}

//設定 doCheck2 函數,取直短柱的 x、y 座標來運算。由於剛開始遊戲,只能點 選木板周圍的直短柱,因此只允許點選 h36、h41、h46、h51、h40、h45、h50、

h55,若符合才能進行運算。

function doCheck2(x, y, o) { if (times == 0) {

o.gotoAndStop(2); //短柱變為白色粗實線 var case1 = h36._currentframe;

var case2 = h41._currentframe;

var case3 = h46._currentframe;

var case4 = h51._currentframe;

var case5 = h40._currentframe;

var case6 = h45._currentframe;

var case7 = h50._currentframe;

var case8 = h55._currentframe;

if (case1 == 2 || case2 == 2 || case3 == 2 || case4 == 2 || case5 == 2

|| case6 == 2 || case7 == 2 || case8 == 2) {

times = 1;// times 值為 1 代表執行動作後輪到玩家乙進行遊戲 o.enabled = false; //已點選過的直短柱,不能再被點選 txt = "請點選一邊";

info_text = "輪到乙";

removeMovieClip("cut"); //將鋸木板的人偶移除,以更換新位置 i = i+1; //i 剛開始為 0,點選之後會加 1,所以 i=1 tx = x; //紀錄點選橫短柱的 x 座標為 tx

ty = y; //紀錄點選橫短柱的 y 座標為 ty matx[i] = tx; //令 matx[1]的值為 tx

maty[i] = ty; //令 maty[1]的值為 ty

//比對 maty[i]的值若等於 1(即點選 y 座標為 1 的直短柱),將鋸木板的人偶放 置新鋸痕末端,並令人偶所在位置的偵測點變為藍色(tb 的第二影格)。 if (maty[i] == 1) {

tmp = _root.attachMovie("cut", "cut", _root.getNextHighestDepth());

tmp._x = o._x-100; //鋸木板人偶的 x 座標,參照直短柱的 x 座標 tmp._y = o._y+5; //鋸木板人偶的 y 座標,參照直短柱的 y 座標 tmp._alpha = 70; //鋸木板人偶的透明度 70%

tbnum = (tx-6)*10+(ty+1); //計算人偶所在位置偵測點的 tb 數值 p = eval("tb"+tbnum)._currentframe; //令偵測點的影格數字為 p p = p+1; //偵測點的影格數字加 1,遊戲進行時通常為 2

eval("tb"+tbnum).gotoAndStop(p); //偵測點往下一個影格(紅→藍)

if (p != 2) { //若偵測點影格數字不為 2(等於 3),遊戲即結束(藍→紅)

lose(); //執行 lose 函數,代表遊戲結束}}

//比對 maty[i]的值若等於 5(即點選 y 座標為 5 的直短柱),將鋸木板的人偶放

//比對 maty[i]的值若等於 5(即點選 y 座標為 5 的直短柱),將鋸木板的人偶放

相關文件