Youtube 観てたら、古いテレビの録画で、せんだみつおゲームをやっていた。やっぱりプログラマだから書いてみたくなる。言語はこないだ見つけた、Fantom にしてみる。
こんな感じ
- Actor を5つ生成して、5名の参加者に見立てる
- メインのスレッドでは、無限ループしながら Actor にタイミングを出しつづける
- Actor は、"SENDA", "MITSUO", "NAHANAHA"を出力しながら、ランダムに次の番のアクターを指名する
using concurrent
class SendaMitsuoGame {
Void main() { play }
Void play() {
pool := ActorPool()
Actor[] actors := (1..5).map { Player(pool, it) }
actors[0].send("next1")
actors.each { it.send(actors.toImmutable) }
messages := ["senda", "mitsuo", "nahanaha"]
while (true) {
message := getHeadAndRotate(messages)
actors.each { it.send(message) }
Actor.sleep(1sec)
}
}
Str getHeadAndRotate(Str[] m) { m.add(m.removeAt(0)).last }
}
const class Player : Actor {
const Int number
new make(ActorPool p, Int number) : super(p) {
this.number = number }
override Obj? receive(Obj? msg) {
if (msg is List) { Actor.locals["all"] = msg }
else if (msg == "senda") doSenda
else if (msg == "mitsuo") doMitsuo
else if (msg == "nahanaha") doNahanaha
else if (0==((Str)msg).index("next")) {
setMyTurn(((Str)msg)["next".size..-1].toInt)
}
return null
}
Bool isNext(Int n) {
diff := (n - number).abs()
return 1 == diff || 4 == diff
}
Bool isMyTurn() { Actor.locals["myTurn"] }
Void setMyTurn(Int f) {
Actor.locals["myTurn"] = (number == f)
Actor.locals["nextOnesTurn"] = isNext(f) }
Void doSenda() { callAndAssign("SENDA") }
Void doMitsuo() { callAndAssign("MITSUO") }
Void doNahanaha() {
if (Actor.locals["nextOnesTurn"])
echo("" + number + ": NAHANAHA");
}
Void callAndAssign(Str call) {
if (!isMyTurn()) return
next := nextOne()
echo("" + number + ": " + call + " -> " + next);
((Actor[])Actor.locals["all"]).each { it.send("next" + next) }
}
Int nextOne() {
next := Int.random(1..4)
if (next < number) return next
return (++next < 6) ? next: 1
}
}
出力はこんな感じになる。ミスる事も無く、延々とせんだみつおゲームを繰り返す。適当な確率でミスさせる事も、もちろんできるけど、割愛。
$ fan senda.fan 1: SENDA -> 2 2: MITSUO -> 5 1: NAHANAHA 4: NAHANAHA 5: SENDA -> 1 1: MITSUO -> 3 4: NAHANAHA 2: NAHANAHA 3: SENDA -> 5 5: MITSUO -> 4 5: NAHANAHA 3: NAHANAHA 4: SENDA -> 3 3: MITSUO -> 1 5: NAHANAHA 2: NAHANAHA 1: SENDA -> 4 4: MITSUO -> 5 1: NAHANAHA 4: NAHANAHAしかし夜遅くまで、俺、何書いてんだ・・・
0 件のコメント:
コメントを投稿