5. 今回完成したコードと実際に動かしてみよう!
これで、辞書とリストを組み合わせて複数の敵を管理し、出現・移動・描画する仕組みが完成しました。
敵が次々と現れることで、ゲームに活気が生まれますね!
今回の内容をすべて含んだ完成コードはこちらです。
import pyxel
import random
# =========================================================
# ASTRO SURVIVOR
# - 宇宙シューティングゲーム -
# =========================================================
# --- 定数設定 ---
SCREEN_WIDTH = 160
SCREEN_HEIGHT = 120
GAME_TITLE = "ASTRO SURVIVOR"
STAR_COUNT = 40
# キャラクターのサイズ
PLAYER_W = 8
PLAYER_H = 8
PLAYER_SPEED = 3
ENEMY_W = 8 # 敵の幅
ENEMY_H = 8 # 敵の高さ
# 色の定義
COL_BLACK = 0
COL_NAVY = 1
COL_PURPLE = 2
COL_GREEN = 3
COL_BROWN = 4
COL_DBLUE = 5
COL_LBLUE = 6
COL_WHITE = 7
COL_RED = 8
COL_ORANGE = 9
COL_YELLOW = 10
COL_L_GREEN = 11
COL_CYAN = 12
COL_GRAY = 13
COL_PINK = 14
COL_PEACH = 15
# --- Pyxelの初期化と音の定義 ---
pyxel.init(SCREEN_WIDTH, SCREEN_HEIGHT, title=GAME_TITLE)
# --- 変数の初期化 ---
# プレイヤー
player_x = SCREEN_WIDTH // 2 - PLAYER_W // 2
player_y = SCREEN_HEIGHT - 20
# ゲームオブジェクト
bullets = [] # [x, y, vx, vy]
enemies = [] # Dictionary {'x', 'y', 'type', ...}
stars = [] # [x, y, speed]
# 星空の準備
for _ in range(STAR_COUNT):
stars.append([
random.randint(0, SCREEN_WIDTH),
random.randint(0, SCREEN_HEIGHT),
random.randint(1, 3)
])
# =========================================================
# 関数定義 (エフェクト生成など)
# =========================================================
# 敵を出現させる
def spawn_enemy():
enemies.append({
'x': random.randint(0, SCREEN_WIDTH - ENEMY_W),
'y': -10,
'vx': 0,
'vy': 1.0,
'hp': 1,
'w': ENEMY_W, 'h': ENEMY_H,
'score': 10
})
# =========================================================
# メインループ (Update & Draw)
# =========================================================
# 毎フレーム実行される更新処理 (計算などはここで行う。描画は禁止)
def update():
global player_x, player_y
global bullets, enemies
# --- 3. プレイヤー操作 ---
if pyxel.btn(pyxel.KEY_LEFT): player_x = max(player_x - PLAYER_SPEED, 0)
if pyxel.btn(pyxel.KEY_RIGHT): player_x = min(player_x + PLAYER_SPEED, SCREEN_WIDTH - PLAYER_W)
if pyxel.btn(pyxel.KEY_UP): player_y = max(player_y - PLAYER_SPEED, 0)
if pyxel.btn(pyxel.KEY_DOWN): player_y = min(player_y + PLAYER_SPEED, SCREEN_HEIGHT - PLAYER_H)
# 弾の発射
if pyxel.btnp(pyxel.KEY_SPACE):
bullets.append([player_x + 3, player_y - 4, 0, -5])
# --- 4. オブジェクト更新 ---
# 弾の移動
surviving_bullets = []
for b in bullets:
b[0] += b[2] # vx
b[1] += b[3] # vy
# 画面外でなければ残す
if b[1] >= -10 and b[0] >= -10 and b[0] <= SCREEN_WIDTH + 10:
surviving_bullets.append(b)
bullets = surviving_bullets
# 敵の出現
if pyxel.frame_count % 30 == 0:
spawn_enemy()
# 敵の更新
surviving_enemies = []
for e in enemies:
e['y'] += e['vy']
if e['y'] > SCREEN_HEIGHT:
continue
surviving_enemies.append(e)
enemies = surviving_enemies
# 毎フレーム実行される描画処理 (結果を画面に表示する。計算はしない)
def draw():
pyxel.cls(COL_BLACK)
# 背景
for star in stars:
pyxel.pset(star[0], star[1], COL_WHITE if star[2] > 1 else COL_GRAY)
# プレイヤー
pyxel.rect(player_x, player_y, PLAYER_W, PLAYER_H, COL_ORANGE)
pyxel.rect(player_x+3, player_y-2, 2, 2, COL_YELLOW)
# 弾
for b in bullets:
pyxel.rect(b[0], b[1], 2, 4, COL_L_GREEN)
# 敵
for e in enemies:
pyxel.rect(e['x'], e['y'], e['w'], e['h'], COL_GRAY)
pyxel.rect(e['x']+2, e['y']+2, 4, 4, COL_CYAN)
pyxel.run(update, draw)
上記のコードを実際にブラウザで動かしてみてください。
実際に動かしてみよう!
矢印キーで自機を操作、スペースキーで弾を発射できます。敵が画面上から次々と出現します。
次回の記事では、いよいよ自機の弾と敵の「当たり判定」を実装し、敵を撃ち落とせるようにします。お楽しみに!
実践:命中!敵を撃破

最後まで読んでくれてありがとう!🌱
ノートみたいに、いつでも見返してね。