【Family BASIC】遊戲開發(2)-封鎖線

2022/05/14閱讀時間約 14 分鐘
自製遊戲-封鎖線
Blockade(封鎖線)是一款在1976年街機上發行的對戰遊戲,其簡單易懂的玩法,在當時可讓不少人為之瘋狂,這也是我們本次教學的主角,借由重製這款經典遊戲來學習如何使用Family BASIC開發遊戲,讓經典再現。
開始前建議你在複習一下上一篇的教學以熟悉Family BASIC的基本操作。

以下是完成後的遊戲影片

Blockade(封鎖線)企劃

玩法介紹
遊戲一開始雙方各自控制著不斷前進的的方塊(1P 藍色,2P白色),方塊移動過的地方會被填滿,玩家的目標就是盡量想辦法圍住對方讓其可移動區域變小進而碰撞到被填滿的區塊,當然也要一邊小心控制不斷往前移動的方塊,使其不碰到被填滿的區塊;只要雙方任一方先碰到被填滿的區塊這局就算結束,對方獲得1積分。
遊戲流程

操作方式

遊戲操作說明
  • 1P
方向鍵:控制方塊前進方向
START:開始遊戲
SELECT:結束程式
  • 2P
方向鍵:控制方塊前進方向
關於遊戲區陣列
使用陣列來作區塊顯示與碰撞判斷是製作遊戲時滿常使用到的技巧,本次我們也善用了這個技巧,從上圖可以看出,只要是方塊移動到的地方就會在陣列相對位置填入1,以標示此位置已經有方塊了,在判斷碰撞時只要在方塊移動前判斷一下要前進的位置是否為1就會知道是不是已經發生碰撞了。

BG GRAPHIC模式

預計完成背景圖
上圖是我們預計在BG GRAPHIC模式下完成的背景圖。
區塊編號
為了辨識方便先將會使用到的方塊標上編號(白底紅框)。
上圖紅色圈起來的部分請選”CHAR”模式後輸入即可。
遊戲背景與區塊編號
以上畫面的號碼(黑底白框)請參考"區塊編號"所標示的方塊編號(白底紅框),並一一對照將相對方塊圖形填上。
製作自己的版面
強烈建議您發揮創意來製作屬於自己的封鎖線版面,只要不動到上圖紅色半透明區的圖形,其他部分歡迎自由發揮。
還有。。請分享您的創作,讓我也玩到您製作的版面(期待)。

BASIC模式-程式碼

已將完整程式碼放置GitHub Gist上,請點選以下超連結查看:
10  DIM C(17,17)
20 D3=0
30 D7=0
40 IF F=1 THEN D3=D3+1
50 IF F=2 THEN D7=D7+1
60 D0=2
70 D1=2
80 D2=1
90 D4=15
100 D5=15
110 D6=0
120 F=0
130 CLS
140 VIEW
150 LOCATE 9,1
160 PRINT D3
170 LOCATE 18,1
180 PRINT D7
190 L=0
200 FOR X=0 TO 17
210 FOR Y=0 TO 17
220 C(X,Y)=0
230 IF X=0 OR X=17 OR Y=0 OR Y=17 THEN C(X,Y)=1
240 NEXT
250 L=L+5
260 LOCATE 12,10
270 PRINT L
280 NEXT
290 LOCATE 12,10
300 PRINT "     "
310 P1=STICK(0)
320 IF P1=1 THEN D2=3
330 IF P1=2 THEN D2=2
340 IF P1=8 THEN D2=0
350 IF P1=4 THEN D2=1
360 P3=STRIG(0)
370 IF P3=1 AND F>0 THEN GOTO 40
380 IF P3=2 THEN END
390 P2=STICK(1)
400 IF P2=1 THEN D6=3
410 IF P2=2 THEN D6=2
420 IF P2=8 THEN D6=0
430 IF P2=4 THEN D6=1
440 IF F>0 THEN GOTO 310
490 PLAY "C0D1"
500 IF F=0 THEN GOSUB 600
510 IF F=-1 THEN GOSUB 700
520 IF F>0 THEN PLAY"CA1F1AB"
530 IF F<1 THEN F=NOT F
540 GOTO 310
600 IF D2=0 THEN D1=D1-1
610 IF D2=1 THEN D1=D1+1
620 IF D2=2 THEN D0=D0-1
630 IF D2=4 THEN D0=D0+1
640 IF C(D0,D1)=1 THEN F=2
650 IF F=2 THEN LOCATE D4+5,D5+2
660 IF F=2 THEN PRINT CHR$(199)
670 C(D0,D1)=1
680 RETURN
700 IF D6=0 THEN D5=D5-1
710 IF D6=1 THEN D5=D5+1
720 IF D6=2 THEN D4=D4-1
730 IF D6=3 THEN D4=D4+1
740 IF C(D4,D5)=1 THEN F=1
750 IF F=1 THEN LOCATE D0+5,D1+2
760 if F=1 THEN PRINT CHR$(199)
770 C(D4,D5)=1
780 RETURN

程式碼說明:

10 DIM C(17,17)
10行:宣告遊戲區陣列大小
20 D3=0 
30 D7=0
40 IF F=1 THEN D3=D3+1
50 IF F=2 THEN D7=D7+1
20行:初始1P分數(D3)
30行:初始2P分數(D7)
40行:如果F變數為1就將D3變數加1(1P分數)
50行:如果F變數為2就將D7變數加1(2P分數)
60 D0=2 
70 D1=2
80 D2=1
90 D4=15
100 D5=15
110 D6=0
120 F=0
60行:初始1P方塊X位置
70行:初始1P方塊Y位置
80行:初始1P移動方向(0:上 1:下 2:左 3:右)
90行:初始2P方塊X位置
100行:初始2P方塊位置
110行:初始2P移動方向(0:上 1:下 2:左 3:右)
120行:誰移動與誰贏變數(F=0:1P移動 -1:2P移動 1:1P贏 2:2P贏)
130 CLS 
140 VIEW
130行:清除畫面
140行:顯示BG GRAPHIC模式製作的背景圖
150 LOCATE 9,1 
160 PRINT D3
170 LOCATE 18,1
180 PRINT D7
150~160行:在畫面上顯示1P分數(D3)
170~180行:在畫面上顯示2P分數(D7)
190 L=0 
200 FOR X=0 TO 17 
210   FOR Y=0 TO 17 
220     C(X,Y)=0 
230     IF X=0 OR X=17 OR Y=0 OR Y=17 THEN C(X,Y)=1 
240   NEXT 
250   L=L+5 
260   LOCATE 12,10 
270   PRINT L 
280 NEXT 
290 LOCATE 12,10 
300 PRINT "      "
190行:紀錄執行進度變數(L)
200~280行:使用雙迴圈來清除遊戲區陣列
220行:清除遊戲區陣列
230行:填入外圍方塊編號(1),如下圖:
250行:進度累加
260~270行:顯示進度
290~300:清除顯示在畫面上的進度
310 P1=STICK(0) 
320 IF P1=1 THEN D2=3 
330 IF P1=2 THEN D2=2 
340 IF P1=8 THEN D2=0 
350 IF P1=4 THEN D2=1 
360 P3=STRIG(0) 
370 IF P3=1 AND F>0 THEN GOTO 40 
380 IF P3=2 THEN END 
390 P2=STICK(1) 
400 IF P2=1 THEN D6=3 
410 IF P2=2 THEN D6=2 
420 IF P2=8 THEN D6=0 
430 IF P2=4 THEN D6=1 
440 IF F>0 THEN GOTO 310
310行:判斷1P方向鍵輸入,按下後會回傳數值並存入P1變數內(P1=1:按下右方向鍵、P1=2:按下左方向鍵、P1=8:按下上方向鍵、P1=4:按下下方向鍵)
320行:1P按下右方向鍵後將1P的移動方向(D2變數)設定為3(讓方塊往右移動)
330行:1P按下左方向鍵後將1P的移動方向(D2變數)設定為2(讓方塊往左移動)
340行:1P按下上方向鍵後將1P的移動方向(D2變數)設定為1(讓方塊往上移動)
350行:1P按下下方向鍵後將1P的移動方向(D2變數)設定為0(讓方塊往下移動)
360行:判斷1P按鈕輸入,按下後會回傳數值並存入P3變數內(P3=1:按下Start按鈕,P3=2:按下Select按鈕)
370行:判斷1P在遊戲結束時按下Start按鈕後,讓遊戲重新開始
380行:判斷1P按下Select按鈕後,結束遊戲
390行:判斷2P方向鍵輸入,按下後會回傳數值並存入P2變數內(P2=1:按下右方向鍵、P2=2:按下左方向鍵、P2=8:按下上方向鍵、P2=4:按下下方向鍵)
400行:2P按下右方向鍵後將2P的移動方向(D6變數)設定為3(讓方塊往右移動)
410行:2P按下左方向鍵後將2P的移動方向(D6變數)設定為2(讓方塊往左移動)
420行:2P按下上方向鍵後將2P的移動方向(D6變數)設定為1(讓方塊往上移動)
430行:2P按下下方向鍵後將2P的移動方向(D6變數)設定為0(讓方塊往下移動)
440行:如果遊戲結束(F>0)就返回310行繼續判斷玩家輸入
490 PLAY “C0D1” 
500 IF F=0 THEN GOSUB 600 
510 IF F=-1 THEN GOSUB 700 
520 IF F>0 THEN PLAY”CA1F1AB” 
530 IF F<1 THEN F=NOT F 
540 GOTO 310
490行:播放移動音效
500行:如果是1P移動就跳到600行執行副程式(F=0:1P移動 F=-1:2P移動)
510行:如果是2P移動就跳到700行執行副程式(F=0:1P移動 F=-1:2P移動)
520行:如果已經分出勝負(F>0),就播放結束音樂
530行:如果尚未分出勝負就換堆方移動(將F反轉,會以1與-1切換)
540行: 回310行繼續執行
600 IF D2=0 THEN D1=D1–1 
610 IF D2=1 THEN D1=D1+1 
620 IF D2=2 THEN D0=D0–1 
630 IF D2=4 THEN D0=D0+1 
640 IF C(D0,D1)=1 THEN F=2 
650 IF F=2 THEN LOCATE D4+5,D5+2 
660 IF F=2 THEN PRINT CHR$(199) 
670 C(D0,D1)=1 
680 RETURN
600行:判斷變數D2 = 0(1P玩家按方向鍵上),就將1P移動中方塊Y軸(D1)持續減1
610行:判斷變數D2 = 1(1P玩家按方向鍵下),就將1P移動中方塊Y軸(D1)持續加1
620行:判斷變數D2 = 2(1P玩家按方向鍵左),就將1P移動中方塊X軸(D0)持續加1
630行:判斷變數D2 = 4(1P玩家按方向鍵右),就將1P移動中方塊X軸(D0)持續加1
640行:如果1P移動到的位置已經有區塊就設定2P勝利(F=2)
650~660行:在2P的位置顯示小旗子
670行:在1P位置填入區塊編號1(表示此位置已經有區塊)
680行:返回主程式
700 IF D6=0 THEN D5=D5–1 
710 IF D6=1 THEN D5=D5+1 
720 IF D6=2 THEN D4=D4–1 
730 IF D6=3 THEN D4=D4+1 
740 IF C(D4,D5)=1 THEN F=1 
750 IF F=1 THEN LOCATE D0+5,D1+2 
760 if F=1 THEN PRINT CHR$(199) 
770 C(D4,D5)=1 
780 RETURN
700行:判斷變數D6 = 0(2P玩家按方向鍵上),就將2P移動中方塊Y軸(D5)持續減1
710行:判斷變數D6 = 1(2P玩家按方向鍵下),就將2P移動中方塊Y軸(D5)持續加1
720行:判斷變數D6 = 2(2P玩家按方向鍵左),就將2P移動中方塊X軸(D4)持續加1
730行:判斷變數D6 = 4(2P玩家按方向鍵右),就將2P移動中方塊X軸(D4)持續加1
740行:如果2P移動到的位置已經有區塊就設定1P勝利(F=1)
750~760行:在1P的位置顯示小旗子
770行:在2P位置填入區塊編號1(表示此位置已經有區塊)
780行:返回主程式

後記

花了不少時間寫這篇,主要是想盡量說明遊戲的運作原理與程式說明,希望對有興趣使用Family BASIC開發遊戲的同好有所幫助。
另外,來說說這次開發Family BASIC遊戲的小小心得,老實說以Family BASIC 2.0版的SRAM只有2K的容量下要來開發遊戲,很考驗程式跟企劃功力,就拿這次遊戲開發來說,有好幾次都因為程式寫到一半發現SRAM用光了,只好先回頭去最佳化程式跟刪減企劃內容才免免強強把遊戲生出來,不過這不就是懷舊遊戲迷人的地方嗎?!在有限的資源下發揮最大創意,這跟之前在PC或手機上開發遊戲的概念完全不一樣,我個人到是滿享受在這種變態小的容量下開發遊戲的,你說是不是。。。以上是這次的Family BASIC遊戲教學希望你會喜歡,我們下次見囉!!!
為什麼會看到廣告
5會員
15內容數
留言0
查看全部
發表第一個留言支持創作者!