第04話:疾走感を少し獲得した少年
前回、少年に心の声を吐露させた所、ずっと言い続けることになって大変に迷惑でした。
しかし賑やかし程度でも、ないよりはマシです。
プログラム的にちょっと汚くなりますが、フラグを立てて一度だけ言ってもらうようにしましょう。
しかしそれだけではあまりに変更が小さすぎるので、もう一つ考えてみましょう。
風の変化を実装しましたが、いまいちインパクトがありません。
これが実際に画面のあるゲームなら風の強弱で帽子の速度が変わるのでそれなりに意味があるでしょう。
しかし、文章では「強い風」とか「弱い風」を列挙されても「ふーん」てなものです。
あまりおもしろくないので、少し残念ですが、風の変化はなくしてしまいましょう。
これだけでは機能を削っただけです。
さらにもう一つなにか考えましょう。
少年には疾走感が足りません。
いろんなものを飛び越えながら走ってもらいましょう。
ということで、地面にあるいろいろなものを教えてくれるメソッド「getObjectOnGround」というものを作りました。
これが「黒猫」「倒れた酒瓶」「うずくまっているおばあちゃん」などを返してくれるので、これをつかって文章を作っていきます。
また、しばらく少年の方に集中したいので、最初と最後のセリフはしばらく固定にします。
帽子に届いたらハッピーエンド、100m以上になったらバッドエンドです。
さぁ、そしてこれが完成した文章です!
**********************************************
少女「帽子がとばされちゃった(棒読み)」
少年「も、もちろん、僕が取ってくるよ!」
少年は駆け出した。
帽子まで30メートル!
少年の走る目の前に、うずくまっているおばあちゃんが!
しかし、少年はうずくまっているおばあちゃんを危なげなく飛び越えた。
(行ける、僕は行けるぞ!)
少年はそう信じて走り続けた。
帽子まで32.5メートル!
帽子まで35.0メートル!
少年の走る目の前に、ひしゃげたゴミ箱が!
しかし、少年はひしゃげたゴミ箱をなんとか飛び越えた。
帽子まで37.5メートル!
帽子まで40.0メートル!
(駄目かも……いや、違う、自分を信じるんだ!)
少年は雑念を振り払って無心で足を動かし続けた。
帽子まで42.5メートル!
帽子まで45.0メートル!
帽子まで47.5メートル!
少年の走る目の前に、床屋の看板が!
しかし、少年は床屋の看板を危なげなく飛び越えた。
帽子まで50.0メートル!
帽子まで52.5メートル!
帽子まで55.0メートル!
少年の走る目の前に、異様な臭いを放つゴミ袋が!
しかし、少年は異様な臭いを放つゴミ袋をなんとか飛び越えた。
帽子まで57.5メートル!
帽子まで60.0メートル!
少年の走る目の前に、パン屋の看板が!
しかし、少年はパン屋の看板をなんとか飛び越えた。
帽子まで62.5メートル!
少年の走る目の前に、足が一本ない椅子が!
しかし、少年は足が一本ない椅子をトリプルアクセルで飛び越えた。審査員も大喝采だ。
帽子まで65.0メートル!
少年の走る目の前に、うずくまっているおばあちゃんが!
しかし、少年はうずくまっているおばあちゃんをトリプルアクセルで飛び越えた。審査員も大喝采だ。
帽子まで67.5メートル!
帽子まで70.0メートル!
(もうダメだ。また罵られるに違いない。この世界に神はないのか!?)
少年はボロボロになりながら、神を呪い、天を呪い、世界のすべてを呪いながらも進み続けた。
帽子まで72.5メートル!
少年の走る目の前に、足が一本ない椅子が!
しかし、少年は足が一本ない椅子をなんとか飛び越えた。
帽子まで75.0メートル!
帽子まで77.5メートル!
帽子まで80.0メートル!
少年の走る目の前に、倒れた空き瓶が!
しかし、少年は倒れた空き瓶を軽々と飛び越えた。
帽子まで82.5メートル!
帽子まで85.0メートル!
帽子まで87.5メートル!
少年の走る目の前に、寝ている黒猫が!
しかし、少年は寝ている黒猫を軽々と飛び越えた。
帽子まで90.0メートル!
帽子まで92.5メートル!
帽子まで95.0メートル!
少年の走る目の前に、かしがった手すりが!
しかし、少年はかしがった手すりを錐揉み回転しながら飛び越えた。
帽子まで97.5メートル!
少年は諦めて足を止めた。
少年がうなだれて少女のもとに戻ると、またもや少女は冷ややかな目で少年を見た。
少女「酷すぎるわ。なんど失敗すれば気が済むの?」
少年は自らの非力さを呪った。
**********************************************
なんかいい感じになってますよ!
これまでと比較すると格段の出来です。
しかし、ここまで来てみて、文章書くよりプログラムを書くほうが大変な気がしてきました。
ですがそれは何かの気のせいということにして進んでいきたいと思います。
なお、ジャンプの文章でレアなものが頻繁に出過ぎないように、重み付きの乱数を作成したり、地味にいろいろ作っています。
ソースコードは以下の通り。
#! ruby -E Windows-31J:utf-8
# coding: utf-8
#第04話:疾走感を少し獲得した少年
#シーンクラス
class CityScene
@@obj_on_ground=[
"寝ている黒猫",
"うずくまっているおばあちゃん",
"倒れた空き瓶",
"腐った材木",
"かしがった手すり",
"異様な臭いを放つゴミ袋",
"足が一本ない椅子",
"地面に転がる酔っぱらい",
"新聞紙の束",
"ひしゃげたゴミ箱",
"パン屋の看板",
"床屋の看板",
"残飯をあさる野良犬"
];
def self.getObjectOnGround
n = rand(@@obj_on_ground.length)
return @@obj_on_ground[n]
end
end
#アクションクラス
class BoyAction
@@act_jump=[
"なんとか飛び越えた",
"軽々と飛び越えた",
"危なげなく飛び越えた",
"錐揉み回転しながら飛び越えた",
"トリプルアクセルで飛び越えた。審査員も大喝采だ"
]
def self.getJumpAction
n = WeightedRandom::int_rand(@@act_jump.length-1,0.6)
return @@act_jump[n]
end
end
#重み付き乱数生成クラス
class WeightedRandom
#0が最も出やすくて、maxが最も出にくい乱数
#next_prob:次の数字が出る確率
def self.int_rand(max, next_prob)
p = 1.0
total = 1.0
#確率分布を積分
for i in 1..max
p = p * next_prob
total += p
end
#乱数計算
r = total * rand()
#乱数を確率分布で計算
p = 1.0
x = 1.0
ret = 0
while x < r
p = p * next_prob
x = x + p
ret += 1
end
return ret
end
def self.test
a =[]
for i in 0..10 do a[i]=0; end
for i in 1..100000 do a[WeightedRandom::int_rand(5,0.1)] += 1; end
for i in 0..10 do puts a[i]; end
end
end
#初期化
$d = 30 #帽子までの距離
$windspeed = 5 #風の速度
$speed = 2.5 #走る速度
#フラグ
$flag1 = 0
$flag2 = 0
$flag3 = 0
#メソッド類
def print_distance
puts "帽子まで"+$d.to_s+"メートル!"
puts
end
def boy_act
obj = CityScene::getObjectOnGround()
puts "少年の走る目の前に、"+obj+"が!"
puts "しかし、少年は"+obj+"を"+BoyAction::getJumpAction()+"。"
puts
end
def boy_think
if $d < 40
if $flag1 == 0
puts "(行ける、僕は行けるぞ!)"
puts "少年はそう信じて走り続けた。"
puts
$flag1 = 1
end
elsif $d < 70
if $flag2 == 0
puts "(駄目かも……いや、違う、自分を信じるんだ!)"
puts "少年は雑念を振り払って無心で足を動かし続けた。"
puts
$flag2 = 1
end
elsif ($flag3 == 0)
puts "(もうダメだ。また罵られるに違いない。この世界に神はないのか!?)"
puts "少年はボロボロになりながら、神を呪い、天を呪い、世界のすべてを呪いながらも進み続けた。"
puts
$flag3 = 1
end
end
def nextstep
$d = $d - $speed + $windspeed
end
def happy_ED
puts "少年は帽子を掴んだ!"
puts
puts "少年が喜び勇んで少女のもとに戻った。"
puts
puts "少女「まぁまぁね」"
puts
puts "少年は少女に認められた喜びに打ち震えた。"
puts
end
def bad_ED
puts "少年は諦めて足を止めた。"
puts
puts "少年がうなだれて少女のもとに戻ると、またもや少女は冷ややかな目で少年を見た。"
puts
puts "少女「酷すぎるわ。なんど失敗すれば気が済むの?」"
puts
puts "少年は自らの非力さを呪った。"
puts
end
#メインルーチン
puts "**********************************************"
puts
puts "少女「帽子がとばされちゃった(棒読み)」"
puts
puts "少年「も、もちろん、僕が取ってくるよ!」"
puts
puts "少年は駆け出した。"
puts
loop do
print_distance
if rand() < 0.3
boy_act
end
boy_think
nextstep
if $d <= 0
happy_ED
break
elsif $d >= 100
bad_ED
break
end
end
puts "**********************************************"