リバーシ作成。
GUIインターフェースの実装が進んでいないです。
AIのアルゴリズムも作らないといけないのに。
石返しの探索メソッド、実行メソッドの再実装の途中で止まってます。
Javaのメソッド引数に渡すクラス型変数は参照型だということを忘れていて、
//---- //石の座標情報を含むクラス class DiscPosition { int x, y, color; } //---- /* * int isPlacable() * 返せる石を探索するメソッド * discPos: 石を置こうとしている場所 * 戻り値: 返せる石の総数 */ int isPlacable(DiscPosition discPos) { int reversableDIscs = 0; //直線のチェック reversableDiscs += checkPlacable(discPos, -1, -1, 0); //左上方向 reversableDiscs += checkPlacable(discPos, 0, -1, 0); //上方向 //…中略… return reversableDiscs; //返せる石の総数を返す } //---- /* * int checkPlacable() * isPlacable()の下請け * discPos: 石を置こうとしている場所 * x_direction: x方向の指定、-1で左、1で右 * y_direction: y方向の指定、-1で上、1で下 * counter: 現段階で返せる候補数 * 戻り値: 特定方向で返せる石の数 */ int checkPlacable(DiscPosition discPos, int x_direction, int y_direction, int counter) { discPos.setX(discPos.getX() + x_direction); discPos.setY(discPos.getY() + y_direction); //…再帰的にボードの端までチェック(略)…// }
っていうひどいコーディングをしていました。
つか、恥ずかしい。
このコード?を載せるのもある意味羞恥プレイかも。
isPlacable()内でdiscPosを引数にして複数回呼び出しているcheckPlacable()内で
discPos.setX(discPos.getX() + x_direction); discPos.setY(discPos.getY() + y_direction);
とか言ってdiscPosの値を直接いぢると一回目のcheckPlacable()に与えているdiscPosの値と二回目のcheckPlacable()に与えているdiscPosの値が異なる。
石を置こうとしている場所はチェック中は、当り前だが一定のはず。
それをいじってしまったのだから結果がおかしくなるのは当然、という恥ずかしいミス。
早急に直さなければ。
GUIはSwingで作る方向で考えてみます。
とか、ちょっとプログラム書きっぽいネタを出してみる。