大人のための将棋再入門 4 (居角)左美濃右四間

将棋再開後、棒銀くん・中飛車くん・早石田くんの対策がある程度できるようになると、そろそろ日常使いできる汎用性の高い戦法をマスターしたくなってくる。
お勧めは、(居角)左美濃。特に攻撃ユニット(右辺)を右四間に組む形は、陣形やその狙いがはっきりしているので真似しやすい。特に古典的な矢倉に対しての威力は絶大で、少々おかしな駒組してもウォーズ低級位レベルならほぼほぼ勝てると思う。
実際の進行例はこんな感じです。

私の子供のころは、入門書には決まって矢倉が紹介されていて、あまり疑問もなくそのように組むことが多かったが、この矢倉というのは、冷静に考えると
・囲いを組むまでに手数がかかる
・基本的に引き角なので攻撃への活用が意外にしにくい
という弱点がある。特に後者などは、下段に引いた角と入城しようとする玉がたびたび「ごっつんこ」する。だから、その駒組の不自由さは常々感じていたはずなのに、これに改良を加えようとは当時はこれっぽちも思わなかった。刷り込みって怖いね。

それはともかく攻撃時のポイントは、
・飛角(右)銀(右)桂を攻撃に参加させる
・飛車・角の大駒は大胆に切ってもよいからとにかく攻めを繋げる
ことでしょうか。ここらへんがうまくいけば、仕掛けから寄せまで割と一直線に進行する場合が多く、かなり気分よく勝てる戦法です。

細かい話をすると、「左美濃+中飛車」や「左美濃+早繰り銀」などのバリエーションもありますが、ここらへんは応用編といったところでしょう。私も勉強中です。時系列的にみると、先手番矢倉の対抗策として左美濃登場→さらにその対抗策として雁木の再評価という流れのようです。2017年現在、将棋研究のテーマの一つにもなっているようですが、級位者レベルにとってこれはテーマがいささか細かすぎる。再開最初は、まずは大雑把に全体を掴みましょう。

カテゴリー: 大人のための将棋再入門, 将棋 | コメントをどうぞ

JSKifuForWP を複数走らせる

JSKifuForWP はまあ動くようになった。

次の課題は、同じページにこの JavaScript を複数走らせると、動作がおかしくなること。

それはそうだ。プログラムでは getElementById 使いまくり。同一ページに同じ id が複数個あるのはまずい。

何らかの手段で一つのプログラムに固有の id を与えなければいけない。

ここをみたが、うまくいかない。うーん。

発想を変えて、HTML の id ではなく、プログラムに固有の id を持たせることにする。

動いた。これで原理的には同一ページで複数の JSKifuForWP を走らせることができる。

 

 

 

カテゴリー: JavaScript | コメントをどうぞ

xampp のお手軽感がちょうどいい、からのデバッグ その2

持ち駒の処理に着手。

成り駒をそのまま手持ちにしている。

修正。

うまくいった。後は、「打」のときに持ち駒を手放すロジックをつくる必要がある。面倒そう。。。

が、JavaScript は

(持ち駒情報の文字列) = (持ち駒情報の文字列).replace(持ち駒の文字列表現, ”);

で(持ち駒情報の文字列)から最初にマッチした(持ち駒の文字列表現)だけ削除される仕様とのこと。全部が置き換わるわけではないという。便利なのか非合理的なのかよくわからない。

実装。

おお、うまく動いているっぽい。

この一局は、おおむね正しく表示されているようだ。

 

ここまでの成果は JSKifuForWP のテストページで。

 

カテゴリー: JavaScript, 将棋 | コメントをどうぞ

xampp のお手軽感がちょうどいい、からのデバッグ

最近、JavaScript づいているので、ローカルにテスト環境を構築すべく xampp を導入した。Thinble もお手軽でよかったのだが、ディレクトリ掘って複数ファイルつっこんでいくとさすがに不安定になったので。

ついでにサイトのバックアップも取ったが、それでも xampp ディレクトリのサイズは1G 未満。

これは便利。

 

さっそく、将棋山脈というところで生成された kif ファイルを JSKifuForWP で読み込めないか検討。

なんとか、コメントは kif ファイルでも読み込めるようになった。一歩前進。

なお、JavaScript の文字列操作はここが参考になった。

しかし、これでは駒が動かない。kif ファイルの場合、指し手は

1 7六歩(77) (00:00/00:00:00)

のように表記される。駒の移動元は () 内の2文字 -この場合は 77 – を調べればいいので簡単だ。次は、移動先。7六も変換は容易だ。とりあえず、後手香車に置き換えて表示させるとこうなる。

しかし、駒の種類は? どう符号化されているかは、ファイルひっくり返して調べるしかない。

先手:歩→0e 香→0c 桂→oa  銀→08 金→07 角→05 飛→03 玉→02 と→0f 杏→0d 圭→0b 全→09 馬→06 龍→04

後手:歩→1d 香→1b 桂→19 銀→17 金→16 角→14 飛→12 玉→11 と→1e 杏→1c 圭→1a 全→18 馬→15 龍→13

かな。先手番を基準に考えて、後手駒は「駒番号(10進数) + 15(10進数)」と表せる。

よしよし。

後は、駒交換時の処理や持ち駒の表示。

 

カテゴリー: JavaScript, xampp | コメントをどうぞ

大人のための将棋再入門 3 脳内評価関数更新用早石田くん対策

ウォーズ低級位時は、相手が棒銀・中飛車・早石田を指してくる場合が本当に多い。

対策立ててないと

の局面で恐怖を覚えます。「飛車が危ない」と。

要するに、この後、どこかで▲7四歩△同歩▲2二角成△同銀と進んだ場合の▲5五角の飛車取りを予想して身構えるわけですね。例えば、こんな局面、

この場合には、△3三角打と自陣角を打つのが好手です(おそらく定跡にもなっていると思う)。

つまり、飛車を取らせるわけです。

落ち着いて考えると▲8二角成△同銀としたところで単なる飛車角交換ですし、この後、後手陣に飛車を打ち込む隙はありません。むしろ△9九角成を防ぐために後手に回ることになります。

この進行を早石田対策としてとりあえず覚えておいてもいいですし、

どんなときでも 飛車>角 → 序盤は飛車より角

というふうに脳内評価関数を更新しておきましょう。

この後の進行はここなんか参考にしてください。

 

カテゴリー: リバーシ・チェス・将棋・碁, 大人のための将棋再入門, 将棋 | コメントをどうぞ

大人のための将棋再入門 2 シケプリ風まとめと若干の考察

起源:古代インドのチャトランガがその起源といわれている。チャトランガが西洋に渡りチェスとなり、日本に渡って将棋となった。両者は、独自の発展を遂げていたが、ボードゲーム系の AI というくくりでみると、例えば著名なコンピュータ将棋プログラム YaneuraOu が コンピュータチェスプログラム StockFish のコードから多大な影響を受けているなどの例があり、両者の関連性は無視できない。

ゲーム理論上の分類二人零和有限確定完全情報ゲームに分類される。

理論的性質からのアプローチ:二人零和有限確定完全情報ゲームは、「理論上は完全な先読みが可能であり、双方のプレーヤーが最善手を打てば、必ず先手必勝か後手必勝か引き分けかが決まる」が、将棋の場合、その完全な先読み(完全解析)はいまだなされておらず、仮になされたとしても(特にプレイヤーが人間の場合には)その結果に基づいて指し手を決定する具体的な手段を用意するのは現実的ではない。現実的には、コンピュータ将棋においては、ミニマックス法などの定式化されたアルゴリズムを利用して指し手を決定している。

ミニマックス法などに関しては、こちらに実例を挙げて軽く触れておきました。そこでも触れましたが、実際の差し手決定には、「探索」に負けず劣らず「局面評価」が重要であることを強調しておきました。

人間の対局を振り返ってみると、定跡から外れた局面などは、人間もミニマックスに近い思考方法を取っていることがわかります。つまり、何手か先を読んで、そのときの局面を「駒得しているから良い」とか「駒損はしているが先手を取っているので指せる」などと評価して現実的な指し手を決定しているわけですね。
で、困るのは、人間は、なかなか質の良い評価関数を獲得するのが難しいってことです。

 ヘボ将棋 王より飛車を かわいがり

なんて川柳はあまりに有名ですね。

特に、大人になると意識的にやらないとなかなか脳内評価関数(?)は更新されないので、ソフトを使った検討などでは、このことを意識しながらおこなうと良いでしょう。
まず、上の格言的川柳が批判するような局面が頻発する早石田の対策から考えましょう。
なお、評価関数の評価に関してはこんなことがいえると思います。

評価関数の評価:完全解析がなされていない以上、これとの比較において各種ソフトの評価関数の優劣を決めることはできない。現実的には、異なる評価関数を持つソフト同士の対戦結果から「レーティング」を求め、評価する。

ソフト同士の対局から新しい定跡を抽出しようという動きにはこういった背景があったわけですね。

カテゴリー: リバーシ・チェス・将棋・碁, 大人のための将棋再入門, 将棋 | コメントをどうぞ

大人のための将棋再入門 1

他サイトで公開した将棋系の書き物の評判がいいようなので、内容整理してこちらでもアップ。

———————————————————————————————

昨今の将棋ブームにならって将棋を再開する人は多いようだ。
強い新人の存在、AI との絡み…など興味の方向性は様々だろうが、内容のある将棋を指せると愉しい。

ところで、そのような場合、どういう戦法から入った方がいいだろう?

子供の時と違うのだから、入門書に紹介してあるような棒銀や矢倉棒銀ばかりでは面白くないし、第一勝てない(対矢倉の居角左美濃は優秀。特にウォーズ級位者レベルならほぼほぼ勝てる)。
ノーマル四間飛車を勧める人もいるが、相手が最善手を指し続けた場合、振り飛車が不利になることが明らかになりつつある現在、これをいい大人が採用するのはどうかと思う。なにより、ノーマル四間はノーマル四間で細かい定跡を覚える必要があるので面倒くさい。
変化が多く敬遠される傾向にあるが、ここではあえて先手番・後手番ともに居飛車を採用するのをお勧めしたい。
対振り飛車、相居飛車(角換わり・横歩・相がかり)などバリエーションは多いが、そこは大人になってからやる将棋、アバウトに進行を覚えておけばそれなりに指せる。すべてを網羅しなくても、システマティックに対応できるのが大人の知恵というものだろう。また、プロ棋戦鑑賞時にも手の意味がわかるようになって対局がより深く愉しめるようになると思う。あと、現時点で最強ソフト elmo が振り飛車を指さないというのは、棋理の上でもそれなりの裏付けがあるように思う。

私も、再開当初は、先手番の時は居飛車、後手番の時は四間飛車で指していたのだが、後手番の時に、指し方がわからなくなる場合が多く、結局、先手も後手も居飛車で指すようになった。ただし、相手が見え見えな棒銀・中飛車・早石田の場合は、それ用の対策を立てて指す。角換わりや横歩取りの対策はどうしても後回しになってしまうが、そのときはそのとき。負けても気にしなければ、トータルの勝率はそれなりに維持できるはずだ。

 

カテゴリー: 大人のための将棋再入門, 将棋 | コメントをどうぞ

nkif と DB と検索

今日は、JSKifuForWP のコードをいじる。

コメント出力も可能になった。

JSKifuForWP は読み込むことのできるデータ形式は、nkif 形式のみである。nkif というのは、私が勝手に名付けた名称で、その出自が某放送局のためこの名前となっている (笑)。

今日の作業でそのデータ構造はほぼ理解した。

nkif は一局面を例えば

p=1b191716101617191b0014000000000012001d1d1d1d1d1d1d1d1d0000000000

00000000000000000000000000000e000000000000000e000e0e0e0e0e0e

0e0003000000000005000c0a08070207080a0c26;

h1=;

h2=;

という形で表す。p は盤面の駒配置、h1 は先手の持ち駒、h2 は後手の持ち駒、である。

p はここでも調べていた。1一が 1b で香、2一が 19 で桂、‥‥というのはわかっていたのだが、これだと 81 * 2 = 162 文字で盤面の駒配置はすべて決定されるはずだが、実際には、164 文字ある。最後の 26 が余計だ。

今までこれがわからなかったのだが、わかってみればなんことはない、これは着手位置を表すマーカー画像の位置そのものだった。初手▲2六歩と飛車先を突いたので、こうなっている次第。余計な情報なので落としてもいいのかもしれない。

そこまでわかったので、テスト的にデータベースも作ってみた。とりあえず三局ほどデータを挿入。

この状態で

SELECT * FROM tbl_kifu where kifu like ‘%p=1b19171610161719‥(略)‥0a0c26;%’

を実行(SQL文はいつまでたっても慣れないっす)。

結果は、


と同一局面(初手▲2六歩)を正しく2件ひろってくる

問題の処理時間は、

と約 30 ms 。

これだと100局程度でも、同一局面をひろってくるのに数秒かかりそう。

んー、ちょっと遅いかな。

感想としては

・それっぽいシステムは組めそう

・が、「こなれた」システムをつくるのはそれなりのノウハウが必要

と思った。

やはり、データベースとか検索とかは苦手だ。

カテゴリー: PostgreSQL, リバーシ・チェス・将棋・碁, 将棋 | コメントをどうぞ

CakePHP チュートリアル試してみた

WordPress 使ってながら、PHP に関してはまったく無知だったので、CakePHP 3 をちょこちょこお勉強。
まずは公式チュートリアルから。最初のサンプルのブックマークがどうしたこうしたはまったく興味なかったのでブログの方から試す。

おそらく最終成果物はこうなると思います。

対応する MySQL のテーブルを確認する。

CRUD 操作は確かに安定してますな。

 

カテゴリー: CakePHP, プログラミング環境 | コメントをどうぞ

あのプロジェクトを救え! NetBeans

エンジニアというものは、自分のつくったプロダクツに責任を持ち、万難を排して保守にに努めるべし(略)…と考えていた時期が私にもありました。

実際には、大人の事情等があってそう理想的にはいかないんでしょうが、特にIT系に深入りすると「けっこう使えるのになぜかメンテが今一つで敬遠されているプロジェクト」が山ほどあることに気がつきます。「食わず嫌いの方も多いかもしれないが、こう使えばけっこう使えるよ」的なことを書いていきたいと思います。

まず、Java 系の IDE である NetBeans から。

Java 系の IDE というと eclipse の方がメジャーなんでしょうが、多機能すぎて私は使用を途中で放棄しました。操作が今一つわかりにくいっていうか。。。

もちろん、NetBeans にも悪いところはかなりあるのは知っています。例えば、プロジェクトから WildFly などアプリケーションサーバを走らせると、ほとんどの場合、停止しない、とか。最近もこの手の問題に直面しててこずりました。ですが、なにかちょっとしたコードを書きたいとき、断然、NetBeans の方が便利だと思います。プロジェクトをつくる仰々しさがないっていうんでしょうか。。。

ですが、残念なことにそのチュートリアルとかがひどかったりするのですね。

まず、なんでこんな迂遠な書き方するんだろう? 翻訳ということを差し引いてもちょっとどうかと思います。やっていることは単純で「アプリケーションサーバ上に二つの JSP ページを載せる。一方のフォーム上の入力欄に文字列を書き込み、投稿ボタンを押下するともう一方のページに遷移し、その文字列を表示する。コントロールは beans でおこなう」というものです。最初にこれを書いておかないものだから、目的地がどこなのか初心者は混乱します。

要するに

というページを用意し、「OK」ボタンを押下すると

というページを出力するってことです。

情報も古いです。サンプルソースがなにしろ JDK 1.6 対応だったりします。

今回、手を出したついでに同内容を 『JDK 1.8 + NeteBeans 8.1 + WildFly 10』で作りなおしたものを github に上げておきました。

これを作成したときのポイントは

・操作は下手にショートカットなどはつかわず、自分の手慣れたやり方でOK。(ページやクラスの作成などは右クリック→新規追加で十分でしょう)

・コードは基本コピペ。

・IDE はプラグインなどが不安定なものが多い。デプロイは面倒がらずに http://localhost:9990 からおこなう。

といったところでしょうか。

なお、chrome では、現在(2017年夏)、デフォールトでは Java が動きません。npapi というやつを有効化しておきましょう。

 

カテゴリー: NetBeans, プログラミング環境 | コメントをどうぞ