五目並べゲーム

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

####(各ファイル)
・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
●□□□〇
□●□□〇
〇□●□〇
□□□●□
□□□□●
黒の勝利です！
ゲームを終了します!