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

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

ただいまの
回答率

90.48%

  • Java

    14072questions

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

java  じゃんけんゲーム

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,698
コード 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文の中や、続きのプログラムをどのようにすればよいでしょうか?

よろしくお願いいたします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

全体の考え方を構築しなおしました.
public class Player {
    
    //定数、変数
    static final int GU = 1, TYOKI = 2, PA = 4;     //手をビットで管理
    private String name;                                 //プレイヤーの名前 
    private int hand = 0;                                //出している手(初期では「何も出していない」とする)
    private static Random rnd = new Random();  //Playerごとに乱数を持つ意味はないので共有する

    
    //nameのコンストラクタ
    public Player(String name){
        
        this.name = name;
    }
    
    //手を出す
    public int playHand(){
        
        hand = 1 << rnd.nextInt(3)  //rndが0-2の整数を返し,その数分ビットシフトした値を手にする
        return hand;
    } 

    //今出している手を調べる
    public int getHand(){
        return hand;
    }   
        
    //自分の名前を教える
    public String getname(){
        
        return name;
    }
    
}
Playerクラスを書き換えてみました.主に手の扱いを.
こうすることで,判定がかなり楽になります.
まず参加するPlayerを配列にします.そして全員でじゃんけんします.
この時,出した手をチェックし,ビット和を取ります
int cond = 0;  //出している手の状況を保持
for(Player p : players){  //Player配列をplayersとする
    cond |= p.playHand();  
}
そして手の状況を見て,出ている手が2種類なら勝者の手を確定させます.
(それ以外ならあいこなのでじゃんけんのやり直し)
int winner = 0;
switch(cond){
    case Player.GU | Player.TYOKI:
        winner = Player.GU;
        break;
    case Player.TYOKI | Player.PA:
        winner = Player.TYOKI;
        break;
    case Player.PA | player.GU:
        winner = Player.PA;
        break;
}
そしてここでクイックソートの考え方を使います.
クイックソートはある値を軸にして,それより小さな値を左側に,大きな値を右側に集めて分割しソートしますが,
ここでは左側に勝者,右側に敗者を集めて分割し,その分割単位で再びじゃんけんをさせて同じことを繰り返します.
//探査範囲の左端left,右端rightを,再帰メソッドの引数として渡してあるものとする
int l = left, r = right;
while(true){
    while(true){
        if(players[l].getHand() != winner) break;  //左側から負けたPlayerを探す
        l++;
    }
    while(true){
        if(players[r].getHand() == winner) break;
        r--;
    }
    if(l > r) break;
    Player temp = players[l];
    players[l] = players[r];
    players[r] = temp;
}
//ここで再帰呼び出し
これが終わると,Player配列がじゃんけんの順位に並んでいるはずなので,それをもとにスコア付けができます.これを5回繰り返せば目的は達せられるのではないでしょうか.

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/28 20:00

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

    キャンセル

  • 2015/07/30 10:23

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

    キャンセル

0

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

どこに何を定義すべきかをいったん整理した方がいいと思います。
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();  
int player = 5; はほかのクラスに管理を任せた方がいいと思います。
その代り、プレーヤには自分が何点持ってるか、覚えといてもらった方が良いと思いませんか?


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



-------------コメント返し分--------------
ソースはコンパイルしてないので、適当に修正してください
public class Judge {
    // 参加者管理用メンバ
    ArrayList players;
 
   /**
     * 大会実行メソッド
     */   
   Public void game() {
  players = new ArrayList();
      playlers.add(new Player("A君");
      playlers.add(new Player("B君");
      playlers.add(new Player("C君");
      
     judgejanken();
      
  }


    //勝敗を判定する
    public void judgejanken(){
         // 勝敗パターン
   int type = 0;
         // パーなしの時
   for (int i = 0; i < players.size(); i++) {
               // パーがあれば、関係なし
               if (players.get(i).hand == Player.pa) {
                    type = 0;
                     break;
               }
     type = 1;
         }
   for (int i = 0; i < players.size(); i++) {
               // ぐーのときに勝ち
               if (players.get(i).hand == Player.gu) {
                     //得点管理用のメンバ名は適宜書き換えが必要
                     players.get(i).result = 1;
               } else {
                     players.get(i).result = 0;
               }
         }
        
    }


投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/28 15:43

    回答ありがとうございます^^
    int player = 5; はほかのクラスに管理を任せた方がいいと思います。
    というのは、PlayerクラスにはPlayerのことと無関係なことは書かない方がいいのでしょうか?


    参加者をインスタンス化して参加者のHandの調べ方がよくわからないです。
    またHandをしらべてそれをどのようにjudgejankenに組み込むのかが分からないので教えていただきたいです。

    順位を表示するメソッドなどは後で書こうと思っていました!

    キャンセル

  • 2015/07/28 15:56

    基本的に無関係な情報を書くと情報がばらけるので探すのが面倒になります。
    int player = 5;の情報は、参加者の個々に対する情報。というより、じゃんけん大会の情報なのでそちらに管理を任せたほうがいいと思ったからです。この場合、Judge を審判員としてそちらに管理するようにした方が使いやすくないでしょうか?

    参加者をインスタンス化については、単純に
    ArrayList Players;
    Players.add(new Player("A君”);
    Players.add(new Player("B君”);
    といった感じでインスタンス化したものをリストで管理。といった感じだと思います。


    キャンセル

  • 2015/07/28 16:19

    確かにその通りだと思います!
    int player = 5;はJudgeクラスに移しますね。

    参加者をインスタンス化して、どうやってjudgejankenメソッドに組み込むのかが分からないので教えていただきたいです。

    キャンセル

  • 2015/07/28 16:28

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

    キャンセル

  • 2015/07/28 16:33

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

    キャンセル

  • 2015/07/28 17:20

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

    キャンセル

  • 2015/07/28 17:32

    コード載せていただいてありがとうございます^^

    players.size(); は参加人数を表しているのでしょうか?
    またplayers.get(i).handやplayers.get(i).resultは何を表しているのでしょうか?

    キャンセル

  • 2015/07/28 18:06

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

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Java

    14072questions

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