Bootstrap

Java顺序表 实现扑克牌游戏简单 (梭哈 / 斗牛)

  简单的扑克牌游戏 梭哈:
  梭哈用的是扑克牌共52张牌,因为不容易出好牌,也有去掉 234567 的简易玩法,规则玩法花样很多。
  在这里我们采用:52 张牌,3 个人,一人 5 张牌,按规则对牌面大小进行比较 ,这样的方式进行游戏。

牌型比较:
同花顺>四条>满堂红>同花>顺子>三条>二对>单对>散牌。
数字比较:
A>K>Q>J>10>9>8 >7>6>5>4>3>2
花式比较:
黑桃>红桃>草花>方块

1 创建一张牌

将具体的扑克牌抽象,使用主要的信息就可以了,主要依据花色和点数就可以进行游戏。注意,花色和点数用 String 来设置。

public class Card {
    // 花色
    public String suit;
    // 点数
    public String rank;

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

    @Override
    public String toString() {
        return "[" + this.suit + this.rank + "]";
    }
}

2 创建一副牌

4 种花色( ♥ , ♦ , ♣ , ♠ ) * 13个点数( 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , J , Q , K , A ),以及大鬼小鬼。

// 给定扑克牌的花色
public static final String[] suits = {"♥","♦","♣","♠"};
// 给定扑克牌的点数
public static final String[] rank = {
"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
// 创建一副牌
private static List<Card> buyPoker() {
    List<Card> poker = new ArrayList<>();
    for (int i = 0; i < suits.length; i++) {
        for (int j = 0; j < rank.length; j++) {
            poker.add(new Card(suits[i],rank[j]));
        }
    }
    poker.add(new Card("","big Joker"));
    poker.add(new Card("","small Joker"));
    return poker;
}

3 洗牌

洗牌思路:
从最后开始循环,每取到一个元素,就将这个元素与它之前的、随机的一个元素进行交换,直到循环到第一个元素。

// 因为是可变对象,所以不用返回值,就可以修改到 List
private static void shuffle(List<Card> poker) {
    Random random = new Random();
    for (int i = poker.size() - 1; i > 0 ; i--) {
    // 获取 0 ~ i 的随机数作为位置
        int pos = random.nextInt(i);
        swap(poker,i,pos);
    }
}

private static void swap(List<Card> poker, int i, int pos) {
    Card tmp = poker.get(i);
    poker.set(i,poker.get(pos));
    poker.set(pos,tmp);
}

4 发牌 / 展示手牌

因为梭哈中不用大小鬼,我们在发牌时,去掉大小鬼,然后三个玩家一人发 5 张扑克牌,按规则比大小。

  public static void main(String[] args) {
        // 1.创建一副牌
        List<Card> poker = buyPoker();

        // 2.洗牌
        shuffle(poker);
//        System.out.println(poker);

        // 3.发牌
        // 三个玩家,每个人手中发五张牌
//        List<Card> player1 = new ArrayList<>();
//        List<Card> player2 = new ArrayList<>();
//        List<Card> player3 = new ArrayList<>();
        // 可以把上面三个人放到一个 List 中
        // plays 类型仍然是 List, 泛型参数是 List<Card>
        // 每个元素就是一个 List<Card>
        List<List<Card>> players = new ArrayList<>();
        // 每次 add 的元素都是一个 ArrayList<Card> 类型
        players.add(new ArrayList<>());
        players.add(new ArrayList<>());
        players.add(new ArrayList<>());
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                // 获得要发的牌:
                // remove 移除第一张牌,就像发牌时从最上面开始发
                // 该方法会返回要移除的元素的值
                Card top = poker.remove(0);
                if (top.rank.equals("big Joker") || top.rank.equals("small Joker")) {
                    top = poker.remove(0);
                }
                // 找到人:
                // 发给第 j 个人
                List<Card> player = players.get(j);
                // 把牌给到人
                player.add(top);
            }
        }

        // 4. 展示手牌,按照一定规则比较大小
        for (int i = 0; i < players.size(); i++) {
            List<Card> player = players.get(i);
            System.out.println("玩家" + i + "的手牌是:" + player);
        }
    }

在这里插入图片描述

;