パオ碁
パオ碁
url
- Google Play: パオ碁
- karino2/PaooGo: Go app for android, fork from gobandroid.
- 以下のエンジンもcpp下に置く必要がある(今のところシンボリックリンクにしてる、将来submoduleにする予定)
- karino2/GnuGo2Fork
- karino2/Ray android_fork
- karino2/LibertyFork
- karino2/KataGo: android_fork
- karino2/AmigoGtpFork
- karino2/gnugo_fork
- karino2/PaooGoのfork時のコミット コード参考にする時にちょくちょく見たくなるので
コンセプト
ぴよ将棋のようなアプリの囲碁版が欲しい。
- セットアップ無し、広告無しですぐに打ち始められる
- 弱いエンジンと戦える
- ヒント、検討が出来る
- カスタマイズ性や強いエンジンを使える、などの機能はサポートしない
- ネットワークパミッションやファイルパミッションは無しにしたい
こんな感じのものを作りたい。 だいたい囲碁であそぼ!の修行のlv 3くらいをやっている人を対象にしたようなアプリで、 初段くらいまで使える、というのを目指したい(初段がどのくらい強いのか知らないが)。
開発方針
- gobandroidをforkして開発する
- 対局用の碁エンジンとしては AmigoGtp, liberty, gnugo2.6, gnugo3.8の4つとする
- 解析用にはKataGo b6を使う
- 囲碁のルール等はgnugo3.8を使う
- 囲碁エンジンはapkにすべて含めて、設定無しでそのまま使える状態にする
対局用のエンジンは、間を埋めるような復数エンジンの混ぜ合わせはやる必要がありそう。
とりあえずの目標
先を考えすぎるとやる気がわかないので、直近の目標だけを考えてみる。
開発メモ
ここまでの作業のメモを以下に書く。
gobandroidいじり
- guavaとかをdependenciesに追加
- ライブラリを適当にアップデート
- AndoidManifests.xmlにGnuGoのサービスのqueryを追加
このくらいで動いた。検討出来ないのかな?
katagoのNDKでのビルド
NDKでビルドしてみる。大変かしら?
まずは公式をgit clone。
$ git clone https://github.com/lightvector/KataGo.git
そしてndkのビルドをする。
$ export ANDROID_NDK_HOME=~/Library/Android/sdk/ndk/25.2.9519653
$ cd cpp
$ mkdir build
$ cmake . -B build -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake -DCMAKE_BUILD_TYPE=Release -DANDROID_NATIVE_API_LEVEL=33 -DANDROID_NDK=${ANDROID_NDK_HOME} -DANDROID_ABI=armeabi-v7a -DUSE_BACKEND=EIGEN
Eigenが見つからんと言われた。 Eigenはヘッダだけinclude出来る場所に置けば良さそうだな。
ダウンロードはここか?
なんかhttpsじゃないんだが…
とりあえず3.4.0をダウンロードする。 そしてcpp/external下に置く。
cpp $ cd external
cpp/external $ tar xzvf eigen-3.4.0.tar.gz
# cpp/external/eigen-3.4.0が出来る
次にこれをCMakeLists.txtに加えればいいのか?
include_directories(external/eigen-3.4.0)
そしてfind_packageで怒られるのでコメントアウトしておく。
# find_package(Eigen3 REQUIRED)
# include_directories(SYSTEM ${EIGEN3_INCLUDE_DIRS})
# message(STATUS "Found Eigen3 at ${EIGEN3_INCLUDE_DIRS}")
message(STATUS "Skip eigen3 package find")
なんかlibzipがないからself playはzipの結果書き出しが出来ないから出来ないよ、とか言われるがしないのでいいだろう。
ではビルド。
$ cd build
$ make -j 16
なんか以下のエラーが出た。
KataGo/cpp/core/sha2.cpp:205:2: error: Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN
#error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN
まぁどうせlittle endianでいいんだが、CMakeだけにしておきたいな。という事でさっきのmessageの下に以下を追加。
message(STATUS "Skip eigen3 package find")
# NDK
target_compile_definitions(katago PRIVATE BYTE_ORDER=1234)
target_compile_definitions(katago PRIVATE LITTLE_ENDIAN=1234)
target_compile_definitions(katago PRIVATE BIG_ENDIAN=4321)
これでビルド出来た。 ビルドした結果はexeになってしまっている気がするな。
build $ file katago
katago: ELF 32-bit LSB pie executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, BuildID[sha1]=a209a1e7210ea98f1bebe78b6122bb0621b09b5d, with debug_info, not stripped
adb shellで動かしてみるか?
build $ export PATH=$PATH:~/Library/Android/sdk/platform-tools
build $ adb push katago /sdcard/temp/katago
build $ adb shell
penang:/ $ cd /sdcard/temp
penang:/sdcard/temp $ ./katago
/system/bin/sh: ./katago: can't execute: Permission denied
126|penang:/sdcard/temp $ chmod +x katago
penang:/sdcard/temp $ ./katago
/system/bin/sh: ./katago: can't execute: Permission denied
なんで? sdcard下は実行出来ないんだった。
$ adb shell
/ % cd /data/local/tmp
/data/local/tmp % cp /sdcard/temp/katago ./
/data/local/tmp % chmod 755 katago
/data/local/tmp % ./katago
penang:/data/local/tmp $ ./katago
Usage: ./katago SUBCOMMAND
---Common subcommands------------------
gtp : Runs GTP engine that can be plugged into any standard Go GUI for play/analysis.
benchmark : Test speed with different numbers of search threads.
genconfig : User-friendly interface to generate a config with rules and automatic performance tuning.
# 以下略
おぉ、動いた!
モデルとcfgを動かしてgtpモードで動かしてみよう。
Mac$ adb push g170e-b20c256x2-s5303129600-d1228401921.bin.gz /sdcard/temp/
g170e-b20c256x2-s5303129600-d1228401921.bin.gz: 1 file pushed, 0 skipped. 37.4 MB/s (87358203 bytes in 2.229s)
Mac$ adb push ./cpp/configs/gtp_example.cfg /sdcard/temp/
./cpp/configs/gtp_example.cfg: 1 file pushed, 0 skipped. 67.7 MB/s (32457 bytes in 0.000s)
Mac$ adb shell
penang:/ $ cd /data/local/tmp
penang:/data/local/tmp $ cp /sdcard/temp/g17* ./
penang:/data/local/tmp $ cp /sdcard/temp/gtp* ./
penang:/data/local/tmp $ ./katago gtp -model g170e-b20c256x2-s5303129600-d1228401921.bin.gz -config gtp_example.cfg
KataGo v1.16.3
Using TrompTaylor rules initially, unless GTP/GUI overrides this
Initializing board with boardXSize 19 boardYSize 19
Loaded config gtp_example.cfg
Loaded model g170e-b20c256x2-s5303129600-d1228401921.bin.gz
Model name: g170-b20c256x2-s5303129600-d1228401921
GTP ready, beginning main protocol loop
protocol_version
= 2
boardsize 9
Initializing board with boardXSize 9 boardYSize 9
=
komi 6.5
=
play b D4
=
genmove w
= D6
おー、動いた!でもgenmoveは1分以上掛かってるな。
maxVisitsを10にすると5秒くらいに。こんなもんでいいかも。
とりあえずここまでを公開。
karino2/KataGo at android_fork
gobandroidのGnuGoプラグインのコードを読む
サービスにしているのは知っているが、exeを呼んでるのかsoをJNIで呼んでるのかとかを調べていきたい。
以下か。
ligi/gobandroid-ai-gnugo: this is a ai service for gnugo
Android.mkは自分で書いていて、soになっている。
src/main/jni/project/gnugo-3.8/interface/java_bridge.c にJNIの実装があって、以下の2つだけを実装している。
void
Java_org_ligi_gobandroidhd_ai_gnugo_GnuGoConnection_initGTP (
JNIEnv* env,
jclass clasz,
jfloat memory
)
{
init_gtp (memory);
}
jstring
Java_org_ligi_gobandroidhd_ai_gnugo_GnuGoConnection_playGTP (
JNIEnv* env,
jclass clasz,
jstring input
)
{
char *cinput = (char*)(*env)->GetStringUTFChars (env, input, NULL);
strcpy (gtp_input_line, cinput);
gtp_output_line[0] = '\0';
play_gtp ();
(*env)->ReleaseStringUTFChars (env, input, cinput);
return (*env)->NewStringUTF (env, gtp_output_line);
}
これくらいならすぐ作れそうだな。
メモ
./katago gtp -config gtp_human20k.cfg -model your_favorite_normal_model_for_katago.bin.gz -human-model b18c384nbt-humanv0.bin.gz
./katago gtp -config gtp_human20k.cfg -model b18c384nbt-humanv0.bin.gz -human-model b18c384nbt-humanv0.bin.gz
weak2 s10014464弱すぎ、weak3 s14649344 強すぎ
弱い囲碁エンジンを求めて
gnugoをlevel 0で触っているが、序盤が弱くて終盤が強すぎる。 ただgnugoは終盤が人間っぽいというかちゃんとパスしてくれる。
michiをN_SIMSを減らして見たが100だと動かなくて400だと強すぎる。
調べていたらこんなサブレを見つけた。
What’s the best way to bring an AI down to my rank? : r/baduk
zen7が弱いらしい。
何それ?とググっていたら以下のレーティングを見つける。
breakwa11/GoAIRatings: Estimate Go AI ratings by real games
Amigoってのも弱いな、と調べて以下にいきつく。
AmiGoGtp download - SourceForge.net
ちょっと手を入れたらビルドが通った。少し戦うと弱さは自分と同じくらいで悪くない。 ただすごく弱い時とすごく強い時がある感じで、取り合いが強すぎて序盤が弱すぎる感じか。 まぁこれは割と戦える。
zen7は売り物っぽい。
go169というのもあったので調べてみるが、ソースは見つからない。けれど、その前身のGo81はソースがあった。
展開してみるとpalm用という感じだが少しいじればビルドは出来そう。Go169はAmiGoより強そうだがいい勝負っぽい。 Go81がいい感じに弱い可能性もあるが、強さが分からない段階でビルドしてみるのもなぁ。
とりあえず
- 初心者用はAmiGo
- スコアとかの基本的なライブラリとしてはGnuGo
- 分析はkatago b6の最強モデル
の3つがあればどうにかなるかな?
gnugoの2.6はconfigureしたら途中でこける。まぁそれはそうか。
少しいじってビルドを通した。gtpが無い。
デフォルトではちょっと勝てないくらい強いが -D 4 を指定したら勝てた。
- 9x9 All Time Ranks ランク。いい囲碁エンジンないかな〜。
- Download free go engines 古い囲碁エンジンの名前がわかる。だいたいリンク切れだが。
libertyが意外と弱そうなので少し調べてみる。
internet archiveで古い記事を見ているとlibertyはKGSで24Kとの事。GnuGo 2.6は17kなので結構差があるかも。 少しいじってGTPで動くようにした。
karino2/LibertyFork: Liberty fork for imlement more GTP commands.
以下にこの辺のエンジンのKGSの棋力が載っている。
かつて存在した「初心者向け囲碁対局サイトGo-Up!」について(墓標)|Go-Up
GTPエンジン同士を戦わせる
囲碁エンジン評価に移動。
続: gobandroidのGnuGoプラグインのコードを読む
gnugoのコードベースの理解が進んだのでもう一度gobandroid用のエンジンのサービスのコードを軽く眺める。 どうも口としてはplayGtpというものだけにして、文字列を送る感じにしているようだ。 で、play_gtpと同じようなものを少し雑にいじってグローバル変数に入れた文字列をstdinであるかのように偽造している。
これでもまぁやりたいことは出来るのだろうけれど、囲碁のライブラリとしてGnuGoを使おうと思うならもうちょっとJNIの口を頑張って整備してもいい気はする。
gtpのコマンドはバラしてJNIのメソッドにしたいところ。
レポジトリ作成、開発開始 2025-08-30 (土)
名前をパオ碁に決定して正式にfork。applicationIdなどを変更して開発開始。
とりあえずgnugo2.6をapkに含めて動かす、というのを最初の目標にしよう。 方針としてはgnugo2.6はレポジトリは別にしたままにして、しばらくはシンボリックリンクでsrc下に置く感じにしたい。 時期が来たらsubmoduleにするかも。
とりあえずAndroid.mkとApplication.mkを書こうと思い、参考にするサンプルでも探そうとすると、なんかみんなCMakeLists.txt使ってるな。 最近はそういうものなの?と公式ページを見るとCMakeLists.txtを使うとの事。
Get started with the NDK - Android NDK - Android Developers
うーむ、Android用のためだけにCMakeLists.txtを用意してそれ以外はcongigureとMakefile.inを使い続けるってややこしいので嫌なんだが、まぁいいか。
とりあえずGnuGo2のsoが出来た。インターフェースはまだinitしか書いてないが。 リンクができればかなり前身ではある。AmigoGtpやGnuGo3やKataGoでも同じ事をやらないといけないので先は長いが。
先を考えるとやる気が失せるので、GnuGo2と戦えるようにするまでだけを考えよう。 そう思えばあとはインターフェースを書いてGnuGo3を呼んでいるところを差し替えるだけなのであと一歩だ。
gnugo2と戦えるところまで来た。なんかundoすると馬鹿になったり(clearboardして最初からplayで動かしているつもり)こっちがパスすると終わってしまったりと細々とおかしいが。
undo周りのバグを修正 2025-08-31 (日)
いつまでもパスしないで延々と自分の地を削り続けるという謎の挙動の原因を追って、undo周りのバグを潰す。 その過程で調査周りのコードが充実してきたり怪しいところが無くなったりして、だいぶ普通に動くようになってきた。
次はUIを変えてGnuGo2.6との対局をメインとする遷移にしたいな。
KataGoのコードを少し読んでいる。よく書けているな。 main.cppと同じことをしつつgtp.cppをバラしたようなAPIを作れば良さそう。 IOはかなり綺麗に切れているのでやれば出来そうに思える。 むしろこれだけ綺麗に切ってあるのにCMakeLists.txtにsoが無いのは驚きだな。
タイトル画面を作り、遷移を普通のゲームっぽくする 2025-09-04 (木)
起動して普通にゲームをやる時の遷移になるようにタイトル画面を作り直し。 とりあえず初めての人でも使い方が分からない、という感じでは無くなったかな。 いらないのを全部削ってアイコンを変えたらapkをどっかにおいてアナウンスしてみてもいいかもしれない。
解析もrayでいいかもしれない 2025-09-06 (土)
rayのlz-analyzeをつけてgnugoと打ってみたが、割と十分つよいな。
Bot for iGo によると2段くらい、との事。とりあえずこれでいいか。
Rayをjniで使えるようにする 2025-09-11 (木)
とりあえずビルドをするところから。適当にCMakeLists.txtを書いて、
$ export ANDROID_NDK_HOME=~/Library/Android/sdk/ndk/27.0.12077973
$ mkdir build
$ cmake . -B build -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake -DCMAKE_BUILD_TYPE=Release -DANDROID_NATIVE_API_LEVEL=33 -DANDROID_NDK=${ANDROID_NDK_HOME} -DANDROID_ABI=armeabi-v7a
$ cd build
$ make -j 16
おや、一発で通る。よしよし。では次にjniを書いていこう。
sim_paramsとuct_paramsを調べる
ファイルから読んでいるが、Android的にはJavaで読んで渡したいよなぁ。 とりあえず読んでいるところを調べる事から。
uct_paramsはUctRating.cppのInputUCTParameterで読んでいる。 fm_tという構造体の配列を初期化する、というのと、hashとhash_indexを初期化する、という構成になっているな。
fm_tはdouble一つとdouble 5個の配列で出来ているのでようするにdouble 6個だな。 小さい配列はJava側でdoubleの配列を初期化して渡して、大きい配列はC++側のポインタを変えさせてJava側で初期化するか。
Hashもunsigned long longとintなのでjintを3みつとして初期化していけばいいか?
なんとなくuct_paramsの初期化の関数は書いた(呼ぶのはまだ)。
sim_paramsはRating.cppのLoadFeatureParametersだな。
中身を見るとpo_md2以外は大してデカくないな。po_pat3もたかだか64Kだし、全部まとめて入れてしまう、でいいか。 う、uct_paramsもそうした方が良かったな。
zipをassetsに加えたらcloseEntryが遅くてうーん、と悩んでいたが、 そもそもzipではなく素のファイルでいいんじゃない?apkは圧縮されるんだから、と言われて、そういえばそうだなと思って修正。
uct_paramsのうち、小さい奴は一通り終わり。 あとはJava側で初期化する奴とsimだな。
RayのAndroidでの動作に成功 2025-09-12 (金)
uctの初期化終了
MD3.txtなどは思ったよりもtoDoubleが時間が掛かるので、諦めてpythonでバイナリフォーマットを作る方針に変更。 まぁまぁ大掛かりになってきたが、無事uct_paramsは終わる。
だいぶいろいろ整備も進んだのでsimもそう大変ではなかろう。
結局1日かけて、動くところまでは出来た。なんかたまにフリーズするのでバグってそうだが。
いらないものをいろいろ削除、libertyを追加 2025-09-13 (土)
ヒントや検討を作っていくにあたり、既に動かなくなっているいろいろなActivityなどが邪魔なので簡単に削除出来るものは一通り削除しておく。 だいぶ見通しは良くなった。
そしてGnuGo 2.6はdepth 4固定にしたら全く勝てなくなってしまった。うーん、ちょっと強すぎるな、こいつ。 やはりAmiGoと混ぜて適当な強さを作る方法を探求する必要がありそうだ。
Go-Up! - 初心者向け 囲碁対局Webアプリ をやっていたら、Libertyがいい感じの弱さだったので試しにビルドしたりGTPインターフェースをもう少し追加したりしてSabakiで遊んでいたところ、 このくらいならすぐ組み込めそう、という事でパオ碁に組み込んでみた。
ただしばらく打っているとクセになれてしまって勝ち方を覚えてしまった。やはりGnuGo 2.6の方がそこまで単純では無いよな。
ヒントの実装 2025-09-17 (水)
とりあえずanalyzeを2秒やって一番上の結果を使う感じのヒントを実装する。 どうも盤面のsyncがうまく行ってないようで、途中から既に打ってある座標を返す。
とりあえずバグは直すが、大枠は出来たかな。
stringstreamのクリアを忘れていただけだった。そしてclearをしてもクリアされなくてなんでかな?といつものハマりをやる(strを使え、とのgemini先生の教えに従う)。
無事ヒントが動くようになった。
初期化が3秒位かかるのがちょっときになるので調べていると、どうもgetDoubleが遅い。 別にdoubleにする必要も無いので、そのままバイト列を流してみるかなぁ。
意外と日本ルールと中国ルールの違いがある 2025-09-18 (木)
バイト列を流してだいぶ初期化も早くなった。
どうもRayが毎回半目差で負けるのは、中国ルールだと勝っているからっぽい。確かに変な手入れするので中国ルールなんだろうな、とは思っていたが。 少し調べたが日本ルールにする方法は無いっぽい。
うーん、自分は日本ルールでやりたいんだよなぁ。というかいろんなルールどころか日本ルールでもまだ良く分かってないので、他のルールの事なんて興味無い。
Sabakiでkatagoに日本ルールにして試すと期待通りに動いているので、やはりKataGoを入れるかなぁ。
KataGoのJNI作り 2025-09-20 (土)
KataGoを使ってみよう、という事で本格的にJNIを書き始める。 まずは簡単に外せそうなものを外してsoを作る事から。ちょっと書いたらsoは出来た。
GTPEngineを流用する感じで初期化周りを持ってきている。 そのままでは関数から出ない前提になっているので直す必要がちょくちょくあるが、逆にこれが出来たらほぼ完成だな、これ。
一応Analyzeの手前くらいまでは書いて、analyzeのコードを理解したくらいまで進めてガス欠。 あと一歩だが一日では終わらないかな。
散歩行ったあとに気が向いたので動かす所までやるとあっさり動く。 そして超強い。1sec考えるrayでも全部石取ってしまう。無敵。
残りの作業をこの辺で考えたい。
- 検討機能を入れたい
- エンジンを増やしたい
- 間のレベルのエンジンを増やしたい
ここまで出来たら完成だな。とりあえず検討機能かな〜。
検討機能作り始め 2025-09-25 (木)
EditGameActivityを参考にReviewActivityを作成開始。
とりあえずGameを進めたり戻したり、という機能はすでに実装済みだったのを整理していい感じになる。 ただいろいろ出来ていないのでちょっと実装しなきゃいけない事を整理するか。
- variationに数字をつける
- 本手順に戻る、を実装
コードベースの理解を深めつつなんとなく実装が出来た。 次は解析関連の機能だな。
解析の機能を実装 2025-09-27 (土)
夜になんとなくパオ碁の実装でも進める気分になったので、軽く実装してみたら無事できる。だいぶ完成度が上がってきたな。
なんか文字が見づらいのがいまいちだな。Sabakiだと色をアルファで少し薄めに表示して、その上から白で文字を書いているなぁ。
検討からの再開を実装 2025-10-02 (木)
検討から再開出来るように出来た。これで負けそうになったら検討でいろいろ調べてから再開出来るように。
あとはCPUを増やして、使えないメニューを一旦潰せば人に試してもらえるかな。
次はAmigoGtpをつなげてみよう>つなげた
なんかlibertyとどっちが強いか微妙だな、AmigoGtp。まぁいいや。
GnuGo3.8もつなげる、Rayを外す 2025-10-05 (日)
GnuGo 3.8をつなげたら十分強かったので、もうこれでいいや、という事でRayを外す。 コードは残してparamsだけassetsの外に移動する。
GnuGo 3.8は序盤から明らかに勝てない感じだな。GnuGo 2.6は序盤はそんな強くもない印象だが。
現時点でのapkのサイズは以下。
- Ray無し 67.1MB
- Rayあり 120.4MB
無しにしよう。
アイコンも描いてあとはUI周りの整備をしたらリリースは出来そうだな。
Aboutをつける 2025-10-09 (木)
謝辞を復活させてリンクが切れてないものだけにして、エンジンのリンクなども足す。まぁ動いてそう。
Google Playにリリース作業 2025-10-10 (金)
スクリーンショットを足そうととっていたら、ついでにGoogle Playにもリリースするか、という気分になりリリース作業。 Closed Testとかがあってリリースまでの手順がわかりにくくなっているなぁ。
一応リリースされた。
https://play.google.com/store/apps/details?id=io.github.karino2.paoogo
検討の上の数字がウッテガエシとかでは重なって表示されてしまうな。直さないと。
検討の数字の修正、リリース、ハイブリッド 2025-10-19 (日)
いくつか来たPRを取り込み、検討の数字の上書きのバグを修正してリリース。
ハイブリッドの試作
ぱおぬージュニアは強すぎるがぱおりべは弱すぎる、という事で、この2つの間を作る試み。 ぱおりべは序盤が弱すぎるので、序盤をぱおぬージュニアにして、中盤以降をぱおりべにする、ハイブリッドエンジンを作ってみた。 しばらく打って、14手くらいで切り替えるとちょうど良い強さになりそうなので、これを「ぱおぬり」と呼ぶ事にする。
しばらく対局してみたが、ちょうどいい弱さだな。よしよし。
ハイブリッドの調整 2025-10-23 (木)
ちょうど良い弱さだが、少しぱおぬージュニアとの間が広すぎる気がしたので、少し強い程度に調整したハイブリッドも作る。 まぁこんなもんかなぁ、という感じになったのでひとまずマージ。
評価値グラフの実装 2025-10-30 (木)
評価値グラフを実装しよう。
グラフライブラリの選定
低機能でメンテが楽そうな奴を探して、halfhp/androidplot: Charts and plots for Android にしようかな、と思う。
とりあえず評価値0.0だけのグラフまで書けた。まぁこれでいこう。
KataGoでの評価値の推移
1手ずつ出すのはちょっと遅そうなので、まとめて出す方法がほしいな。
kata-analyzeはmoveを複数渡すと結果を返してくれるっぽいが、非同期でやるにはどうしたらいいのかな。
コードを眺めていると、main.cppにjsonでのクエリのモードがあって、これと同じ事をやるのが良さそう。 それはanalysis.cppの MainCmds::analysis でやっているっぽい。
これと同じ感じでやろう。
JNI側ではスレッドを動かし続けて結果をpollingで取り続ける感じにしよう。 終了もend的なメソッドを呼ぶ。
評価値グラフが出た 2025-11-06
なぜかKataGoのスコアが白番目線で、理由がよくわからない。とりあえずマイナスを掛けて表示したらそれっぽいグラフにはなった。 キャンセル用のダイアログがなぜか真っ暗だったり、軸のラベルが多すぎてみづらかったりいまいちな事は多いが、 まずは見た目よりも機能を優先したい。
とりあえず局面にシンクした表示をしたいな。
MPAndroidChartに乗り換え、局面と対応させる 2025-11-13 (木)
タップ関連の処理がAndroidplotは弱かったのでMPAndroidChartに乗り換え。
一応雑にシンク出来るようにはなった。いちいち打った音が鳴るが。
とりあえずToDoを書き出しておく。
- ハイライトをボタンの移動で追従させる
- グラフが完全に終わったらグラフボタンをdisableにする
- ダイアログがなぜか真っ黒なのを直す
グラフとのsync周りを修正してリリース 2025-11-14 (金)
ちょっとゼルダやりすぎて疲れてきたので、息抜きにパオ碁いじり。
グラフをタップされた時の移動をredoをいっぱい行っていたのをちゃんとジャンプするように変更する。 そしてボタンのナビゲーションで移動した時にグラフのハイライトも移動させるようにする。
これで割と普通に動く感じにはなったな。後はダイアログが何故か真っ黒なのを直せば一旦リリースしてもいいかな?>直してリリースした
やはり9路の布石対応したい 2025-11-19 (水)
GnuGoの布石データを見ているとサイズ依存のものを持つ方法が無さそう。9路は中央に直接関わってくるのでこれではダメだよなぁ。 という事で、Kotlinのレイヤーで布石データを持てるようにして、序盤数手はこのデータを使うようにしよう。
布石のデータはあまりvariationとかを詳しく行うのではなくて、単に厳密一致していたら布石として打ち、外れてたら普通にgenMoveする、という感じにしたい。 布石のデータは序盤の確定の変化だけ、という感じにしたい。 Sabakiで適当に手で作ったSGFを文字列としてハードコードして渡す感じで。assetsにする必要も無いでしょう。
回転で4つ、さらに鏡像で2つの合計8通りのパターンを生成する感じにする。 各パターンは一つのパターンから生成する感じにしたい。 それぞれの布石オブジェクトが次の手を生成して、その手と相手の手でフィルタリングして行って残ったオブジェクトに毎回次を聞く感じにしたい。 この辺はちょっと型を作ってみないと良くわからないな。
SGFのreaderはすでにPaooGoには入っているので、割と関数型的に解決出来る問題な気はする。ADTで作るかクラスで作るかはちょっと悩むな。
variationがない移動、つまりCellのリストが一つの布石とする。それは元となるFusekiDataを8通りに対称移動してできた系列の一つ。 当初は大したサイズにならない予定なので、全リストを最初に持てばいいか。 それを手が一つ進む都度フィルタリングして行って、残ったリストからランダムに選んで次を選ぶことで次の手を決める。 この次の手でまたリストをフィルタリングし、ユーザーが打った手でフィルタリングして、また次の手をランダムで選んで次を選ぶ事で作る。 次がなくなったら布石は終わり。
9路用布石を入れてみる 2025-11-19 (水)
とりあえず振り子で確率的に打つ感じを実装してみた。 いい感じだ。ただ振り子は凄く短いので序盤での調整が難しいな。毎回同じになっちゃう。もう少し長い定石だと序盤を毎回同じにしないと永遠に現れない、となりそうなので、調整が悩ましいなぁ。
布石のデータはハードコードした文字列で渡すが、文字列はSGFなので、Sabakiでsgfを作って追加していく感じになる。
ブラックブーメランと豆まきのsgfは作った。あとは王道進行で風車、リフティング、扇子を入れたらとりあえずはいいかな。
ちなみに振り子、一間飛びまで打たれるとgnugo 2.6になかなか勝てない。普段は序盤のしょぼさで勝ってたんだなぁ。
しばらく電車で打ってみたが凄くいい感じだったので、もう少し布石を足す。一応、天元、星、高目の三つの布石は揃えた。 布石を使ってくる奴は別人という事でgnugo2系列+布石はぱおふせという名前のエンジンという事にした。 ぱおぬーパパとぱおぬー爺はgnugo 3系列の布石あり(採用頻度の違い。ぱおふせジュニアも同様)
しばらくやってみたが、かなり遊べるようになった。ぱおふせジュニアが当面のライバル。
SGF保存をとりあえず動くまで 2025-11-21 (金)
gobandroidにあった保存ダイアログを少し手直ししてSAFとして保存するようにしてみたが、ファイル名に日付を追加したりする仕様が微妙に面倒なので、 デフォルトでよくある名前を入れておいてあとはユーザーが勝手に手で編集してね、でいい気がする。
ちょっとその辺手直ししよう。
手直ししてみた。保存はまぁこれでいいかな、という感じにはなった。現状は終了しないと保存出来ないが、ゲーム中とかreview中でも保存出来ていいよな。
あとは共有と開くを実装したら次のバージョン公開かなぁ。
SGFを開く、つぶや棋譜2で共有、クリップボードにコピー 2025-11-23 (日)
ちょっと暇だったのでSGFを開く、も実装してみる。単にReviewに渡していて外から開く場合と必要な情報はちょっと違うよなぁ、とか思うが、そういう対応はまだしてない。
とりあえず共有も動くようにして、ゲームの途中でも保存出来るようにしたらひとまず公開して、おいおい色々直していこう。
つぶや棋譜2のurlを生成してACTION_SENDを送るようにした。SGFのurl encodeは長いが、まぁ9路なら動いてそうだしいいか。
クリップボードにコピーも一応実装しておく。 ついでに振り子があんま出なくなっていたので王道進行と同じ比率にする(変化が多い布石が選ばれやすかったのを修正)。
あとは設定画面を作ればリリースできそうだが、今日のところはこのくらいにしておいてやる。
Setttings画面を追加してp0.7リリース 2025-11-24 (月)
とりあえずリリースしてしまいたかったので、設定画面を作ってリリース。
ぱおりばパパの追加、解析の結果のキャッシュと自動適用、他 2025-12-04 (木)
木曜のAndroidもくもく会なので何か直そうと思ったが、割とパオ碁は完成されている事に気づく。 とりあえずヒントがundoとかでクリアされてないのを修正し、libertyに布石を追加したぱおりばパパを追加する。
ただ作ってみるとぱおりばパパは弱すぎるな。布石+libertyは弱すぎるが布石+gnugo 2.6は強すぎる。
ついでに解析結果をキャッシュして、移動のつどその局面のキャッシュがあるかをチェックするようにした。 これでだいぶ解析がはかどるな。