我正在尝试使用一个项目的以下规则来实现二十一点游戏:
游戏进行如下:向玩家发两张牌,正面朝上。如果总分正好是21,则玩家立即获胜。如果总数不为21,则发给发牌者两张牌,一张朝上,一张朝下。然后,玩家确定是要向发牌人索要另一张牌(称为“命中”)还是用其当前手“停留”。玩家可能会要求几次“击中”。当玩家决定“留下”时,发牌人便开始游戏。如果发牌者有21,则立即赢得比赛。否则,发牌人必须进行“击中”,直到手中的总分达到17点或以上,此时发牌人必须“停留”。如果发牌者在进行“击中”时超过21分,则游戏结束并且玩家获胜。 。如果庄家的积分总计为21,则庄家立即获胜。庄家和玩家玩完手后,总分最高的是获胜者。重复游戏直到玩家决定退出或用完钱下注。
我有一个西服枚举,等级枚举,卡片类别,甲板类别和主要类别。
排名枚举
public enum Rank
{
Ace,
Two,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
Ten,
Jack,
Queen,
King
}
Suit枚举
public enum Suit
{
Spade,
Heart,
Club,
Diamond
}
卡类:
public class Card
{
private Suit suit;
private Rank rank;
Card()
{
suit = null;
rank = null;
}
Card(Suit newSuit, Rank newRank)
{
suit = newSuit;
rank = newRank;
}
public String toString()
{
return(suit + "||" + rank);
}
public Rank getRank()
{
return rank;
}
}
甲板类:
import java.util.ArrayList;
import java.util.Random;
class Deck
{
protected ArrayList<Card> deck;
Deck()
{
deck = new ArrayList<Card>();
}
public void setCardDeck()
{
for(Suit newSuit : Suit.values())
{
for(Rank newRank: Rank.values())
{
deck.add(new Card(newSuit, newRank));
}
}
}
public void shuffle()
{
ArrayList<Card>shuffleDeck = new ArrayList<Card>();
int shuffleNum = 0;
int deckSize = deck.size();
for(int i = 0; i < deckSize; i++)
{
shuffleNum = (int)(Math.random() * deck.size());
shuffleDeck.add(deck.get(shuffleNum));
deck.remove(shuffleNum);
}
deck = shuffleDeck;
}
public String toString()
{
String cardDisplay = "";
for(Card newCard : deck)
{
cardDisplay += "\n" + newCard.toString();
}
return cardDisplay;
}
public void removeCard(int aCard)
{
deck.remove(aCard);
}
public Card dealCard(int aCard)
{
return deck.get(aCard);
}
public void restoreCard(Card restoreCard)
{
deck.add(restoreCard);
}
public void draw(Deck cardSource)
{
deck.add(cardSource.dealCard(0));
cardSource.removeCard(0);
}
public int deckSize()
{
return deck.size();
}
public void resetDeck(Deck reset)
{
int newDeckSize = deck.size();
//put cards into the reset deck
for(int i = 0; i < newDeckSize; i++)
{
reset.restoreCard(dealCard(i));
}
for(int i = 0; i < newDeckSize; i++)
{
removeCard(0);
}
}
public int cardRank()
{
int handPoint = 0;
int ace = 0;
for(Card newCard : deck)
{
switch(newCard.getRank())
{
case Ace:
ace += 1;
break;
case Two:
handPoint += 2;
break;
case Three:
handPoint += 3;
break;
case Four:
handPoint += 4;
break;
case Five:
handPoint += 5;
break;
case Six:
handPoint += 6;
break;
case Seven:
handPoint += 7;
break;
case Eight:
handPoint += 8;
break;
case Nine:
handPoint += 9;
break;
case Ten:
case Jack:
case Queen:
case King:
handPoint += 10;
break;
}
}
//For loop to locate the aces in hand
for(int i = 0; i < ace; i++)
{
if(handPoint > 10)
{
handPoint += 1;
}
else if(handPoint <= 10)
{
handPoint += 11;
}
}
return handPoint;
}
}
主类:
import java.util.*;
public class BlackjackGameSimulator
{
private static Scanner sc = new Scanner(System.in);
private static double gameMoney = 500;
private static double bet;
private static boolean endGame = false;
private static String playOrNot;
public static void main(String[] args)
{
Deck newDeck = new Deck();
Deck player = new Deck();
Deck dealer = new Deck();
newDeck.setCardDeck();
newDeck.shuffle();
while(gameMoney > 0)
{
System.out.println("Would you like to play Blackjack?");
playOrNot = sc.nextLine();
if(playOrNot.equalsIgnoreCase("no"))
{
System.out.println("Bye! See you next time.");
break;
}
if(playOrNot.equalsIgnoreCase("yes"))
{
System.out.println("You have $" + gameMoney + ". How much are you placing your bet?");
bet = sc.nextDouble();
sc.nextLine();
while(bet < 0 || bet > gameMoney)
{
if(bet < 0 || bet > gameMoney)
{
System.out.println("Invalid input. Please place your bet between $0 and " + "$" + gameMoney + ".");
break;
}
}
}
//Player gets 2 cards in the first round
player.draw(newDeck);
player.draw(newDeck);
dealer.draw(newDeck);
dealer.draw(newDeck);
while(true)
{
System.out.println("Your hand: " + player.toString() + "\n");
System.out.println("Your total points are " + player.cardRank());
System.out.println();
if(player.cardRank() == 21 && endGame == false)
{
winner(player, dealer);
resetRound(newDeck, player, dealer);
continue;
}
else
{
//Dealer draws the first card in the current deck
System.out.println("Dealer hand: " + dealer.dealCard(0).toString() + " and ????");
System.out.println("Would you like to hit or stand?");
String reaction = sc.nextLine();
if(reaction.equalsIgnoreCase("hit"))
{
player.draw(newDeck);
System.out.println("You draw " + player.dealCard(player.deckSize() - 1).toString());
if(player.cardRank() < 21)
{
break;
}
if(player.cardRank() > 21)
{
loser(player, dealer);
resetRound(newDeck, player, dealer);
break;
}
}
if(reaction.equalsIgnoreCase("stand"))
{
break;
}
}
System.out.println("Dealer hand: " + dealer.toString());
if((dealer.cardRank() > player.cardRank()) && endGame == false)
{
loser(player, dealer);
resetRound(newDeck, player, dealer);
continue;
}
while((dealer.cardRank() < 17) && endGame == false)
{
dealer.draw(newDeck);
System.out.println("Dealer draws" + dealer.dealCard(dealer.deckSize() - 1).toString());
}
System.out.println("Dealer's current points are " + dealer.cardRank());
if((dealer.cardRank() > 21) && endGame == false)
{
winner(player, dealer);
resetRound(newDeck, player, dealer);
continue;
}
if((player.cardRank() == dealer.cardRank()) && endGame == false)
{
tie(player, dealer);
resetRound(newDeck, player, dealer);
continue;
}
if((player.cardRank() > dealer.cardRank()) && endGame == false)
{
winner(player, dealer);
resetRound(newDeck, player, dealer);
continue;
}
if((player.cardRank() < dealer.cardRank()) && endGame == false)
{
loser(player, dealer);
resetRound(newDeck, player, dealer);
continue;
}
//Return player's and dealer's cards to the deck
player.resetDeck(newDeck);
dealer.resetDeck(newDeck);
}
}
}
private static void winner(Deck player, Deck dealer)
{
System.out.println("You win! You current points are " + player.cardRank() + ". Dealer current points are " + dealer.cardRank());
gameMoney += bet;
endGame = true;
}
private static void loser(Deck player, Deck dealer)
{
System.out.println("You lose! You current points are " + player.cardRank() + ". Dealer current points are " + dealer.cardRank());
gameMoney -= bet;
endGame = true;
}
private static void tie(Deck player, Deck dealer)
{
System.out.println("Push! It's a tie. You current points are " + player.cardRank() + ". Dealer current points are " + dealer.cardRank());
gameMoney -= bet;
endGame = true;
}
private static void resetRound(Deck newDeck, Deck player, Deck dealer)
{
player.resetDeck(newDeck);
dealer.resetDeck(newDeck);
}
}
我现在很难完成正确的循环。例如,如果我打了,它只会发牌,但不会显示积分,并根据情况结束或继续游戏;如果我站着,它会得分并提示我是否要玩游戏。
任何帮助将不胜感激。我非常困扰这个问题。提前非常感谢!
基本上,您的问题是错误地使用了continue vs. break指令。
break每次结束时都需要使用,因为它将使执行流返回到外部while循环,重置手并进行新的下注。
[继续在用户玩耍时需要使用以保持手在循环中。
而且我不确定为什么您添加了“ endGame”条件,但是它对您的执行流程造成了破坏性影响,因此我将其完全删除。确实,您的最终比赛条件是玩家赚了钱或他通过回答no来终止。
这里是您的主体的修订版。我对其进行了简短的测试,因此可能存在其他缺陷。
public class BlackjackGameSimulator {
private static Scanner sc = new Scanner(System.in);
private static double gameMoney = 500;
private static double bet;
private static String playOrNot;
public static void main(String[] args)
{
Deck newDeck = new Deck();
Deck player = new Deck();
Deck dealer = new Deck();
newDeck.setCardDeck();
newDeck.shuffle();
while(gameMoney > 0)
{
System.out.println("Would you like to play Blackjack?");
playOrNot = sc.nextLine();
if(playOrNot.equalsIgnoreCase("no"))
{
System.out.println("Bye! See you next time.");
break;
}
if(playOrNot.equalsIgnoreCase("yes"))
{
System.out.println("You have $" + gameMoney + ". How much are you placing your bet?");
bet = sc.nextDouble();
sc.nextLine();
while(bet < 0 || bet > gameMoney)
{
System.out.println("Invalid input. Please place your bet between $0 and " + "$" + gameMoney + ".");
bet = sc.nextDouble();
sc.nextLine();
}
}
//Player gets 2 cards in the first round
player.draw(newDeck);
player.draw(newDeck);
dealer.draw(newDeck);
dealer.draw(newDeck);
while(true)
{
System.out.println("Your hand: " + player.toString() + "\n");
System.out.println("Your total points are " + player.cardRank());
System.out.println();
if(player.cardRank() == 21)
{
winner(player, dealer);
resetRound(newDeck, player, dealer);
break;
}
else
{
//Dealer draws the first card in the current deck
System.out.println("Dealer hand: " + dealer.dealCard(0).toString() + " and ????");
System.out.println("Would you like to hit or stand?");
String reaction = sc.nextLine();
if(reaction.equalsIgnoreCase("hit"))
{
player.draw(newDeck);
System.out.println("You draw " + player.dealCard(player.deckSize() - 1).toString());
if(player.cardRank() < 21)
{
continue;
}
if(player.cardRank() > 21)
{
loser(player, dealer);
resetRound(newDeck, player, dealer);
break;
}
}
}
System.out.println("Dealer hand: " + dealer.toString());
if((dealer.cardRank() > player.cardRank()))
{
loser(player, dealer);
resetRound(newDeck, player, dealer);
break;
}
while((dealer.cardRank() < 17))
{
dealer.draw(newDeck);
System.out.println("Dealer draws " + dealer.dealCard(dealer.deckSize() - 1).toString());
}
System.out.println("Dealer's current points are " + dealer.cardRank());
if((dealer.cardRank() > 21))
{
winner(player, dealer);
resetRound(newDeck, player, dealer);
break;
}
if((player.cardRank() == dealer.cardRank()))
{
tie(player, dealer);
resetRound(newDeck, player, dealer);
break;
}
if((player.cardRank() > dealer.cardRank()))
{
winner(player, dealer);
resetRound(newDeck, player, dealer);
break;
}
if((player.cardRank() < dealer.cardRank()))
{
loser(player, dealer);
resetRound(newDeck, player, dealer);
break;
}
//Return player's and dealer's cards to the deck
player.resetDeck(newDeck);
dealer.resetDeck(newDeck);
}
}
}
private static void winner(Deck player, Deck dealer)
{
System.out.println("You win! You current points are " + player.cardRank() + ". Dealer current points are " + dealer.cardRank());
gameMoney += bet;
}
private static void loser(Deck player, Deck dealer)
{
System.out.println("You lose! You current points are " + player.cardRank() + ". Dealer current points are " + dealer.cardRank());
gameMoney -= bet;
}
private static void tie(Deck player, Deck dealer)
{
System.out.println("Push! It's a tie. You current points are " + player.cardRank() + ". Dealer current points are " + dealer.cardRank());
gameMoney -= bet;
}
private static void resetRound(Deck newDeck, Deck player, Deck dealer)
{
player.resetDeck(newDeck);
dealer.resetDeck(newDeck);
}
}
希望这会有所帮助!
欢呼声