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

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

- [Python3入門編 (全11レッスン)](https://paiza.jp/works/python3/primer)
- [Progate Python講座](https://prog-8.com/languages/python)


#筆者の環境
- Windows10
- PyCharm Community Edition
- pythonのバージョン (3.7.4)
- discord.pyのバージョン (1.2.4)

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

では本題に行きましょう

#ようやくコードへ

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

```python: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(("私の勝ち！弱ｗｗｗｗｗｗｗｗｗｗｗｗやめたら？じゃんけん",
                              "私の勝ちだね(∩´∀｀)∩、また挑戦してね！"))

        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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521746/edb8c1b7-59b5-08c2-6249-5a2fe6be232c.png)

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

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

```python
    if message.content == "！じゃんけん":
        await message.channel.send("最初はぐー、じゃんけん")
```
この部分でまず **！じゃんけん** 入力された場合
**最初はぐー、じゃんけん** と返すように記述しています。
これはこのじゃんけんbotに限らず他の何かを作る時も使うので覚えます(自戒)

```python
        jkbot = random.choice(("ぐー", "ちょき", "ぱー"))
```
ここでは**jkbot**に 

- ぐー
- ちょき
- ぱー

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

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

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

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

        reply = await client.wait_for("message", check=jankencheck)
```
この部分で**！じゃんけん**を始めた人からのメッセージを待ち、送信されたメッセージが

- ぐー
- ちょき
- ぱー

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

```python
        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
```
ここは簡単ですよね
正直解説することないです。~~だって見たまんまの事しか言えないし~~

```python
        await message.channel.send(judge)
```
これで最後に**judge**に代入された値が送信されるようになっています。

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

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

```python
@client.event
async def on_ready():
"""以下bot起動時に起こる処理を書く"""
```
で書けます。
今回はBotを起動した時にそれをDiscord上で通知してくれる機能を付けます。

![kidou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521746/d61d2af5-7272-2767-a762-4fd5b2ba027c.png)

こんな感じのね。

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

コピーしたらまず

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

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



そして最後に

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

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

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

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

この記事は以上になります。
もし何か問題や間違い等が有れば[Twitter](https://twitter.com/N4RvS3)までご連絡ください。