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

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

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

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

Q&A

解決済

2回答

6539閲覧

java  じゃんけんゲーム

kisaragizinzin7

総合スコア90

Java

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

0グッド

0クリップ

投稿2015/07/28 06:13

編集2015/07/28 06:17
コード java public class Player { //定数、変数 int player = 5; //プレイヤー数 private String name; //プレイヤーの名前 int siaisu = 5; //試合数 static final int gu = 0, tyoki = 1, pa = 2; //0ならグー、1ならチョキ、2ならパー int hand; //出す手 Random rnd = new Random(); //nameのコンストラクタ public Player(String name){ this.name = name; } //手を出す public int showhand(){ int run = rnd.nextInt(3); //0から2の数字をランダムに取り出す if(run == 0){ //0ならグー hand = gu; } else if(run == 1){ //1ならチョキ hand = tyoki; } else{ //2(その他)ならパー hand = pa; } return hand; } //自分の名前を教える public String getname(){ return name; } }
コード java public class Judge { //勝敗を判定する public void judgejanken(){ boolean handboolean[] = new boolean[3]; //どの手が出されたかを示す配列{グー,チョキ,パー} if(hand[gu] == true && hand[tyoki] == true && hand[pa] == false){ //グーチョキのみ } else if(hand[gu] == false && hand[tyoki] == true && hand[pa] == true){ //チョキパーのみ } else if(hand[gu] == true && hand[tyoki] == false && hand[pa] == true){ //パーグーのみ } else{ } }

じゃんけんゲームをここまで作ったのですが・・・

ルールとしては
・5人全員でじゃんけんをして、勝った者負けた者が複数いる場合は、その者で再度じゃんけんを行い、1位から5位まで順位を付ける
・それを5回行い、成績が良かった者から総合順位を付ける
です。

Judgeクラスのjudgejankenメソッドで勝敗の場合分けをしています。
・場にグーとチョキしか出ていない場合グーを出した者が勝ち、チョキを出した者が負け
・場にチョキとパーしか出ていない場合チョキを出した者が勝ち、パーを出した者が負け
・場にグーとパーしか出ていない場合パーを出した者が勝ち、グーを出した者が負け
・その他引き分け
としています。

そこで5人でじゃんけんをして、その後勝った者負けた者でじゃんけんをするので、5人でも4人でも3人でも、何人でじゃんけんをしても、このjudgejankenメソッドが使えるようにしたいのですが、そうするにはif文の中や、続きのプログラムをどのようにすればよいでしょうか?

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

全体の考え方を構築しなおしました.

java

1public class Player { 2 3 //定数、変数 4 static final int GU = 1, TYOKI = 2, PA = 4; //手をビットで管理 5 private String name; //プレイヤーの名前 6 private int hand = 0; //出している手(初期では「何も出していない」とする) 7 private static Random rnd = new Random(); //Playerごとに乱数を持つ意味はないので共有する 8 9 10 //nameのコンストラクタ 11 public Player(String name){ 12 13 this.name = name; 14 } 15 16 //手を出す 17 public int playHand(){ 18 19 hand = 1 << rnd.nextInt(3) //rndが0-2の整数を返し,その数分ビットシフトした値を手にする 20 return hand; 21 } 22 23 //今出している手を調べる 24 public int getHand(){ 25 return hand; 26 } 27 28 //自分の名前を教える 29 public String getname(){ 30 31 return name; 32 } 33 34}

Playerクラスを書き換えてみました.主に手の扱いを.
こうすることで,判定がかなり楽になります.
まず参加するPlayerを配列にします.そして全員でじゃんけんします.
この時,出した手をチェックし,ビット和を取ります

java

1int cond = 0; //出している手の状況を保持 2for(Player p : players){ //Player配列をplayersとする 3 cond |= p.playHand(); 4}

そして手の状況を見て,出ている手が2種類なら勝者の手を確定させます.
(それ以外ならあいこなのでじゃんけんのやり直し)

java

1int winner = 0; 2switch(cond){ 3 case Player.GU | Player.TYOKI: 4 winner = Player.GU; 5 break; 6 case Player.TYOKI | Player.PA: 7 winner = Player.TYOKI; 8 break; 9 case Player.PA | player.GU: 10 winner = Player.PA; 11 break; 12}

そしてここでクイックソートの考え方を使います.
クイックソートはある値を軸にして,それより小さな値を左側に,大きな値を右側に集めて分割しソートしますが,
ここでは左側に勝者,右側に敗者を集めて分割し,その分割単位で再びじゃんけんをさせて同じことを繰り返します.

java

1//探査範囲の左端left,右端rightを,再帰メソッドの引数として渡してあるものとする 2int l = left, r = right; 3while(true){ 4 while(true){ 5 if(players[l].getHand() != winner) break; //左側から負けたPlayerを探す 6 l++; 7 } 8 while(true){ 9 if(players[r].getHand() == winner) break; 10 r--; 11 } 12 if(l > r) break; 13 Player temp = players[l]; 14 players[l] = players[r]; 15 players[r] = temp; 16} 17//ここで再帰呼び出し

これが終わると,Player配列がじゃんけんの順位に並んでいるはずなので,それをもとにスコア付けができます.これを5回繰り返せば目的は達せられるのではないでしょうか.

投稿2015/07/28 10:02

編集2015/07/28 11:39
swordone

総合スコア20649

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

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

tenraku

2015/07/28 11:00

素晴らしい回答だと思います
kisaragizinzin7

2015/07/30 01:23

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

0

あいまいな回答でズバリな回答ではないと思いますが。

どこに何を定義すべきかをいったん整理した方がいいと思います。

Java

1public class Player { 2 3 4 //定数、変数メソッド 5 int player =; //プレイヤー数 6 private String name; //プレイヤーの名前 7 int siaisu = 5; //試合数 8 static final int gu = 0, tyoki = 1, pa = 2; //0ならグー、1ならチョキ、2ならパー 9 int hand; //出す手 10 Random rnd = new Random();

int player = 5; はほかのクラスに管理を任せた方がいいと思います。
その代り、プレーヤには自分が何点持ってるか、覚えといてもらった方が良いと思いませんか?

Java

1public class Judge { 2 3 4 //勝敗を判定する 5 public void judgejanken(){ 6 7 boolean handboolean[] = new boolean[3]; //どの手が出されたかを示す配列{グー,チョキ,パー} 8 9 if(hand[gu] == true && hand[tyoki] == true && hand[pa] == false){ //グーチョキのみ 10 } 11 12 else if(hand[gu] == false && hand[tyoki] == true && hand[pa] == true){ //チョキパーのみ 13 } 14 15 else if(hand[gu] == true && hand[tyoki] == false && hand[pa] == true){ //パーグーのみ 16 } 17 18 else{ 19 } 20 }

上記には、勝敗判定だけのメソッドなので、これを実装掛けたとして、実際に試合を実行するメソッドと最終結果の順位を表示してあげるメソッドなどが必要ですね。それに参加者それぞれのHandを調べる必要があると思いますが、参加者そのもののインスタンス化してあげてどうやって管理するか?等も抜けてるかと思います。

-------------コメント返し分--------------
ソースはコンパイルしてないので、適当に修正してください

Java

1public class Judge { 2 // 参加者管理用メンバ 3 ArrayList players; 4 5 /** 6 * 大会実行メソッド 7 */ 8 Public void game() { 9  players = new ArrayList(); 10 playlers.add(new Player("A君"); 11 playlers.add(new Player("B君"); 12 playlers.add(new Player("C君"); 13 14 judgejanken(); 15 16 } 17 18 19 //勝敗を判定する 20 public void judgejanken(){ 21 // 勝敗パターン 22   int type = 0; 23 // パーなしの時 24   for (int i = 0; i < players.size(); i++) { 25 // パーがあれば、関係なし 26 if (players.get(i).hand == Player.pa) { 27 type = 0; 28 break; 29 } 30     type = 1; 31 } 32   for (int i = 0; i < players.size(); i++) { 33 // ぐーのときに勝ち 34 if (players.get(i).hand == Player.gu) { 35 //得点管理用のメンバ名は適宜書き換えが必要 36 players.get(i).result = 1; 37 } else { 38 players.get(i).result = 0; 39 } 40 } 41 42 }

投稿2015/07/28 06:30

編集2015/07/28 07:46
tenraku

総合スコア148

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

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

kisaragizinzin7

2015/07/28 06:43

回答ありがとうございます^^ int player = 5; はほかのクラスに管理を任せた方がいいと思います。 というのは、PlayerクラスにはPlayerのことと無関係なことは書かない方がいいのでしょうか? 参加者をインスタンス化して参加者のHandの調べ方がよくわからないです。 またHandをしらべてそれをどのようにjudgejankenに組み込むのかが分からないので教えていただきたいです。 順位を表示するメソッドなどは後で書こうと思っていました!
tenraku

2015/07/28 06:56

基本的に無関係な情報を書くと情報がばらけるので探すのが面倒になります。 int player = 5;の情報は、参加者の個々に対する情報。というより、じゃんけん大会の情報なのでそちらに管理を任せたほうがいいと思ったからです。この場合、Judge を審判員としてそちらに管理するようにした方が使いやすくないでしょうか? 参加者をインスタンス化については、単純に ArrayList Players; Players.add(new Player("A君”); Players.add(new Player("B君”); といった感じでインスタンス化したものをリストで管理。といった感じだと思います。
kisaragizinzin7

2015/07/28 07:19

確かにその通りだと思います! int player = 5;はJudgeクラスに移しますね。 参加者をインスタンス化して、どうやってjudgejankenメソッドに組み込むのかが分からないので教えていただきたいです。
tenraku

2015/07/28 07:28

Judge内に実行用のメソッドを新規で起してあげればいいと思います。 ArrayList Players;をクラスメンバとして、 Players.add(new Player("A君”); Players.add(new Player("B君”); をやるような実行メソッドを用意して judgejankenメソッドを呼んでやればいいのでは? メンバで定義してあげれば、judgejankenメソッド内からも参照できるので、判定も可能かと思います。
kisaragizinzin7

2015/07/28 07:33

java初心者なものでおっしゃっていただいてることをどのようにプログラムにしたらいいのかわからないです。 よろしければプログラムを載せていただいてもいいでしょうか?
tenraku

2015/07/28 08:20

簡単で、部分的ですが、コードを載せてみました。 完全ではないので、補てんは必要でしょうけども参考までに。
kisaragizinzin7

2015/07/28 08:32

コード載せていただいてありがとうございます^^ players.size(); は参加人数を表しているのでしょうか? またplayers.get(i).handやplayers.get(i).resultは何を表しているのでしょうか?
tenraku

2015/07/28 09:06

players.size();は playersの大きさですね。この場合、リストに追加した要素はA君、B君、C君の3人なので3を返します。 players.get(i) はplayersのi番目の要素を返すという意味ですので A君からC君のいずれかとなります。 handはPlayer.handとなります。 同様にresultもPlayer.resultとなるわけですが、Playerのメンバにresultは今はないと思います。ですので、 //得点管理用のメンバ名は適宜書き換えが必要 と、表現しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問