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

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

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

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

2回答

1425閲覧

java 〇×.以外の入力で再入力を返す

future0801

総合スコア1

Java

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2022/02/17 06:10

編集2022/02/18 00:13

五目並べのjavaコードを書いている途中ですが、入力値に("O","X",".")以外の値が入力されたときに再入力を促すようなループをdo-whileで実現したいと思っています。
この現状のコードに対して正しい入力を行っても、再入力を返してしまい、無限ループが発生してしまうので、正しい配列の文字列を比較する方法を教えていただきたいです。

入力例:

XXOXO
OXOXX
OOXOO
OXOX.
XOOXX

ただ、javaを習い始めて1か月も経っていない為、
・文字列の比較
・条件式
・Scannerの使い方
の理解度は浅いです。

java

1import java.util.Scanner; 2public class Mogi5_3 { 3 public static String table[][] = new String[5][5]; 4 5 public static void main(String[] args) { 6 start(); 7 Scanner scan = new Scanner(System.in); 8 9 do{ 10 start(); 11 for(int i = 0; i < 5; i++) { 12 table[i] = scan.next().split(""); 13 } 14 }while(!table.equals("O") && !table.equals("X") && !table.equals(".") ); 15 } 16 17 public static void start() { 18 final String MSG_START = "五目並べの盤面を入力してください。"; 19 System.out.println(MSG_START); 20 } 21} 22

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

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

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

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

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

m.ts10806

2022/02/17 06:40

現状の問題点は何でしょうか。 要件に対しどこまで出来ていてなにができていないのでしょうか
future0801

2022/02/17 06:51

失礼致しました。説明を追加致しました。 現状は再入力まで促すループはできるのですが、正しい入力を行ってもループしてしまうので困っております。
jimbe

2022/02/17 07:09

コンパイルが通りません。 出来るだけコード全体をご提示頂けますか。
future0801

2022/02/18 00:16

失礼いたしました。コンパイルができるようにコードを修正させていただきました。 質問には関係ないですが、他のメソッドを含めて全文必要でしたらご連絡ください。
jimbe

2022/02/18 03:06

ありがとうございます。
guest

回答2

0

ベストアンサー

Scan.next はスペースを区切りと判断してしまいますので、1行取り込むなら nextLine が良いと思います。

入力チェックには String.matches を使うのが簡単に思います。

java

1import java.util.Scanner; 2 3public class FiveInARow { 4 public static String table[][] = new String[5][5]; 5 6 public static void main(String[] args) { 7 Scanner scan = new Scanner(System.in); 8 9 System.out.println("五目並べの盤面を'O''X'もしくは'.'で入力してください。"); 10 for(int row=0; row<5; ) { 11 System.out.print((row+1)+"行目: "); 12 String line = scan.nextLine(); 13 if(!line.matches("[OX.]{5}")) { 14 System.out.println("※ 'O''X'もしくは'.'で5文字を入力してください。"); 15 continue; 16 } 17 table[row++] = line.split(""); 18 } 19 20 System.out.println("確認"); 21 for(int i=0;i<5; i++) { 22 for(int j=0; j<5; j++) { 23 System.out.print(table[i][j]); 24 } 25 System.out.println(); 26 } 27 } 28}

投稿2022/02/17 08:32

編集2022/02/17 08:40
jimbe

総合スコア12648

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

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

future0801

2022/02/17 09:30

ありがとうございます!ぜひ参考にさせていただきます!
future0801

2022/02/18 02:11

先程頂いたコードを少し改良して自分のコード上に組み込んで動作することができました。ありがとうございました。
guest

0

!table.equals("O") && !table.equals("X") && !table.equals(".") );

StringとString[][]の比較なので一致することはありません。
また、whileの条件式は「繰り返したい条件式」を指定するので型が違う時点で必ず全て満たさない=繰り返し続ける

ことになります。
コードからすると1行分必ず入力するのでしょうか?
いずれにしても、入力内容次第でループ抜けるのでしたら、入力内容を保管する前にチェックする必要があります。

私でしたらdo-whileではなくwhileとして条件式はtrueのみ
入力した内容を一度作業用変数に受け取り、既定値のみを含んでいればbreakでwhileを抜けさせます。

投稿2022/02/17 07:09

編集2022/02/17 07:12
m.ts10806

総合スコア80850

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

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

m.ts10806

2022/02/17 07:11

回答したのですが、ちょっと間違えました。調整中。
future0801

2022/02/17 09:32

原因が分からなかったので助かります!ありがとうございます! 既定値のみを確認するためにどういったコードだと確認できますでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問