import java.io.*;
class janken
{
public static void main(String[] args) throws IOException{
BufferedReader br = new
BufferedReader(new InputStreamReader(System.in));
int k=0,m=0,h=0,z=0;
while(true){
System.out.print("あなたの手を入力して下さい。(1:グー、2:チョキ、3:パー、0:終了)?\n");
String str = br.readLine();
int a = Integer.parseInt(str);
if(a == 0){
break;
}
z++;
switch(a){
case 1:
System.out.println("あなたの手はグーです。");
break;
case 2:
System.out.println("あなたの手はチョキです。");
break;
case 3:
System.out.println("あなたの手はパーです。");
break;
default:
System.out.println("1~3を入力してください。");
break;
}
{
int ran = ((int)(Math.random()*3)+1);
int b=ran;
switch(b){
case 1:
System.out.println("コンピュータの手はグーです。");
break;
case 2:
System.out.println("コンピュータの手はチョキです。");
break;
case 3:
System.out.println("コンピュータの手はパーです。");
break;
}
int c;
c=a-b;
if(c == 2){
System.out.println("あなたの勝ちです。");
k++;
}
else if(c== -1){
System.out.println("あなたの勝ちです。");
k++;
}
else if(c==0){
System.out.println("あいこです。");
h++;
}
else if(c==1){
System.out.println("コンピュータの勝ちです。");
m++;
}
else {
System.out.println("コンピュータの勝ちです。");
m++;
}
}
}
System.out.println("じゃんけん終了。");
System.out.println("あなたは"+z+"試合中、"+k+"勝"+m+"敗"+h+"分けです");
}
}
このようにじゃんけんのプログラムを作りました。
しかし0~3以外の数字が入力されても、じゃんけんの勝敗を勝手に判定してしまいます・・・
try文でやってみたのですがいまいちうまくいきませんでした。
0~3を入力したら入力エラーと表示して、ふたたびユーザーの手を聞くようにしたいです。
どうすればよいかアドバイスお願いします。
No.4ベストアンサー
- 回答日時:
とりあえず、これで質問者さんの望むとおりの動作はすると思います。
********************ソースファイル******************************
import java.io.*;
class janken
{
public static void main(String[] args) throws IOException{
BufferedReader br = new
BufferedReader(new InputStreamReader(System.in));
int k=0,m=0,h=0,z=0;
/***********************修正部分*******************************/
String str;
int ec;
while(true){
ec = 0;
do{
if(ec > 0 ){
System.out.println("入力値が不正です。再度入力し直して下さい");
}
System.out.print("あなたの手を入力して下さい。(1:グー、2:チョキ、3:パー、0:終了)?\n");
str = br.readLine();
ec++;
}while(!(str.equals("1") || str.equals("2") || str.equals("3") || str.equals("0")));
/*************************************************************/
int a = Integer.parseInt(str);
if(a == 0){
break;
}
z++;
switch(a){
case 1:
System.out.println("あなたの手はグーです。");
break;
case 2:
System.out.println("あなたの手はチョキです。");
break;
case 3:
System.out.println("あなたの手はパーです。");
break;
default:
System.out.println("1~3を入力してください。");
break;
}
{
int ran = ((int)(Math.random()*3)+1);
int b=ran;
switch(b){
case 1:
System.out.println("コンピュータの手はグーです。");
break;
case 2:
System.out.println("コンピュータの手はチョキです。");
break;
case 3:
System.out.println("コンピュータの手はパーです。");
break;
}
int c;
c=a-b;
if(c == 2){
System.out.println("あなたの勝ちです。");
k++;
}
else if(c== -1){
System.out.println("あなたの勝ちです。");
k++;
}
else if(c==0){
System.out.println("あいこです。");
h++;
}
else if(c==1){
System.out.println("コンピュータの勝ちです。");
m++;
}
else {
System.out.println("コンピュータの勝ちです。");
m++;
}
}
}
System.out.println("じゃんけん終了。");
System.out.println("あなたは"+z+"試合中、"+k+"勝"+m+"敗"+h+"分けです");
}
}
ご回答ありがとうございます。
コンパイルしたところ私の思っていたとおりに動いてくれて、とても感動しました。
こんな方法があったなんて・・・まだまだ勉強不足ですね^^;
本当にありがとうございました。
No.3
- 回答日時:
横から失礼。
基本的に、1文字だけの変数が悪いんじゃなくて、使い方だと思われます。同じ変数でもループカウンターなどの場合でしたら、あくまでそのブロック内だけで処理が完結する事を条件として、iでもjでもいいと思います。
ただ、質問者さんの場合は、インクリメントなどのロジックの部分だけではなくて、標準出力の所でも同じように使用されていたので、ちょっと見づらいんじゃないかな~、というわけです。(嫌味ったらしく聞こえるようでしたら、ごめんなさい。)
いえいえ、おっしゃるとおりです。
プログラムを作る以上誰から見てもわかるような変数がいいにきまってますし、これからは意識して変数をつけたいとおもいます。
No.2
- 回答日時:
私も所詮素人なのです。
メソッドの分け方も「長くなりそうなら分ける」という程度。
変数名も最初に「これは試合数を格納する変数にしよう → gameCount」という程度。
変数名については、巷の入門書でも 1文字のいい加減な変数名が使用されていたりするので、その悪影響か?
No.1
- 回答日時:
0 ~ 3 以外の場合には continue で while ループの先頭に戻ればよいだけ?
そして、コンピュータの出し手を決める箇所や、勝敗を判定する箇所をメソッドにして切り出すのが正常なプログラマの作法だと思う。
また、k l m c などの「意味の取れない」変数名も止めましょう。
この回答への補足
やっぱり、自分の手、コンピュータの手、勝敗の判定をメソッドで分けたほうがいいのですか・・・
まだ習いたてでメソッドをどのようにしたらわからないんですが、調べてみます。
変数なんですがまだ試作段階だったので適当にいれてました。
ややこしくてもうしわけないです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby vscode 文字化け 1 2022/05/21 19:17
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- 英語 この英文の意味を教えてください 3 2023/07/07 20:36
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- JavaScript jsで、switch文で書かれた分をif文にできませんか。 1 2022/07/28 15:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSPやサーブレットでSystem.out...
-
C言語のポインターに関する警告
-
[JAVA]try 内の変数を外で!?
-
文字列の引き算
-
JAVAのDouble型の小数点以下の...
-
EclipseでJava
-
vb6 オブジェクトライブラリは...
-
エクセルマクロ文で、赤文字セ...
-
java シンボルが見つかりません...
-
セッションのリセット
-
DLL VBとC++
-
構文解析中にファイルの終わり...
-
Webアプリケーション checkbox...
-
並行サーバの導入
-
会員情報登録プログラムの作成...
-
float型の桁調整について
-
JAVAでの占い
-
NaNではなく、0と表示させたい
-
Javaでカレントディレクトリを...
-
VBAで配列の計算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
[JAVA]try 内の変数を外で!?
-
JAVAのDouble型の小数点以下の...
-
「続行するには何かキーを押し...
-
EclipseでJava
-
文字列の引き算
-
JAVAのエラーの意味が分かりま...
-
配列を後ろから数えるには?
-
JAVAで素数判定
-
nullcline
-
曜日の取得方法を教えて下さい!
-
エクセルマクロ文で、赤文字セ...
-
JAVA 文字色変更
-
会員情報登録プログラムの作成...
-
Javaのコマンドライン引数を使...
-
Javaでカレントディレクトリを...
-
LC発振回路-ループ利得
-
java シンボルが見つかりません...
-
改行の判定方法
おすすめ情報