前往
大廳
主題

【 RPG Maker MV】 記憶翻牌遊戲1

蜜糖情人 | 2023-01-12 03:57:43 | 巴幣 22 | 人氣 308

我的生活毫無樂趣
寫程式居然是我這陣子最開心的事
筆記一下這次的成果,讓我的人生留點意義

這次從一開始就打算系統化
得力於上次拼圖遊戲的筆記
一個晚上寫,一個晚上除BUG完工
不用開EXCLE批量改數值就是爽
系統化成果展示(上限10組20張)

概念如下
0.將每一個位置安排卡牌號
1.顯示每個位置的卡牌
2.第一次選取
3.第二次選取
4.判定
5.遊戲結束並重新開始


0.將每一個位置安排卡牌

兩大部分,基本設定跟安排卡牌位置

基本安排
這次變數比較多,直接看圖
20之前是系統用
變數1、2 牌組的橫/直數量
變數3、4 牌組在畫面的上/左邊界
變數5、6 卡牌的橫/直間距
變數7、8 卡牌大小,這邊指的是原始檔案
變數9   遊戲進度
變數10、11 兩次選取的卡牌編號
變數16  驗證是否完成
變數19  卡牌檔案名稱(不含數字編號)
變數20  卡牌縮放比例(100為原始大小)
21~40是留給位置存卡牌號
41~50留給卡牌驗證

開關預留了10個給系統(結果沒用到)
11~30給位置驗證用

安排卡牌位置
我們已經用變數1、2決定卡組片數
例如3X2,畫面上就會有6張牌
現在就是要決定這六張牌放什麼
比方說
1 3 2
2 1 3
這樣放置
就等於第一個位置是1
第二個位置是3
第三個位置是2...以此類推

這邊跟拼圖一樣,使用迴圈來把6個位置搞定
for (var i=1;i<=$gameVariables.value(1)*$gameVariables.value(2);i++){

使用取隨機值1~3
將隨機數寫到變數11
至於到底要取幾個隨機值,則是總卡牌數(變數1*變數2)的一半
例如我們有3組配對牌,則2*3/2=6/2=3
可是Math.randomInt(寫入變數11,取3個變數)結果是0~2,所以要+1
$gameVariables.setValue(11,Math.randomInt($gameVariables.value(1)*$gameVariables.value(2)/2)+1);

而變數12會等於隨機值+40,也就是卡牌驗證的位置欄$gameVariables.setValue(12,$gameVariables.value(11)+40);

接著把該卡牌編號驗證數+1
也就是說如果編號1被選了一次,則變數41+1
這邊包了很多層
寫入變數(讀取變數12內容(卡牌驗證位置),讀取卡牌驗證位置值+1)
$gameVariables.setValue($gameVariables.value(12),$gameVariables.value($gameVariables.value(12))+1);

但如果只是這樣寫,很有同一張卡牌被選太多次
而我們每一個數值都只能取兩次
所以這邊要做一個確認動作
讀取變數12內容(卡牌驗證位置)值小於2
if($gameVariables.value($gameVariables.value(12))<2)
如果成立,我們才會把上面卡牌驗證位置值+1
並且將變數11(隨機決定的卡牌編號)寫入該位置
i+20的20是系統預留,位置編號從21開始到40
$gameVariables.setValue(i+20,$gameVariables.value(11)

但假如上述沒有成立,比方說在位置4時編號1被選到第三次
那位置4就不會寫入任何卡牌編號
如此位置4就會維持0,且卡牌數量會不足
因此如果位置當中有0的,也就是沒有被賦予卡牌編號的位置
會繼續骰亂數值
if($gameVariables.value(i+20) == 0)

完整語法(綠字註解)
for (var i=1;i<=$gameVariables.value(1)*$gameVariables.value(2);i++){
//如果該位置沒有卡牌編號
if($gameVariables.value(i+20) == 0){
//骰卡片編號亂數
$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
這邊我將變數11跟12先歸零
$gameVariables.setValue(12,0);
$gameVariables.setValue(11,0);

然後同樣用迴圈驗證6個位置
for (var i=1;i<=$gameVariables.value(1)*$gameVariables.value(2);i++){

上面有說,每當一個卡牌編號被選到一次
該卡牌驗證位置值就會+1
例如選到編號1,變數41就會+1
而每一個編號上限是2
所以我的驗證方式是把變數41~46加總到變數11
$gameVariables.setValue(11,$gameVariables.value(11)+$gameVariables.value(i+40)

再看看變數11是不是等於總片數
if($gameVariables.value(11) == $gameVariables.value(1)*$gameVariables.value(2))

假如是,那就等於所有編號都有位置了
那就可以進入下一階段,也就是變數9(遊戲進度)=1
$gameVariables.setValue(9,1);
假如沒有,那就會回去上面的取亂數迴圈
把還是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));
//若加總數=總牌數
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, 圖片名稱, 座標點位置, 圖片X座標, 圖片Y座標, 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+ 橫片數(變數1)*(j-1)
-1是因為第一行不用+橫片數
圖片名稱 = 圖檔名稱(變數19) + 0
因為我的圖檔是P1-0~P1-6
雖然目前我們已經把所有位置安排好卡牌
但目前是只能顯示卡背
所以圖片名稱是"P1-"(變數19)+編號0
圖片X座標 = 左邊界(變數4)+寬幅(變數5)*(i-1)
-1是因為第一片是貼在左邊界的
圖片Y座標同上
X/Y縮放 = 卡牌縮放(變數20)
由於這是系統化,如果片數多,卡牌會被縮小
直接從這邊帶入

可是這邊會有一個問題,如果配對成功
卡牌就不用翻回卡背了
但目前的狀況無論如何都會是全卡背
所以這邊我多一個判定
選取位置的時候,該位置的驗證開關會打開
如果選取的兩個位置配對有成功,
這兩個位置的開關就會維持開啟狀況
如果配對失敗,開關就會關閉
而如果該位置開關是關閉,才會顯示卡背
+10是因為10個預留系統開關
開關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++){
//如果該位置開關不為開啟
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);
}}}


目前已經可以讓牌組顯示了
本來以為這次一篇可以搞定
沒料到寫了也好多,還是分兩篇吧

創作回應

相關創作

更多創作