スマブラSPの勝敗記録をつけてみた(クマメイト) 

# 1. はじめに

スマブラをプレイするにあたり、弱点分析やキャラクターの使用状況などを知るために
クマメイトを使って勝敗記録をつけていました。
ただ、対戦ごとに記録をつけるのが面倒だと感じたので、簡単に登録できるようなプログラムを作ってみました。これを使って、多くの人が対戦を記録し、界隈が盛り上がることを願っています。
ただ、専用部屋の対戦を想定したプログラムではないので、VIP部屋などで使用に限られます。

詳細はGitHubに挙げているので詳細気になる方がいましたらどうぞ。

https://github.com/suemiken/smash_brathoers_register_winner_number

# 目次
[1.はじめに](#1-はじめに)
[2.大乱闘スマッシュブラザーズスペシャルSPECIALとは](#2-大乱闘スマッシュブラザーズスペシャルSPECIALとは)
[3.作成したプログラムの概要](#3-作成したプログラムの概要)
[4.画像処理](#4-画像処理)
[5.クマメイトとの通信](#5-クマメイトとの通信)
[6.おわりに](#6-おわりに)


# 2. 大乱闘スマッシュブラザーズスペシャルSPECIALとは

任天堂が制作したゲームで総勢８６体のキャラクターを操作できる格闘ゲームです。
オフライン大会、オンライン大会と開催されており、多くのユーザにプレイされています。
Nintendo Switch Onlineに加入すれば、オンラインでいろいろな人と対戦できますし、私自身も現対戦環境を楽しんでいます。

そんなスマブラをプレイしていくうえで、私がよく使用するWebサイトがあります。それがクマメイトです。
クマメイトは世界戦闘力の段位のボーダーを確認できるだけでなく、対戦内容の記録をつけることができます。同じようなサイトでスマメイトと呼ばれるサービスもあり、キャラクターの使用状況や対戦内容などを記録できるのですが、専用の部屋を作ったりと敷居が高いという印象です。
それで、私はVIP部屋などで対戦する際はクマメイトで対戦の記録をつけています。
しかし、毎回対戦ごとにクマメイトで登録するのは面倒です

さらに、クマメイトのレスポンスはそこまで早くなく、ストレスでした。

# 3. 作成したプログラムの概要
そこで、Switchのアルバム機能からPCへ簡単にデータ転送可能であることを利用しようと考えました。対戦後のリザルト画面を撮影しておき、後日PCへ転送し、その情報を利用し対戦結果をクマメイトに記録するようなプログラムを作成しました。
クマメイトは、一つ一つ登録しなければならないという問題があるが、 このプログラムを使用すれば、リザルトの写真を撮影し、後日まとめてデータ転送するだけで、 対戦の記録と勝率の確認が可能になります。

GitHub上には６つのリザルト画面を例として提供しており、提供画像と登録内容が正しいことを確認しました。
![スクリーンショット 2022-06-10 143101.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271828/6b0d504a-9107-f36d-a927-da2362abd59f.jpeg)

この記事では、具体的な処理の内容について簡単に説明します。

# 4. 画像処理

今回使用するリザルトの画面はこちらになります。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271828/21ee9f82-4f7b-405d-13e8-d03594888059.jpeg)
この画像から使用したキャラクター名、対戦相手のキャラクター名、勝敗を抽出します。
TesseractのOCRエンジンを利用して、キャラクター名と勝敗情報（順位）を抽出します。実現に当たり、VIPマッチなどのオンライン対戦だと左側が自身が操作したキャラクター、右側が対戦相手のキャラクターになる仕様を利用します。(専用部屋だと使えません)
まず、キャラクター名の抽出は座標が固定なことを使用して長方形でCropします。
![crop.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271828/5ccd7a9a-ad62-cc30-cb9b-8d5201ced629.jpeg)
次に、キャラクターが被る箇所を黒塗りします。
![draw1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271828/1dc7d8be-2b30-2e5d-5266-222711ca570c.jpeg)
そして、キャラクターアイコンを黒塗りします。これは、1Pが赤色のアイコンであることを利用します。
![draw2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271828/4e94c2bb-d73f-f26f-7ec0-c5ad9b296b3d.jpeg)
最後に、文字認識の精度を上げるためにローテーションします。
![draw3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271828/0e91db5e-78b6-531f-96e6-ff4b5942e1d0.jpeg)
この状態でTesseractのOCRエンジンで文字認識を行いました。テスト画像で使用したキャラクターにおいては、すべて認識が成功しています。
順位に関しては、以下のように切り取った画像を文字認識で判別します。２は正しく判別されないという問題がありますが、１が正しく認識できるのでそちらの情報を使って順位をつけています。
![rank.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271828/6431cc7c-89ce-4dab-8915-228c91ed3926.jpeg)
# 5. クマメイトとの通信
さて、画像処理とOCRを用いて、キャラクター名と勝敗情報が抽出できました。この情報をクマメイトに送信します。pythonのrequestsを用いて、HTTP通信することで登録します。以下のような手順で実施しました。

1.requestsを用いて、セッションを作成
2.クマメイトのトップサイトにゲットメソッドを送信
3.その後、ログインサイトにポストメソッドでログイン情報を送信
4.登録サイトへポストメソッドでキャラクター名などを登録

以下がプログラムです。詳細はGitHub上のリポジトリを参照ください。
```
#クマメイトのユーザ名とパスワード
USER = '******'
PASS = '******'

session = requests.Session()
url = {'top':'https://kumamate.net', 'login':'https://kumamate.net/wp-login.php', 'regit':'https://kumamate.net/submitfight'}
login={'log': USER, 'pwd':PASS, 'wp-submit': 'ログイン','redirect_to': url['top'], 'testcookie': '1'}

state = session.get(url['top'], timeout=(20, 20))

# ログイン
state = session.post(url['login'], data=login, timeout=(20, 20))

### 画像ファイル数だけ繰り返す ###
data_dir_path = u"./images/"
file_list = os.listdir(r'./images')
for file_name in file_list:
    root, ext = os.path.splitext(file_name)
    if ext == u'.png' or u'.jpeg' or u'.jpg':
        abs_name = data_dir_path + file_name
        im = Image.open(abs_name)

        payload = get_chara_name(im)

        state = session.get(url['top'])
        state = session.post(url['regit'], data=payload, timeout=(20, 20))
```

# 6. おわりに
簡単な処理内容でうまく登録できました。
いつかオフ大会出たいですね～