简单的扑克牌游戏 梭哈:
梭哈用的是扑克牌共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);
}
}