ゲームブロックで敵スプライトも弾を発射できるようにしようで作ったコードにライフを追加してみよう。
ライフを追加することで敵スプライトからの弾を数回受けてもゲームオーバーにならないようになります。
ライフを追加するには、前回のコードのうち、最初からブロックに

ライフ数を決めるブロックを挿入して、
プレイヤーが敵スプライトから発射された弾に当たる度にライフ数を 1 だけ減らすようにします。
ライフ数を減らすブロックは便利でして、ライフ数が 0 になった時点で自動でゲームオーバーの処理を開始します。
今回のコードをMicroPythonで書き換えてみます。
from microbit import *
import random
# プレイヤーの座標
player = [2, 4]
# 弾
bullet = [0, 0]
# ライフ
life = 3
# 敵
def create_enemy():
return [random.randint(0, 4), 0]
enemy = create_enemy()
# 敵の弾
enemy_bullet = [0, 0]
# 弾が発射中
is_launching = 0
# 敵の弾が発射中
is_enemy_launching = 0
# ボタンの押しっぱなし問題を回避
is_push_button = 0
render_active = True
def render():
global player, bullet, enemy, enemy_bullet, is_launching, is_enemy_launching, render_active
if not render_active:
return
coord = ""
for y in range(0, 5):
for x in range(0, 5):
if is_launching and bullet[0] == x and bullet[1] == y:
coord += "9"
elif is_enemy_launching and enemy_bullet[0] == x and enemy_bullet[1] == y:
coord += "9"
elif player[0] == x and player[1] == y:
coord += "9"
elif enemy[0] == x and enemy[1] == y:
coord += "9"
else:
coord += "0"
coord += ":"
img = Image(coord)
display.show(img)
# 弾の移動に関する処理
def update_bullet():
global bullet, enemy, is_launching
if is_launching == 1:
if bullet[0] == enemy[0] and bullet[1] == enemy[1]:
is_launching = 0
enemy = create_enemy()
bullet[1] -= 1
if bullet[1] < 0:
is_launching = 0
# 敵の移動に関する処理
def update_enemy():
global enemy, enemy_bullet, is_enemy_launching
enemy[0] += random.randint(-1, 1)
if enemy[0] < 0:
enemy[0] = 0
if enemy[0] > 4:
enemy[0] = 4
if is_enemy_launching == 0:
if random.randint(0, 2) > 1:
is_enemy_launching = 1
enemy_bullet[0] = enemy[0]
enemy_bullet[1] = 0
# 敵の弾の移動に関する処理
def update_enemy_bullet():
global player, life, enemy_bullet, is_enemy_launching, render_active
if is_enemy_launching == 1:
if enemy_bullet[0] == player[0] and enemy_bullet[1] == player[1]:
is_enemy_launching = 0
life -= 1
if life <= 0:
display.scroll("GAME OVER")
render_active = False
enemy_bullet[1] += 1
if enemy_bullet[1] > 4:
is_enemy_launching = 0
run_every(render, ms=100)
run_every(update_bullet, ms=100)
run_every(update_enemy, ms=500)
run_every(update_enemy_bullet, ms=100)
while True:
if is_push_button == 0:
# ボタンA + Bの同時押しをしたい且つボタン押しっぱなしで反応することを回避したい場合はボタンの押し状況を事前に確認して変数に入れておく
is_button_a_pressed = button_a.was_pressed()
is_button_b_pressed = button_b.was_pressed()
if is_button_a_pressed and is_button_b_pressed:
if is_launching == 0:
is_launching = 1
bullet[0] = player[0]
bullet[1] = 4
is_push_button = 1
else:
if is_button_a_pressed:
if player[0] > 0:
player[0] -= 1
is_push_button = 1
elif is_button_b_pressed:
if player[0] < 4:
player[0] += 1
is_push_button = 1
else:
is_push_button = 0
# ボタン押しっぱなしで反応する問題を回避する時にWhile Trueの最後でsleep(50)を入れておくと良い
sleep(50)