エージェントクラスによるエージェントのつくり方 - aharalabMeiji/fireplaceAharaLab GitHub Wiki
このページに書かれていることが現状バージョンの仕様です。
-
まず、プレーヤ(以下ではエージェントと呼ぶことにします)専用のファイルを作ってください。
-
エージェントの名前を決めてください。ここではたとえば
AdorableCat
であるとします。新しく作ったファイルのファイル名は「agent_AdorableCat.py
」にしてください。(これはマストではないのですが、そろえておくと、他の人がわかりやすいと思います。) -
クラスとその中に関数を2つ作ります。
import random from utils import * class AdorableCatAgent(Agent): def __init__(self, myName: str, myFunction, myOption = [], myClass: CardClass = CardClass.HUNTER, rating =1000 ): super().__init__(myName, myFunction, myOption, myClass, rating ) def AdorableCatAI(self, game: Game, option=[], gameLog=[], debugLog=False): player = game.current_player while True: myCandidate = getCandidates(game)#実行できることがらをリストで取得 if len(myCandidate)>0: myChoice = random.choice(myCandidate)#ランダムに一つ選ぶ if myChoice.type ==ExceptionPlay.TURNEND:#何もしないを選択したとき return executeAction(game, myChoice, debugLog=debugLog)#選択したものを実行 postAction(player)#後処理 else: return
とりあえずこれだけ書いておいて、あとで中身を作ります。option
とgameLog
とdebugLog
は一応引数として(無意味であっても)入れておいてください。
-
start.py
をいじります。main()
関数をみつけてください。20行目あたりの空いているところに、from agent_AdorableCat import AdorableCatAgent AdorableCat=AdorableCatAgent("AdorableCat", AdorableCatAgent.AdorableCatAI)
のように書いておいて、33行目あたりを
play_set_of_games(Human, AdorableCat, gameNumber=1, debugLog=True)
としておくと、AdorableCat
と人間との対戦ができるようになります。(各行の書き始めのインデント(桁下げ)をそろえる必要があります)
-
上記プログラム中で
myCandidate = getCandidates(game)
という変数の中に「取りうる行動すべてのリスト」が代入されます。上記プログラムmyChoice = random.choice(myCandidate)
では「ランダムに選ぶ」ことがおこなわれていますが、ここを変更して賢いエージェントを作ってください。またexecuteAction
でアクションの実行、postAction
はアクション後の追加アクション(追加でもらえるカードをチョイスしたりする)を自動的に行う命令です。 -
上記でファイル名
agent_AdorableCat.py
と関数名AdorableCatAI
とエージェント名AdorableCatAgent
は区別したほうがいいようです。なお、自己対戦させるときには、from agent_AngryCat import AdorableCatAgent AdorableCat1=AdorableCatAgent("AdorableCat1", AdorableCatAgent.AdorableCatAI) AdorableCat2=AdorableCatAgent("AdorableCat2", AdorableCatAgent.AdorableCatAI)
のように二つ作ってください。
-
AdorableCatAI
の引数ですが、エージェントを生成する段階でオプションをつける設計にしたい場合には、option
を用いてください。また、このバージョンから、「exectAction
でどのようなaction
が実行されたか、というリスト」が引数gameLog
に代入されることになりました。ゲームの履歴を参考に作戦を立てることも可能になりました。gameLog
はリストですが、その要素はclass Candidateの変数です。 -
class AdorableCatAgent
にはメンバー変数を自由に設定できます。これにより、他のエージェントとの重複を気にせず、ターンを超えて使用可能な、エージェント内で使用できる変数を自由に設定できます。 -
マリガンルールにも対応したい場合にはマリガンもできるエージェントを参照して作ってください。
-
発見にも対応したい場合には発見もできるエージェントを参照して作ってください。
-
エージェントを作る際に「ゲームの複製」を作る必要があるでしょう。組み込み関数を使って
import copy tmp_game = copy.deepcopy(game)
で実行することができますが、この方法だとまれにdeepcopy内で無限ループを起こす可能性があります。fireplace内の関数
from utils import *
tmp_game = fireplace_deepcopy(game)
を使ったほうが(たぶん)安定的に動きます。