4
2

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.

簡単に動かせるじゃんけんbotの作り方(解説)

Last updated at Posted at 2019-10-31

#まずはじめに
大前提としてpythonの基礎知識が無いと少し難しいかもしれません(if文とか?)
全くないよ!~~Python?なにそれ美味しいの?~~って人は以下のサイトで少し勉強すると何となく理解出来ると思います。僕自身も初学者なので完璧に理解なんてしてませんしこう書いたらこう動くのか~~程度にしか分からないですが忘備録として残します。
まぁとりあえずじゃんけんbotが作りたいよ!
って人は適当にコピペして動かしてください

#筆者の環境

  • Windows10
  • PyCharm Community Edition
  • pythonのバージョン (3.7.4)
  • discord.pyのバージョン (1.2.4)

前提条件

お使いのエディターでpythonとdiscord.pyが動く前提で進めていきます
動かないよ!って方は他の方が上げて下さっている記事を元に動くようにしてください。
この記事では特に説明しません

では本題に行きましょう

#ようやくコードへ

結論から言うとこのコードコピペすれば動きます、多分

JankenBot
import discord
import random
client = discord.Client()


@client.event
async def on_message(message):
"""以下メッセージを処理します"""
    global result, judge
    if message.author.bot:  # ボットからのメッセージを回避します
        return

    if message.content == "!じゃんけん":
        await message.channel.send("最初はぐー、じゃんけん")

        jkbot = random.choice(("ぐー", "ちょき", "ぱー"))
        draw = "引き分けだよ~"
        wn = "君の勝ち!"
        lst = random.choice(("私の勝ち!弱wwwwwwwwwwwwやめたら?じゃんけん",
                              "私の勝ちだね(∩´∀`)∩、また挑戦してね!"))

        def jankencheck(m):
            return (m.author == message.author) and (m.content in ['ぐー', 'ちょき', 'ぱー'])

        reply = await client.wait_for("message", check=jankencheck)
        if reply.content == jkbot:
            judge = draw
        else:
            if reply.content == "ぐー":
                if jkbot == "ちょき":
                    judge = wn
                else:
                    judge = lst

            elif reply.content == "ちょき":
                if jkbot == "ぱー":
                    judge = wn
                else:
                    judge = lst

            else:
                if jkbot == "ぐー":
                    judge = wn
                else:
                    judge = lst

        await message.channel.send(judge)

とまぁこんな感じです。
とりあえずこれを実行してみると

無題.png

こんな感じで動きます。
もう少し掘り下げてみます。

簡単な解説

本当に簡単な解説しか出来ないですが個人的に分かりにくいところ少しだけ。(筆者の知識不足が露呈する)

    if message.content == "!じゃんけん":
        await message.channel.send("最初はぐー、じゃんけん")

この部分でまず !じゃんけん 入力された場合
最初はぐー、じゃんけん と返すように記述しています。
これはこのじゃんけんbotに限らず他の何かを作る時も使うので覚えます(自戒)

        jkbot = random.choice(("ぐー", "ちょき", "ぱー"))

ここではjkbot

  • ぐー
  • ちょき
  • ぱー

のいずれかがランダムで代入されるようになってます。
jkbotという名前はあくまでも例なので自由に変更して大丈夫です。その代わり変更した場合はそれ以下のコードのjkbot部分を変更したものに全て書き換えてください。

        lst = random.choice(("私の勝ち!弱wwwwwwwwwwwwやめたら?じゃんけん",
                              "私の勝ちだね(∩´∀`)∩、また挑戦してね!"))

ここ、なんとなく最初は二つ目のメッセージのみ記述していたのですが刺激が欲しくなりこちらもランダム関数を使うことにより負けメッセージをランダム化させました。要らない人はwndrawのように普通に代入してください。

        def jankencheck(m):
            return (m.author == message.author) and (m.content in ['ぐー', 'ちょき', 'ぱー'])

        reply = await client.wait_for("message", check=jankencheck)

この部分で**!じゃんけん**を始めた人からのメッセージを待ち、送信されたメッセージが

  • ぐー
  • ちょき
  • ぱー

であるかの判定をして、Trueなら以下のコードに続きます
正直この部分自分自身あんまり分かってないです
こんなものなんだろうと割り切って記述しています。

        if reply.content == jkbot:
            judge = draw
        else:
            if reply.content == "ぐー":
                if jkbot == "ちょき":
                    judge = wn
                else:
                    judge = lst

            elif reply.content == "ちょき":
                if jkbot == "ぱー":
                    judge = wn
                else:
                    judge = lst

            else:
                if jkbot == "ぐー":
                    judge = wn
                else:
                    judge = lst

ここは簡単ですよね
正直解説することないです。だって見たまんまの事しか言えないし

        await message.channel.send(judge)

これで最後にjudgeに代入された値が送信されるようになっています。

#物足りない?
これでじゃんけんbotとしては問題なく稼働するはずのですが
もう少し何か欲しい!って欲張りな初学者の方にはBot起動時にメッセージを自動で送信するコードも置いておきます。
以下にはそれ用のコードやそれについての事しか書かないのでじゃんけんbotで満足だよ!って方はお疲れ様でした!何かあればコメントください。

##欲張りな方のため
Bot起動時のイベントは

@client.event
async def on_ready():
"""以下bot起動時に起こる処理を書く"""

で書けます。
今回はBotを起動した時にそれをDiscord上で通知してくれる機能を付けます。

kidou.png

こんな感じのね。

ではまず、どこのチャンネルにメッセージを送信して欲しいかを決め、そのチャンネルのIDをコピーしてきます。IDのコピーのやり方が分からないという方はご自分で調べてください、割愛します。

コピーしたらまず

channel = client.get_channel(ID)

と記述し、IDの部分に先ほどコピーしたIDを書き換えてください。コピーした数字そのままで結構です

これでチャンネルの指定が出来ました

そして最後に

await channel.send("etc")  # etcの部分に好きな文章を入れてください

と記述するとBot起動時に自動で送信してくれます。

#最後に
まずはここまでお疲れ様でした。
私の日本語能力の低さや語彙力が皆無という事もあって分かりにくい解説になってしまっていたかもしれません、ごめんなさい。:bow:

あくまで初学者向けの記事の為ある程度知識のある方が見ると色々クレームを付けたくなるようなコードかもしれませんがお許しください。自分含め最初はあまり理解できていなくても何かを動かせた!という感動が次のステップへの道のりだと考えているので...

この記事は以上になります。
もし何か問題や間違い等が有ればTwitterまでご連絡ください。

4
2
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
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?