マジカル交換自動化について
Closed this issue · 3 comments
全く知識がない状態でしたがこれを機にコードを書き始めたものです
https://qiita.com/pokezaresu/items/b86970a716c64ef46370
上記のサイトや、もともとあるコマンドを参考にして、マジカル交換自動化のコードを書こうとしました。
以下のファイルのコードの内、ポケモンを選択する部分の動作が上手くいかず、pythonでどう書けばいいのか調べても全くわからない状況です
既存の自動リリースのコマンドを少し編集し使用しようと思いましたが、既存のコマンドから、ループを脱出し元のループに戻る方法がわからず断念しました。
動作部分をどうすればいいのか、またはすべて書き直してこれが正解というものがありましたら図々しいのは百も承知ですが追加していただきたいです。
知見を広める非常にわかりやすく便利なツールの作成感謝いたします。
あまり動作確認できていませんが、動作部分の処理を察するにこんな感じでしょうか…
# マジカル交換
class Magical_Trade(PythonCommand):
def __init__(self, name):
super(Magical_Trade, self).__init__(name)
self.maxpcnt = 30 # ポケモン交換したい数
self.pcnt = 0 # ポケモンの数
def do(self):
while True:
if self.pcnt < self.maxpcnt:
self.pcnt += 1
# 開始
self.press(Button.Y, wait=1.5)
self.press(Direction.DOWN, wait=1.0)
self.press(Button.A, wait=3.0)
# ポケモン選択
self.pselect()
self.wait(1.0)
self.press(Button.A, wait=1.0)
self.press(Button.A, wait=6.0)
self.press(Button.A, wait=1.0)
self.press(Button.A, wait=1.0)
self.press(Button.A, wait=90)
# 交換相手検索中
self.press(Button.Y, wait=60)
self.press(Button.A, wait=1.0)
self.press(Button.A, wait=1.0)
self.press(Button.A, wait=1.0)
self.press(Button.A, wait=1.0)
self.press(Button.A, wait=1.0)
else:
self.wait(1.0)
print('done')
self.finish()
def pselect(self):
bcnt = (self.pcnt - 1) % 30 + 1
x = (bcnt -1) % 6
# y = (bcnt -1) / 6
y = (bcnt -1) // 6 #整数除算
# for i = 0, i < x, i += 1
for i in range(0, x, 1):
self.press(Direction.RIGHT, wait=0.5)
# for i = 0, i < y, i += 1
for i in range(0, y, 1):
self.press(Direction.DOWN, wait=0.5)
全体をwhileループに入れました。
pythonのforループは基本的には修正したように書きます。0から始まって5回ループするなら
for i in range(0, 5, 1):
hogehoge
のような感じです。これは一部省略可能で
for i in range(5):
hogehoge
とも書けます。詳しくはpython3のforループで調べてみてください。
また、pythonではint型を普通に除算するとfloat型になるので、今回のような場合は整数除算か整数部分を取る必要があります。
関数定義時・if文の条件後・forループの際など、" : " を書かないと行けない箇所が多いので気をつけましょう。
追記
__init__まわりはあまり弄っていません
画像認識を用い交換完了したタイミングですぐYを押す処理を加えた上で動作しました
大変有り難うございます
次にコードを書くときの糧にさせていただきます
プログラミング初心者です。
私はキャプボを用いたマジカル交換の自動化を、以下のように実装していました。
(何週間か前に書いたものなので書式が変わっているかもしれません)
判定に使用している画像は切り抜きや透過が適当なので、新しく用意し直したほうがよさそうですが、、、(ポケセンの左下で開始すれば、ちゃんと認識してくれます。)
現在は、交換する回数を決め打ち(もしくは無限ループ)で行っているのですが、
今後、ダイアログ表示機能を用いて、
ポケモンの数やボックス数で入力できるようにしたいなあ。と思ってます。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from Commands.PythonCommandBase import PythonCommand, ImageProcPythonCommand
from Commands.Keys import KeyPress, Button, Direction, Stick
class AutoMagicalExchange(ImageProcPythonCommand):
NAME = '自動マジカル交換'
def __init__(self, cam):
super().__init__(cam)
self.count = 30
self.row = 0
self.col = 0
self.isNext = False
def do(self):
i = 0
while i != self.count:
# while True:
self.MagicalExchange()
while not self.isContainTemplate('MagicalExchangeCompleted.png', threshold=0.9):
self.wait(0.5)
else:
self.press(Button.Y, wait=20)
while not self.isContainTemplate('Network_Online.png', threshold=0.9):
self.press(Button.B)
else:
i += 1
print("%dst Pokemon exchange" % i)
if self.col == 5:
self.col = 0
if self.row == 4:
self.row = 0
self.isNext = True
else:
self.row += 1
else:
self.col += 1
def MagicalExchange(self):
self.press(Button.Y, wait=1.5)
self.press(Direction.DOWN)
self.press(Button.A, wait=2)
if self.isNext:
self.press(Button.R)
self.isNext = False
else:
for _ in range(self.row): self.press(Direction.DOWN)
for _ in range(self.col): self.press(Direction.RIGHT)
self.press(Button.A, wait=0.3)
self.press(Button.A, wait=4)
self.press(Button.A)
self.pressRep(Button.B, 5, interval=0.1)
横から失礼しました。