根據維基百科「太空侵略者」的資料介紹,日本 TAITO 公司於 1978年發行了 「Space Invaders」的一款大型電玩遊戲,後來許多廠商跟風遊戲採用昆蟲造型,在台灣的玩家暱稱此類遊戲為「小蜜蜂」。後來1979 年,NAMCO 公司也推出了「Galaxian」遊戲,玩家使用一台戰鬥機,要摧毀侵犯地球的外星人戰鬥機。由於外星人戰機會不時往下飛,攻擊玩家,更讓此類遊戲變得更刺激,廣受當時玩家喜愛。我們現在也可以用玩學機來開發這個遊戲,是不是很厲害呢?
玩學運算科技公司提供了一套相當精簡的 Demo 程式,僅用 45行指令,就可以完成一個相當類似小蜜蜂的遊戲。精準的還原了大型電玩的玩法。未來如果學員有興趣,還能使用 VGA 擴充套件,將遊戲畫面輸出到螢幕上,甚至也能改版成多人對戰的版本。
我們先來看看程式,將程式讀進玩學機中執行吧。
# WiFiBoy OK:ESP32 Galaxian Clone Example (BlitEngine/45-Line-Example)
# 2018.09.06, ricky@wifiboy.org, WiFiBoyMini
# 2020.01.09, tklua@wifiboy.org, OK:ESP32
wb.blitpal()
star=[]; starspeed=[]
for i in range(0, 40):
star.append(wb.rand() % 20480)
starspeed.append((wb.rand() % 4)+1)
x = 50; bt = btx = ct = dx = sc = 0; dir = 2; spn=[]
for i in range(0,18): spn.append(1)
while True:
wb.blitbuf()
for j in range(0,40):
wb.blitbuf(star[j],255)
star[j] = star[j]+160*starspeed[j]
if (star[j]>20480): star[j] = star[j] - 20480
if wb.getkey() & 4 == 4:
x += 2
if x > 144: x = 144
if wb.getkey() & 8 == 8:
x -= 2
if x < 0: x = 0
if wb.getkey() & 1 == 1:
if bt==0: bt = 112; btx = x+6
if wb.getkey() & 2 == 2:
for i in range(0,18): spn[i]=1
if bt > 0: wb.blitimg(1, btx, bt); bt -= 2
ct += 1
if (ct %4)==0:
dx += dir
if dx>64: dir=-2; dx=64
if dx<1: dir=2; dx=1
for j in range(32,97,48): wb.blitimg(176, dx+j-16, 12, 16)
for i in range(0,18):
sx = dx+(i%6)*16; sy = (i//6)*16+30
if (spn[i]==1):
if ((ct+i)%40<20): wb.blitimg(144, sx, sy, 16)
else: wb.blitimg(146, sx, sy, 16)
if (bt-sy>0) and (bt-sy<16) and (btx-sx>0) and (btx-sx<13):
spn[i]=20; bt = 0; sc+=100
elif (spn[i]>7): wb.blitimg(121, sx, sy, 16); spn[i]-=1
elif (spn[i]>2): wb.blitimg(119, sx, sy, 16); spn[i]-=1
wb.blitimg(115, x, 112, 16)
wb.blitstr("SCORE %5s"%(str(sc)), 20, 0)
wb.blit()
要學員直接寫出45行的小精靈遊戲,有點強人所難。但經過這幾天的教學課程,我們應該就有能力魔改一些地方,變成「坦克打小精靈」遊戲。我們的條件如下:
我們在不調整操作系統、遊戲背景畫面(流星天空)、爆炸效果等情況下,要如何讓遊戲可以玩呢?這也是以前大型電玩中張飛打春麗的魔改方法。是不是很有趣呢?
我們來試試底下的程式,來體驗會魔改的成就感。
wb.blitstr("Galaxian Demo", 0, 0)
wb.blitimg(115, 0, 20, 16, 16) # 戰機
wb.blitimg(119, 16, 20, 16, 16) # 小爆炸
wb.blitimg(121, 32, 20, 16, 16) # 大爆炸
wb.blitimg(144, 48, 20, 16, 16) # 外星人1
wb.blitimg(146, 64, 20, 16, 16) # 外星人2
wb.blitimg(176, 80, 20, 16, 16) # 小魔王
對應成
wb.blitimg(496, 0, 40, 16, 16) # 戰車朝上
wb.blitimg(562, 16, 40, 16, 16) # 中爆炸
wb.blitimg(564, 32, 40, 16, 16) # 大爆炸
wb.blitimg(336, 48, 40, 16, 16) # 紅鬼
wb.blitimg(340, 64, 40, 16, 16) # 黃鬼
wb.blitimg(344, 80,40, 16, 16) # 粉紅鬼
# 魔改坦克大戰小精靈
wb.blitpal()
star=[]; starspeed=[]
for i in range(0, 40):
star.append(wb.rand() % 20480)
starspeed.append((wb.rand() % 4)+1)
x = 50; bt = btx = ct = dx = sc = 0; dir = 2; spn=[]
for i in range(0,18): spn.append(1)
while True:
wb.blitbuf()
for j in range(0,40):
wb.blitbuf(star[j],255)
star[j] = star[j]+160*starspeed[j]
if (star[j]>20480): star[j] = star[j] - 20480
if wb.getkey() & 4 == 4:
x += 2
if x > 144: x = 144
if wb.getkey() & 8 == 8:
x -= 2
if x < 0: x = 0
if wb.getkey() & 1 == 1:
if bt==0: bt = 112; btx = x+6
if wb.getkey() & 2 == 2:
for i in range(0,18): spn[i]=1
if bt > 0: wb.blitimg(1, btx, bt); bt -= 2
ct += 1
if (ct %4)==0:
dx += dir
if dx>64: dir=-2; dx=64
if dx<1: dir=2; dx=1
for j in range(32,97,48): wb.blitimg(344, dx+j-16, 12, 16)
for i in range(0,18):
sx = dx+(i%6)*16; sy = (i//6)*16+30
if (spn[i]==1):
if ((ct+i)%40<20): wb.blitimg(336, sx, sy, 16)
else: wb.blitimg(340, sx, sy, 16)
if (bt-sy>0) and (bt-sy<16) and (btx-sx>0) and (btx-sx<13):
spn[i]=20; bt = 0; sc+=100
elif (spn[i]>7): wb.blitimg(564, sx, sy, 16); spn[i]-=1
elif (spn[i]>2): wb.blitimg(496, sx, sy, 16); spn[i]-=1
wb.blitimg(496, x, 112, 16)
wb.blitstr("SCORE %5s"%(str(sc)), 20, 0)
wb.blit()
遊戲類應用也要告一段落了,明天開始,我們將要介紹玩學機在網路應用方面的例子。明天見囉!