6. ゲームを作る
ここまでの組み合わせで、石よけゲーム を作ります。 上から石が落ちてくるので、← → で動いてよけます。当たると音が鳴って、よけた数が出ます。
rb
▶ コンソールで開く# チュートリアル 6: 石よけゲーム。← → で動いて、上から落ちてくる石をよける。
require 'adventure_board'
GC.start
matrix = AdventureBoard.matrix
buttons = AdventureBoard.buttons
speaker = AdventureBoard.speaker
speaker.reset
x = 8 # 自分の位置(いちばん下の段)
rocks = [] # 落ちてくる石。1 つが [x, y]
score = 0 # よけた石の数
tick = 0 # ループが何周したか
while true
buttons.each_press do |name|
x -= 1 if name == :left
x += 1 if name == :right
end
x = 1 if x < 1
x = 16 if 16 < x
tick += 1
speed = 6 - score / 10 # よけるほど速くなる
speed = 2 if speed < 2
if tick % speed == 0
rocks.each { |r| r[1] += 1 } # 石を 1 段落とす
rocks << [rand(16) + 1, 1] if rand(3) == 0 # ときどき新しい石を出す
end
hit = rocks.any? { |r| r[1] == 16 && r[0] == x }
if hit
speaker.play_mml("t180 o3 l16 g e c")
matrix.clear_drawing
matrix.draw_text(score.to_s, 0, 0) # よけた数を出す
matrix.blit
matrix.show
sleep_ms 2000
rocks = []
score = 0
buttons.clear_presses # 待っているあいだに押したぶんは捨てる
next
end
left = rocks.select { |r| r[1] <= 16 } # 下まで落ちきった石は捨てて
score += rocks.size - left.size # その数だけ点を足す
rocks = left
matrix.clear
rocks.each { |r| matrix.set(r[0], r[1], 0x60) }
matrix.set(x, 16, 0xFF)
matrix.show
sleep_ms 30
endしくみ
石を覚えておく
ruby
rocks = [] # 落ちてくる石。1 つが [x, y]rocks << [rand(16) + 1, 1] で、いちばん上の段のでたらめな位置に石を足します。
石を落とす速さ
ループは 30 ミリ秒ごとに回っていますが、石が毎回落ちると速すぎます。 tick(何周したか)を数えて、speed 周に 1 回だけ落とします。
ruby
if tick % speed == 0speed はよけた数が増えるほど小さくなるので、だんだん速くなります。
当たったか
ruby
hit = rocks.any? { |r| r[1] == 16 && r[0] == x }「いちばん下の段にあって、x が自分と同じ石が 1 つでもあるか」を調べます。
点を数える
下まで落ちきった石(y が 16 を超えたもの)は捨てて、その数だけ点を足します。
ruby
left = rocks.select { |r| r[1] <= 16 } # まだ画面の中の石だけ残す
score += rocks.size - left.size
rocks = leftやってみよう
- A ボタンで 2 マス飛べるようにしてみましょう
- よけるたびに短い音を鳴らしてみましょう
- 当たったら、
draw_textで「負」と出してみましょう - 石の明るさを、落ちるほど明るくしてみましょう