java 记牌_(笔记)JAVA--集合实现斗地主洗牌、发牌、看牌(利用TreeSet排序)

创建HashMap,键是编号,值是牌

创建ArrayList,存储编号

创建花色数组和点数数组

从0开始往HashMap里面存储编号,并存储对应的牌。同时往ArrayList里面存储编号

洗牌(洗的是编号),用Collections的shuffle()方法实现

发牌(发的也是编号,为了保证编号是排序的,创建TreeSet集合接收)

定义方法看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)

调用方法

代码如下:

import java.util.ArrayList;

import java.util.Collections;

import java.util.HashMap;

import java.util.TreeSet;

public class ChinesePoker {

public static void main(String[] args) {

//创建HashMap,键是编号,值是牌

HashMap hm = new HashMap();

//创建ArrayList,存储编号

ArrayList arr = new ArrayList();

//创建花色数组

String[] Colors = {"♦", "♣", "♥", "♠"};

//牌数组

String[] Numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "k", "A", "2"};

//从0开始往HashMap里面存储编号,并存储对应的牌。同时往ArrayList里面存储编号

int index = 0;

for (String color : Colors) {

for (String Number : Numbers) {

hm.put(index, color + Number);

//存储编号到arr集合

arr.add(index);

index++;

}

}

hm.put(index, "小王");

arr.add(index);

index++;

hm.put(index, "大王");

arr.add(index);

//洗牌、该方法随机打乱

Collections.shuffle(arr);

//发牌,为了保证编号是排序的,创建TreeSet集合接收

TreeSet lYset = new TreeSet();

TreeSet llFset = new TreeSet();

TreeSet WZXset = new TreeSet();

TreeSet DPset = new TreeSet();

for (int i = 0; i < arr.size(); i++) {

int x = arr.get(i);

//后三张为底牌

if (i >= arr.size() - 3) {

DPset.add(x);

} else if (i % 3 == 0) { //为玩家一发牌

lYset.add(x);

} else if (i % 3 == 1) {//为玩家二发牌

llFset.add(x);

} else if (i % 3 == 2) {//为玩家三发牌

WZXset.add(x);

}

}

//调用方法

lookPoker("刘洋", lYset, hm);

lookPoker("刘亦菲", llFset, hm);

lookPoker("王祖贤", WZXset, hm);

lookPoker("底牌", DPset, hm);

}

public static void lookPoker(String name, TreeSet ts, HashMap hm) {

System.out.print(name + "的牌是:");

for (Integer key : ts) {

//通过键获取对应值,即编号对应的牌

String poker = hm.get(key);

System.out.print(poker + " ");

}

System.out.println();

}

}

运行效果如下:

66a66e39b54e1c487820e0dc91d8ac4c.png

扑克牌记牌系统需要实现的功能有:洗牌发牌、计算牌面点数、计算牌型、统计各种牌型出现的次数等。下面是一个简单的扑克牌记牌系统的 Java 实现,供参考: ```java import java.util.*; public class Poker { private List<Card> cards; public Poker() { cards = new ArrayList<>(); for (int suit = 0; suit < 4; suit++) { for (int rank = 1; rank <= 13; rank++) { cards.add(new Card(suit, rank)); } } } public void shuffle() { Collections.shuffle(cards); } public Card deal() { if (cards.isEmpty()) { return null; } else { return cards.remove(cards.size() - 1); } } public int getHandValue(List<Card> hand) { int value = 0; int aces = 0; for (Card card : hand) { if (card.getRank() == 1) { aces++; value += 11; } else if (card.getRank() >= 10) { value += 10; } else { value += card.getRank(); } } while (value > 21 && aces > 0) { value -= 10; aces--; } return value; } public String getHandType(List<Card> hand) { int[] counts = new int[14]; int maxCount = 0; for (Card card : hand) { counts[card.getRank()]++; maxCount = Math.max(maxCount, counts[card.getRank()]); } if (maxCount == 4) { return "Four of a kind"; } else if (maxCount == 3) { for (int rank = 1; rank <= 13; rank++) { if (counts[rank] == 2) { return "Full house"; } } return "Three of a kind"; } else if (maxCount == 2) { int pairs = 0; for (int rank = 1; rank <= 13; rank++) { if (counts[rank] == 2) { pairs++; } } if (pairs == 2) { return "Two pairs"; } else { return "One pair"; } } else { boolean straight = true; for (int rank = 1; rank <= 9; rank++) { if (counts[rank] != 1) { straight = false; break; } } if (straight && counts[10] == 1 && counts[11] == 1 && counts[12] == 1 && counts[13] == 1) { return "Royal flush"; } for (int rank = 1; rank <= 10; rank++) { if (counts[rank] != 1) { straight = false; break; } } if (straight) { return "Straight flush"; } for (int rank = 1; rank <= 13; rank++) { if (counts[rank] == 5) { return "Straight"; } } return "High card"; } } public Map<String, Integer> getCounts() { Map<String, Integer> counts = new HashMap<>(); for (int suit = 0; suit < 4; suit++) { String suitName = Card.suitNames[suit]; for (int rank = 1; rank <= 13; rank++) { String cardName = Card.rankNames[rank] + " of " + suitName; counts.put(cardName, 0); } } for (Card card : cards) { String cardName = card.toString(); counts.put(cardName, counts.get(cardName) + 1); } return counts; } } class Card { private int suit; private int rank; public static String[] suitNames = {"Clubs", "Diamonds", "Hearts", "Spades"}; public static String[] rankNames = {"", "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"}; public Card(int suit, int rank) { this.suit = suit; this.rank = rank; } public int getSuit() { return suit; } public int getRank() { return rank; } public String toString() { return rankNames[rank] + " of " + suitNames[suit]; } } ``` 使用方式: ```java Poker poker = new Poker(); poker.shuffle(); List<Card> hand = new ArrayList<>(); for (int i = 0; i < 5; i++) { hand.add(poker.deal()); } System.out.println("Hand: " + hand); System.out.println("Hand value: " + poker.getHandValue(hand)); System.out.println("Hand type: " + poker.getHandType(hand)); System.out.println("Counts: " + poker.getCounts()); ``` 注意:这只是一个简单的实现,还有很多功能可以添加,例如判断是否有癞子牌、支持多副牌等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值