表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
9/30

第05話:協力者を得た少年 ソースコード

#! ruby -E Windows-31J:utf-8

# coding: utf-8


#第05話:協力者を得た少年



#シーンクラス

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 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 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

elsif rand() < 0.1

helper1

end


boy_think

nextstep


if $d <= 0

happy_ED

break

elsif $d >= 100

bad_ED

break

end

end


puts "**********************************************"


評価をするにはログインしてください。
この作品をシェア
Twitter LINEで送る
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

この作品はリンクフリーです。ご自由にリンク(紹介)してください。
この作品はスマートフォン対応です。スマートフォンかパソコンかを自動で判別し、適切なページを表示します。

↑ページトップへ