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

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

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

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

Q&A

解決済

5回答

5784閲覧

mainのみに書いたじゃんけんプログラムを3つのメソッドに分けて作り直したい

dandai

総合スコア8

Java

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

0グッド

0クリップ

投稿2018/04/27 02:55

編集2018/04/27 03:16

前提・実現したいこと

javaの勉強中です。以下のようにじゃんけんプログラムを作成したのですが、オブジェクト指向に基づき、3つのメソッド(main含む)に分けて作成し直せという課題が出ました。

どこをどのように分けて作れば良いのか、何を基準に分ければいいのか教えていただけると幸いです。

じゃんけんプログラムの条件はAさんとBさんがじゃんけん、それを10回繰り返し、「n回目 Aさんグー Bさんパー 勝者:Bさん」のように表示させる、ただしAさんが三回連続で負けた場合そこでプログラムを終了する、という条件です。

また、このようなプログラムの場合ループ回数が二桁になるとき、1〜9のから10になったとき表示が桁数分ずれることが気になるのですが、なにか解決法はあるのでしょうか?

該当のソースコード

java

1import java.util.Random; 2 3public class Janken { 4 5 public static void main(String[] args) { 6 7 //文字列型の配列hand[]に、"グー ","チョキ","パー "を代入 8 String hand[] = {"グー ","チョキ","パー "}; 9 10 //文字列型の変数judgeに、nullを代入 11 String judge = null; 12 13 //整数型の変数losecountに、0を代入 14 int losecount = 0; 15 16 17 Random rd = new Random(); 18 //整数型の変数iに1を代入し、iが10より大きいか同じになるまで、iを1増やして、繰り返す 19 for(int i =1 ; i <= 10 ; i++) { 20 21 //整数型の変数xに、RandomクラスのnextInt()メソッドで取得した3未満の整数型の数字を代入 22 int x = rd.nextInt(3); 23 24 //整数型の変数yに、RandomクラスのnextInt()メソッドで取得した3未満の整数型の数字を代入 25 int y = rd.nextInt(3); 26 27 //x-y+3を3で割った余りが2の場合、処理をする 28 if((x - y + 3) % 3 == 2){ 29 30 //変数judgeに " 勝者:Aさん"を代入 31 judge = " 勝者:Aさん"; 32 33 //x-y+3を3で割った余りが1の場合、処理をする 34 }else if ((x - y + 3) % 3 == 1) { 35 36 //変数judgeに " 勝者:Bさん"を代入 37 judge = " 勝者:Bさん"; 38 39 //それ以外(x-y+3を3で割った余りが0)の場合、処理をする 40 }else { 41 42 //変数judgeに " 引き分け"を代入 43 judge = " 引き分け"; 44 } 45 46 47 //変数judgeが" 勝者:Aさん"と等しい、または" 引き分け"と等しい場合、処理をする 48 if(judge.equals(" 勝者:Aさん") || judge.equals( " 引き分け") ){ 49 50 //変数losecountに0を代入 51 losecount = 0; 52 53 //それ以外(変数judgeが" 勝者:Bさん"と等しい)の場合、処理をする 54 }else { 55 56 //変数losecountを1増やす 57 losecount++; 58 } 59 60 //あらかじめ用意された基本機能のうち、出力系を指定し、コンソールに回数とA,Bさんの手と勝者を表示後、改行をする 61 System.out.println(i+"回目 Aさん"+hand[x]+" Bさん"+hand[y]+judge); 62 63 //変数losecountが3の場合、処理をする 64 if(losecount == 3) { 65 66 //for文の処理を終了する 67 break; 68 } 69 } 70 } 71} 72
1回目 Aさんチョキ Bさんグー  勝者:Bさん 2回目 Aさんグー  Bさんグー  引き分け 3回目 Aさんグー  Bさんパー  勝者:Bさん 4回目 Aさんチョキ Bさんグー  勝者:Bさん 5回目 Aさんチョキ Bさんパー  勝者:Aさん 6回目 Aさんグー  Bさんグー  引き分け 7回目 Aさんチョキ Bさんチョキ 引き分け 8回目 Aさんチョキ Bさんパー  勝者:Aさん 9回目 Aさんパー  Bさんパー  引き分け 10回目 Aさんパー  Bさんパー  引き分け

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

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

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

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

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

m.ts10806

2018/04/27 03:05

インデントをつけてください。プログラムが見づらくなっています。
m.ts10806

2018/04/27 03:06

「桁数分ずれる」というのは具体的にどのような状況となるのでしょうか。結果を貼り付けるなり画面キャプチャなりで例示してください。
退会済みユーザー

退会済みユーザー

2018/04/27 03:13

多分これの↓の行か・w・ 適宜 スペースか0を埋めないとね //あらかじめ用意された基本機能のうち
dandai

2018/04/27 03:14

表示を追加しました。このように9回目までは縦の列が揃いますが、10回目になると桁が2桁になった分1文字分ずれてしまうのが気持ち悪いので、表示をそろえたい、という意味です。
m.ts10806

2018/04/27 03:18

その部分はフォーマットかけて0埋めすれば良いかと思いますが(やり方は調べればすぐ出てきます。)課題としてはmain内に全ておさまっているので達成ではないですよね。基準を質問されていますが、それは基本「作る人が決める」ことだったりします。もちろんコーディング規約があるならそれに倣うべきですが、どのような勉強をしてきたか、にもよります。何かしら習ってきているはずなので、まずはそちらを土台にやってみてください。
dandai

2018/04/27 03:26

ありがとうございます。もう少し練ってみます。
退会済みユーザー

退会済みユーザー

2018/04/27 04:36

「3つのメソッド(main含む)に分けて作成し直せ」というのはオブジェクト指向とは関係ないと思います。3つのクラスに分けて、というならわかりますが。課題を出した人の真意を確認した方がいいのでは?
guest

回答5

0

ループ回数が二桁になるとき、1〜9のから10になったとき表示が桁数分ずれることが気になるのですが、なにか解決法はあるのでしょうか?

これに答えておきますと、
string.formatメソッドというのを使うと、表示する変数の桁数を指定できるので、それでどうにかできますね

投稿2018/04/27 03:54

y_waiwai

総合スコア87719

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

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

dandai

2018/04/27 04:19

ありがとうございます。やってみます!
guest

0

プログラム分割の基本と思いますが、入力→処理→出力に分けるのがいいのでは?

投稿2018/04/27 03:32

cateye

総合スコア6851

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

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

dandai

2018/04/27 04:17

ありがとうございます。この場合コンソールから入力はしませんが、入力とはどの部分が当たるのでしょうか?
cateye

2018/04/27 04:38 編集

なんだかの形で処理に必要なデータに値を設定しているところ....nextInt()あたりでしょう。出力は、画面表示です。 処理と言うのは、入力デーの判定や加工をすることです。私の場合は、入力データと出力データを元にどういった処理(プログラムの振る舞い)にするかを考えるようにしています。(組込開発が多かった為、入出力データは最初から決まっているこ事が多かったので)
guest

0

Aさん、Bさんのじゃんけんの手と勝敗の数が保存できるクラスは有ると便利かもですね

今はプレイヤーが2人なのでしっくりこないと思いますが、100人になった時にどれだけプログラムの変更が楽になるかで考えるといいかも?

投稿2018/04/27 03:48

Do_you_1isten

総合スコア29

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

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

dandai

2018/04/27 04:18

ありがとうございます。その考えは無かったので、拡張性を考えてやってみようと思います!
guest

0

ベストアンサー

オブジェクト指向に基づき、3つのメソッド(main含む)に分けて作成し直せという課題が出ました。
どこをどのように分けて作れば良いのか、何を基準に分ければいいのか教えていただけると幸いです。

課題ということなので、ヒントだけ。
このプログラムに登場するモノ(主語やアクター:役者)をクラスやEnumとするといいですよ。

投稿2018/04/27 03:37

umyu

総合スコア5846

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

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

dandai

2018/04/27 04:18

ありがとうございます。列挙型と配列の使い分けがはっきりしていないので、調べてやってみようと思います。
guest

0

こんにちは、あくまでも一つの方法に過ぎませんので、参考程度にお願いします。

オブジェクト指向に基づき、3つのメソッド(main含む)に分けて作成し直せという課題が出ました。

(i)ジャンケンの勝敗の判定をするメソッド
引数はもちろん2人がそれぞれ出した手で、質問欄に書いてある(x - y + 3) % 3を戻り値にします。
引き分け、Aさんの勝ち、Bさんの勝ちのときそれぞれ0,1,2になります。

(ii) (i)をもとに一回の勝負の結果を表示するメソッド
結果の表示でif文を使ってもいいのですが、

String []result = {"引き分け","Aさんの勝ち","Bさんの勝ち"};

のように、配列を使うと出力の際にif文を使わずに済みます。

(iii) (i),(ii)をもとに得られた結果をMain関数にて,for文で10回繰り返します。

それと、もう一つ

また、このようなプログラムの場合ループ回数が二桁になるとき、1〜9のから10になったとき表示が桁数分ずれることが気になるのですが、なにか解決法はあるのでしょうか?

一つの方法として、%2dを使うと桁数がそろいます。

for(int i = 1; i <= 10; i++){ System.out.printf("%2d\n",i); }

これを実行すると以下の結果が得られます。

1回目 2回目 3回目 4回目 5回目 6回目 7回目 8回目 9回目 10回目

桁数がそろっていることがわかります。

投稿2018/04/27 07:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問