[topic] 憂鬱な勇者
Posted feedbacks - Haskell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | module Main where
import Data.List
import qualified System.IO.UTF8 as U
import System.IO.Unsafe
import System.Random
shuffle :: StdGen -> [a] -> ([a],StdGen)
shuffle g xs = shuffle' [] g (length xs,xs)
where shuffle' acc g (0,_) = (acc,g)
shuffle' acc g (n,xs) = case randomR (0,n-1) g of
(i,g') -> case splitAt i xs of
(ys,z:zs) -> shuffle' (z:acc) g' (n-1,ys++zs)
facts = scanl (*) 1 [1..30]
monsters = ["焼きたてパン","強いシャチホコ","もんじゃ焼き一年生","怪人ホタテ男","ニセ勇者","逃げ足の早いアレ","睡魔","煩悩","愛らしい子犬の中の人","恋するスズメバチ","勇敢なクマンバチ","信じられない物","勇者の師匠","浮遊する鎧","怪盗ドボン","闇の招き猫","誘惑のカスタードクリーム","しょっぱすぎる籠手","カレー味の兜","光沢だけは一流の盾","若葉マークのモンスター","新緑の季節","梅雨時の車両のニオイ","暑すぎる夏","新宿らしき何か","やたら発達したドーナツ","育ちすぎたクマー","なごやかな雰囲気","凍り付いた気配","忍び寄る恐怖"]
skills = ["お豆腐の買い方","鉛筆の買い方","消しゴムの使い方","メモの取り方","攻撃に使えないこともない呪文","裏町の歩き方","森林浴","珈琲の味","しじみのみそ汁の作り方","回覧板の回し方","郵便物の投函方法","立ち話のコツ","猫の呼び方","犬の呼び方","カラスの呼び方","鳩専用豆鉄砲","秘密の趣味","速く走るコツ","剣の使い方","斧の使い方","まきわりで、まっきわりわり","聖なる祈り","孤独","涼しく過ごすコツ","お洒落のコツ","卵をふわっと焼く方法","ごはんの研ぎ方","油汚れの対応方法","大人の振るまい","Suicaの使い方"]
main = do { g <- getStdGen
; let (ms,g') = shuffle g monsters
; let (ss,_) = shuffle g' skills
; U.putStrLn
$ unlines
$ intersperse sep
$ map showStep
$ zip [1..30]
$ zip3 facts ms ss
}
showStep (l,(v,m,s))
= unlines
$ ["*-----"
,m++"を倒した!"
,show (facts !! l) ++ "の経験値を得た."
,"勇者は"++(if l==30 then "また,"
else show l ++"に")++"レベルが上った!"
,"勇者は"++(if l==30 then "ふと空しさ"
else s) ++"を覚えた."]
sep = unlines ["そして,"
,"かくかくかじかで,山あり谷ありの冒険が続いがが割愛."]
|



rkanbe #6403() Rating1/1=1.00
RPG他の要素を全て省略してレベルアップだけするプログラム。自動またはユーザからのアクションによって、RPG風の経験値の獲得とレベルアップメッセージを出力します。
元祖のソースコードは Ruby で書かれています。
http://d.hatena.ne.jp/hrkt0115311/20080527/1211891558
出力はほぼ原典どおりですが、それぞれの言語の特徴にあわせた処理の仕方で書いてみるとどうなるでしょうか(オブジェクト指向、再帰処理が書きやすい、など)。
これまでの言語別移植リストはこちらに掲載されています。
http://d.hatena.ne.jp/keyword/%cd%ab%dd%b5%a4%ca%cd%a6%bc%d4
[ reply ]