Java初心者 オセロを作ってみた(第2回)

Java初心者 オセロを作ってみた(第2回)

目次

はじめに
クラスの追加
コマを置くための座標入力を作成
入力した値からボードにコマを配置する
おわりに

はじめに

Javaを学び始めて数か月の私がJavaでオセロを作成していきます。
前回はオセロのスタート時点を表示するところまで完成しました!
今回はボードにコマを置くことを目指します!
プレイヤーが入力した座標にコマを置く処理を追加していきます!
それでは作成していきます!!

クラスの追加

まずは、クラスを前回作成したものに追加して作成をしていきます。
今回は入力した座標にコマを置く処理を記載していきたいので下記画像のようにクラスを追加しました。

configパッケージの配下に「Reverseクラス」を追加しました!
では、それぞれのクラスにコードを記載していきます。

コマを置くための座標入力を作成

今回、プレイヤーにコマを置いてもらう方法としてキーボードでコマを置く座標を入力してもらえるようにします。
そのために、初めにキーボードから入力した内容を受け付けるコードを記載します。
以前作成した、Mainクラスに以下のようにコードを追加します。

<code>package osero;

import osero.config.Start;
import osero.view.Board;
<strong><span style="color:#cf2e2e" class="tadv-color">import java.util.Scanner;</span></strong>

public class Main {
	
	//ボードの情報
	public static String board&#91;]&#91;] = new String&#91;8]&#91;8];
	
	<strong><span style="color:#cf2e2e" class="tadv-color">//コマの置くために入力した情報を保持する</span></strong>
	<strong><span style="color:#cf2e2e" class="tadv-color">public static int X;</span></strong>
	<strong><span style="color:#cf2e2e" class="tadv-color">public static int Y;</span></strong>
	
	public static void main(String&#91;] args) {
	
		//インスタンスの作成
		Board BD = new Board();
		Start ST = new Start();
		<strong><span style="color:#cf2e2e" class="tadv-color">Scanner SC = new Scanner(System.in);</span></strong>
		
		//初期値を設定
		ST.initialize();
		ST.boardSetup();
		//ボードを表示
		BD.showBoard(board);
		
		<strong><span style="color:#cf2e2e" class="tadv-color">//X座標の入力行う</span></strong>
	    <strong><span style="color:#cf2e2e" class="tadv-color">System.out.println("コマを置く、横の座標を1~8の半角で入力をしてください");</span></strong>
	    <strong><span style="color:#cf2e2e" class="tadv-color">X = SC.nextInt();</span></strong>
		<strong><span style="color:#cf2e2e" class="tadv-color">//Y座標の入力を行う</span></strong>
		<span style="color:#cf2e2e" class="tadv-color"><strong>System.out.println("コマを置く、縦の座標を1~8の半角で入力をしてください");</strong>
</span>	    <strong><span style="color:#cf2e2e" class="tadv-color">Y = SC.nextInt();</span></strong>
	}
	
	//コマの情報
	public static String white = " ○ ";
	public static String black = " ● ";
	public static String empty = "   ";
	
}
</code>

先ほど説明したように、今回はプレイヤーにキーボードから入力をしてもらえるようにします。
ですので、Scannerクラスをインポートし、Scannerクラスを使用して、プレイヤーからキーボードでの入力を行えるようにします。
実際にScannerクラスを使用するために、インスタンスの作成が必要となるので下記のようにコードを記載しました。
Scanner sc = new Scanner(System.in)
そして、入力された値の情報を保持するためにint型の変数「X」と「Y」を作成しました。
この変数に、x座標・y座標の数字を入力してもらえるように処理を追加します。
それぞれの変数にnextint()でキーボードからの入力を受け付けて、変数に値を保存します。

次に先ほど入力された値を使用して、コマを指定したボードに置く処理を追加します。
最初に作成した「Reverseクラス」に下記コードを記載します

<code>package osero.config;

import osero.Main;

public class Reverse {
	
	//入力した座標にコマを置く
		public void PutKoma(int x, int y) {
			Main.board&#91;x]&#91;y] = Main.black;
		}
}
</code>

「PutKoma」メソッドを作成しました。
このメソッドは、キーボードで入力された値を受け取り、指定された座標にコマを置くためのコードとなります。
これでキーボードで入力された受け取る処理ができたので、Mainクラスに戻り、キーボードで入力された値を受け渡す処理を追記します。
Mainクラスに以下のようにコードを追記します

<code>package osero;

<strong><span style="color:#cf2e2e" class="tadv-color">import osero.config.Reverse;</span></strong>
import osero.config.Start;
import osero.view.Board;
import java.util.Scanner;

public class Main {
	
	//ボードの情報
	public static String board&#91;]&#91;] = new String&#91;8]&#91;8];
	
	//コマの置くために入力した情報を保持する
	public static int X;
	public static int Y;
	
	public static void main(String&#91;] args) {
	
		//インスタンスの作成
		Board BD = new Board();
		Start ST = new Start();
		Scanner SC = new Scanner(System.in);
		<strong><span style="color:#cf2e2e" class="tadv-color">Reverse RV = new Reverse();</span></strong>
		
		//初期値を設定
		ST.initialize();
		ST.boardSetup();
		//ボードを表示
		BD.showBoard(board);

		//X座標の入力行う
		System.out.println("コマを置く、横の座標を1~8の半角で入力をしてください");
		X = SC.nextInt();
		//Y座標の入力を行う
		System.out.println("コマを置く、縦の座標を1~8の半角で入力をしてください");
		Y = SC.nextInt();

		<strong><span style="color:#cf2e2e" class="tadv-color">//入力した座標にコマを置く</span></strong>
		<strong><span style="color:#cf2e2e" class="tadv-color">RV.PutKoma(X, Y);</span></strong>
		<strong><span style="color:#cf2e2e" class="tadv-color">//ボードを表示</span></strong>
		<strong><span style="color:#cf2e2e" class="tadv-color">BD.showBoard(board);</span></strong>
	}
	
	//コマの情報
	public static String white = " ○ ";
	public static String black = " ● ";
	public static String empty = "   ";
	
}
</code>

Reverseクラスをインポートし、インスタンス「RV」を作成しました。
次に作成したPutKomaメソッドを呼び出して、引数にX・Yを渡します。
指定した座標にコマが置かれた状態のボード表示するためにBD.showBoard(board)を記載します
これでキーボードで入力された値を使用してボードにコマを置くことができるようになりました!

入力した値からボードにコマを配置する

しかし、このままでは入力される値をint型にしているため数値以外が入力された時にエラーとなりゲームが止まってしまいます。
ボードは8×8となるので1~8で座標入力を行えるようにしたいです。
なので、キーボードで1~8が入力された時のみに処理を行うようにコードを記載していきます。
Mainクラスに下記のようにコードを追記します。

<code>package osero;

import osero.config.Reverse;
import osero.config.Start;
import osero.view.Board;
import java.util.Scanner;

public class Main {
	
	//ボードの情報
	public static String board&#91;]&#91;] = new String&#91;8]&#91;8];
	
	//コマの置くために入力した情報を保持する
	public static int X;
	public static int Y;
	
	public static void main(String&#91;] args) {
	
		//インスタンスの作成
		Board BD = new Board();
		Start ST = new Start();
		Scanner SC = new Scanner(System.in);
		Reverse RV = new Reverse();
		
		<strong><span style="color:#cf2e2e" class="tadv-color">System.out.println("オセロを開始します");</span></strong>
		
		//初期値を設定
		ST.initialize();
		ST.boardSetup();
		//ボードを表示
		BD.showBoard(board);
		
		<strong><span style="color:#cf2e2e" class="tadv-color">boolean CheckInputX = true;</span></strong>
		<strong><span style="color:#cf2e2e" class="tadv-color">while(CheckInputX) {</span></strong>
			<strong><span style="color:#cf2e2e" class="tadv-color">//X座標の入力行う</span></strong>
			<strong><span style="color:#cf2e2e" class="tadv-color">System.out.println("コマを置く、横の座標を1~8の半角で入力をしてください");</span></strong>
			<strong><span style="color:#cf2e2e" class="tadv-color">try {</span></strong>
				<strong><span style="color:#cf2e2e" class="tadv-color">X = SC.nextInt();</span></strong>
				<strong><span style="color:#cf2e2e" class="tadv-color">if(1 &lt;= X &amp;&amp; X &lt;= 8) {</span></strong>
					<strong><span style="color:#cf2e2e" class="tadv-color">CheckInputX = false;</span></strong>
				<strong><span style="color:#cf2e2e" class="tadv-color">}else {</span></strong>
					<strong><span style="color:#cf2e2e" class="tadv-color">System.out.println("1~8の半角数字を入力してください");</span></strong>
				<strong><span style="color:#cf2e2e" class="tadv-color">}</span></strong>
			<strong><span style="color:#cf2e2e" class="tadv-color">}catch(Exception e) {</span></strong>
				<strong><span style="color:#cf2e2e" class="tadv-color">System.out.println("その値は無効です。1~8の半角数字を入力してください");</span></strong>
				<strong><span style="color:#cf2e2e" class="tadv-color">SC.next();</span></strong>
			<strong><span style="color:#cf2e2e" class="tadv-color">}</span></strong>
		<strong><span style="color:#cf2e2e" class="tadv-color">}</span></strong>
		
		<strong><span style="color:#cf2e2e" class="tadv-color">boolean CheckInputY = true;</span></strong>
		<strong><span style="color:#cf2e2e" class="tadv-color">while(CheckInputY) {</span></strong>
			<strong><span style="color:#cf2e2e" class="tadv-color">//Y座標の入力を行う</span></strong>
			<strong><span style="color:#cf2e2e" class="tadv-color">System.out.println("コマを置く、縦の座標を1~8の半角で入力をしてください");</span></strong>
			<strong><span style="color:#cf2e2e" class="tadv-color">try {</span></strong>
				<strong><span style="color:#cf2e2e" class="tadv-color">Y = SC.nextInt();</span></strong>
				<strong><span style="color:#cf2e2e" class="tadv-color">if(1 &lt;= Y &amp;&amp; Y &lt;= 8) {</span></strong>
					<strong><span style="color:#cf2e2e" class="tadv-color">CheckInputY = false;</span></strong>
				<strong><span style="color:#cf2e2e" class="tadv-color">}else {</span></strong>
					<strong><span style="color:#cf2e2e" class="tadv-color">System.out.println("1~8の半角数字を入力してください");</span></strong>
				<strong><span style="color:#cf2e2e" class="tadv-color">}</span></strong>
			<strong><span style="color:#cf2e2e" class="tadv-color">}catch(Exception e) {</span></strong>
				<strong><span style="color:#cf2e2e" class="tadv-color">System.out.println("その値は無効です。1~8の半角数字を入力してください");</span></strong>
				<strong><span style="color:#cf2e2e" class="tadv-color">SC.next();</span></strong>
			<strong><span style="color:#cf2e2e" class="tadv-color">}</span></strong>
		<strong><span style="color:#cf2e2e" class="tadv-color">}</span></strong>
		
		//入力した座標にコマを置く
		<strong><span style="color:#cf2e2e" class="tadv-color">RV.PutKoma(X - 1, Y - 1);</span></strong>
		
		//ボードを表示
		BD.showBoard(board);
		
		SC.close();
		
	}
	
	//コマの情報
	public static String white = " ○ ";
	public static String black = " ● ";
	public static String empty = "   ";
	
}
</code>

x・y座標のそれぞれで記載しているコードはほとんど同じ内容です。
違う点としてはboolean型でしている変数名を「CheckInputX」・「CheckInputY」としている点です。
この変数を作成している理由は、その下に記載しているwhile文で使用するためです。
while文は繰り返し処理を行うために記載をしています。
今回の場合ですと1~8の正しい数値が入力されるまで、繰り返しプレイヤーに入力を行うように指示するために記載しています。
そして、while文は条件式がfalseになったときに繰り返し処理から抜けることができるため、「CheckInputX」・「CheckInputY」をboolean型でtrueとしておき、1~8が入力された時のみにfalseと変数を書き換えて、処理から抜けられるようにしました。
while文の中にtry-catch文を使用して先ほど説明した1~8が入力できる値と指定していきます。
try文の中にはキーボードから数値が入力された時の処理を記載します。
if-else文で1~8の場合は処理を終了できるようにそれ以外の数値の時は1~8のどれかしか入力できないというメッセージを出すようにします。
catch文には数値以外が入力されたときにエラーで止まるのではなく、例外処理となるように記載をします。
数値以外が入力されたときはメッセージとキーボードで次の入力を行えるようにSC.next()を記載します。
SC.next()を記載しないと無限ループ状態となってしまうので注意が必要です。
最後にPutKomaメソッドの引数をX-1・Y-1とします。
本来、ボードの座標は0~7が正しい数値をなるため入力された数値をそのまま引数とすると1つ座標がずれてしまいます。
なので-1として入力された数値で指定された正しい座標へコマを置けるようにします。
これで、キーボードで入力できる値を指定することができました!

おわりに

では、実際に動かしてみましょう!!

このように指定した座標に無事コマを置くことができました!!

今回は無限ループになったりと大変でしたがどうにか作成することができてよかったです
次回もこの後の処理を作成していきたいと思います!