モグラたたきゲームの制作
ラズPicoとSSD1306とキーパッドを使って、下の動画のようなもぐらたたきゲームを制作します。画面の「■」がもぐらのつもりで、もぐらの位置に対応したキーパッドのスイッチを押すともぐらを叩いたと判定します。50回キーを押したら終了です。
もぐらたたきゲームのコード(MicroPython)
import time, random
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
#ゲームの設定
GAME_SPEED = 2 #モグラの入れ替わる速度[秒]
#キーパッドの初期設定
IN_PIN = [19, 20, 21, 22]#←a,b,c,d自分の配線にあわせること
SEL_PIN = [16, 17, 18]#←x,y,z自分の配線にあわせること
KEY_MAP =[[ '.','7','4','1'],
[ '0','8','5','2'],
[ '\n','9','6','3']]
sel_sw = []
in_sw = []
#SELピンの初期化
for i in range(len(SEL_PIN)):
sel_sw.append(Pin(SEL_PIN[i], Pin.OUT))
sel_sw[i].value(1)
#INピンの初期化
for i in range(len(IN_PIN)):
in_sw.append(Pin(IN_PIN[i], Pin.IN))
#キー入力の関数
def inputKeypad():
value = None
for i in range(len(SEL_PIN)):
sel_sw[i].value(0)
for j in range(len(IN_PIN)):
if in_sw[j].value() == 0:
value = KEY_MAP[i][j]
while in_sw[j].value()==0:
time.sleep(0.05)
sel_sw[i].value(1)
return value
#モグラを表示する関数
def dispMole(molematrix):
oled.fill(0)
for x in range(3):
for y in range(3):
if molematrix[y][x]==1:
oled.fill_rect(12*(x + 1)+30*x, 5+23*y , 12,12,1)
oled.show()
#モグラの位置
def initMole(moleline):
moleMatrix=[ moleline[i:i+3] for i in range(0, len(moleline),3)]
dispMole(moleMatrix)
moleline = sum(moleMatrix, [])
return moleline
#ゲームスタートのカウントダウン
def startCountdown():
for i in range(3,0,-1):
oled.fill(0)
oled.text(str(i), 50,28)
oled.show()
time.sleep(1)
oled.fill(0)
oled.text('Game Start!', 20, 28)
oled.show()
time.sleep(1)
#ディスプレイの初期化
WIDTH = 128
HEIGHT = 64
i2c = I2C(0)
i2c.scan()
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)
startCountdown()
#モグラの初期状態
initmoleline=[random.randint(0,1) for i in range(9)]
moleline = initMole(initmoleline)
t1 = time.time()
keycount = 0
molecount = initmoleline.count(1)
score = 0
while True:
t2 = time.time()
value = inputKeypad()
#モグラを叩いたら消える
if value != None and value != '.' and value != '0' and value != '\n':
keycount += 1
print('value:',value)
if moleline[int(value)-1]==1:
score += 1
moleline[int(value)-1]=0
initMole(moleline)
#モグラの再設置(全滅or指定時間経過)
if 1 not in moleline or t2 - t1 > GAME_SPEED:
t1 = time.time()
moleline = [random.randint(0,1) for i in range(9)]
initMole(moleline)
molecount += moleline.count(1)
print(molecount)
#終了条件
if keycount >=50 or molecount >= 100:
break
#スコア表示
oled.fill(0)
oled.text('Score:' + str(score), 30, 8)
oled.text('Try again!', 25,30)
oled.text('press enter', 20,50)
oled.show()
"""
#ソフトウエアリブート(main.pyで保存していると再スタート)
while True:
value = inputKeypad()
if value == '\n':
machine.soft_reset()
"""
モグラたたきゲームの回路図
モグラたたきゲームをもっと面白くするアイディア
・もぐらの出現スピードを2秒間隔から変えてみよう
→短くすると「難しく」なる。長くすると「やさしく」なる
・もぐらを「■」から変えてみよう
→SSD1306の関数を調べて、もぐらの画を描いてみよう
・もぐらを正しく叩いたら「○」、間違えたら「✕」を表示してみよう
→SSD1306の関数を調べて、「○」「✕」を描いてみよう
・もぐらの出現数が上限になったらゲームを終わるように変えてみよう
→もぐらの出現数をカウントするコードの追加など
・ゲーム終了までのカウントダウンを追加しよう
→(終了条件-現在地)をSSD1306に表示するコードを追加