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

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

ただいまの
回答率

90.47%

  • Java

    14103questions

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

java 引数

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,159
コード

public class Player{
    
    
    //定数、変数
    static final int STONE = 0, SCISSORS = 1, PAPER = 2;  //ジャンケンの手を表す定数
    private String name_;                                 //プレイヤーの名前 
    private int winCount_ = 0;                            //プレイヤーの勝った回数


    //nameのコンストラクタ
    public Player(String name){
        this.name_ = name;
    }
    
    
    //ジャンケンの手を出すメソッド
    public int showHand(){
        
        int hand = 0;
        
        Random rnd = new Random();           //ランダムに数字を取り出す公式
        int randomNum = rnd.nextInt(3);      //0から2の数字をランダムに取り出す

        if (randomNum == 0){
            hand = STONE;
        }
        else if (randomNum == 1){
            hand = SCISSORS;
        }
        else if (randomNum == 2){
            hand = PAPER;
        }

        return hand;          //決定した手を戻り値として返す
    }
    
    
    //勝敗を聞くメソッド
    public void notifyResult(boolean result){
        
        if (true == result){        //true勝ち、false負け
            winCount_ ++;         //勝った場合は勝ち数を加算する
        }
    }
    
    
    //自分の勝った回数を答えるメソッド
    public int getWinCount(){
        return winCount_;
    }
    
    
    //自分の名前を答えるメソッド
    public String getName(){
        return name_;
    }
}

コード

public class Judge{
    
    
    //ジャンケンを開始するメソッド
    public void startJanken(Player player1, Player player2){
        
        System.out.println("【ジャンケン開始】\n");

        for (int cnt = 0; cnt < 3; cnt++){                  //ジャンケンを3回行う
            
            System.out.println("【" + (cnt + 1) + "回戦目】");

            Player winner = judgeJanken(player1, player2);  //プレイヤーの手を見て、どちらが勝ちかを判定する
            
            if (winner != null){
                
                System.out.println("\n" + winner.getName() + "が勝ちました!\n");  //勝者を表示する
                winner.notifyResult(true);                                    //勝ったプレイヤーへ結果を伝える
            }
            else{
                System.out.println("\n引き分けです!\n");
            }
        }

        System.out.println("【ジャンケン終了】\n");

        Player finalWinner = judgeFinalWinner(player1, player2);                        //最終的な勝者を判定する

        System.out.print(player1.getWinCount() + " 対 " + player2.getWinCount() + "で"); //結果の表示

        if (finalWinner != null){
            System.out.println(finalWinner.getName() + "の勝ちです!\n");
        }
        else{
            System.out.println("引き分けです!\n");
        }
    }
    
    
    //プレイヤーの手を見て、どちらが勝ちかを判定するメソッド
    private Player judgeJanken(Player player1, Player player2){
        
        Player winner = null;

        int player1hand = player1.showHand();  //プレイヤー1の手を出す

        int player2hand = player2.showHand();  //プレイヤー2の手を出す

        //それぞれの手を表示する
        printHand(player1hand);
        System.out.print(" vs. ");
        printHand(player2hand);
        System.out.print("\n");

        //プレイヤー1が勝つ場合
        if ((player1hand == Player.STONE && player2hand == Player.SCISSORS)
         || (player1hand == Player.SCISSORS && player2hand == Player.PAPER)
         || (player1hand == Player.PAPER && player2hand == Player.STONE)){
            
            winner = player1;
        }
        //プレイヤー2が勝つ場合
        else if ((player1hand == Player.STONE && player2hand == Player.PAPER)
              || (player1hand == Player.SCISSORS && player2hand == Player.STONE)
              || (player1hand == Player.PAPER && player2hand == Player.SCISSORS)){
            
            winner = player2;
        }

        //どちらでもない場合は引き分け(nullを返す)

        return winner;
    }
    
    

    //最終的な勝者を判定するメソッド
    private Player judgeFinalWinner(Player player1, Player player2){
        
        Player winner = null;

        int player1WinCount = player1.getWinCount();  //Player1から勝ち数を聞く

        int player2WinCount = player2.getWinCount();  //Player2から勝ち数を聞く

        if (player1WinCount > player2WinCount){
            winner = player1;  //プレイヤー1の勝ち
        }
        else if (player1WinCount < player2WinCount){
            winner = player2;  //プレイヤー2の勝ち
        }

        // どちらでもない場合は引き分け(nullを返す)

        return winner;
    }
    
    

    //ジャンケンの手を表示するメソッド
    private void printHand(int hand){
        
        switch (hand){
        
            case Player.STONE :
                System.out.print("グー");
                break;

            case Player.SCISSORS :
                System.out.print("チョキ");
                break;

            case Player.PAPER :
                System.out.print("パー");
                break;

            default :
                break;
        }
    }
}

コード

public class Main {
    
    /**オブジェクト指向によるジャンケンプログラム*/
    
        public static void main(String[] args)
        {
            // 審判(斎藤さん)のインスタンス生成
            Judge saito = new Judge();

            // プレイヤー1(村田さん)の生成
            Player murata = new Player("村田さん");

            // プレイヤー2(山田さん)の生成
            Player yamada = new Player("山田さん");

            // 村田さんと山田さんをプレイヤーとしてジャンケンを開始する
            saito.startJanken(murata, yamada);
        }
    }


上のはじゃんけんのサンプルコードなのですが、これは2人で対戦した場合のものになります。
もし三人以上で対戦する場合はどうしたらいいのでしょうか?

私が思うに
  public void startJanken(Player player1, Player player2){
となっている引数の部分を増やせばいいと思うのですが、引数の部分に変数を使って
num = 5(5人で対戦の場合)
Player playernum 
for(int i= 0; i<num; i++)
のような感じですればいいのではと思うのですが

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+2

こんにちは

私がぱっと思いついたポイントとしては、、、

1)数量が動的変化する部分を配列にする

「プレイヤー」が該当すると思います
配列にすれば全体数は取り出せるので num=5 のような全体数を定義する必要がなくなりますね

2)勝負のロジックを変更する

二人ならば「1対1」でおしまいですが、複数人となると「総当り」なのか「トーナメント」なのかによってだいぶ処理が異なります
参加人数が奇数の場合にあまった人はどうするか?などのルールも決めることになります


投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/27 10:56

    回答ありがとうございます^^

    5人の場合ですと5人全員でじゃんけんをして勝ち負けを出す方法を考えています。
    この場合どうしたらよいのでしょうか?

    キャンセル

  • 2015/07/27 11:21

    5人じゃんけんについて

    1:1を繰り返すのではなく、「全員で手をだす」となるそれなりに複雑になりますね
    ・ルールを明確にする(勝ちがひとりでもいれば終了?誰かが3回勝利するまで続ける?など)
    ・手の出方のパターンを考える

    あとはパターンごとに、ルールに則って勝利カウントをし、勝利条件に達したら終了するロジックとなります

    注意点としては、手の出し方がランダムなので「終わらない」場合を想定することですかね(「最大勝負数を30回とする」など)

    キャンセル

  • 2015/07/27 11:35

    ルールにつきましては、
    ・5人でじゃんけんを10回行う。
    ・1回ごとに1位から5位まで順位を付ける
    (まず5人でじゃんけんをして勝ちが2人以上、負け2人以上いた場合、再度ジャンケンをしていく)。
    ・総合成績として1位の回数が多い人から順位をつける
    (1位の回数が同じ場合は2位の回数が多い方を優先する)。
    このように考えています。

    確かに人数が多くなるとあいこが続いて終わらない場合も出てきますね。

    キャンセル

  • 2015/07/27 11:41

    なんかこの説明を見ると,Playerの配列をクイックソートっぽく考えて並べ替えてスコアを付ける考え方のほうがやりやすい気がしてきました.
    5人のPlayer配列を作る→勝ち・負けで2グループに割って再帰
    →最終的に勝った順にPlayerが並ぶのでその位置を基準に順位付け

    キャンセル

  • 2015/07/28 19:20

    swordone さん、補足ありがとうざいました。おっしゃるようなイメージがよいと私も思います。
    あとは、恐らく順位付けができない状況が必ずできてしまうでしょうから、同順を認める(1位が二人になったら、結果を1,1,3,4,5とする)とか、お互いの順位で高いものを比較してその順位を先に取った方を優先する(murataとyamadaがお互い1位を取っていて同順位だった場合により早く1位を取ったmurataを1位とする)などのルールが必要になるでしょうね。
    ごめんなさい、ご質問は「引数」に関するものだったのに、すっかり「どうやって勝負を決めるか」の回答になってしまいました。
    でも、プログラミングの醍醐味は「どのような状況を想定し、どのように振る舞うか」を考えるのが一番おもしろいところと思いますので、どうぞ引き続きがんばってください。

    キャンセル

+2

そのような場合に便利な可変長引数というものがあります.
public void startJanken(Player... players)
型名の後に...を付けることで,その型の引数を好きなだけ取れます.
またその型の配列も引数として渡せます.
可変長引数は配列として扱われるので,このメソッドの中でplayers[0]としたり,
for文でfor(Player player: players)と拡張for文にも使えます.

5人なら5人でじゃんけんして勝ち負けを出したいということなので,
このメソッドの中では
  1.  5人のPlayerを渡してじゃんけん開始
  2.  あいこにならなくなるまで繰り返し(万が一のためにストップ条件が必要か?)
  3.  勝ったPlayerが2人以上ならそのPlayerを引数にこのメソッドを再帰呼び出し
  4.  一人になったら終了
という感じでしょうか?

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/27 11:17

    回答ありがとうございます^^
    可変長引数というものがあるんですね!

    そうですね!
    そういう流れでしたいと考えています。

    キャンセル

+1

例えばJudge内部にプレイヤーのリストを持たせて、
Judgeに追加する形はどうでしょう。

/*
この辺りで色々宣言
*/
Judge saito = new Judge();
saito.addPlayer(yamada);  //ヤマダ参戦
saito.addPlayer(murata);  //ムラタ参戦
saito.startJanken();      //二人でジャンケン
saito.addPlayer(john);    //ジョン参戦
saito.startJanken();      //三人でジャンケン

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

関連した質問

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

  • Java

    14103questions

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