发牌游戏:Java代码实现
发牌游戏是一个非常受欢迎的桌面游戏,我们可以通过编写Java代码来实现这个游戏的逻辑。在这篇文章中,我将向您展示如何用Java语言实现一副牌的创建、洗牌和发牌。
1. 创建一副牌
首先,我们需要创建一副牌,包括四种花色和十三种点数。在这个示例中,我们将去除大小王、三个2和一个A,共48张牌。
String[] suits = {"♠", "♥", "♣", "♦"}; // 四种花色
String[] ranks = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"}; // 十三种点数
ArrayList<String> deck = new ArrayList<String>(); // 创建一副牌
for (String suit : suits) {
for (String rank : ranks) {
String card = suit + rank;
if (!"♠2".equals(card) && !"♥2".equals(card) && !"♦2".equals(card) && !"♠A".equals(card)) {
deck.add(card);
} // 删除大小王、三个2和一个A,共48张牌
}
}
2. 洗牌
接下来,我们需要将这幅牌洗混。在Java中,我们可以使用 Collections.shuffle()
方法来打乱 List 中的元素。
Collections.shuffle(deck); // 洗牌
3. 发牌
现在,我们已经创建好了一副洗过的牌。接下来,我们需要将这副牌分发给多个玩家。假设有三个玩家,每人分到16张牌。我们可以使用一个二维数组 hands
来表示每个玩家手中的牌。
int numPlayers = 3; // 玩家数量
int numCards = 16; // 每人16张牌
ArrayList<String>[] hands = new ArrayList[numPlayers]; // 创建一个二维数组来保存每个玩家手中的牌
for (int i = 0; i < numPlayers; i++) {
hands[i] = new ArrayList<>();
}
for (int i = 0; i < numPlayers * numCards; i++) {
String card = deck.get(i);
int playerIndex = i % numPlayers;
hands[playerIndex].add(card); // 将每张牌依次分配给不同的玩家
}
4. 对牌进行排序
最后,我们需要对每个玩家手中的牌进行排序。在这个示例中,我们将使用一个自定义的比较器来对牌进行排序。我们还编写了一个转换函数 convertDeck()
来将牌面中的字母(例如 A、J、Q 和 K)转换为数字(例如 1、11、12 和 13)。
Comparator<String> cmp = (s1, s2) -> {
String substring = s1.substring(1, 2);
String substring1 = s2.substring(1, 2);
substring=convertDeck(substring);
substring1=convertDeck(substring1);
return Integer.parseInt(substring) - Integer.parseInt(substring1);
}; // 创建一个自定义的比较器,用于对牌进行排序
for (int i = 0; i < numPlayers; i++) {
ArrayList<String> hand = hands[i];
Collections.sort(hand, cmp); // 对每个玩家手中的牌进行排序
}
最后,在控制台上打印出每个玩家手中的牌。
for (int i = 0; i < numPlayers; i++) {
System.out.println("游戏者 " + (i + 1) + "手里的牌:");
System.out.println(hands[i]); // 打印
的完整代码如下所示:
package org.codertao;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
/**
* @BelongsProject: MyNotes
* @BelongsPackage: org.codertao
* @Author: bainianshushu
* @CreateTime: 2023-05-03 08:19
* @Description: 发牌
* @Version: 1.0
*/
public class DealCards {
public static void main(String[] args) {
// 创建一副牌,去除大小王、三个2和一个A,共48张牌
String[] suits = {"♠", "♥", "♣", "♦"};
String[] ranks = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
ArrayList<String> deck = new ArrayList<String>();
for (String suit : suits) {
for (String rank : ranks) {
String card = suit + rank;
if (!"♠2".equals(card) && !"♥2".equals(card) && !"♦2".equals(card) && !"♠A".equals(card)) {
deck.add(card);
}
}
}
// 洗牌
Collections.shuffle(deck);
// 发牌
int numPlayers = 3;
int numCards = 16;
// 发牌
ArrayList<String>[] hands = new ArrayList[numPlayers];
for (int i = 0; i < numPlayers; i++) {
hands[i] = new ArrayList<>();
}
for (int i = 0; i < numPlayers * numCards; i++) {
String card = deck.get(i);
int playerIndex = i % numPlayers;
hands[playerIndex].add(card);
}
Comparator<String> cmp = (s1, s2) -> {
String substring = s1.substring(1, 2);
String substring1 = s2.substring(1, 2);
substring=convertDeck(substring);
substring1=convertDeck(substring1);
return Integer.parseInt(substring) - Integer.parseInt(substring1);
};
// 遍历每个人手里拿到的牌
for (int i = 0; i < numPlayers; i++) {
System.out.println("游戏者 " + (i + 1) + "手里的牌:");
System.out.println(hands[i]);
ArrayList<String> hand = hands[i];
// 对手牌排序
Collections.sort(hand, cmp);
for (String card : hands[i]) {
System.out.println(card);
}
}
}
/**
* 转换牌面
* @param substring 牌面
* @return 转换后的牌面
*/
public static String convertDeck(String substring){
switch (substring) {
case "1":
substring = "10";
break;
case "A":
substring = "1";
break;
case "J":
substring = "11";
break;
case "Q":
substring = "12";
break;
case "K":
substring = "13";
break;
default:
break;
};
return substring;
}
}