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

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

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

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

Q&A

解決済

1回答

5970閲覧

総勝敗数を表示

pigry

総合スコア13

Java

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

0グッド

0クリップ

投稿2016/10/16 08:29

編集2016/10/16 09:16

前回に引き続き、じゃんけんのプログラムを作っています。これは三回勝ったら1回勝ちとし、それを止めるというまで繰り返して最後に総勝敗数を表示させたいのですが、うまくいきません。どこをどう直せば良いでしょうか・・・

java

1import java.util.*; 2 3public class Janken5m { 4 static Scanner stdIn = new Scanner(System.in); 5 static Random rand = new Random(); 6 7 public static void main(String[] args) { 8 boolean cont = true; 9 int w=play3(); 10 int l=play3(); 11 12 do { 13 // ここからplay3の処理 14 play3(); 15 //ここまでがplay3の処理 16 System.out.println("続けますか。0:no 1:yes"); 17 cont = stdIn.nextInt()==1; 18 }while(cont); 19 System.out.println(w+"勝"+l+"敗"); 20 } 21 static int play1() { // 関数値で勝者を返す 1:人 2:コンピュータ 22 int c; 23 int h; 24 int r; 25 do{ 26 System.out.print("手(0:グー/ 1: テョキ/ 2:パー) ? "); 27 c = rand.nextInt(3); 28 h = stdIn.nextInt(); 29 print("人", h); 30 print("コンピュータ", c); 31 r = r = (c-h+3)%3; 32 switch(r) { 33 case 0: System.out.println("あいこ"); break; 34 case 1: System.out.println("人の勝ち"); break; 35 case 2: System.out.println("コンピュータの勝ち"); break; 36 } 37 }while(r==0); 38 return r; 39 } 40 41 static int play3(){ 42 int w=0; int l=0; 43 int wc=0, wh=0; 44 int r=0; 45 while(wc<3 && wh<3) { 46 r=play1(); 47 if(r==1) wh++; 48 else if(r==2) wc++; 49 } 50 51 if(wh==3) {System.out.println("3勝"+wc+"敗で人の勝ちです。" ); w++; } 52 else {System.out.println("3勝"+wh+"敗でコンピュータの勝ちです。"); l++; } 53 54 return r; 55 } 56 57 static void print(String who, int x) { 58 switch(x) { 59 case 0: System.out.println(who+":グー"); break; 60 case 1: System.out.println(who+":テョキ"); break; 61 case 2: System.out.println(who+":パー"); break; 62 } 63 } 64} 65 66コード

ちなみに、実行するとこのような感じで勝敗数がおかしくなってしまいます。
あと、三回勝負で一旦決着がついた後に「続けますか?」と表示されるはずなのに表示されません
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:パー
コンピュータの勝ち
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:グー
あいこ
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:パー
コンピュータの勝ち
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:テョキ
人の勝ち
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:グー
あいこ
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:テョキ
人の勝ち
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:テョキ
人の勝ち
3勝2敗で人の勝ちです。
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:グー
あいこ
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:テョキ
人の勝ち
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:テョキ
人の勝ち
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:グー
あいこ
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:テョキ
人の勝ち
3勝0敗で人の勝ちです。
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:グー
あいこ
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:グー
あいこ
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:テョキ
人の勝ち
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:パー
コンピュータの勝ち
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:テョキ
人の勝ち
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:グー
あいこ
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:グー
あいこ
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:テョキ
人の勝ち
3勝1敗で人の勝ちです。
続けますか。0:no 1:yes
1
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:グー
あいこ
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:グー
あいこ
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:テョキ
人の勝ち
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:パー
コンピュータの勝ち
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:グー
あいこ
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:パー
コンピュータの勝ち
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:テョキ
人の勝ち
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:グー
あいこ
手(0:グー/ 1: テョキ/ 2:パー) ? 0
人:グー
コンピュータ:テョキ
人の勝ち
3勝2敗で人の勝ちです。
続けますか。0:no 1:yes
0
1勝1敗

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

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

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

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

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

swordone

2016/10/16 09:22

あと、"チョキ"が"テョキ"になってます。
guest

回答1

0

ベストアンサー

「うまくいかない」の内容を説明しないとわかりませんよ?
(訂正) wやlを宣言する際にplay3を呼んでいることが原因です。

java

1int w=play3();

この宣言により、

手(0:グー/ 1: テョキ/ 2:パー) ? 0

人:グー
コンピュータ:パー
コンピュータの勝ち
(中略)
3勝2敗で人の勝ちです。

の部分が行われ、play3()で「最後に人が勝った」ことにより1が返されます。これがwに代入されます。

次の

java

1int l=play3();

で、再びplay3()が呼び出され、

手(0:グー/ 1: テョキ/ 2:パー) ? 0

人:グー
コンピュータ:グー
あいこ
(中略)
3勝0敗で人の勝ちです。

これが出力されます。これも「最後に人が勝った」ことにより1が返され、lに代入されます。

このあとの出力がdo-whileに当たる部分ですが、勝ち数を一切カウントしていません。
結局、whileを抜けるまでwもlも上書きされず、

java

1System.out.println(w+"勝"+l+"敗");

で"1勝1敗"と出力されたのです。


ひとまずmainに手を付けると

java

1public static void main(String[] args) { 2 int w = 0; 3 int l = 0; 4 boolean cont = true; 5 while (cont) { 6 // xはこの書き方をするためのダミー変数 7 int x = (play3() == 1) ? w++ : l++; 8 boolean check = true; 9 while (check) { 10 System.out.println("続けますか。0:no 1:yes"); 11 switch (stdIn.nextInt()){ 12 case 0: 13 cont = false; 14 case 1: 15 check = false; 16 break; 17 default: 18 System.out.println("0か1で入力して下さい。"); 19 } 20 } 21 } 22 System.out.println(w+"勝"+l+"敗"); 23}

こんな感じになるのでは?play3メソッドの返り値をbooleanにして判定したいところですが。

投稿2016/10/16 08:49

編集2016/10/16 14:21
swordone

総合スコア20651

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

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

pigry

2016/10/16 09:29

なるほど、mainでplay3()を呼んではいけなかったのですね・・・ それでは、play3()でやっているw++;とl++;では勝敗数はカウントされていないのでしょうか?
swordone

2016/10/16 09:37 編集

そのw,lはplay3で宣言しているもので、mainで宣言しているものとは無関係です。 あとmainで呼んではいけない訳ではなくて、その返り値をmainのw,lに代入する意味がないということです。
pigry

2016/10/16 10:29

play3()とmainのwとlは全く別のものになってしまうのですね play3()で数えたwとlを勝敗数として表示するにはどのようにしたらいいのですか?
swordone

2016/10/16 10:45

play3()でカウントしてるのは3勝先取の勝ち数ですよね?返す必要がないのでは? play3()の返り値で条件判断してw,lをインクリメントするのが自然な流れでは?
pigry

2016/10/16 23:24

ありがとうございました。これをもとにもう少し考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問