LoginSignup
2
2

More than 3 years have passed since last update.

五目並べゲーム

Last updated at Posted at 2020-02-15

(ルール)

・5×5(変更可)のマス目に黒と白が交互に石を置いていく
・縦、横、斜めのマスが同色石によってすべて埋まった時点で勝利

(各ファイル)

・Stoneクラス
→石の情報を管理
・Boardクラス
→碁盤情報を管理
・Judgeクラス
→勝利判定を管理
・Constantインターフェイス
→定数を管理
・Gameクラス
→ゲームとしてまとめる

Stone.java
package Gomokunarabe;

public class Stone implements Constant{
    Board board = new Board();


    //石が正常に置けたらtrue,置けなかったらfalse
    private boolean stoneSet;
    public boolean getStoneSet() {
        return stoneSet;
    }
    public void setStoneSet(boolean stoneSet) {
        this.stoneSet = stoneSet;
    }


    //石の位置に関するフィールド
    private int tatePosition;
    private int yokoPosition;
    public int getTatePosition() {
        return tatePosition;
    }
    public void setTatePosition(int tatePosition) {
        this.tatePosition = tatePosition;
    }
    public int getYokoPosition() {
        return yokoPosition;
    }
    public void setYokoPosition(int yokoPosition) {
        this.yokoPosition = yokoPosition;
    }


    //石配置処理
    @SuppressWarnings("resource")
    public void stoneConfig(boolean stoneColor) {
        //引数stoneColorがtrueで黒、falseで白
        System.out.println("石の位置を入力してください");
        try {
        int tatePosition = new java.util.Scanner(System.in).nextInt();
        int yokoPosition = new java.util.Scanner(System.in).nextInt();
        if((tatePosition>=0&&yokoPosition>=0)&&(tatePosition<BOARD_LENGTH && yokoPosition<BOARD_LENGTH)) {
            if(Board.getPosition(tatePosition, yokoPosition)==EMPTY_STONE) {
                setTatePosition(tatePosition);
                setYokoPosition(yokoPosition);
                board.board(getTatePosition(), getYokoPosition(), stoneColor);
                setStoneSet(true);
            }
            else {
                setStoneSet(false);
                System.out.println("石が置かれていない場所を選択してください");
            }
        }
        else {
            setStoneSet(false);
            System.out.println("0~"+(BOARD_LENGTH-1)+"のどれかで入力してください");
        }
        }
        catch(Exception e) {
            setStoneSet(false);
            System.out.println("整数で入力してください");
        }
    }

}

Board.java
package Gomokunarabe;

public class Board implements Constant{
    //石の位置を保存
    private static String[][] position = new String[BOARD_LENGTH][BOARD_LENGTH];
    public static void setPosition(int tate, int yoko, String stone) {
        position[tate][yoko] = stone;
    }
    public static String getPosition(int tate, int yoko) {
        return position[tate][yoko];
    }

    //trueなら黒、falseなら白
    private Boolean stoneColor;
    public Boolean isStoneColor() {
        return stoneColor;
    }
    public void setStoneColor(Boolean stoneColor) {
        this.stoneColor = stoneColor;
    }

    public void firstShowBoard() {
        //碁盤の数字表示
        for(int i=0; i<BOARD_LENGTH;i++) {
            if(i==(BOARD_LENGTH-1)) {
                System.out.println(i);
                }
            else if(i==0) {
                System.out.print(" "+i+",");
            }
            else {
                System.out.print(i + ",");
                }
                }
        for(int j=0; j<BOARD_LENGTH; j++) {
            System.out.println(j);
        }

        //position配列のすべての座標に"□"を格納し
        //position参照時のnullを防ぐ
        for(int i=0; i<BOARD_LENGTH;i++) {
            for(int j=0; j<BOARD_LENGTH; j++) {
                setPosition(i,j,EMPTY_STONE);
                System.out.print(EMPTY_STONE);
            }
            System.out.println("");
        }
    }

    //碁盤作成メソッド
    public void board(int tate, int yoko, boolean stoneColor) {
        //stoneColorがtrueで黒,falseで白
        setStoneColor(stoneColor);

        for(int i=0; i<BOARD_LENGTH; i++) {
            //for文の変数iは縦を意味する
            for(int j=0; j<BOARD_LENGTH; j++) {
                //for文の変数jは横を意味する
                if((i==tate) && (j==yoko)) {
                    if(isStoneColor()) {
                        setPosition(tate,yoko,BLACK_STONE);
                        System.out.print(getPosition(tate,yoko));
                    }
                    else{
                        setPosition(tate,yoko,WHITE_STONE);
                        System.out.print(getPosition(tate,yoko));
                    }
                }
                else {
                    System.out.print(getPosition(i,j));
                }
            }
            System.out.println("");
        }
    }
}

Judge.java
package Gomokunarabe;

public class Judge implements Constant{

    private int win = 0;

    public int getWin() {
        return win;
    }

    public void setWin(int win) {
        this.win += win;
    }
    public void resetWin() {
        this.win = 0;
    }


    public boolean winJudge() {
        //win変数が5か-5の総和を持った時trueを返し勝利判定とする

        //横列の勝利判定
        for(int i=0; i<BOARD_LENGTH; i++) {
            for(int j=0; j<BOARD_LENGTH; j++) {
                if(Board.getPosition(i, j)==BLACK_STONE) {
                    setWin(1);
                }
                else if(Board.getPosition(i, j)==WHITE_STONE) {
                    setWin(-1);
                }
                else {
                    setWin(0);
                }
            }

            if((getWin()==BOARD_LENGTH) || (getWin()==(-BOARD_LENGTH))) {
                return true;
            }
            else {
                resetWin();
            }
        }

        //縦列の勝利判定
        for(int j=0; j<BOARD_LENGTH; j++){
            for(int i=0; i<BOARD_LENGTH; i++)
             {
                if(Board.getPosition(i, j)==BLACK_STONE) {
                    setWin(1);
                }
                else if(Board.getPosition(i, j)==WHITE_STONE) {
                    setWin(-1);
                }
                else {
                    setWin(0);
                }
            }

            if((getWin()==BOARD_LENGTH) || (getWin()==(-BOARD_LENGTH))) {
                return true;
            }
            else {
                resetWin();
            }
        }

        //左斜め列の勝利判定
        for(int i=0; i<BOARD_LENGTH; i++) {
            for(int j=0; j<BOARD_LENGTH; j++) {
                if((i==j) && (Board.getPosition(i, j)==BLACK_STONE)) {
                    setWin(1);
                }
                else if((i==j) && (Board.getPosition(i, j)==WHITE_STONE)) {
                    setWin(-1);
                }
                else {
                    setWin(0);
                }
            }
            }
        if((getWin()==BOARD_LENGTH) || (getWin()==(-BOARD_LENGTH))) {
            return true;
        }
        else {
            resetWin();
        }

        //右斜め列の勝利判定
        for(int i=0; i<BOARD_LENGTH; i++) {
            for(int j=0; j<BOARD_LENGTH; j++) {
                if((i+j == (BOARD_LENGTH - 1)) && (Board.getPosition(i, j)==BLACK_STONE)) {
                    setWin(1);
                }
                else if((i+j == (BOARD_LENGTH - 1)) && (Board.getPosition(i, j)==WHITE_STONE)) {
                    setWin(-1);
                }
                else {
                    setWin(0);
                }
            }
            }
        if((getWin()==BOARD_LENGTH) || (getWin()==(-BOARD_LENGTH))) {
            return true;
        }
        else {
            resetWin();
        }

        return false;
    }

    }




Constant.java
package Gomokunarabe;

public interface Constant{
    /*
     * 碁盤の長さに関する定数を変えることで
     * 升目を変更
     */

    //碁盤の長さ
    int BOARD_LENGTH = 5;

    //黒い石
    String BLACK_STONE = "●";
    //白い石
    String WHITE_STONE = "〇";
    //空白
    String EMPTY_STONE = "□";

}


Game.java
package Gomokunarabe;

public class Game {
    Stone stone = new Stone();
    Judge judge = new Judge();
    Board board = new Board();

    //trueでゲーム継続、falseでゲーム終了
    private boolean gameLoop = true;
    public boolean isGameLoop() {
        return gameLoop;
    }
    public void setGameLoop(boolean gameLoop) {
        this.gameLoop = gameLoop;
    }

    //奇数の時は黒、偶数のときは白
    private int loop=1;
    public int getLoop() {
        return loop;
    }
    public void setLoop(int loop) {
        this.loop = loop;
    }

    public void gameStart() {
        board.firstShowBoard();

        while(isGameLoop()) {
            //gameLoopがtrueの場合ゲーム継続
            if(getLoop()%2 == 1) {
                //loopが奇数のときは黒
                System.out.println("黒の番です");
                //引数にtrueで黒の手番
                stone.stoneConfig(true);
                if(stone.getStoneSet()) {
                    if(!judge.winJudge()) {
                    //winJudgeがfalseでゲーム継続、trueで勝利判定
                    //stoneSetがtrueで次の白の番に以降
                    setLoop(2);
                    }
                    else {
                        System.out.println("黒の勝利です!\nゲームを終了します!");
                        setGameLoop(false);
                    }
                }
                else {
                    setLoop(1);
                }
            }
            //loopが偶数の時は白
            else{
                System.out.println("白の番です");
                stone.stoneConfig(false);

                if(stone.getStoneSet()) {
                    if(!judge.winJudge()) {
                        //winJudgeがfalseでゲーム継続、trueで勝利判定
                        //stoneSetがtrueで次の白の番に以降
                        setLoop(1);
                        }
                        else {
                            System.out.println("白の勝利です!\nゲームを終了します!");
                            setGameLoop(false);
                        }
                    //stoneSetがtrueで黒の番に移行
                    }
                else {
                    setLoop(2);
                }
            }

        }
    }


}

Main.java
package Gomokunarabe;

public class Main {

    public static void main(String[] args) {
        Game game = new Game();
        game.gameStart();
    }
}

【実行結果】

★五目並べ★
0,1,2,3,4
0
1
2
3
4
□□□□□
□□□□□
□□□□□
□□□□□
□□□□□
黒の番です
石の位置を入力してください
0
0
●□□□□
□□□□□
□□□□□
□□□□□
□□□□□
白の番です
石の位置を入力してください
0
4
●□□□〇
□□□□□
□□□□□
□□□□□
□□□□□
黒の番です
石の位置を入力してください
1
1
●□□□〇
□●□□□
□□□□□
□□□□□
□□□□□
白の番です
石の位置を入力してください
1
4
●□□□〇
□●□□〇
□□□□□
□□□□□
□□□□□
黒の番です
石の位置を入力してください
2
2
●□□□〇
□●□□〇
□□●□□
□□□□□
□□□□□
白の番です
石の位置を入力してください
2
0
●□□□〇
□●□□〇
〇□●□□
□□□□□
□□□□□
黒の番です
石の位置を入力してください
3
3
●□□□〇
□●□□〇
〇□●□□
□□□●□
□□□□□
白の番です
石の位置を入力してください
2
4
●□□□〇
□●□□〇
〇□●□〇
□□□●□
□□□□□
黒の番です
石の位置を入力してください
4
4
●□□□〇
□●□□〇
〇□●□〇
□□□●□
□□□□●
黒の勝利です!
ゲームを終了します!

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2