見出し画像

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方向分で処理を記述しています。

以上がメインのクラスとなります。
次回は、このクラスを用いて実際に処理を実行するクラスを作成し、オセロゲームの完成へと近づけていきたいと思います!


この記事が気に入ったらサポートをしてみませんか?