用java写一个纸牌游戏
时间: 2023-12-18 12:05:52 浏览: 24
好的,这里是一个简单的Java纸牌游戏示例,它实现了黑杰克(Blackjack)游戏:
```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class BlackjackGame {
private static final int BLACKJACK = 21;
private static final int DEALER_STAND_VALUE = 17;
private List<Card> deck;
private List<Card> playerHand;
private List<Card> dealerHand;
private Scanner scanner;
public BlackjackGame() {
deck = new ArrayList<>();
playerHand = new ArrayList<>();
dealerHand = new ArrayList<>();
scanner = new Scanner(System.in);
}
public void play() {
System.out.println("Welcome to Blackjack!");
while (true) {
// 初始化
deck.clear();
playerHand.clear();
dealerHand.clear();
createDeck();
shuffleDeck();
dealCards();
// 玩家回合
playerTurn();
// 庄家回合
dealerTurn();
// 结算
int playerScore = calculateScore(playerHand);
int dealerScore = calculateScore(dealerHand);
System.out.println("Player's hand: " + playerHand + " (" + playerScore + ")");
System.out.println("Dealer's hand: " + dealerHand + " (" + dealerScore + ")");
if (playerScore == BLACKJACK) {
System.out.println("Congratulations! You win!");
} else if (playerScore > BLACKJACK) {
System.out.println("Bust! You lose!");
} else if (dealerScore > BLACKJACK) {
System.out.println("Dealer busts! You win!");
} else if (playerScore == dealerScore) {
System.out.println("Push!");
} else if (playerScore > dealerScore) {
System.out.println("You win!");
} else {
System.out.println("You lose!");
}
// 询问是否继续游戏
System.out.print("Play again? (y/n) ");
String answer = scanner.nextLine();
if (!answer.equalsIgnoreCase("y")) {
break;
}
}
System.out.println("Thanks for playing!");
scanner.close();
}
private void createDeck() {
for (Suit suit : Suit.values()) {
for (Rank rank : Rank.values()) {
deck.add(new Card(suit, rank));
}
}
}
private void shuffleDeck() {
Collections.shuffle(deck);
}
private void dealCards() {
playerHand.add(dealCard());
dealerHand.add(dealCard());
playerHand.add(dealCard());
dealerHand.add(dealCard());
}
private Card dealCard() {
return deck.remove(0);
}
private int calculateScore(List<Card> hand) {
int score = 0;
int aceCount = 0;
for (Card card : hand) {
if (card.getRank().getValue() == 1) {
aceCount++;
score += 11;
} else if (card.getRank().getValue() >= 10) {
score += 10;
} else {
score += card.getRank().getValue();
}
}
while (score > BLACKJACK && aceCount > 0) {
score -= 10;
aceCount--;
}
return score;
}
private void playerTurn() {
while (true) {
int score = calculateScore(playerHand);
System.out.println("Player's hand: " + playerHand + " (" + score + ")");
if (score == BLACKJACK) {
break;
} else if (score > BLACKJACK) {
break;
}
System.out.print("Hit or stand? (h/s) ");
String answer = scanner.nextLine();
if (answer.equalsIgnoreCase("h")) {
playerHand.add(dealCard());
} else {
break;
}
}
}
private void dealerTurn() {
while (calculateScore(dealerHand) < DEALER_STAND_VALUE) {
dealerHand.add(dealCard());
}
}
public static void main(String[] args) {
BlackjackGame game = new BlackjackGame();
game.play();
}
}
enum Suit {
CLUBS, DIAMONDS, HEARTS, SPADES
}
enum Rank {
ACE(1), TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), NINE(9), TEN(10), JACK(10), QUEEN(10), KING(10);
private int value;
Rank(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
class Card {
private Suit suit;
private Rank rank;
public Card(Suit suit, Rank rank) {
this.suit = suit;
this.rank = rank;
}
public Suit getSuit() {
return suit;
}
public Rank getRank() {
return rank;
}
@Override
public String toString() {
return rank + " of " + suit;
}
}
```
这个代码实现了一个简单的黑杰克游戏,玩家可以选择是否要 “hit”(抽一张牌)或 “stand”(不抽牌)。计分规则是将 A 点数计为 11,除此之外,点数大于 10 的牌都计为 10。当玩家或庄家的点数超过 21 时,该玩家输掉游戏。