【将棋】指手を生成するコードを生成するコード2
空いた時間にちまちま作っています。
指手を生成するコードを生成するコードをデバッグした後に、
生成された指手を生成するコードをデバッグしないといけないので大変です。
キャプチャとドロップはなんとかできたけど、王手の回避手を同じように作ると
組み合わせが膨大になりすぎた。
というのは、
王の位置(81)×王手をかける位置(81)×合い駒を打つ持ち駒のパターン(127)で、
王手を回避するパターンを生成しないといけない。
コードだけで、1Gバイトを超えてコンパイルが止まってしまう。
コード例は下にあります。パターンをひたすらswitchで展開していく。
前回も書いたけど、狙いは、いままで配列で駒の利きを計算していたので、その配列参照をなくすことで高速になること、
事前に利きの配列を用意する必要がなく、関数をコピペすればいきなり使える、
というものです。
なにかアホなことしていて、根本的に方針が間違ってるかもしれない。
int *gen_evasion(char *kifu, int *te, char king_pos, char attack_pos) { switch(king_pos) { case 0: // kpos switch(attack_pos) { case 9: // attack pos switch(kifu[1]) { case KOMA_GI: *te++=0x24089; *te++=0x20089; break; case KOMA_KA: *te++=0x34089; *te++=0x30089; break; case KOMA_UM: *te++=0x68089; break; case KOMA_RY: *te++=0x70089; break; } switch(kifu[10]) { case KOMA_KI: *te++=0x28509; break; case KOMA_HI: *te++=0x3c509; *te++=0x38509; break; case KOMA_TO: *te++=0x48509; break; case KOMA_NY: *te++=0x50509; break; case KOMA_NK: *te++=0x58509; break; case KOMA_NG: *te++=0x60509; break; case KOMA_UM: *te++=0x68509; break; case KOMA_RY: *te++=0x70509; break; case KOMA_EMP: switch(kifu[11]){ case KOMA_HI: *te++=0x3c589; *te++=0x38589; break; case KOMA_RY: *te++=0x70589; break; case KOMA_EMP: switch(kifu[12]){ case KOMA_HI: *te++=0x3c609; *te++=0x38609; break; case KOMA_RY: *te++=0x70609; break; case KOMA_EMP: switch(kifu[13]){ case KOMA_HI: *te++=0x3c689; *te++=0x38689; break; case KOMA_RY: *te++=0x70689; break; case KOMA_EMP: switch(kifu[14]){ case KOMA_HI: *te++=0x3c709; *te++=0x38709; break; case KOMA_RY: *te++=0x70709; break; case KOMA_EMP: switch(kifu[15]){ case KOMA_HI: *te++=0x3c789; *te++=0x38789; break;