練習問題

【Java】マルバツゲーム(○×ゲーム)を行うプログラム作ってみた

ここではJavaで〇✕ゲームを作ります。

 

マルバツゲームとは?

〇✕ゲームは

こんな感じで3✕3のマスに〇と✕を交互に書いていき、縦、横、ななめのどれかで一直線に〇か✕かを並べるゲームです。

 

どのようにプログラムを組むか

今回のプログラムは次のように作ります。

・先攻をランダムに決める
・盤面に番号を振り該当する番号を入力することで〇か✕を書く
・勝敗が決まったかの判定を行う
・結果を表示する

まず全体のソースコードを出し、そのあと各メソッドについて解説します。

 

ソースコード

import java.io.*;

import java.util.Random;

public class マルバツゲーム1 {

static char[] board=new char[9];

/*
*各メソッドを呼び出す
*/

public static void main(String[] args) throws IOException {

番号の表示();

char board[]=初期ボードの設定();

ボードを表示(board);

String 先攻=順番を決める();

System.out.println(先攻+"から書いてください");

board=ゲームを実行(board,先攻);

結果表示(board);

}

/*
*ゲームを実行させる
*/
static char[] ゲームを実行(char[] board,String 先攻) throws IOException{

int i=1;

if (先攻.equals("マル")) {

while(i>0){

board=マルを書く(board);

if(判定(board)==true) break;

バツを書く(board);

if(判定(board)==true) break;

}

}

else {

while (i>0) {

バツを書く(board);

if(判定(board)==true) break;

マルを書く(board);

if(判定(board)==true) break;

}

}return board;

}

/*
*盤面に振り分けられた番号を表示させる
*/
static void 番号の表示() {

System.out.println("盤面の番号は以下の通りです");

int[] number=new int[9];

for (int i=0;i<9;i++) {

System.out.print(i+1+" ");

if(i==2||i==5||i==8) {

System.out.println();

}

}

System.out.println();

}

/*
*ボードを初期化する
*/
static char[] 初期ボードの設定() {

for (int i=0;i<9;i++) {

board[i]='□';

}return board;

}

/*
*現在の盤面の状況を表示する
*/
static void ボードを表示(char[] board) {

for (int i=0;i<9;i++) {

System.out.print(board[i]);

if(i==2||i==5||i==8) {

System.out.println();

}

}

}

/*
*どちらが先攻かを決める
*/
static String 順番を決める() {

Random r=new Random();

int a=r.nextInt(2);

if (a==0) return "マル";

else return "バツ";

}

/*
*盤面に〇を書き、盤面の状況を表示
*/
static char[] マルを書く(char[] board) throws IOException{

BufferedReader br =new BufferedReader (new InputStreamReader (System.in));

System.out.println("空白のマスの中で〇を書きたい場所を選んでください");

ボードを表示(board);

int num=Integer.parseInt(br.readLine());

if (board[num-1]=='□') {

board[num-1]='〇';

}else {

System.out.println("ほかのところを選んでください");

}return board;

}

/*
*盤面に×を書き、盤面の状況を表示
*/
static char[] バツを書く(char[] board) throws IOException{

System.out.println("空白のマスの中で×を書きたい場所を選んでください");

BufferedReader br =new BufferedReader (new InputStreamReader (System.in));

ボードを表示(board);

int num=Integer.parseInt(br.readLine());

if (board[num-1]=='□') {

board[num-1]='×';

}else {

System.out.println("ほかのところを選んでください");

}return board;

}

/*
*勝敗がついたか、引き分けになったかの判定を行う
*/
static boolean 判定(char board[]) {

if (board[0]=='〇'&&board=='〇'&&board=='〇'||

board=='〇'&&board=='〇'&&board[5]=='〇'||

board[6]=='〇'&&board[7]=='〇'&&board[8]=='〇'||

board[0]=='〇'&&board=='〇'&&board[8]=='〇'||

board=='〇'&&board=='〇'&&board[6]=='〇'||

board[0]=='〇'&&board=='〇'&&board[6]=='〇'||

board=='〇'&&board=='〇'&&board[7]=='〇'||

board=='〇'&&board[5]=='〇'&&board[8]=='〇')

return true;

if (board[0]=='×'&&board=='×'&&board=='×'||

board=='×'&&board=='×'&&board[5]=='×'||

board[6]=='×'&&board[7]=='×'&&board[8]=='×'||

board[0]=='×'&&board=='×'&&board[8]=='×'||

board=='×'&&board=='×'&&board[6]=='×'||

board[0]=='×'&&board=='×'&&board[6]=='×'||

board=='×'&&board=='×'&&board[7]=='×'||

board=='×'&&board[5]=='×'&&board[8]=='×')

return true;

else {

for (int i=0;i<9;i++) {

if (board[i]=='□') {

return false;

}

}return true;

}

}

/*
*ゲームの結果を表示する
*/
static void 結果表示(char[] board) {

if (board[0]=='〇'&&board=='〇'&&board=='〇'||

board=='〇'&&board=='〇'&&board[5]=='〇'||

board[6]=='〇'&&board[7]=='〇'&&board[8]=='〇'||

board[0]=='〇'&&board=='〇'&&board[8]=='〇'||

board=='〇'&&board=='〇'&&board[6]=='〇'||

board[0]=='〇'&&board=='〇'&&board[6]=='〇'||

board=='〇'&&board=='〇'&&board[7]=='〇'||

board=='〇'&&board[5]=='〇'&&board[8]=='〇') {

System.out.println();

System.out.println("〇の勝ちです");

}

else if (board[0]=='×'&&board=='×'&&board=='×'||

board=='×'&&board=='×'&&board[5]=='×'||

board[6]=='×'&&board[7]=='×'&&board[8]=='×'||

board[0]=='×'&&board=='×'&&board[8]=='×'||

board=='×'&&board=='×'&&board[6]=='×'||

board[0]=='×'&&board=='×'&&board[6]=='×'||

board=='×'&&board=='×'&&board[7]=='×'||

board=='×'&&board[5]=='×'&&board[8]=='×') {

System.out.println();

System.out.println("×の勝ちです");

}

else {

System.out.println();

System.out.println("引き分けです");

}

System.out.println();

System.out.println("最終盤面はこうなりました");

ボードを表示(board);

}

}

 

スポンサーリンク



 

盤面の番号を表示するメソッド

static void 番号の表示() {

System.out.println("盤面の番号は以下の通りです");

int[] number=new int[9];

for (int i=0;i<9;i++) {

System.out.print(i+1+" ");

if(i==2||i==5||i==8) {

System.out.println();

}

}

System.out.println();

}

ここのメソッドでは〇、✕を入力させるときに使う盤面の番号を表示させています。

ここで使われている構文が分からなければ次の記事をご覧ください。

http://mittsu2017.com/java%ef%bd%9e%e7%b9%b0%e3%82%8a%e8%bf%94%e3%81%97%e3%81%ae%e5%87%a6%e7%90%86%e3%80%80for%e6%96%87%ef%bd%9e/

http://mittsu2017.com/java%ef%bd%9e%e6%9d%a1%e4%bb%b6%e5%88%86%e5%b2%90%e3%80%80if%e6%96%87%ef%bd%9e/

http://mittsu2017.com/java%ef%bd%9e%e9%85%8d%e5%88%97%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%ef%bd%9e/

 

初期ボードの設定メソッド

static char[] 初期ボードの設定() {

for (int i=0;i<9;i++) {

board[i]='□';

}return board;

}

ここでは実際に〇や✕を書くボードを初期化しています。
初期状態では全ての配列に「□」を入れています。

 

盤面の状況を表示する

static void ボードを表示(char[] board) {

for (int i=0;i<9;i++) {

System.out.print(board[i]);

if(i==2||i==5||i==8) {

System.out.println();

}

}

}

ここでは現在の盤面の状況を表示します。

順番を決める

static String 順番を決める() {
Random r=new Random();
int a=r.nextInt(2);
if (a==0) return "マル";
else return "バツ";
}
ここではどちらが先攻かを乱数を使って決めています。
0か1の乱数を取得し、0なら〇が、1なら✕が先攻になります。

http://mittsu2017.com/java%e3%80%90%e5%85%a5%e9%96%80%e7%b7%a8%e3%80%91%ef%bd%9e%e4%b9%b1%e6%95%b0%e3%81%ae%e7%94%9f%e6%88%90/

〇を書くメソッド

static char[] マルを書く(char[] board) throws IOException{

BufferedReader br =new BufferedReader (new InputStreamReader (System.in));

System.out.println("空白のマスの中で〇を書きたい場所を選んでください");

ボードを表示(board);

int num=Integer.parseInt(br.readLine());

if (board[num-1]=='□') {

board[num-1]='〇';

}else {

System.out.println("ほかのところを選んでください");

}return board;

}

 

ここではどこに〇を書くかを選択させ、そこに何も書かれていなければ〇を書きます。

もし、選択された場所にすでに〇か✕が書かれていた場合、もう一度入力をさせます。

〇を書いた後、return文でボードの状況を返します。

http://mittsu2017.com/java%ef%bd%9e%e3%82%ad%e3%83%bc%e3%83%9c%e3%83%bc%e3%83%89%e5%85%a5%e5%8a%9b%ef%bd%9e/

 

✕を書くメソッド

static char[] バツを書く(char[] board) throws IOException{

System.out.println("空白のマスの中で×を書きたい場所を選んでください");

BufferedReader br =new BufferedReader (new InputStreamReader (System.in));

ボードを表示(board);

int num=Integer.parseInt(br.readLine());

if (board[num-1]=='□') {

board[num-1]='×';

}else {

System.out.println("ほかのところを選んでください");

}return board;

}

 

ここではバツを書きます。
内容は〇を書くメソッドと同じです。

 

スポンサーリンク



 

判定メソッド

static boolean 判定(char board[]) {

if (board[0]=='〇'&&board=='〇'&&board=='〇'||
board=='〇'&&board=='〇'&&board[5]=='〇'||
board[6]=='〇'&&board[7]=='〇'&&board[8]=='〇'||
board[0]=='〇'&&board=='〇'&&board[8]=='〇'||
board=='〇'&&board=='〇'&&board[6]=='〇'||
board[0]=='〇'&&board=='〇'&&board[6]=='〇'||
board=='〇'&&board=='〇'&&board[7]=='〇'||
board=='〇'&&board[5]=='〇'&&board[8]=='〇')

return true;

if (board[0]=='×'&&board=='×'&&board=='×'||
board=='×'&&board=='×'&&board[5]=='×'||
board[6]=='×'&&board[7]=='×'&&board[8]=='×'||
board[0]=='×'&&board=='×'&&board[8]=='×'||
board=='×'&&board=='×'&&board[6]=='×'||
board[0]=='×'&&board=='×'&&board[6]=='×'||
board=='×'&&board=='×'&&board[7]=='×'||
board=='×'&&board[5]=='×'&&board[8]=='×')

return true;

else {

for (int i=0;i<9;i++) {

if (board[i]=='□') {

return false;

}

}return true;

}

}

 

ここでは勝敗が決まったのかどうかを判定します。
判定の方法は簡単で、IF文を使い〇が勝つパターン、
✕が勝つパターンの全パターンを網羅し、
どこかで一列そろっていないか確認します。

そのどのパターンも満たしてなく、
盤面が〇と✕で埋まってしまった場合、
引き分けと判定します。

どちらかの勝ちか、引き分けが判明するとtrue、
判明しなければfalseを返します。

 

結果表示メソッド

static void 結果表示(char[] board) {

if (board[0]=='〇'&&board=='〇'&&board=='〇'||
board=='〇'&&board=='〇'&&board[5]=='〇'||
board[6]=='〇'&&board[7]=='〇'&&board[8]=='〇'||
board[0]=='〇'&&board=='〇'&&board[8]=='〇'||
board=='〇'&&board=='〇'&&board[6]=='〇'||
board[0]=='〇'&&board=='〇'&&board[6]=='〇'||
board=='〇'&&board=='〇'&&board[7]=='〇'||
board=='〇'&&board[5]=='〇'&&board[8]=='〇') {

System.out.println();

System.out.println("〇の勝ちです");

}

else if (board[0]=='×'&&board=='×'&&board=='×'||
board=='×'&&board=='×'&&board[5]=='×'||
board[6]=='×'&&board[7]=='×'&&board[8]=='×'||
board[0]=='×'&&board=='×'&&board[8]=='×'||
board=='×'&&board=='×'&&board[6]=='×'||
board[0]=='×'&&board=='×'&&board[6]=='×'||
board=='×'&&board=='×'&&board[7]=='×'||
board=='×'&&board[5]=='×'&&board[8]=='×') {

System.out.println();

System.out.println("×の勝ちです");

}

else {

System.out.println();

System.out.println("引き分けです");

}

System.out.println();

System.out.println("最終盤面はこうなりました");

ボードを表示(board);

}

 

ここではゲームの結果を表示します。
どちらが勝ちかを表示し、最終盤面を表示します。

 

ゲームを実行するメソッド

static char[] ゲームを実行(char[] board,String 先攻) throws IOException{

int i=1;

if (先攻.equals("マル")) {

while(i>0){

board=マルを書く(board);

if(判定(board)==true) break;

バツを書く(board);

if(判定(board)==true) break;

}

}

else {

while (i>0) {

バツを書く(board);

if(判定(board)==true) break;

マルを書く(board);

if(判定(board)==true) break;

}

}return board;

}

 

ここでは勝敗が決まるまで〇と✕を交互に入力させるようにメソッドを実行します。
順番を決めるメソッドで決まった順番をもとにIF文を使ってゲームを実行させます。

 

メインメソッド

public static void main(String[] args) throws IOException {

番号の表示();

char board[]=初期ボードの設定();

ボードを表示(board);

String 先攻=順番を決める();

System.out.println(先攻+"から書いてください");

board=ゲームを実行(board,先攻);

結果表示(board);

}

ここでは各メソッドを呼び出しています。

 






あわせて読みたい
サイトマップ ...