2020年8月頃から、LINE友だちの名前がツムツムのゲーム内でも自分で設定した表示になりました。それにより、友だちの名前に特定のマークを付けて、「そのマークがあったら送信を飛ばす」という事が可能になりました。以前からの方法(リア友を非表示削除する・ゼロスコアのリア友をランキング送信から飛ばす)よりも確実で使いやすくなったと思います。
この【マーク飛ばし=Skip】のプログラムを作成しましたのでご紹介します。こちらはランキングからハートを送信するプログラムです。関数にしてお使いください。
■プログラム【Skipハート送信】
■プログラム【Skip高速ハート送信】(こちらの記事です)
■プログラム【Skip回復待ちハート送信】…coming soon
【Skipハート送信】は【Skip高速ハート送信】からなるべく変数を取り除いたプログラムです。送信時間は若干長くなりますが、【Skip高速ハート送信】よりも簡単になっていると思います。
【Skip回復待ちハート送信】はskipと回復待ちを組み合わせたプログラムです。
いずれのプログラムも初心者レベルではありませんので、詳細な説明は省略して解説します。ある程度は知識が必要な為うまく動かない場合はご自身で修正出来る方にお勧めします。こちらを読んでご自分なりのプログラムに作り替えてご使用ください。
概要
準備として、ツムツムのランキングに載っているがハートを送信したくない友だちに、LINEで名前の先頭にマーク飛ばし用のマークを付けておきます。お勧めは画像認識がやりやすい【□】(白い四角)です。
プログラムを実行すると、マークを付けた友だちをスキップしてハートを送信しません。このプログラムは、ハートが回復していない(青)場合はそのままスルーしてランキング送信を続けます。
■Skipした回数とハートをスルー(自分&ハートが回復していない)した回数もカウントします。但しスルーとSkip両方が該当する場合にはスルーのみをカウントします。また、エラーがあった際は重複してカウントする場合もあります。
■Skipする為には、ハートとSkipマークを確実に画像認識する必要があります。スワイプにズレがあると同じ段でのハートとSkip両方の画像認識ができません。その為、スワイプは1人ずつとしました。4人スワイプで変数を使用して4段分を分ける事も可能ですが、プログラムがより複雑になる事、裏画像認識を使用すれば速度は落ちない事により1人スワイプを採用しました。

(1)ズレ無し。ハートとSkip両方見える
(2)この程度のズレならば両方見える
(3)ハートは見えるがSkipマークが見えない
(1)と(2)は良いが(3)ではSkipプログラムが正確に動かない。つまり(3)にならない様にズレ補正スワイプが必須。
ズレ補正スワイプについてはこちらをご覧ください。
裏画像認識
裏画像認識とは…
実際に画像認識での判定が必要な場面ではなく、前もって画像認識をしておくことを指します。
送信の流れは「ハート送信→OK→ミッションタップ→スワイプ→」で、通常はハート送信前にハートの画像認識を行いますが、これを「ハート送信→OK」の間、「OK→ミッション」の間に行うのが裏画像認識です。
理由は時間の短縮です。「ハート送信→OK」の間と「OK→ミッション」の間は端末の処理待ち通信待ちの時間です。この時間を短縮するには「もっと速い端末を使う」「もっと速い通信と契約する」しかありません。つまり、普通は黙って待つしかない時間です。
一方FRepプログラムでは、画像認識処理・その画像認識のスクショを撮る為に若干の時間(1秒前後)が掛かります。プログラム制御や変数の計算はほんの僅かな時間(0.001秒程度)です。※掛かる時間は端末の性能により違います。
通常の送信の流れでは、ハート送信前にFRepでの画像処理時間が掛かり、その後にOK→ミッションタップ→スワイプの時間が掛かりますが、FRepでの処理時間を端末と通信の処理待ち時間に済ませてしまうというのが裏画像認識です。【高速ハート送信Hv2】でも、1回のスクショを使いまわすことで裏画像認識をしています。
裏スクショ
ハート送信の様子をよく観察すると、「OK→ミッション」の間に一瞬ハートが見えるのがわかります。送信後のハートもまだ桃色のままの状態です。
裏スクショでは「OK→ミッション」の間にハートの画像認識用のスクショを撮ります。これが出来ると格段に速くなります。これを教えて下さったのも本職プログラマーのHさんです。
お使いの端末で裏スクショが出来るかどうか、テストプログラムを作成実行してみて下さい。ハートがある状態で1つ送信するプログラムです。ハートのあるランキング画面が撮れたら成功です。
筆者の端末では、4.待機が0秒では【OK】が残ったスクショになりました。そこで待機を少しずつ増やして0.3秒でハートのあるランキング画面が撮影出来ました。実際のプログラムでは余裕をもって0.5秒で設定しています。
この裏スクショは、端末が別の処理等で動いていると【OK】や【ハートをプレゼントしました!】の画像が撮れる可能性もあります。ハートの画像失敗=ハートが無いとはなりませんので、失敗した場合にリカバリできる様なプログラムにする必要があるでしょう。
実際の送信の様子
※音量にご注意ください
こちらは録画の為にAPI→BMPに変更してプログラムを実行しました。しかし裏画像認識を採用している為ほとんどスピードは落ちていません。
【送信時間の目安】
■【Skipハート送信】BMP :H291+S16+T4=合計311件で18分5秒
■【Skipハート送信】API :H291+S16+T1=合計308件で16分33秒
■【Skip高速ハート送信】BMP:H292+S16+T1=合計309件で14分2秒
■【Skip高速ハート送信】API:H294+S16+T1=合計311件で14分4秒
送信時間は端末により違いますので参考程度にお考えください。
変数
このプログラムで使用した変数です。
err,delay,Hcntは関数から戻ったフルオートプログラムでも使用します。
| 変数 | 値 | 内容 |
| skip | 0 | 今回skip無 |
| 100 | 今回ハートをskip | |
| 1 | 次のハートをskip | |
| 101 | 今回Skip、次skip | |
| end | 91 | ランキング最下段送信 |
| 92 | 最下段2番目送信 | |
| 100 | 最下段3番目~ランキング2位 | |
| 101 | 次が1位 | |
| 102 | 1位 | |
| 999 | 1位確認 | |
| err | 0 | エラー無し(本プログラムで設定済) |
| 1 | エラー有(ここでは不使用) | |
| 2 | エラー有、途中で終了 | |
| 3 | エラー有、遅延 | |
| stm | スタート時間 | |
| Hcnt | ハート送信カウント | |
| Scnt | skipカウント | |
| Ecnt | エラー処理したカウント | |
| Tcnt | ハート無しでスルーしたカウント | |
| Werr | ログに書くエラー文字列 | |
| delay | 遅延(秒数) | |
| Hposi | ハートの位置 |
座標
このプログラムで使用する座標です。端末ごとに座標は変わりますので自分の端末に当てはめて考えてください。
このプログラムではランキング4人分を1~4段目として考える
※解像度:720×1280の端末使用の場合:画像認識の作り方とスクショの位置によって座標は変わる
■1段目ハートの画像認識位置→y:422
■2段目ハートの画像認識位置→y:557
■1段目と2段目の差:557-422=135
■ランキング枠2段目の画像認識位置→y:532
■ランキング枠と2段目の差:557-532=25
ハートが無くてランキング枠や自分画像認識をした際には差分を足すことでスワイプ判定に使える。つまり、ランキング枠2段目+25=2段目ハート位置となる
プログラム
| 移動元 | No. | プログラム | 概要 | 判定 | 移動先 | 補足 |
| 1 | 変数 | 最初に0設定 | ↓ | ※1 | ||
| 2 | 待機 | ↓ | ||||
| 74 | 3 | 区分 | 【91】最下段ハート送信 | |||
| 4 | 画像認識 | ハート画像認識 | 成功 | 5 | 3段目 | |
| 失敗 | 7 | |||||
| 4 | 5 | 画像認識 | skip画像認識 | 成功 | 6 | 3段目 |
| 失敗 | 10 | |||||
| 5 | 6 | 変数 | Scnt+1 , skip=100(skip有) | 13 | ||
| 4 | 7 | 画像認識 | ランキング[枠]画像認識 | 成功 | 9 | 3段目→2段目でもOK |
| 失敗 | 8 | |||||
| 7 | 8 | 画像認識 | 自分画像認識 | 成功 | 9 | 3段目→2段目でもOK([枠]と同じ検索範囲にする) |
| 失敗 | 69 | 失敗はエラー処理へ | ||||
| 7,8 | 9 | 変数 | Tcnt+1 , skip=100(skip有) | 13 | ||
| 5 | 10 | タッチ操作 | ハートタップ | ↓ | 画像認識の結果をタップ | |
| 11 | 変数 | Hcnt+1 , skip=0(skip無) | ↓ | エラー処理から戻っても、ここでskip=0にする | ||
| 12 | タッチ操作 | OKタップ | ↓ | |||
| 6,9 | 13 | 区分 | 裏画像認識 | ↓ | ||
| 14 | 変数 | end=92 , var=@now | ↓ | ここを起点に、画像認識で何秒かかっても待機時間を一定にする | ||
| 74 | 15 | 画像認識 | ハート画像認識 | 成功 | 16 | 2段目 この前に待機を入れてもよかったか? |
| 失敗 | 19 | |||||
| 15 | 16 | 変数 | Hposi=num:@lastmatch.y | ↓ | Hposi=ハートの位置 | |
| 17 | 画像認識 | skip画像認識 | 成功 | 18 | 2段目 | |
| 失敗 | 22 | |||||
| 17 | 18 | 変数 | Scnt+1 , skip=num:skip∔1(skip有) | 22 | 変数skipが1又は101になる | |
| 15 | 19 | 画像認識 | ランキング[枠]画像認識 | 成功 | 21 | 2段目 |
| 失敗 | 20 | |||||
| 19 | 20 | 画像認識 | 自分画像認識 | 成功 | 21 | 2段目 |
| 失敗 | 69 | 失敗はエラー処理へ | ||||
| 19 | 21 | 変数 | Tcnt+1 , skip=num:skip∔1(skip有) | ↓ | 変数skipが1又は101になる | |
| 17,18 | 22 | IF | ≧100 | 27 | Skip中ならミッションタップしない | |
| 否 | ↓ | |||||
| 23 | 変数 | 待機時間を計算 | ↓ | ※2 変数varより待機時間を決定する | ||
| 24 | 区分 | 裏画像認識 | ↓ | |||
| 25 | 待機 | 変数で設定した時間を待機 | ↓ | |||
| 26 | タッチ操作 | ミッションタップ | ↓ | |||
| 22 | 27 | 変数 | end=100 | 55 | スワイプなし | |
| 28 | 区分 | 【91】最下段ハート送信 | — | |||
| 56 | 29 | 区分 | 1人ハート送信 | ↓ | ||
| 30 | タッチ操作 | ハートタップ | ↓ | 横600,縦Hposi位置 | ||
| 31 | 変数 | Hcnt+1 | ↓ | |||
| 32 | タッチ操作 | OKタップ | ↓ | |||
| 57 | 33 | 区分 | 裏画像認識 | ↓ | ||
| 34 | 変数 | var=@now | ↓ | ここを起点に、画像認識で何秒かかっても待機時間を一定にする | ||
| 74 | 35 | 待機 | ↓ | 画像認識のスクショ撮る前に待機を追加 | ||
| 36 | 画像認識 | ハート画像認識 | 成功 | 37 | 1段目 | |
| 失敗 | 40 | |||||
| 36,73 | 37 | 変数 | Hposi=num:@lastmatch.y+135 | ↓ | Hposi=ハートの位置を2段目にする | |
| 38 | 画像認識 | skip画像認識 | 成功 | 39 | 1段目 | |
| 失敗 | 42 | |||||
| 38 | 39 | 変数 | Scnt+1 , skip=num:skip∔1(skip有) | 42 | 変数skipが1又は101になる | |
| 36 | 40 | 画像認識 | ランキング[枠]画像認識 | 成功 | 41 | 2段目 |
| 失敗 | 69 | 失敗はエラー処理へ | ||||
| 40,73 | 41 | 変数 | Tcnt+1 , skip=num:skip∔1(skip有),Hposi=… | ↓ | ※3 | |
| 38,39 | 42 | 画像認識 | 1位画像認識 | 成功 | 43 | 1段目 |
| 失敗 | 44 | |||||
| 42 | 43 | 変数 | end+1 | ↓ | 1位ならendを101or102にする | |
| 42 | 44 | IF | ≧100 | 49 | Skip中ならミッションタップしない | |
| 否 | ↓ | |||||
| 45 | 変数 | 待機時間を計算 | ↓ | ※2 変数varより待機時間を決定する | ||
| 46 | 区分 | 裏画像認識 | ↓ | |||
| 47 | 待機 | 変数で設定した時間を待機 | ↓ | |||
| 48 | タッチ操作 | ミッションタップ | ↓ | |||
| 44 | 49 | SW | end=100 | 52 | ※4 | |
| end=101 | 50 | |||||
| end≧102 | 59 | |||||
| 49 | 50 | IF | 次がSkipなら、Scnt+1して1位確認へ | 59 | ※5 | |
| ↓ | ||||||
| 51 | 変数 | 1位は1段目の送信をする | ↓ | ※6 | ||
| 49 | 52 | IF | 長短スクロールどちらか? | >545 | 53 | ハート位置・枠位置から決定 |
| ≦545 | 54 | ジャストは557だがスワイプ精度により長めを多くした | ||||
| 53 | 記録 | 1人分短めスクロール | 55 | |||
| 54 | 記録 | 1人分長めスクロール | 55 | |||
| 27,53,54 | 55 | IF | 次Skip有無 | skip=1or101 | 57 | Skip有 |
| 否 | 56 | Skip無 | ||||
| 55 | 56 | Skip無なら、skip=0して 1人送信へ | 29 | |||
| 55 | 57 | Skip有なら、skip=100して 裏画像認識へ | 33 | |||
| 58 | 区分 | 1人ハート送信 | — | |||
| 49,50 | 59 | ループ | 1位送信確認 | ミキピョン用に確認 | ||
| 60 | 変数 | 終了フラグ end=999 | ↓ | |||
| 61 | 待機 | ↓ | 画像認識前に待機を追加 | |||
| 62 | 画像認識 | ランキング画像認識 | 成功 | ↓ | ||
| 失敗 | 70 | |||||
| 74 | 63 | 画像認識 | skip画像認識 | 成功 | 81 | 1段目 |
| 失敗 | ↓ | |||||
| 64 | 画像認識 | ハート画像認識 | 成功 | ↓ | 1段目 | |
| 失敗 | 81 | |||||
| 65 | タッチ操作 | OKタップ | ↓ | |||
| 66 | タッチ操作 | ミッションタップ | ↓ | |||
| 67 | ループ | 1位送信確認 | 59,↓ | |||
| 68 | スクショ | スクリーンショット | 81 | 15回ループでも復帰出来なければ諦める | ||
| 8,40 | 69 | ループ | エラー処理ループ | ↓ | ||
| 62 | 70 | 変数 | Ecnt+1 , skip=100(skip有) | ↓ | ループから戻った時はミッションタップ不要なので今回Skip扱いにする | |
| 71 | 画像認識 | ランキング画像認識 | 成功 | 72 | 枠ではない | |
| 失敗 | 75 | |||||
| 71 | 72 | 画像認識 | 自分画像認識 | 成功 | 73 | 2段目 |
| 失敗 | 74 | |||||
| 72 | 73 | 画像認識 | ハート画像認識 | 成功 | 37 | 1段目 |
| 失敗 | 41 | |||||
| 72 | 74 | SW | 復帰先を選択 | end=999 | 63 | 1位送信確認へ ※7 |
| end≧100 | 35 | 裏画像認識へ | ||||
| end=91 | 3 | 最下段ハート送信へ →この場合のみskip=100ではないが11で0になる | ||||
| end=92 | 15 | 下から2段目ハート送信へ | ||||
| 71 | 75 | 画像認識 | OKリトライ画像認識 | 成功 | 77 | |
| 失敗 | ↓ | |||||
| 76 | 画像認識 | とじる画像認識 | 成功 | 77 | ||
| 失敗 | ↓ | |||||
| 75,76 | 77 | タッチ操作 | ミッションタップ | ↓ | ||
| 78 | ループ | エラー処理ループ | 69,↓ | |||
| 79 | スクリーンショット | ↓ | 10回ループでも復帰出来なければ諦める | |||
| 80 | 変数 | err=2 | ↓ | エラー有、途中で終了 | ||
| 63,64,68 | 81 | 区分 | 送信完了 ログ作成 | ↓ | ||
| 82 | 変数 | 送信前待機の時間を記録 | ↓ | ※8 | ||
| 83 | 変数 | 送信ログ作成 | ↓ | ※9 | ||
| 84 | IF | 送信前待機190秒以上はエラー | delay<190 | 85 | 通常180秒 | |
| delay≧190 | 86 | |||||
| 84 | 85 | 変数 | 遅延ゼロにする delay=0 | 87 | ||
| 84 | 86 | 変数 | 遅延秒数設定 エラー文字列設定 | 87 | ※10 | |
| 85,86 | 87 | クリップボード | 完了 | |||
| 88 | 区分 | 送信完了 ログ作成 | 完了 | |||
※3
Tcnt+1 , skip=num:skip∔1(skip有),
Hposi=lastmatch.y+25:スワイプ判定用に+25して、ランキング枠のy値→2段目ハート位置に

※5
変数Skipが1又は101の場合は、【変数セットScnt+1】してから1位送信確認へ
※行き先に[v]があると変数がセットされている。但しラベル名が長いと見えない場合もある。


この位は変数セットしてもいいかな…とした例。やっぱり見えにくい…後で直すかも?
※6
1位はスワイプ出来ないので1段目で送信だが、Hposiは2段目のハート位置にしてあるので[-135]して再び1段目位置にセット
スワイプのプログラムを飛ばし、skip=0してから1人送信プログラムへ
※8(プログラムスクショは82)
ログ作成でstmの値が変わる前に送信前待機の時間を記録

※9(プログラムスクショは83)
送信ログ作成

※10(プログラムスクショは86)
遅延があったなら[err=3]をセットし(フルオートプログラムで使用)、送信ログに遅延秒数を追加

まとめと修正情報
なんとか纏めましたがミスがあったらすみません。半分は自分自身の忘備録となっております。記入漏れ・説明不足等は大目に見て下さい。
※忘備録:基本的に制御設定(画像認識やSwitch・IF等)での行き先指定での変数セットはしない。そこで変数をセットすると指定した変数が見え難く修正時にわかりにくい。どうしても変数セットする場合にはラベルにその旨表示してわかりやすくしておく。
※このプログラムでは1ヶ所(プログラム50)のみ制御設定(IF)で変数セットがあります。






















コメント