第06話:通り過ぎる建物とあやしいおじさん ソースコード
#! ruby -E Windows-31J:utf-8
# coding: utf-8
#第06話
#初期化
def init
$d = 30 #帽子までの距離
$windspeed = 5 #風の速度
$speed = 2.5 #走る速度
#フラグ
$flag1 = 0
$flag2 = 0
$flag3 = 0
end
#メインルーチン
def mainstory
puts "**********************************************"
puts
puts "少女「帽子がとばされちゃった(棒読み)」"
puts
puts "少年「も、もちろん、僕が取ってくるよ!」"
puts
puts "少年は駆け出した。"
puts
loop do
print_distance
r = rand()
if r < 0.3
boy_act
elsif r < 0.5
boy_run
elsif r < 0.6
helper1
elsif r < 0.7
helper2
elsif r < 0.8
change_windspeed
end
boy_think
nextstep
if $d <= 0
happy_ED
break
elsif $d >= 100
bad_ED
break
end
end
puts "**********************************************"
end
#シーンクラス
class CityScene
@@obj_on_ground=[
"寝ている黒猫",
"うずくまっているおばあちゃん",
"倒れた空き瓶",
"腐った材木",
"かしがった手すり",
"異様な臭いを放つゴミ袋",
"足が一本ない椅子",
"地面に転がる酔っぱらい",
"新聞紙の束",
"ひしゃげたゴミ箱",
"パン屋の看板",
"床屋の看板",
"残飯をあさる野良犬"
];
@@building=[
"パン屋",
"小さな家",
"雑貨屋",
"あばら屋",
"立派な屋敷",
"崩れかけた廃屋"
]
def self.getObjectOnGround
n = rand(@@obj_on_ground.length)
return @@obj_on_ground[n]
end
def self.getBuilding
n = rand(@@building.length)
return @@building[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
#メソッド類
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_run
b = CityScene::getBuilding()
puts "少年は"+b+"の脇を駆け抜けた!"
puts
end
def change_windspeed
$windspeed = rand(10).to_i
puts "風が変化した!"
if $windspeed <= 2
puts "弱い風が吹いている!"
puts
elsif $windspeed <= 5
puts "それなりに強い風が吹いている!"
puts
else
puts "かなりの強風が吹いている!"
puts
end
end
def helper1
step = 1
puts "走っている少年にローブをかぶった老人が声をかけた。"
puts
puts "老人「おお、なにを急いでいるんじゃ?」"
puts
puts "少年「帽子を追いかけているんです!」"
puts
puts "老人「ふむ、わしが風を逆に吹かせてやろう」"
puts
loop do
if rand() < 0.3
d_move = step*$windspeed
if rand() < 0.5
puts "老人「ふぬわーーー!!」"
puts
puts "魔法の力で帽子が40メートル戻ってきた!"
puts
puts "しかし、老人が呪文を唱えている間に"+d_move.to_s+"メートル飛んでしまった。"
puts
d_move -= 40
else
puts "老人「ふぬ……ぬぐっ」"
puts
puts "魔法に失敗した!"
puts
puts "しかも、老人が呪文を唱えている間に"+d_move.to_s+"メートル飛んでしまった。"
puts
end
if d_move < 0
puts "合計で"+(-d_move).to_s+"メートル近づいた!"
puts
puts "少年「おじいさんありがとう!」"
puts "少年はまた走り出した!"
puts
else
puts "逆に"+d_move.to_s+"メートル離れてしまった!"
puts
puts "少年「あ、ありがとう……」"
puts "少年は微妙な表情でまた走り出した!"
puts
end
$d += d_move
break
end
puts "老人「むむ……」"
puts
puts "少年「早く早く!」"
puts
step += 1
end
end
def helper2
puts "おやしいおじさんが少年に声をかけた。"
puts
puts "おじさん「おう、ボーズ、何を急いでいるんだ」"
puts
puts "少年「帽子を追いかけているんです!」"
puts
puts "おじさん「くっくっくっ、そうかい。こいつを舐めてみな」"
puts
puts "少年はおじさんから渡された飴玉を口に放り込んだ。"
puts "少年は体中が熱くなった。"
puts
puts "少年「ありがとうございます。でも、これなんですか?」"
puts
puts "おじさん「気にするな。くっくっ、動きやすくなるぜ」"
puts
puts "少年が走り出すと、少し速くなったように感じた。"
puts
$speed += 1.2
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
#メインを10回出力
for i in 1..10
init()
mainstory()
end