第四章 數位化數學遊戲的程式碼說明
第四節 鋸木板遊戲
鋸木板遊戲設計流程:(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 的直短柱),將鋸木板的人偶放