Java 纸牌游戏:模拟扑克牌比大小

本文将使用 Java 语言编写一个模拟纸牌游戏的软件,实现两名玩家比大小的功能。游戏包含以下步骤:

  1. 创建一副扑克牌

    • 包括四种花色:黑桃、红桃、梅花、方片。
    • 包括十三种点数:2-10、J、Q、K、A。
  2. 创建两名玩家

    • 玩家至少要有 ID(由玩家自己创建)、姓名和手牌等属性。
    • 手牌为扑克牌的集合。
  3. 随机洗牌

    • 将创建好的扑克牌进行随机洗牌。
  4. 发牌

    • 从洗牌后的扑克牌的第一张开始,发给每个玩家,按照一人一张的方式,每人发三张牌。
  5. 比较大小

    • 比较两名玩家手中的扑克牌,比较规则为:
      • 取两人各自手中点数最大的牌进行比较,点数大的赢。
      • 若两人各自的点数最大的牌相等,则再按照花色比较,大小由黑(4)、红(3)、梅(2)、方(1)决定,花色大者获胜。
  6. 输出结果

    • 输出比较结果,显示获胜者的 ID 和手牌。

代码实现

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Poker {
    private List<Card> cards;

    public Poker() {
        cards = new ArrayList<>();
        for (int i = 2; i <= 10; i++) {
            cards.add(new Card('黑桃', i));
            cards.add(new Card('红桃', i));
            cards.add(new Card('梅花', i));
            cards.add(new Card('方片', i));
        }
        cards.add(new Card('黑桃', 'J'));
        cards.add(new Card('黑桃', 'Q'));
        cards.add(new Card('黑桃', 'K'));
        cards.add(new Card('黑桃', 'A'));
        cards.add(new Card('红桃', 'J'));
        cards.add(new Card('红桃', 'Q'));
        cards.add(new Card('红桃', 'K'));
        cards.add(new Card('红桃', 'A'));
        cards.add(new Card('梅花', 'J'));
        cards.add(new Card('梅花', 'Q'));
        cards.add(new Card('梅花', 'K'));
        cards.add(new Card('梅花', 'A'));
        cards.add(new Card('方片', 'J'));
        cards.add(new Card('方片', 'Q'));
        cards.add(new Card('方片', 'K'));
        cards.add(new Card('方片', 'A'));
    }

    public void shuffle() {
        Collections.shuffle(cards);
    }

    public Card getCard() {
        if (cards.size() > 0) {
            return cards.remove(0);
        }
        return null;
    }
}

class Card implements Comparable<Card> {
    private String suit;
    private String rank;
    private int point;

    public Card(String suit, int point) {
        this.suit = suit;
        this.point = point;
        this.rank = String.valueOf(point);
    }

    public Card(String suit, String rank) {
        this.suit = suit;
        this.rank = rank;
        if (rank.equals('J')) {
            point = 11;
        } else if (rank.equals('Q')) {
            point = 12;
        } else if (rank.equals('K')) {
            point = 13;
        } else if (rank.equals('A')) {
            point = 14;
        }
    }

    public String getSuit() {
        return suit;
    }

    public String getRank() {
        return rank;
    }

    public int getPoint() {
        return point;
    }

    @Override
    public int compareTo(Card o) {
        if (point > o.point) {
            return 1;
        } else if (point < o.point) {
            return -1;
        } else {
            int s1 = getSuitValue(suit);
            int s2 = getSuitValue(o.getSuit());
            if (s1 > s2) {
                return 1;
            } else if (s1 < s2) {
                return -1;
            } else {
                return 0;
            }
        }
    }

    private int getSuitValue(String suit) {
        if (suit.equals('黑桃')) {
            return 4;
        } else if (suit.equals('红桃')) {
            return 3;
        } else if (suit.equals('梅花')) {
            return 2;
        } else if (suit.equals('方片')) {
            return 1;
        }
        return 0;
    }

    @Override
    public String toString() {
        return suit + rank;
    }
}

class Player {
    private String id;
    private String name;
    private List<Card> hand;

    public Player(String id, String name) {
        this.id = id;
        this.name = name;
        hand = new ArrayList<>();
    }

    public void addCard(Card card) {
        hand.add(card);
    }

    public void sortHand() {
        Collections.sort(hand);
    }

    public Card getMaxCard() {
        if (hand.size() > 0) {
            sortHand();
            return hand.get(hand.size() - 1);
        }
        return null;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public List<Card> getHand() {
        return hand;
    }
}

class Game {
    private Poker poker;
    private Player player1;
    private Player player2;

    public Game(String id1, String name1, String id2, String name2) {
        poker = new Poker();
        player1 = new Player(id1, name1);
        player2 = new Player(id2, name2);
    }

    public void start() {
        poker.shuffle();
        for (int i = 0; i < 3; i++) {
            player1.addCard(poker.getCard());
            player2.addCard(poker.getCard());
        }
        System.out.println(player1.getName() + '的手牌:' + player1.getHand());
        System.out.println(player2.getName() + '的手牌:' + player2.getHand());

        Card maxCard1 = player1.getMaxCard();
        Card maxCard2 = player2.getMaxCard();
        if (maxCard1.compareTo(maxCard2) > 0) {
            System.out.println(player1.getName() + '获胜!');
            System.out.println('最大的牌是:' + maxCard1);
        } else if (maxCard1.compareTo(maxCard2) < 0) {
            System.out.println(player2.getName() + '获胜!');
            System.out.println('最大的牌是:' + maxCard2);
        } else {
            System.out.println('平局!');
            System.out.println('最大的牌是:' + maxCard1);
        }
    }

    public static void main(String[] args) {
        Game game = new Game('001', '小明', '002', '小红');
        game.start();
    }
}

代码说明

  • Poker 类: 代表一副扑克牌,包含创建、洗牌、发牌等功能。
  • Card 类: 代表一张扑克牌,包含花色、点数、比较大小等功能。
  • Player 类: 代表一个玩家,包含 ID、姓名、手牌等功能。
  • Game 类: 代表游戏,包含开始游戏、发牌、比较大小、输出结果等功能。

运行结果

程序运行后,将会输出两名玩家的手牌和最终的获胜者以及最大的牌。

总结

本文通过 Java 代码实现了简单的纸牌游戏,通过该例子,可以了解如何使用 Java 进行面向对象的编程,以及如何实现简单的游戏逻辑。


原文地址: https://www.cveoy.top/t/topic/oQXj 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录