2

各プレーヤーがポーカーで持っているチップの数を追跡できるプログラムを作成しようとしています。これはポーカー ゲームではなく、各プレーヤーが持っているチップの数を保持できるプログラムのみです。しかし、「ベット」「コール」「フォールド」などを自動で行えるようにしたい。

私の質問は、各順列を書かずにプレーヤーの数を調整する方法はありますか? 現在、追跡できるのは 2 人だけです。理論的に無限の人数を追跡できるようにするにはどうすればよいでしょうか? 可能なすべての順列を書きましたが、あまり効率的ではないことがわかっているので、これをコーディングするより効率的な方法はありますか?

私はJavaの初心者なので、どんな助けもいただければ幸いです。

import java.util.Scanner;
import static java.lang.System.out;

class Chips {
static String move; //first move
static int betVal1, betVal2;
static int pot;
static int P1, P2;
static int roundcount;
static String player;
static Scanner myScanner = new Scanner(System.in);
static int turncount;
static String outcome;

public static void firstP1() { //first move when P1 start
    out.print("P1 - will you 'Bet', 'Check' or 'Fold'? ");
    move = myScanner.next();

    while (!move.equals("Bet") && !move.equals("Check") && !move.equals("Fold")){
    out.print("Please type 'Bet', 'Check' or 'Fold'");
    move = myScanner.next();
    }

    switch(move) {
    case "Bet":
        out.print("How much will you bet? If you've changed your mind: Type '0' to check and '-1' to fold. ");
        betVal1 = myScanner.nextInt();

        while (betVal1 > P1) {
            out.print("You cannot bet more than your chip count. How much will you bet? ");
            betVal1 = myScanner.nextInt();
        }
        if (betVal1 == 0) { //check
            P2aftercheck();
        }
        if (betVal1 == -1) { //fold
            P2 += pot;
            pot = 0;
            roundcount = 0;
            turncount++;

            out.print("P1: ");
            out.println(P1);
            out.print("P2: ");
            out.println(P2);
            out.println("Next turn");

            if (turncount  % 2 == 0) { //check to see who begins next turn
                player = "One";
            } else {
                player = "Two";         
            }

            if( player.equals("One")) {
                firstP1();
            } else {
                firstP2();
            }

        }


        pot += betVal1;
        P1 -= betVal1;
        //out.println(betVal);
        //out.print(pot);
        P2afterbet();
        break;

    case "Check":
        P2aftercheck();
        break;

    case "Fold":
        P2 += pot;
        pot = 0;
        roundcount = 0;
        turncount++;

        if (turncount  % 2 == 0) {
            player = "One";
        } else {
            player = "Two";         
        }

        if( player.equals("One")) {
            firstP1();
        } else {
            firstP2();
        }
        break;

    }
}

public static void firstP2() { //first move when P2 start
    out.print("P2 - will you 'Bet', 'Check' or 'Fold'? ");
    move = myScanner.next();

    while (!move.equals("Bet") && !move.equals("Check") && !move.equals("Fold")){
    out.print("Please type 'Bet', 'Check' or 'Fold' ");
    move = myScanner.next();
    }

    switch(move) {
    case "Bet":
        out.print("How much will you bet? ");
        betVal2 = myScanner.nextInt();
        while (betVal2 > P2) {
            out.print("You can not bet more than your chip count. How much will you bet? ");
            betVal2 = myScanner.nextInt();
        }
        pot += betVal2;
        P2 -= betVal2;
        //out.println(betVal);
        //out.print(pot);
        P1afterbet();
        break;

    case "Check":
        P1aftercheck();
        break;

    case "Fold":
        P1 += pot;
        pot = 0;
        roundcount = 0;
        turncount++;

        out.print("P1: ");
        out.println(P1);
        out.print("P2: ");
        out.println(P2);
        out.println("Next turn");

        if (turncount  % 2 == 0) {
            player = "One";
        } else {
            player = "Two";         
        }

        if( player.equals("One")) {
            firstP1();
        } else {
            firstP2();
        }
        break;

    }
}

public static void P1afterbet() { //P1 move after P2 bet
    out.print("P1 - will you 'Bet', 'Call' or 'Fold'? ");
    move = myScanner.next();

    while (!move.equals("Bet") && !move.equals("Call") && !move.equals("Fold")){
        out.print("Please type 'Bet', 'Check' or 'Fold' ");
        move = myScanner.next();
    }

    switch(move) {
    case "Bet":
        out.print("How much will you bet? ");
        betVal1 = myScanner.nextInt();
        while (betVal1 < betVal2){
            out.print("Please bet at least ");
            out.print(betVal2);
            out.println(" chips.");
            out.print("How much will you bet? ");
            betVal1 = myScanner.nextInt();
        }

        pot += betVal1;
        P1 -= betVal1;
        P2afterbet();
        break;

    case "Call":
        pot += betVal1;
        P1 -= betVal1;
        roundcount++;
        if (roundcount == 4){
            roundend();
        }
        if( player.equals("P1")) {
            firstP1();
        } else {
            firstP2();
        }
        break;

    case "Fold":
        P2 += pot;
        pot = 0;
        roundcount = 0;
        turncount++;

        out.print("P1: ");
        out.println(P1);
        out.print("P2: ");
        out.println(P2);
        out.println("Next turn");

        if (turncount  % 2 == 0) {
            player = "One";
        } else {
            player = "Two";         
        }

        if( player.equals("One")) {
            firstP1();
        } else {
            firstP2();
        }
        break;
    }
}

public static void P1aftercheck() { //P1 move after P2 check
    out.print("P1 - will you 'Bet', 'Check' or 'Fold'? ");
    move = myScanner.next();

    while (!move.equals("Bet") && !move.equals("Check") && !move.equals("Fold")){
    out.print("Please type 'Bet', 'Check' or 'Fold'");
    move = myScanner.next();
    }

    switch(move) {
    case "Bet":
        out.print("How much will you bet? ");
        betVal1 = myScanner.nextInt();
        while (betVal1 > P1) {
            out.print("You can not bet more than your chip count. How much will you bet? ");
            betVal1 = myScanner.nextInt();
        }
        pot += betVal1;
        P1 -= betVal1;
        //out.println(betVal);
        //out.print(pot);
        P2afterbet();
        break;

    case "Check":
        roundcount++;
        if (roundcount == 4) {
            roundend();
        }
        if( player.equals("One")) {
            firstP1();
        } else {
            firstP2();
        }
        break;

    case "Fold":
        P2 += pot;
        pot = 0;
        roundcount=0;
        turncount++; 

        out.print("P1: ");
        out.println(P1);
        out.print("P2: ");
        out.println(P2);
        out.println("Next turn");

        if (turncount  % 2 == 0) {
            player = "One";
        } else {
            player = "Two";         
        }

        if( player.equals("One")) {
            firstP1();
        } else {
            firstP2();
        }
        break;

    }
}

public static void P2afterbet() { //P2 move after P1 bet
    out.print("P2 - will you 'Bet', 'Call' or 'Fold'? ");
    move = myScanner.next();

    while (!move.equals("Bet") && !move.equals("Call") && !move.equals("Fold")){
    out.print("Please type 'Bet', 'Check' or 'Fold'");
    move = myScanner.next();
    }

    switch(move) {
    case "Bet":
        out.print("How much will you bet? ");
        betVal2 = myScanner.nextInt();
        while (betVal2 > P2) {
            out.print("You can not bet more than your chip count. How much will you bet? ");
            betVal2 = myScanner.nextInt();
        }
        while (betVal2 < betVal1) {
            out.print("You must bet at least ");
            out.print(betVal1);
            betVal2 = myScanner.nextInt();
        }
        pot += betVal2;
        P2 -= betVal2;
        //out.println(betVal);
        //out.print(pot);
        P1afterbet();
        break;

    case "Call":
        P2 -= betVal1;
        pot += betVal1;
        roundcount++;
        if (roundcount == 4){
            roundend();
        }
        if( player.equals("P1")) {
            firstP1();
        } else {
            firstP2();
        }
        break;

    case "Fold":
        P1 += pot;
        pot = 0;
        roundcount = 0;
        turncount++;

        out.print("P1: ");
        out.println(P1);
        out.print("P2: ");
        out.println(P2);
        out.println("Next turn");

        if (turncount  % 2 == 0) {
            player = "One";
        } else {
            player = "Two";         
        }

        if( player.equals("One")) {
            firstP1();
        } else {
            firstP2();
        }
        break;

    }
}

public static void P2aftercheck() { //P2 move after P1 check
    out.print("P2 - will you 'Bet', 'Check' or 'Fold'? ");
    move = myScanner.next();

    while (!move.equals("Bet") && !move.equals("Check") && !move.equals("Fold")){
    out.print("Please type 'Bet', 'Check' or 'Fold'");
    move = myScanner.next();
    }

    switch(move) {
    case "Bet":
        out.print("How much will you bet? ");
        betVal2 = myScanner.nextInt();
        while (betVal2 > P1) {
            out.print("You can not bet more than your chip count. How much will you bet? ");
            betVal2 = myScanner.nextInt();
        }
        pot += betVal2;
        P2 -= betVal2;
        //out.println(betVal);
        //out.print(pot);
        P1afterbet();
        break;

    case "Check":
        roundcount++;
        if (roundcount == 4){
            roundend();
        }
        if( player.equals("One")) {
            firstP1();
        } else {
            firstP2();
        }

        break;

    case "Fold":
        P1 += pot;
        pot = 0;
        roundcount=0;
        turncount++;

        out.print("P1: ");
        out.println(P1);
        out.print("P2: ");
        out.println(P2);
        out.println("Next turn");

        if (turncount  % 2 == 0) {
            player = "One";
        } else {
            player = "Two";         
        }

        if( player.equals("One")) {
            firstP1();
        } else {
            firstP2();
        }

        break;

    }
}

public static void roundend() {
    out.print("Who won the round? 'P1' or 'P2'? ");
    outcome = myScanner.next();
    turncount++;

    if (turncount  % 2 == 0) {
        player = "One";
    } else {
        player = "Two";         
    }

    while (!outcome.equals("P1") && !outcome.equals("P2")){
        out.print("Please type 'P1' or 'P2'");
        outcome = myScanner.next();
    }

    if (outcome.equals("P1")){
        P1 += pot;
        pot = 0;
        roundcount = 0;

        out.print("P1: ");
        out.println(P1);
        out.print("P2: ");
        out.println(P2);
        out.println("Next turn");

        if (P1 != 0 && P2 != 0){
            if( player.equals("One")) {
                firstP1();
            } else {
                firstP2();
            }
        } else if (P1 == 0) {
            out.print("P1 is out of chips. P2 Wins!");
        } else {
            out.print("P2 is out of chips. P2 Wins!");
        }
    } else {
        P2 += pot;
        pot = 0;
        roundcount = 0;

        out.print("P1: ");
        out.println(P1);
        out.print("P2: ");
        out.println(P2);
        out.println("Next turn");

        if (P1 != 0 && P2 != 0) {
            if( player.equals("P1")) {
                firstP1();
            } else {
                firstP2();
            }
        } else if (P1 == 0) {
            out.print("P1 is out of chips. P2 Wins!");
        } else {
            out.print("P2 is out of chips. P2 Wins!");
        }
    } 

    System.exit(0);
}

public static void main(String args[]){

    pot = 0;
    roundcount = 0; //status within turn i.e. Flop, Turn, River
    turncount = 2; //use for who starts

    out.print("Please enter starting chip count ");
    P1 = myScanner.nextInt();
    P2 = P1;

    firstP1();
}

}

4

2 に答える 2

1

はい。ただし、プログラムの設計方法を再考する必要があります。

これを行う最も簡単な方法は、Playerクラスを作成し、プレーヤーが実行するすべてのアクションをこのクラス内のメソッドとして実装することです。Player のチップを管理するには、変数Player.chipsをグローバルにアクセスできるようにするか、Player.getChips()やなどのメソッドで管理しますPlayer.setChips()

複数のプレーヤーの場合、 の配列がありますPlayer

Player[] Players; 
Players[0] = new Player();
Players[1] = new Player();

次の投稿がさらに役立つ場合があります (同様の問題ですが、 Poker の代わりに Blackjack を使用しています) - How to initialize an array of objects in Java .

于 2012-10-30T11:48:59.240 に答える
0

あなたが見逃している主なことは、メソッドがパラメーターを取ることができるということだと思います。

ですから、物事を次のようなスタイルにするのではなく、

private static void player1Move() {
    //player 1 takes his move
}

private static void player2Move() {
    //player 2 takes her move
}

あなたは持っているでしょう。

private static void move(int playerID) {
    //player playerID takes their move
}

Java の命名規則では、メソッド名とフィールド名は小文字で始まり、クラス名は大文字で始まる必要があります。また、メソッドが何か、便利なものを返すことができることを忘れないでください。すべてのメソッドはvoidです。呼び出し元の関数に何らかのステータスを返す方法を考えてみてください。

たとえばint getBet(int playerID)、ユーザーにベット額を入力するように要求し、それを (playerID パラメーターを使用して) チップ スタックと照合し、有効な場合はベット額を返すメソッドを作成できます。すべてを何度も書き直すよりずっといいですよね?

最後のヒント: 1行のコードをコピーしていることに気付いた場合は、何か問題があります。

編集: Nathan Dunn の回答も非常に関連性があります。Java はオブジェクト指向言語です。その事実を活用する方法を学びましょう。確かにPlayerクラスは必要です。

于 2012-10-30T11:48:11.870 に答える