这次我们来谈谈关于斗地主的发牌的一些简单操作(54张牌,考虑点数,花色;三名玩家,其中地主比其他玩家多3张牌),由于竞技的公平性,我们一定得要随机牌型,所以这里我们主要会用到Random类的一些基本用法,下面我们来看看具体实现方法吧:
- 众所周知,三人斗地主地主会多三张牌,所以我们没办法仅凭一个集合遍历出三个不同数据量的数组,所以我们干脆把所有54张牌全部罗列出来,并创建三个不同的动态数组分别表示三个角色用来存储三人的牌;
- 我们需要定义一个发牌方法用来完成我们所需的功能,这里我的设计方法是这样的:通过前面定义的一个完整数组的索引随机调用(Random),随后根据动态数组的特性,先定义三个空的动态数组用来存储三人的牌,然后输出这三个动态数组,即为我们所要求的三人的手牌;
- 需要注意的一点是我们在执行完一次Random之后会继续执行新的Random,所以这里会采用递归的方法,以此作为我们的发牌顺序;
- 最后我们在main方法中调用此方法即可。
import java.util.ArrayList;
import java.util.Random;
/**
* 参考斗地主的游戏规则,完成一个发牌的功能
* (54张牌,考虑点数,花色;三名玩家,其中地主比其他玩家多3张牌)
*
* @author Wxp
*
*/
public class Test4 {
// 首先把一副完整的扑克牌通过数组形式罗列出来
String[] pai = { "梅花A", "梅花2", "梅花3", "梅花4", "梅花5", "梅花6", "梅花7", "梅花8", "梅花9", "梅花10", "梅花J", "梅花Q", "梅花K", "黑桃A",
"黑桃2", "黑桃3", "黑桃4", "黑桃5", "黑桃6", "黑桃7", "黑桃8", "黑桃9", "黑桃10", "黑桃J", "黑桃Q", "黑桃K", "方块A", "方块2", "方块3",
"方块4", "方块5", "方块6", "方块7", "方块8", "方块9", "方块10", "方块J", "方块Q", "方块K", "红桃A", "红桃2", "红桃3", "红桃4", "红桃5",
"红桃6", "红桃7", "红桃8", "红桃9", "红桃10", "红桃J", "红桃Q", "红桃K", "小王", "大王" };
// 分别定义三个动态数组用来存储地主和两个农民的牌
ArrayList<String> landlord = new ArrayList<>();
ArrayList<String> farmer1 = new ArrayList<>();
ArrayList<String> farmer2 = new ArrayList<>();
// 创建一个发牌方法
public void fapai() {
Random r = new Random();
int i = r.nextInt(pai.length);
if (pai[i] == null && (landlord.size() <= 20 && farmer1.size() <= 17 && farmer2.size() < 17)) {
fapai();
} else {
if (landlord.size() < 20) {
landlord.add(pai[i]);
pai[i] = null;
fapai();
} else if (farmer1.size() < 17) {
farmer1.add(pai[i]);
pai[i] = null;
fapai();
} else if (farmer2.size() < 17) {
farmer2.add(pai[i]);
pai[i] = null;
fapai();
} else {
//利用三个foreach遍历出三个玩家的牌得出我们所要的结果
for (String a : landlord) {
System.out.print(a + "\t");
}
System.out.println();
for (String a : farmer1) {
System.out.print(a + "\t");
}
System.out.println();
for (String a : farmer2) {
System.out.print(a + "\t");
}
}
}
}
public static void main(String[] args) {
Test4 t = new Test4();
t.fapai();
}
}
需要注意的几点主要是递归结束的条件必须是牌全部放完才可,我们在此处是将原数组中已发的牌作null标记,通过判断是否为null得知此张牌是否已发,所以在判断为空时我们递归回去继续调用此方法,直到数组中所有的牌全被标记为null时运行结束。
下面是代码运行结果(因为显示问题,我把\t换成了空格,程序中建议用\t):
这里主要还是用的还是循环语句和递归,在实际开发中使用面向对象思维可能会更好。这里就不一一叙述了。