4
0

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 3 years have passed since last update.

共闘ことばRPG コトハマン

Last updated at Posted at 2020-02-21

#はじめに
皆さんはコトダマンというゲームを御存じでしょうか

コトダマンとはiOS/Android向けに配信されている共闘ことばRPGゲームのことです

ルールとしては空いた枠に文字を埋めていきコンボを組んで敵を倒す、という感じのものになっています

cotodaman.jpg

共闘ことばRPGコトダマン好評配信中!!

iOS
https://itunes.apple.com/jp/app/id1298368256
Android
https://play.google.com/store/apps/details?id=com.sega.Kotodaman

#なにをするのか
さて、媚を売り切ったところで本題に入っていこうと思います

今回やっていくのはCOTOHA APIを使ってコトダマンのようなものを作ってみようというものです

(コトダマンのようなものといっても単語ごとに分けてコンボ数を数えるだけですが)

#プログラム本体

コトハマン.py
cotohaman.py
# -*- coding: utf-8 -*-
import os
import urllib.request
import json

class CotohaApi:
    def __init__(self,client_id, client_secret, developer_api_base_url, access_token_publish_url):
        self.client_id = client_id
        self.client_secret = client_secret
        self.developer_api_base_url = developer_api_base_url
        self.access_token_publish_url = access_token_publish_url
        self.getAccessToken()
        
    def getAccessToken(self):
        url = self.access_token_publish_url
        headers={
            "Content-Type": "application/json;charset=UTF-8"
        }
        data = {
            "grantType": "client_credentials",
            "clientId": self.client_id,
            "clientSecret": self.client_secret
        }
        data = json.dumps(data).encode()
        req = urllib.request.Request(url, data, headers)
        res = urllib.request.urlopen(req)
        res_body = res.read()
        res_body = json.loads(res_body)
        self.access_token = res_body["access_token"]
    def callCotohaApiCommon(self, url, data):
        headers= {
            "Authorization": "Bearer " + self.access_token,
            "Content-type":"application/json;charset=UTF-8",
        }
        data = json.dumps(data).encode()
        req = urllib.request.Request(url, data, headers)
        
        CONNECTION_RETRY_COUNT = 2
        
        for counter in range(1, CONNECTION_RETRY_COUNT + 1):
            try:

                res = urllib.request.urlopen(req)
                break
            except urllib.request.HTTPError as e:
                if e.code == 401:
                    print("Please retry.")
                    self.access_token = self.getAccessToken()
                    headers["Authorization"] = "Bearer " + self.access_token
                    req = urllib.request.Request(url, data, headers)
                else:
                    print ("<Error> " + e.reason)
                    return ""
            except Exception as e:
                print(e)
                return ""
        
        res_body = res.read()    
        res_body = json.loads(res_body)
        return res_body["result"][0]["tokens"]
    
    def cotodama(self,coto):
        url = self.developer_api_base_url + "nlp/v1/parse"
        data = {
            "sentence": coto
        }
        coto = self.callCotohaApiCommon(url, data)
        if len(coto) == 1 and coto[0]["pos"] == "名詞":
            return coto
        return ""
    
    def cut(self):
        word_lis = []
        result_lis = []
        coto = input("文字を入力してください(7文字)")
        for i in range(0,6,1):
            for j in range(7,0,-1):
                if i+1 == j: break
                word_lis.append(coto[i:j])
        for tex in word_lis:
            if tex[0] == "":
                continue
            result_lis.append(self.cotodama(tex))
        result_lis = list(filter(lambda a: a!="",result_lis))
        return result_lis
    
if __name__ == "__main__":
    f = open('token.txt')
    lines = f.readlines()  
    for i in range(len(lines)):
        lines[i] = lines[i].replace("\n",'')
    inst = CotohaApi(lines[0], lines[1], lines[2], lines[3])
    result = inst.cut()
    for res in result:
        print(res[0]["lemma"])
    print("{}COMBO!".format(len(result)))

#少しだけ解説
序盤のAPI設定and呼び出し部分は
↓この記事か公式リファレンスを読んでください
「メントスと囲碁の思い出」をCOTOHAさんに要約してもらった結果。COTOHA最速チュートリアル付き

このテンプレートに与えるデータを加工する部分の解説をします

七文字のひらがなを入力として受け取り、左から長い順に入力を分割してリストに格納しています

その後分割した単語ごとにAPIに投げていくのですが、"ん"が単語の最初にいるとなぜか名詞判定されてしまうので取り除いています

そして帰ってきた結果が分割されず、単語のみでかつ名詞であった場合に結果のリストに格納しています

最後に、それを順に出力して終了です

#結果

入力>>さいかくあいま
才覚
さいか

いかくあ
威嚇
いか
くあいま
くあい
くあ
合間
あい

12COMBO!

適当に画像検索から見つけてきた単語を入れましたが、人間には理解できない単語も出てきてしまっていますね

#まとめ
今回作ったものの問題点としては
・複数回APIコールしなければいけない
・ちょっと人間には理解できない単語が出てきてしまう

修正案があればコメントいただけると助かります

#さいごに
この記事は【Qiita x COTOHA APIプレゼント企画】に参加しています

いいねください

#参考ページ
COTOHA API
公式リファレンス
「メントスと囲碁の思い出」をCOTOHAさんに要約してもらった結果。COTOHA最速チュートリアル付き
自然言語処理を簡単に扱えると噂のCOTOHA APIをPythonで使ってみた

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?