Перестановки Java



Я пытаюсь написать программу, которая может отслеживать количество фишек у каждого игрока в покер. Это не игра в покер, а всего лишь программа, которая может сохранять количество фишек у каждого игрока. Тем не менее, я хочу иметь возможность "ставить", "колл", "фолд" и т. д. и иметь возможность автоматически отслеживать.



Мой вопрос в том, есть ли способ регулировать количество игроков, не записывая каждую перестановку? В настоящее время он может отслеживать только 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();
}


}

582   2  

2 ответов:

Да, но вам нужно будет переосмыслить то, как разработана ваша программа.

Самый простой способ сделать это-создать класс Player и реализовать каждое действие, которое игрок выполняет как метод в этом классе. Для управления фишками игрока у вас будет переменная Player.chips, которая либо глобально доступна, либо управляется такими методами, как Player.getChips() и Player.setChips().

Для нескольких игроков у вас будет массив Player's ie.

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

Вам может помочь следующее сообщение еще (аналогичная проблема, но с использованием блэкджека вместо покера) - как инициализировать массив объектов в Java.

Я думаю, что главное, что вы упускаете, - это то, что методы могут принимать параметры.

Поэтому вместо того, чтобы иметь вещи в стиле;

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) и возвращает сумму своей ставки, когда она действительна. Гораздо лучше, чем переписывать все снова и снова, верно?

Последний совет: если вы обнаружите, что копируете одну строку кода, Вы делаете что-то неправильно.

Редактировать: ответ Натан Данн тоже очень актуальна. Java-это объектно-ориентированный язык язык, научись использовать этот факт. Вам определенно нужен класс Player.

Comments

    Ничего не найдено.