Javaでプログラムを作成する【オセロゲーム】#3
今回もプログラム作成を進めていきます!
#2でオセロ版のベースとなる部分を作成していました。今回はゲーム進行の軸となるプログラムを作成したいと思います!
ひっくり返す処理に関しては、上下左右斜めの全8方向分で処理を記載しなければいけないため、プログラムが長くなってしまったのですがご了承ください!
// ラウンド毎の盤面表示
System.out.println(BLACK + ":" + cnt_black);
System.out.println(WHITE + ":" + cnt_white);
System.out.println("――――――――――――――");
// 空いている駒があるかで条件分岐
if (existempty) {
System.out.println(stone + "のターンです");
} else {
System.out.println(stone + "ゲーム終了!");
game = false;
}
}
static public void setStone(int x, int y) {
// 範囲外のX,Y軸を指定した場合
if (x > 7 || y > 7) {
System.out.println("その位置に駒は置けません");
}
// 駒を配置できる場合
if (board[y][x].equals(EMPTY)) {
board[y][x] = stone;
// 駒をひっくり返す処理
turnStone(x, y);
// 次うつ駒の設定
String next_rev_storn = stone;
stone = rev_stone;
rev_stone = next_rev_storn;
// オセロ版の描写
showBoard();
// 駒を配置できない場合
} else {
System.out.println("その位置に駒は置けません")
}
ゲーム進行上で必要なテキストの表示や、駒を置く際のルールを多次元配列上の確認を条件分岐を用いながら記述しています。
static public void turnStone(int x, int y) {
// 8方向(上下左右斜め)の駒の配置を確認し、ひっくり返す
turnLeftUp(x, y);
turnUp(x, y);
turnRightUp(x, y);
turnLeft(x, y);
turnRight(x, y);
turnLeftDown(x, y);
turnDown(x, y);
turnRightDown(x, y);
}
// 全方向分の処理をそれぞれ追加する
static public void turnLeftUp(int x, int y) {
if (y > 1 && x > 1) {
// となりの駒
String next = board[y - 1][x - 1];
// となりの駒が裏駒の場合
if (next.equals(rev_stone)) {
// さらにその一つとなりから順に確認
for (int i = 2; true; i++) {
if (x - i < 0 || y - i < 0 || board[y - i][x - i].equals(EMPTY)) {
// 駒がない場合終了
break;
} else if (board[y - i][x - i].equals(stone)) {
// 自駒の場合
// あいだの駒をすべて自駒にひっくりかえす
for (int t = 1; t < i; t++) {
// 配列の要素を上書き
board[y - t][x - t] = stone;
}
break;
}
}
}
}
}
static public void turnUp(int x, int y) {
if (y > 1) {
// となりの駒
String next = board[y - 1][x];
// となりの駒が裏駒の場合
if (next.equals(rev_stone)) {
// さらにその一つとなりから順に確認
for (int i = 2; true; i++) {
if (y - i < 0 || board[y - i][x].equals(EMPTY)) {
// 駒がない場合終了
break;
} else if (board[y - i][x].equals(stone)) {
// 自駒の場合
// あいだの駒をすべて自駒にひっくりかえす
for (int t = 1; t < i; t++) {
// 配列の要素を上書き
board[y - t][x] = stone;
}
break;
}
}
}
}
}
static public void turnRightUp(int x, int y) {
if (y > 1 && x < 6) {
// となりの駒
String next = board[y - 1][x + 1];
// となりの駒が裏駒の場合
if (next.equals(rev_stone)) {
// さらにその一つとなりから順に確認
for (int i = 2; true; i++) {
if (x + i > 7 || y - i < 0 || board[y - i][x + i].equals(EMPTY)) {
// 駒がない場合終了
break;
} else if (board[y - i][x + i].equals(stone)) {
// 自駒の場合
// あいだの駒をすべて自駒にひっくりかえす
for (int t = 1; t < i; t++) {
// 配列の要素を上書き
board[y - t][x + t] = stone;
}
break;
}
}
}
}
}
static public void turnDown(int x, int y) {
if (y < 6) {
// となりの駒
String next = board[y + 1][x];
// となりの駒が裏駒の場合
if (next.equals(rev_stone)) {
// さらにその一つとなりから順に確認
for (int i = 2; true; i++) {
if (y + i > 7 || board[y + i][x].equals(EMPTY)) {
// 駒がない場合終了
break;
} else if (board[y + i][x].equals(stone)) {
// 自駒の場合
// あいだの駒をすべて自駒にひっくりかえす
for (int t = 1; t < i; t++) {
// 配列の要素を上書き
board[y + t][x] = stone;
}
break;
}
}
}
}
}
static public void turnRight(int x, int y) {
if (x < 6) {
// となりの駒
String next = board[y][x + 1];
// となりの駒が裏駒の場合
if (next.equals(rev_stone)) {
// さらにその一つとなりから順に確認
for (int i = 2; true; i++) {
if (x + i > 7 || board[y][x + i].equals(EMPTY)) {
// 駒がない場合終了
break;
} else if (board[y][x + i].equals(stone)) {
// 自駒の場合
// あいだの駒をすべて自駒にひっくりかえす
for (int t = 1; t < i; t++) {
// 配列の要素を上書き
board[y][x + t] = stone;
}
break;
}
}
}
}
}
static public void turnLeftDown(int x, int y) {
if (y < 6 && x > 1) {
// となりの駒
String next = board[y + 1][x - 1];
// となりの駒が裏駒の場合
if (next.equals(rev_stone)) {
// さらにその一つとなりから順に確認
for (int i = 2; true; i++) {
if (x - i < 0 || y + i > 7 || board[y + i][x - i].equals(EMPTY)) {
// 駒がない場合終了
break;
} else if (board[y + i][x - i].equals(stone)) {
// 自駒の場合
// あいだの駒をすべて自駒にひっくりかえす
for (int t = 1; t < i; t++) {
// 配列の要素を上書き
board[y + t][x - t] = stone;
}
break;
}
}
}
}
}
static public void turnLeft(int x, int y) {
if (x > 1) {
// となりの駒
String next = board[y][x - 1];
// となりの駒が裏駒の場合
if (next.equals(rev_stone)) {
// さらにその一つとなりから順に確認
for (int i = 2; true; i++) {
if (x - i < 0 || board[y][x - i].equals(EMPTY)) {
// 駒がない場合終了
break;
} else if (board[y][x - i].equals(stone)) {
// 自駒の場合
// あいだの駒をすべて自駒にひっくりかえす
for (int t = 1; t < i; t++) {
// 配列の要素を上書き
board[y][x - t] = stone;
}
break;
}
}
}
}
}
static public void turnRightDown(int x, int y) {
if (y < 6 && x < 6) {
// となりの駒
String next = board[y + 1][x + 1];
// となりの駒が裏駒の場合
if (next.equals(rev_stone)) {
// さらにその一つとなりから順に確認
for (int i = 2; true; i++) {
if (x + i > 7 || y + i > 7 || board[y + i][x + i].equals(EMPTY)) {
// 駒がない場合終了
break;
} else if (board[y + i][x + i].equals(stone)) {
// 自駒の場合
// あいだの駒をすべて自駒にひっくりかえす
for (int t = 1; t < i; t++) {
// 配列の要素を上書き
board[y + t][x + t] = stone;
}
break;
}
}
}
}
}
}
駒が置かれたときに、ひっくり返す駒があるかを「隣り合った駒」を全方向で確認し、if文とfor文の入れ子構造で処理しています。
それを8方向分で処理を記述しています。
以上がメインのクラスとなります。
次回は、このクラスを用いて実際に処理を実行するクラスを作成し、オセロゲームの完成へと近づけていきたいと思います!
この記事が気に入ったらサポートをしてみませんか?