KawaSwitch/Poke-Controller

マジカル交換自動化について

Closed this issue · 3 comments

全く知識がない状態でしたがこれを機にコードを書き始めたものです

https://qiita.com/pokezaresu/items/b86970a716c64ef46370

上記のサイトや、もともとあるコマンドを参考にして、マジカル交換自動化のコードを書こうとしました。

以下のファイルのコードの内、ポケモンを選択する部分の動作が上手くいかず、pythonでどう書けばいいのか調べても全くわからない状況です

既存の自動リリースのコマンドを少し編集し使用しようと思いましたが、既存のコマンドから、ループを脱出し元のループに戻る方法がわからず断念しました。

動作部分をどうすればいいのか、またはすべて書き直してこれが正解というものがありましたら図々しいのは百も承知ですが追加していただきたいです。

知見を広める非常にわかりやすく便利なツールの作成感謝いたします。

PythonCommand.zip

あまり動作確認できていませんが、動作部分の処理を察するにこんな感じでしょうか…

# マジカル交換
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型になるので、今回のような場合は整数除算か整数部分を取る必要があります。
image

関数定義時・if文の条件後・forループの際など、" : " を書かないと行けない箇所が多いので気をつけましょう。

追記
__init__まわりはあまり弄っていません

画像認識を用い交換完了したタイミングですぐYを押す処理を加えた上で動作しました
大変有り難うございます
次にコードを書くときの糧にさせていただきます

xv13 commented

プログラミング初心者です。
私はキャプボを用いたマジカル交換の自動化を、以下のように実装していました。
(何週間か前に書いたものなので書式が変わっているかもしれません)

判定に使用している画像は切り抜きや透過が適当なので、新しく用意し直したほうがよさそうですが、、、(ポケセンの左下で開始すれば、ちゃんと認識してくれます。)

MagicalExchangeCompleted.png
MagicalExchangeCompleted

Network_Online.png
Network_Online

現在は、交換する回数を決め打ち(もしくは無限ループ)で行っているのですが、
今後、ダイアログ表示機能を用いて、
ポケモンの数やボックス数で入力できるようにしたいなあ。と思ってます。

#!/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)

横から失礼しました。