元小学校教員!がIT企業へ転職したリアルなブログ

公立の小学校教員を4年間勤めた後、IT企業へ転職しました。教育・転職・ITに関する情報を発信していきます。

【Java】【初心者】しりとりプログラム~その⑤~(メソッド化してみた)

こんばんは。
駆け出しプログラマーのakhです。


前回は、コンピュータの動きをメソッド化して、

コンピュータ同士での対戦をすることができました。


今回は、

プレイヤーメソッドを作って、

もう一度、コンピュータ対プレイヤー(1対1)の

しりとりプログラムを作ってみたいと思います。



試行錯誤して、できたのがこちら!!!

package practice4;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Siritori16 {

	public static void main(String[] args) {
		boolean flag = true;
		List<String> playerUsed = new ArrayList<>();
		List<String> comUsed = new ArrayList<>();
		//最初の言葉をランダムで出す
		int count =0;
		int a = new Random().nextInt(50);
		String firstWord = new String();
		try{
			File file = new File("C:\\辞書\\sakura.txt");
			FileReader fr = new FileReader(file);
			BufferedReader bfr = new BufferedReader(fr);
			while(bfr.ready()){
				firstWord = bfr.readLine();
				firstWord = toUpper(firstWord);
				firstWord = remove(firstWord);
				if(count == a){
					break;
				}
			count ++ ;
			}
		} catch (IOException e) {
    		e.printStackTrace();
    	}

		System.out.println("最初の言葉は...");
		System.out.println(firstWord);
		String data = firstWord;
		String inputstr = new String();
		int i = 0;
		while(i<5){
			if(flag){
				System.out.println((i+1)+"回目");
				inputstr=player(inputstr,data);
				System.out.println("player:"+inputstr);

				//全角カタカナで入力
				if(Katakana(inputstr)==false){
	    			continue;
	    		}

				//前の言葉から繋がっているかどうか
				if(!(data.charAt(data.length()-1) == inputstr.charAt(0))){
					System.out.println("");
					System.out.println("だめです。続く言葉を入れてください。");
					flag = false;
					break;
				}
				comUsed.add(firstWord);
				data=computer(data,inputstr,comUsed);


				//語尾に「ん」があるかどうか
	    		if(checkStr(inputstr)){
	    			flag = false;
	    			break;
	    		}
	    		//2回使ったかどうか
				if(playerUsed.contains(inputstr)){
					System.out.println("一度使いました。");
					flag = false;
					break;
				}
				if(playerUsed.contains(data)){
					System.out.println("同じ言葉を使ってしまいました…");
					flag = true;
					break;
				}
				if(data==firstWord){
					System.out.println("最初と同じ言葉を使ってしまいました");
					flag = true;
					break;
				}
				if(data==null){
					flag = true;
					break;
				}
				playerUsed.add(firstWord);
				playerUsed.add(inputstr);
				playerUsed.add(data);
				i++;
			}
		}
		if(!flag){
			System.out.println("----------------------------------------------------------------");
			System.out.println("あなたの負けです。");
		}
		//5回ループしたとき
		if(i==5){
			System.out.println("----------------------------------------------------------------");
			System.out.println("5回ループしました。");
			System.out.println("あなたの勝ちです。");
		}
	}
	//プレイヤーメソッド
	private static String player(String inputstr,String data){
		List<String> used = new ArrayList<>();
		inputstr = new java.util.Scanner(System.in).nextLine();
		used.add(inputstr);
		inputstr = toUpper(inputstr);
		inputstr = remove(inputstr);
		return inputstr;
	}
	//コンピュータメソッド
	private static String computer(String data,String inputstr,List<String> comUsed){
			String word = new String();
			try {
				// ファイルのパスを指定する
				File file = new File("C:\\辞書\\sakura.txt");
				// ファイルが存在しない場合に例外が発生するので確認する
				if (!file.exists()) {
					System.out.print("ファイルが存在しません");
				}
				// BufferedReaderクラスのreadLineメソッドを使って1行ずつ読み込み表示する
				FileReader fileReader = new FileReader(file);
				BufferedReader bufferedReader = new BufferedReader(fileReader);
				 while ((data = bufferedReader.readLine()) != null) {
		               	word = data;
		               	data = toUpper(data);
		               	data = remove(data);
		               	if(inputstr.charAt(inputstr.length()-1) == data.charAt(0)){
		               		if(!comUsed.contains(data) ) {
		               			System.out.println("com:"+data);
		               			comUsed.add(data);
		               			//System.out.println(comUsed);
		               			break;
		               		}
		               	}
		         }
				 if(data == null) {
					 	System.out.println("                      ");
		    			System.out.println("辞書にもうありません。");
		    		}
				// 最後にファイルを閉じてリソースを開放する
		           bufferedReader.close();
	    	} catch (IOException e) {
	    		e.printStackTrace();
	    	}
			return data;
	}
	//カタカナ小文字を大文字に変換するメソッド
			private static String toUpper(String str) {
				str = str.replace("ャ","ヤ");
				str = str.replace("ュ","ユ");
				str = str.replace("ョ","ヨ");
				str = str.replace("ァ","ア");
				str = str.replace("ィ","イ");
				str = str.replace("ゥ","ウ");
				str = str.replace("ェ","エ");
				str = str.replace("ォ","オ");
				return str;
			}
	//語尾に「ー」があったら、取るメソッド
			private static String remove(String str2){
				if(str2.substring(str2.length()-1).equals("ー")){
					 str2 = str2.substring(0,(str2.length()-1));
				}
				return str2;
			}
	//語尾に「コウサン」、「ン」があるかどうか確認するメソッド
			private static boolean checkStr(String checkStr){
				boolean result = true;
				if(checkStr.equals("コウサン")){
					System.out.println("「コウサン」しました。");
				}else if(checkStr.substring(checkStr.length()-1).equals("ン")){
        			System.out.println("「ン」がつきました。");
				}else{
					//「ン」が付かない場合は検証結果をfalseにする
					return false;
				}
				return result;
			}
	//入力の言葉が「全角カタカナ」及び長音付「ー」かどうか確認するメソッド
			private static boolean Katakana(String str3){
				if(str3 == null || !str3.matches("^[ァ-ヶー]*$")){
					//一致しない場合、エラー
					System.out.println("全角カタカナで入力してください。");
					return false;
				}
				return true;
			}
}


表示画面は、こんな感じ

最初の言葉は...
センベイ
1回目
イタチ
player:イタチ
com:チータ
2回目
タヌキ
player:タヌキ
com:キシヤ
3回目
ヤリ
player:ヤリ
com:リンゴ
4回目
ゴマ
player:ゴマ
com:マンゴ
5回目
ゴリラ
player:ゴリラ
com:ラクダ
----------------------------------------------------------------
5回ループしました。
あなたの勝ちです。

いやぁ、ここまでくるのには、相当な時間かかりました…