####(ルール)
・5×5(変更可)のマス目に黒と白が交互に石を置いていく
・縦、横、斜めのマスが同色石によってすべて埋まった時点で勝利
####(各ファイル)
・Stoneクラス
→石の情報を管理
・Boardクラス
→碁盤情報を管理
・Judgeクラス
→勝利判定を管理
・Constantインターフェイス
→定数を管理
・Gameクラス
→ゲームとしてまとめる
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("整数で入力してください");
}
}
}
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("");
}
}
}
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;
}
}
package Gomokunarabe;
public interface Constant{
/*
* 碁盤の長さに関する定数を変えることで
* 升目を変更
*/
//碁盤の長さ
int BOARD_LENGTH = 5;
//黒い石
String BLACK_STONE = "●";
//白い石
String WHITE_STONE = "〇";
//空白
String EMPTY_STONE = "□";
}
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);
}
}
}
}
}
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
●□□□〇
□●□□〇
〇□●□〇
□□□●□
□□□□●
黒の勝利です!
ゲームを終了します!