記録

色々なことを書きます

Discordのbotを作る(3)

前: Discordのbotを作る(2) - 記録

 

チーム分け

"!12"でチーム分けをする。

コマンド名が12なのは、今までのチーム分けが、一斉に1か2をテキストチャンネルに送信する、という方法だったから。

 

チーム分けに必要な情報は、

  • 参加者のリスト
  • チーム数
  • チーム毎の人数の上限

の3つ。

ランダムにチーム分けをするということは、

誰でも良い=勝敗をそれほど意識しない=ノーマル戦

ということなので、とりあえずは上限5人で、チーム数最小限で固定とする。

 

チーム数が最小限になるようにするが、1チームで収まっても2チーム作るようにする。

def teamlen(men_list):
    n =(len(men_list)+4)//5
    if n >=2:
        return n
    else:
        return 2

 

チーム数が決まったらチーム分けをする。

振り分け方は、シャッフルしたリストを、1番目の人は1に、2番目の人は2に、3番目の人は1に…というように、順番に分けていくという方法。

トランプを配るときと同じというとわかりやすいか。

この方法なら、シャッフルするときに希望ポジション毎に固めておけば、振り分けたときに別のチームになる。

 

シャッフルする。

def teamshuffle(plist):
    random.shuffle(plist)
    result =[]
    for x in plist:
        if type(x) == list:
            for user in x:
                result +=[user]
        else:
            result +=[x]
    return result

 

振り分けて文章にする。

def teamallocation(rlist,l):
    result =[[]for i in range(l)]
    n =0
    for x in rlist:
        result[n] += [x]
        if n +1 == l:
            n =0
        else:
            n +=1
    
    bunsyou =''
    m =1
    for y in result:
        bunsyou +='チーム'+str(m)+'\n'
        for z in y:
            bunsyou +='['+ z ']'
        bunsyou +='\n\n'
        m +=1
    return bunsyou

 

これで動かせるが、リストから削除したりする機能も必要。

かなり変数名が適当になってきた。

Discordのbotを作る(2)

前: Discordのbotを作る(1) - 記録

 

チーム振り分けまでの流れ

  1. discord上で一人ずつ登録する。希望ポジションがあればコールする。
  2. 登録した人のリストをシャッフルし、振り分ける。

 

リストに登録するコマンド

"!ad (ポジション) (名前)"でリストに登録する。

()内は、省略すると"fill"(どこでも)、"送信者の名前"になるようにする。

まず、前回作った関数をちょっと書き換える。

def command(message,n=0):
try:
return message.split(' ')[n]
except IndexError:
return ''

cmd_1 = command(message.content)
cmd_2 = command(message.content,1)
cmd_3 = command(message.content,2)

これでdiscordで入力したコマンドを簡単に扱える。

 

 "!ad"と入力したときの処理はこうした。

if cmd_1 == cmd_list[0]:#!ad
    if l_name in n_list:
        comment = l_name+'は既に登録されています'
    else:
        try:
            p = position.index(cmd_2)
        except ValueError:
            p = 5
        n_list +=[l_name]
        if p !=5:
            p_list[p] +=[l_name]
        else:
        p_list +=[l_name]
        comment = l_name+'の希望ポジションは'+position[p]+'です'

n_listは名前のリスト、p_listも名前のリストだが、リストの中にポジション毎にリストがある。ただし、fillのリストは無い。

p_list =[[],[],[],[],[]]

l_nameは、送信者の名前で、ポジションの次に名前が入力されていたらそれになる。

まずはn_listに名前が無いか確認する。

無ければポジションが指定されているか調べる。

position =['top','mid','adc','sup','jg','fill']

このリストのどれかに当てはまればpにインデクスを代入し、当てはまらないのならfillと同じ5を代入する。

次に、n_listとp_listに名前を追加する。

ポジションを指定してればリストの中のリストに追加するが、fillならp_listに直接追加する。

これは、同じポジションの人をまとめた状態でシャッフルするため。

この処理が終わると、

await client.send_message(message.channel,comment)

でdiscordに結果を送信する。

 

次: Discordのbotを作る(3) - 記録

Discordのbotを作る(1)

PythonでDiscordのbotを作る

6人以上でlolをするときにチーム分けをするための、discord上で動くbotを作る。

とりあえず作りたい機能は、

  • ランダムに分ける
  • 希望ポジションを考慮して分ける

の2つ。

botを作るのに最低限必要な知識は、調べたらすぐ出てきたので書きません。

 

コマンド入力

よくあるbotと同じように、"!○○○"といった感じでコマンドを入力して動かしたい。

とりあえず思いついたのは、メッセージがコマンドと一致すると動くというもの。

if message.content ==('!○○○')

 

しかし、これでは'!○○○ ●'みたいな、空白で区切って値を入力するコマンドを追加するときに困るので、

split関数でメッセージを分割し、1番目が一致すると動くようにする。

def command(message):
return message.split(' ')[0]
cmd = command(message.content)
if cmd ==('!○○○')

これでコマンド+αの情報を扱えるはず。

 

次: Discordのbotを作る(2) - 記録

最初の記事

たまに「ツイート以外で自分のしたことを記録したいと思うこと」があるのでブログを始めます。

 

書く予定

 

気が向いたら書きます。