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

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

【初心者】【Java】しりとりプログラム~その①~

f:id:akiho817:20200427222437j:plain

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

なんと、

ついに、、


とても苦戦していた「しりとりプログラム」が
完成しました(^O^)/


といっても、コンピュータとの一対一ですが。
(最終目標は、8人プレイ)






初心者にとっては、ベリーハードでした。


以下、コードです。

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;
public class Siritori12 {
	public static void main(String[] args) {
		boolean flag = true;
		String word = new String();
		System.out.println("言葉を入力してください");
		System.out.println("シリトリ");
		String data = "シリトリ";
		List<String> used = new ArrayList<>();
		//5どちらかが敗北条件に達するor5回ループするまで繰り返す
		int i = 0;
		while(i<5){
          //プレーヤーの場合、言葉を入力してもらう
			String inputstr;
			//String data = new String();
    		inputstr = new java.util.Scanner(System.in).nextLine();

    		if(Katakana(inputstr)==false){
    			continue;
    		}
    		//前の言葉から繋がっているかどうか
    		if(!(data.charAt(data.length()-1) == inputstr.charAt(0))){
    			System.out.println("だめです。続く言葉を入れてください。");
    			flag = false;
    			//continue;
    		}
    		//語尾に「ん」があるかどうか
    		if(checkStr(inputstr)){
    			flag = false;
    			//break;
    		}
    		if(used.contains(inputstr)){
    			System.out.println("その言葉は一度使いました。");
    			flag = false;
    			//break;
    		}
    		used.add(inputstr);
    		inputstr = toUpper(inputstr);
    		inputstr = remove(inputstr);
    		if(flag) {
	    		System.out.println((i+1)+"回目");
	    		System.out.println("自分:"+inputstr);
	    		try {
	                // ファイルのパスを指定する
	                File file = new File("C:\\辞書\\sakura.txt");
	                // ファイルが存在しない場合に例外が発生するので確認する
	                if (!file.exists()) {
	                    System.out.print("ファイルが存在しません");
	                    return;
	                }
	                // 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(!used.contains(word) ) {
	                			System.out.println("com:"+data);
	                			break;
	                		}
	                	}
	                }
                // 最後にファイルを閉じてリソースを開放する
                bufferedReader.close();
	    		} catch (IOException e) {
	    			e.printStackTrace();
	    		}
    		}
    		if(data == null){
    			System.out.println("辞書にもうありません。");
    		}
    		//勝敗判定(勝敗が付かない場合は無限ループの先頭に戻る)
    		if(flag && data == null) {
    			System.out.println("あなたの勝ちです。");
    			break;
    		}else if(!flag){
    			System.out.println("あなたの負けです。");
    			break;

    		}else{
    			used.add(word);
    			System.out.println("入力してください。");
    			i++;
    			continue;
    		}
    	}
		//5回ループしたとき
		if(i==5){
			System.out.println("----------------------------------------------------------------");
			System.out.println("5回ループしました。");
			System.out.println("あなたの勝ちです。");
			}
    }
	//カタカナ小文字を大文字に変換するメソッド
			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;
			}
}


何が難しかったかというと、自分が入力した文字の
末尾の言葉を
(例えば「リンゴ」を入力した場合、「ゴ」)
自作の辞書データの中から検索して出力するところです。


while文を使って、辞書データを一行ずつ読んでいきました。

      while ((data = bufferedReader.readLine()) != null) {


if文を使い、もしも入力した言葉の最後の一文字が、
辞書データの最初の一文字と一致していたら画面に出力しました。

	            if(inputstr.charAt(inputstr.length()-1) == data.charAt(0)){
	                		System.out.println("com:"+data);
	                		break;
	                	}
	             }

まだまだ学んだことがあるのですが、
つづきはその②へ!!