Hubot

Hubot-scriptsでサイコロを投げる

More than 5 years have passed since last update.

暇すぎてbotとでも遊ぼうかと思っても、会話だけではすぐにつまらなくなってしまいます。

そんな時に備えて、botにサイコロを振らせてみましょう。


参考スクリプト

dice.coffeeを参考に、シンプルにしてみました。


サイコロふるよ

「サイコロ!」と叫ぶと、6面ダイスを2つ振るスクリプトを用意しました。


dice2d6.coffee

module.exports = (robot) ->

robot.hear /サイコロ/, (msg) ->
msg.send report roll 2, 6

report = (results) ->
"えいっ! #{results.join('と')} がでたよ!"

roll = (dice, sides) ->
rollOne(sides) for i in [0...dice]

rollOne = (sides) ->
1 + Math.floor(Math.random() * sides)


coffeeスクリプトのfor文の使い方とか、やはり他の人が書いたスクリプトは参考になります。

repot関数には、roll(2, 6)の結果が入ります。

roll関数は、diceに2(2個)、sidesに6(6面)をセットすると、diceの数だけ繰り返します。

繰り返されるのは、rollOne関数です。ここで6面ダイスを振ります。

逆からたどると、rollOneを2回呼び出した結果が配列になり、その配列がreport関数のresultsに入ります。resultsをjoinで繋いで返答を作成します。


前回学んだmsg.randomを使うよ

サイコロも何度も振ると、botの反応が同じなのでつまらなくなってきます。

そこで、前回のmsg.randomを使ってみましょう。


dice2d6_2.coffee

dicemes1 = [

"えいっ!",
"コロコロ..",
"いい目でてね〜"
]
dicemes2 = [
"だよっ",
"だねっ!",
"だったよ!"
]

module.exports = (robot) ->
robot.hear /(サイコロ|ダイス)/, (msg) ->
msg.send report msg, roll 2, 6

report = (msg, results) ->
msg1 = msg.random dicemes1
msg2 = msg.random dicemes2
"#{msg1} #{results.join('と')} #{msg2}"

roll = (dice, sides) ->
rollOne(sides) for i in [0...dice]

rollOne = (sides) ->
1 + Math.floor(Math.random() * sides)


ついでに、サイコロだけではなくて、ダイスでも反応するようにしました。

これで、

私:「運命のダイスロール!」

hubot:「いい目でてね〜 4と2 だよっ」

私:「サイコロ!」

hubot:「えいっ! 3と3 だったよ!」

私:「サイコロ投げて!」

hubot:「コロコロ.. 5と4 だったよ!」

ということができるようになります。

これで1人でも寂しくないですよね!