質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1265閲覧

Javaでタッチタイピング練習の際に、一文字一文字判定させ、回答者に分かりやすく表示させたい

GReBan4

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

0クリップ

投稿2023/04/21 07:32

実現したいこと

  • 誤った文字の場合、その文字が間違いだとユーザーに分かりやすく表示させたい

前提

現在、Javaを使ってタッチタイピング練習プログラムを作成しています。
プログラム自体の基本フローは完成しているのですがが、なにか物足りなく、問題文と入力した文字が一文字でも誤っていた場合、その誤っていた文字をユーザーに分かりやすく表示させたいと思っています。
色々試してみましたが、理解ができなかったので、なにかいい方法などや例コードなどあれば教えていただきたいです。

基本の処理フロー

  • 問題文字列表示
  • ユーザーが文字を入力
  • 誤った答えなら、間違いと表示
  • 正解なら正解と表示
  • 最終的なスコアを表示させる

該当のソースコード

コードはMainのほかに別のクラスを作り、Wordクラスから文字配列をもってきています。

Java

1public class Main { 2 3 public static void main(String[] args) { 4 java.util.Scanner scanner = new java.util.Scanner(System.in); 5 6 Word word = new Word(); 7 String finishWord = "終了"; 8 int score = 0; 9 int missScore = 0; 10 11 System.out.println("タイピング練習を始めるには1を押してください"); 12 System.out.println("もし、途中で終わりたいときは終了と入力してください"); 13 int typingStart = scanner.nextInt(); 14 15 if(typingStart == 1) { 16 Main.timer(); 17 } 18 19 while(true) { 20 21 //配列呼び出し 22 word.setWordList(); 23 System.out.println(word.getWordV()); 24 25 //結果入力 26 @SuppressWarnings("resource") 27 String wordAnswer = new java.util.Scanner(System.in).nextLine(); 28 29 if(wordAnswer.equals(finishWord)) { 30 break; 31 } 32 else if(wordAnswer.equals(word.getWordV())) { 33 System.out.println("正解!"); 34 score++; 35 } 36 else { 37 System.out.println("不正解"); 38 missScore++; 39 } 40 } 41 42 System.out.println("お疲れ様でした。"); 43 System.out.println("あなたのスコアは 正解:" + score + " 不正解:" + missScore + "です"); 44 45 scanner.close(); 46 47 } 48 49 //タイピング前のタイマー 50 public static void timer() { 51 52 try { 53 System.out.print(" 3,"); 54 Thread.sleep(1000); 55 System.out.print(" 2,"); 56 Thread.sleep(1000); 57 System.out.print(" 1"); 58 Thread.sleep(1000); 59 System.out.println("開始!"); 60 } catch (InterruptedException e) { 61 e.printStackTrace(); 62 } 63 } 64 65}

Java

1public class Word { 2 3 //例文 4 private String[] wordList = {"りんご", "みかん", "ぶどう", 5 "さくらんぼ", "ぱいなっぷる"}; 6 7 private String wordV; 8 9 //ランダム表示 10 public void setWordList() { 11 int wordRandom = new java.util.Random().nextInt(getWordListLength()); 12 this.setWordV(wordList[wordRandom]); 13 } 14 15 public String[] getWordList() { 16 return wordList; 17 } 18 19 //配列の長さ 20 public int getWordListLength() { 21 return wordList.length; 22 23 } 24 25 public String getWordV() { 26 return wordV; 27 } 28 29 public void setWordV(String wordV) { 30 this.wordV = wordV; 31 } 32}

試したこと

  • splitを使った比較方法
  • Array?を使った方法

補足情報

Java 17

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2023/04/21 09:31 編集

まず、同じストリーム (System.in) を元とする複数の Scanner オブジェクトは作らないようにしてください。 そして、何を持って「分かり易い」と判断するのかは作者が決めることです。 ついでに Word クラスは大した処理をしていません。(ランダムに文字列を返すメソッドが一つあるだけで済むのでは。) 始めるときの入力で 1 以外の数字や文字入力したらどうなりますか。
guest

回答1

0

ベストアンサー

問題文と入力した文字が一文字でも誤っていた場合、その誤っていた文字をユーザーに分かりやすく表示させたいと思っています。

「わかりやすく」というのが、案外難しいというか悩ましいですね...

「あおいうみ」を例に、ありがちなパターンを表にしました。

類別入力出力例一言コメント
入れ替わりおあいうみoaiumiおあいうみ, あおいうみ, いうみよくある
抜けおいうみoiumiおいうみ小指がね
ミスあおいうにaoiuniあおいう, あおいう, あおいうとなり
余計あおいうyみaoiuymiあおいうあるかな
重複あおいうみいaoiumiiあおいうみチャタった
組み合わせ(抜け&重複)おいうみいoiumiiおいうみ文字数はあってる
考察1うみあおいumiaoiうみあおいうみこうなるか?
考察2みういおあmiuioaみうおあ, あおうみ, みういおおいうみう~~む
考察3えええええeeeeeえええええ, あおいうみ, あおいうみえええええもういいですw

個人的には複数「出力例」があるのは1個目が好みですが、実装を思いつきませんでしたorz
実装的には3個目が簡単な気がします(冗長であまり見やすくないが...)

気になった点を勝手に変えました^^;

java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) { 5 final var scanner = new Scanner(System.in); 6 final var randomWord = new RandomWord(); 7 final var finishWord = "終了"; 8 9 var score = 0; 10 var missScore = 0; 11 12 System.out.println("タイピング練習を始めるにはEnterを押してください"); 13 System.out.println("もし、途中で終わりたいときは「終了」と入力してください"); 14 scanner.nextLine(); 15 16 countdown(); 17 18 while (true) { 19 var correct = randomWord.get(); 20 System.out.println(); 21 System.out.println(correct); 22 23 var answer = scanner.nextLine(); 24 if (answer.equals(finishWord)) { 25 break; 26 } 27 28 if (answer.equals(correct)) { 29 System.out.println("正解!"); 30 score++; 31 } else { 32 System.out.println("不正解"); 33 printCorrect(correct, answer); 34 missScore++; 35 } 36 } 37 38 System.out.println("お疲れ様でした。"); 39 System.out.println("あなたのスコアは 正解:" + score + " 不正解:" + missScore + "です"); 40 41 scanner.close(); 42 } 43 44 private static void countdown() { 45 try { 46 System.out.print(" 3,"); 47 Thread.sleep(1000); 48 System.out.print(" 2,"); 49 Thread.sleep(1000); 50 System.out.print(" 1"); 51 Thread.sleep(1000); 52 System.out.println("開始!"); 53 } catch (InterruptedException e) { 54 e.printStackTrace(); 55 } 56 } 57 58 private static void printCorrect(String correct, String answer) { 59 for (var c : correct.toCharArray()) { // 正解を1文字ずつループ 60 var i = answer.indexOf(c); // 答えに含まれていればそのインデックス 61 if (-1 < i) { // 答えに含まれている 62 var s = answer.substring(0, i); // インデックス以前の文字列 63 answer = answer.substring(i + 1); // 答えをインデックス以降に切り詰める 64 // sがあれば取り消し線で出力(sがカラでも制御コードだけなので何も出ない) 65 System.out.print("\u001b[9m" + s + "\u001b[0m"); // 取り消し線 66 // 正解の文字はそのまま出力 67 System.out.print(c); 68 } else { // 答えに含まれていない 69 // 正解の文字を太字で出力 70 System.out.print("\u001b[1m" + c + "\u001b[0m"); // 太字 71 } 72 } 73 // まだanswerがあまっていれば取り消し線で出力(sanswerがカラでも制御コードだけなので何も出ない) 74 System.out.println("\u001b[9m" + answer + "\u001b[0m"); // 取り消し線 75 } 76} 77 78class RandomWord { 79 //private final String[] wordList = { "あおいうみ" }; 80 private final String[] wordList = { "りんご", "みかん", "ぶどう", "さくらんぼ", "ぱいなっぷる", }; 81 private final Random random = new Random(); 82 83 public String get() { 84 return wordList[random.nextInt(wordList.length)]; 85 } 86}

java ansiエスケープシーケンス - Google 検索

環境によっては太字等効かないかもしれません。その場合は何か別の表現を考えてみてください^^

投稿2023/04/21 16:09

TN8001

総合スコア9244

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GReBan4

2023/04/23 05:46

わかりやすい表とともに、コードの書き加え、ありがとうございました! 変数は自分のをそのままにして、コードを参考にして実行することができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問