ゲームブロックで敵スプライトも弾を発射できるようにしよう


ゲームブロックで敵スプライトを自動で左右に動かすようにしようで敵スプライトも自動で左右に動くようにしました。

このコードを改修して、敵スプライトも時々弾を発射するようにしてみます。



最初だけブロック内で敵の弾の発射中のフラグを用意しておきます。



敵の弾の発射の関数を作成し、新たにずっとブロックを設置して敵の弾の挙動のコードを作成します。



更に新たにずっとブロックを用意して、発射した敵の弾の動きに関する処理を追加します。



発射した敵の弾の動きが書かれたずっとブロックに敵の弾スプライトとプレイヤースプライトがぶつかった時の条件式を挿入してゲームオーバーの処理を追加したら終了です。

あとはこのコードに点数や弾が何かに当たった時に音を出すといった処理を追加してゲーム性を高めていきましょう。




今回のコードをMicroPythonで書き換えてみます。

from microbit import *
import random

# プレイヤーの座標
player = [2, 4]

# 弾
bullet = [0, 0]

# 敵
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, 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
			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)
京都の東本願寺で開催されているプログラミング教室で講師をしています。
詳しくはTera schoolを御覧ください。
同じカテゴリーの記事
マインクラフト用ビジュアルエディタを開発しています。

詳しくはinunosinsi/mcws_blockly - githubをご覧ください。