pyYGOBot

とりあえず概形は作った。
nnt339es.hatenablog.com

導入方法

意外と面倒くさくて、実用的な目途が立ったら追記する。

起動方法

  1. パッケージルートにDecksディレクトリを作成する
  2. Decksにydkファイルを用意する
  3. 引数を渡して app.pyを起動する。

引数確認方法

python app.py -h

起動コマンド例

python app.py --deck ThunderD --name myAI --port 7911

起動に成功するとDecksディレクトリにそのデッキ用のディレクトリが作成される

#ToDo
ydkファイルを読み込むディレクトリを指定できるようにする。

※注意※
python3.8が必要。ライブラリはrequirements.pyを参照。

モジュールとして使う

# YGOEnvとDuelAgentをインポート
from pyYGOenv import YGOEnv
from pyYGOagent import DuelAgent

def main():
    deck: str = 'deck_name'
    host: str = '127.0.0.1' # ADSを起動してあるIPアドレス
    port: int = 7911        # ADSのポート
    version: int = 38 | 1<<8 | 8<<16 # ADSのバージョン(この例では38.1.8)
    name: str = 'AI'  # ADSで表示する名前
    # 環境を作成
    collect_env = YGOEnv(deck, host, port, version, name+'_collect')
    eval_env = YGOEnv(deck, host, port+1, version, name+'_eval')

    # エージェントを作成
    agent = DuelAgent(collect_env, eval_env)

    # 訓練
    agent.train(1000)

    collect_env.close()
    eval_env.close()


if __name__ == '__main__':
    main()

簡単な解説

pyYGO

遊戯王一般のオブジェクトを扱うパッケージ。

pyYGOenv

tf-agents.environments.py_environment.PyEnvironment仕様の環境

pyYGOnetwork

通信関連のパッケージ

pyYGOagent

エージェント関連のパッケージ

agent.py

エージェント本体

AIパラメータ

AI関連でいじるべきパラメータ

パラメータ 説明 場所
学習率
レイヤー構造
活性化関数
報酬

※注意※

未コーディング箇所

カウンター関連、シンクロ召喚、宣言系の処理は未コーディングなためゲーム中に発生するとエラーを投げてプログラムは終了する。

学習成果

コメントの#unknown

私もよくわからない部分なため質問されても困る箇所。

コーディングポリシー

  • クラス名はキャピタライズ。
  • 変数名は小文字、区切り文字はアンダーバー_
  • 処理で一時的に作成するtemporaryな変数以外はできるだけ詳しい変数名を付ける。英単語の省略もできるだけ避ける。
  • 定数は全て大文字、列挙型Enumもすべて大文字。
  • 関数名は小文字、区切り文字はアンダーバー_
  • 関数処理が大きくなる場合は、空行で処理をブロックに分ける。
  • elif も複雑になって読みにくいようであれば空行で区切る。
  • メソッド間は空行2つ分空ける。
  • 型ヒントが必須の場所:引数、戻り値、初期化時のプロパティ
  • 型ヒントが推奨される場所:関数内で初めて出てきた変数
  • 型ヒントが非推奨な場所:プロパティへの代入時(selfうんぬんでコードが長くなって読みづらくなるから)
  • 数字に意味があるなら定数に適切な名前を付けてラップする。(コメントを付けるぐらいならの意)