4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

hubot-scriptsAdvent Calendar 2013

Day 4

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

Posted at

暇すぎて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人でも寂しくないですよね!

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?