Skip to content

Instantly share code, notes, and snippets.

@pazworld
Last active December 18, 2015 01:38
Show Gist options
  • Save pazworld/5704807 to your computer and use it in GitHub Desktop.
Save pazworld/5704807 to your computer and use it in GitHub Desktop.
%% -*- coding: utf-8 -*-
-module(yy).
-export([start/0]).
monsters() -> ["焼きたてパン", "強いシャチホコ", "もんじゃ焼き一年生",
"怪人ホタテ男", "ニセ勇者", "逃げ足の早いアレ", "睡魔", "煩悩",
"愛らしい子犬の中の人", "恋するスズメバチ", "勇敢なクマンバチ",
"信じられない物", "勇者の師匠", "浮遊する鎧", "怪盗ドボン", "闇の招き猫",
"誘惑のカスタードクリーム", "しょっぱすぎる籠手", "カレー味の兜",
"光沢だけは一流の盾", "若葉マークのモンスター", "新緑の季節",
"梅雨時の車両のニオイ", "暑すぎる夏", "新宿らしき何か",
"やたら発達したドーナツ", "育ちすぎたクマー", "なごやかな雰囲気",
"凍り付いた気配", "忍び寄る恐怖"].
skills() -> ["お豆腐の買い方", "鉛筆の買い方", "消しゴムの使い方",
"メモの取り方", "攻撃に使えないこともない呪文", "裏町の歩き方", "森林浴",
"珈琲の味", "しじみのみそ汁の作り方", "回覧板の回し方",
"郵便物の投函方法", "立ち話のコツ", "猫の呼び方", "犬の呼び方",
"カラスの呼び方", "鳩専用豆鉄砲", "秘密の趣味", "速く走るコツ",
"剣の使い方", "斧の使い方", "まきわりで、まっきわりわり", "聖なる祈り",
"孤独", "涼しく過ごすコツ", "お洒落のコツ", "卵をふわっと焼く方法",
"ごはんの研ぎ方", "油汚れの対応方法", "大人の振るまい", "Suicaの使い方"].
win_msg() -> "*-----\n~tsを倒した!\n~pの経験値を得た。\n".
levelup_msg1() -> "勇者は~pにレベルが上がった!\n勇者は、~tsを覚えた。\n\n".
levelup_msg2() -> "そして、\nかくかくしかじかで、"
"山あり谷ありの冒険が続いたが割愛。\n\n".
ending_msg() -> "勇者は、また、レベルが上がった!\n"
"勇者は、ふと空しさを覚えた。\n".
max_level() -> 30.
message_wait() -> 500. % milliseconds
start() ->
System = spawn(fun() -> system() end),
System ! start.
system() ->
receive
start ->
Hero = spawn(fun() -> hero(1) end),
register(hero, Hero),
Rand = spawn(fun() -> rand() end),
register(rand, Rand),
register(system, self()),
self() ! encounter;
encounter ->
Monster = spawn(fun() -> monster() end),
Monster ! encounter;
{win, MonsterName, Exp} ->
io:fwrite(win_msg(), [MonsterName, Exp]);
{levelup, Level, Skill} ->
MaxLevel = max_level(),
if
Level == MaxLevel -> self() ! ending;
Level /= MaxLevel ->
io:fwrite(levelup_msg1(), [Level, Skill]),
timer:sleep(message_wait()),
io:fwrite(levelup_msg2()),
timer:sleep(message_wait()),
self() ! encounter
end;
ending ->
io:fwrite(ending_msg()),
hero ! terminate,
rand ! terminate,
exit(normal)
end,
system().
hero(Level) ->
receive
{attack, MonsterName} ->
self() ! {win, MonsterName};
{win, MonsterName} ->
system ! {win, MonsterName, fact(Level)},
self() ! levelup;
levelup ->
rand ! {select_one, self(), skills()};
{selected, Skill} ->
system ! {levelup, Level, Skill},
hero(Level + 1);
terminate -> exit(normal)
end,
hero(Level).
monster() ->
rand ! {select_one, self(), monsters()},
receive
{selected, Name} -> monster(Name)
end.
monster(Name) ->
receive
encounter -> hero ! {attack, Name}
end.
rand() ->
{A, B, C} = now(),
random:seed(A, B, C),
rand_loop().
rand_loop() ->
receive
{select_one, From, List} ->
N = random:uniform(length(List)),
From ! {selected, lists:nth(N, List)};
terminate -> exit(normal)
end,
rand_loop().
fact(0) -> 1;
fact(N) -> N * fact(N - 1).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment