我的生活毫無樂趣
寫程式居然是我這陣子最開心的事
筆記一下這次的成果,讓我的人生留點意義
這次從一開始就打算系統(tǒng)化
得力於上次拼圖遊戲的筆記
一個晚上寫,一個晚上除BUG完工
不用開EXCLE批量改數(shù)值就是爽
系統(tǒng)化成果展示(上限10組20張)
概念如下
0.將每一個位置安排卡牌號
1.顯示每個位置的卡牌
2.第一次選取
3.第二次選取
4.判定
5.遊戲結(jié)束並重新開始
0.將每一個位置安排卡牌
兩大部分,基本設(shè)定跟安排卡牌位置
基本安排
這次變數(shù)比較多,直接看圖
20之前是系統(tǒng)用
變數(shù)1、2 牌組的橫/直數(shù)量
變數(shù)3、4 牌組在畫面的上/左邊界
變數(shù)5、6 卡牌的橫/直間距
變數(shù)7、8 卡牌大小,這邊指的是原始檔案
變數(shù)9 遊戲進度
變數(shù)10、11 兩次選取的卡牌編號
變數(shù)16 驗證是否完成
變數(shù)19 卡牌檔案名稱(不含數(shù)字編號)
變數(shù)20 卡牌縮放比例(100為原始大小)
21~40是留給位置存卡牌號
41~50留給卡牌驗證
開關(guān)預(yù)留了10個給系統(tǒng)(結(jié)果沒用到)
11~30給位置驗證用
安排卡牌位置
我們已經(jīng)用變數(shù)1、2決定卡組片數(shù)
例如3X2,畫面上就會有6張牌
現(xiàn)在就是要決定這六張牌放什麼
比方說
1 3 2
2 1 3
這樣放置
就等於第一個位置是1
第二個位置是3
第三個位置是2...以此類推
這邊跟拼圖一樣,使用迴圈來把6個位置搞定
for (var i=1;i<=$gameVariables.value(1)*$gameVariables.value(2);i++){
使用取隨機值1~3
將隨機數(shù)寫到變數(shù)11
至於到底要取幾個隨機值,則是總卡牌數(shù)(變數(shù)1*變數(shù)2)的一半
例如我們有3組配對牌,則2*3/2=6/2=3
可是Math.randomInt(寫入變數(shù)11,取3個變數(shù))結(jié)果是0~2,所以要+1
$gameVariables.setValue(11,Math.randomInt($gameVariables.value(1)*$gameVariables.value(2)/2)+1);
而變數(shù)12會等於隨機值+40,也就是卡牌驗證的位置欄$gameVariables.setValue(12,$gameVariables.value(11)+40);
接著把該卡牌編號驗證數(shù)+1
也就是說如果編號1被選了一次,則變數(shù)41+1
這邊包了很多層
寫入變數(shù)(讀取變數(shù)12內(nèi)容(卡牌驗證位置),讀取卡牌驗證位置值+1)
$gameVariables.setValue($gameVariables.value(12),$gameVariables.value($gameVariables.value(12))+1);
但如果只是這樣寫,很有同一張卡牌被選太多次
而我們每一個數(shù)值都只能取兩次
所以這邊要做一個確認動作
讀取變數(shù)12內(nèi)容(卡牌驗證位置)值小於2
if($gameVariables.value($gameVariables.value(12))<2)
如果成立,我們才會把上面卡牌驗證位置值+1
並且將變數(shù)11(隨機決定的卡牌編號)寫入該位置
i+20的20是系統(tǒng)預(yù)留,位置編號從21開始到40
$gameVariables.setValue(i+20,$gameVariables.value(11)
但假如上述沒有成立,比方說在位置4時編號1被選到第三次
那位置4就不會寫入任何卡牌編號
如此位置4就會維持0,且卡牌數(shù)量會不足
因此如果位置當(dāng)中有0的,也就是沒有被賦予卡牌編號的位置
會繼續(xù)骰亂數(shù)值
if($gameVariables.value(i+20) == 0)
完整語法(綠字註解)
for (var i=1;i<=$gameVariables.value(1)*$gameVariables.value(2);i++){
//如果該位置沒有卡牌編號
if($gameVariables.value(i+20) == 0){
//骰卡片編號亂數(shù)
$gameVariables.setValue(11,Math.randomInt($gameVariables.value(1)*$gameVariables.value(2)/2)+1);
$gameVariables.setValue(12,$gameVariables.value(11)+40);
//如果該卡牌驗證位置值小於2
if($gameVariables.value($gameVariables.value(12))<2){
//寫入位置卡牌編號與卡牌驗證+1
$gameVariables.setValue($gameVariables.value(12),$gameVariables.value($gameVariables.value(12))+1);
$gameVariables.setValue(i+20,$gameVariables.value(11))};}}
第二階段,驗證是否每一個位置都有卡牌編號了
因為剛說過,位置有可能維持0
這邊我將變數(shù)11跟12先歸零
$gameVariables.setValue(12,0);
$gameVariables.setValue(11,0);
然後同樣用迴圈驗證6個位置
for (var i=1;i<=$gameVariables.value(1)*$gameVariables.value(2);i++){
上面有說,每當(dāng)一個卡牌編號被選到一次
該卡牌驗證位置值就會+1
例如選到編號1,變數(shù)41就會+1
而每一個編號上限是2
所以我的驗證方式是把變數(shù)41~46加總到變數(shù)11
$gameVariables.setValue(11,$gameVariables.value(11)+$gameVariables.value(i+40)
再看看變數(shù)11是不是等於總片數(shù)
if($gameVariables.value(11) == $gameVariables.value(1)*$gameVariables.value(2))
假如是,那就等於所有編號都有位置了
那就可以進入下一階段,也就是變數(shù)9(遊戲進度)=1
$gameVariables.setValue(9,1);
假如沒有,那就會回去上面的取亂數(shù)迴圈
把還是0的位置補上編號
完整語法(綠字註解)
$gameVariables.setValue(12,0);
$gameVariables.setValue(11,0);
for (var i=1;i<=$gameVariables.value(1)*$gameVariables.value(2);i++){
//卡牌驗證加總
$gameVariables.setValue(11,$gameVariables.value(11)+$gameVariables.value(i+40));
//若加總數(shù)=總牌數(shù)
if($gameVariables.value(11) == $gameVariables.value(1)*$gameVariables.value(2))
{$gameVariables.setValue(9,1);}
}
1.顯示卡牌位置
先把每一個位置都放上卡牌
跟拼圖遊戲3一樣使用兩個迴圈來把位置搞定
詳細的說明請直接連過去看(太多了)
這邊只簡單說明
迴圈
for(j=1;j<=$gameVariables.value(2);j++){
for(i=1;i<=$gameVariables.value(1);i++){
圖片顯示
$gameScreen.showPicture(圖片ID, 圖片名稱, 座標(biāo)點位置, 圖片X座標(biāo), 圖片Y座標(biāo), X縮放, Y縮放, 不透明度, 融合模式);
$gameScreen.showPicture(i+$gameVariables.value(1)*(j-1), $gameVariables.value(19)+0, 0, $gameVariables.value(4)+$gameVariables.value(5)*(i-1), $gameVariables.value(3)+$gameVariables.value(6)*(j-1), $gameVariables.value(20), $gameVariables.value(20), 225, 0)
ID = i+ 橫片數(shù)(變數(shù)1)*(j-1)
-1是因為第一行不用+橫片數(shù)
圖片名稱 = 圖檔名稱(變數(shù)19) + 0
因為我的圖檔是P1-0~P1-6
雖然目前我們已經(jīng)把所有位置安排好卡牌
但目前是只能顯示卡背
所以圖片名稱是"P1-"(變數(shù)19)+編號0
圖片X座標(biāo) = 左邊界(變數(shù)4)+寬幅(變數(shù)5)*(i-1)
-1是因為第一片是貼在左邊界的
圖片Y座標(biāo)同上
X/Y縮放 = 卡牌縮放(變數(shù)20)
由於這是系統(tǒng)化,如果片數(shù)多,卡牌會被縮小
直接從這邊帶入
可是這邊會有一個問題,如果配對成功
卡牌就不用翻回卡背了
但目前的狀況無論如何都會是全卡背
所以這邊我多一個判定
選取位置的時候,該位置的驗證開關(guān)會打開
如果選取的兩個位置配對有成功,
這兩個位置的開關(guān)就會維持開啟狀況
如果配對失敗,開關(guān)就會關(guān)閉
而如果該位置開關(guān)是關(guān)閉,才會顯示卡背
+10是因為10個預(yù)留系統(tǒng)開關(guān)
開關(guān)11開始才是位置驗證用
if(!$gameSwitches.value(i+$gameVariables.value(1)*(j-1)+10)){
完整語法(綠字註解)
for(j=1;j<=$gameVariables.value(2);j++){
for(i=1;i<=$gameVariables.value(1);i++){
//如果該位置開關(guān)不為開啟
if(!$gameSwitches.value(i+$gameVariables.value(1)*(j-1)+10)){
//顯示卡背
$gameScreen.showPicture(i+$gameVariables.value(1)*(j-1), $gameVariables.value(19)+0, 0, $gameVariables.value(4)+$gameVariables.value(5)*(i-1), $gameVariables.value(3)+$gameVariables.value(6)*(j-1), $gameVariables.value(20), $gameVariables.value(20), 225, 0);
}}}
目前已經(jīng)可以讓牌組顯示了
本來以為這次一篇可以搞定
沒料到寫了也好多,還是分兩篇吧