斗地主相信大家都玩过,但是作为一名程序员,你会用Java来模拟一把简单有趣的斗地主吗?
流程
1、洗牌
2、挑出地主牌
3、发牌
4、整牌
创建扑克牌
首先在洗牌之前我们要创建一副扑克牌。我们知道扑克牌共有54张牌,除大小王外共四种花色,由2-10数字牌以及A、J、Q、K、大王和小王组成,由此我们首先建立pokes(所有的牌)、colors(花色)、numbers(出大小王外的所有牌的种类)这三个数组
List<String> pokes=new ArrayList<>();
List<String> colors=new ArrayList<>();
List<String> numbers=new ArrayList<>();
在此之外我们还要创建一个数组pokesIndex用来记录牌序
List<Integer> pokesIndex = new ArrayList<>();
然后我们把花色和牌型放入colors和numbers这两个数组中
colors.add("❤");
colors.add("♠");
colors.add("♦");
colors.add("♣");
numbers.add("A");
for (int i=2;i<=10;i++){
numbers.add(i+"");
}
numbers.add("J");
numbers.add("Q");
numbers.add("K");
然后将花色和牌型进行结合
for (String n:numbers){
for (String c:colors){
String pai=c+n;
pokes.add(pai);
}
}
最后加上大王和小王
pokes.add("小🃏");
pokes.add("大🃏");
这样我们的扑克牌就创建好了,让我们来看一下运行结果
洗牌
那么洗牌就非常的简单了,我们使用shuffle方法,就可以达到洗牌的效果了
首先我们将牌序打乱
Collections.shuffle(pokesIndex);
然后再创建一个新的数组pokesNew,将牌序所对应的扑克牌依次放入数组
List<String> pokesNew = new ArrayList<>();
for (int i = 0; i < pokesIndex.size(); i++) {
int j = pokesIndex.get(i);
pokesNew.add(pokes.get(j));
}
让我们来看一下效果对比
ps:shuffle方法在Collections类中,记得引用类
挑出地主牌
首先我们要创建一个底牌数组dipai
ArrayList<String> dipai=new ArrayList<>();
然后用循环,选择三张牌放入底牌数组
for (int i = 0; i < pokes.size(); i++) {
String pai = pokes.get(i);
if (i >= 51) {
dipai.add(pai);
}
让我们来看一下运行结果
发牌
用三个数组来表示三位牌友(在这里我用我和我室友的名字缩写表示)
ArrayList<String> JQC=new ArrayList<>();
ArrayList<String> NCH=new ArrayList<>();
ArrayList<String> WSW=new ArrayList<>();
然后接上之前的代码
else {
if (i % 3 == 0) {
JQC.add(pai);
} else if (i % 3 == 1) {
NCH.add(pai);
} else {
WSW.add(pai);
}
}
让我们来看一下这一段的总体代码
ArrayList<String> JQC=new ArrayList<>();
ArrayList<String> NCH=new ArrayList<>();
ArrayList<String> WSW=new ArrayList<>();
ArrayList<String> dipai=new ArrayList<>();
for (int i = 0; i < pokes.size(); i++) {
String pai = pokes.get(i);
if (i >= 51) {
dipai.add(pai);
} else {
if (i % 3 == 0) {
JQC.add(pai);
} else if (i % 3 == 1) {
NCH.add(pai);
} else {
WSW.add(pai);
}
看一下效果
以上是的斗地主主要流程
整牌
那么在最开始的时候我们创建了一个存放牌序的数组pokesIndex,这个数组存放了默认(未洗牌之前)的牌的位置,现在我们再创键三位牌友所拿到牌的牌序数组:JQCIndex、NCHIndex、WSWIndex
并将发牌部分的代码做如下调整
if (i%3==0){
JQCIndex.add(pai);
int j = pokesIndex.get(i);
JQC.add(pokes.get(j));
}else if(i%3==1){
NCHIndex.add(pai);
int j = pokesIndex.get(i);
NCH.add(pokes.get(j));
}else {
WSWIndex.add(pai);
int j = pokesIndex.get(i);
WSW.add(pokes.get(j));
}
接着用sort方法进行排序
Collections.sort(JQCIndex);
Collections.sort(NCHIndex);
Collections.sort(WSWIndex);
ps:sort方法在Collections类中,记得引用类
创建三个新的数组用来存放整理以后的牌
List<String> JQCNew = new ArrayList<>();
List<String> NCHNew = new ArrayList<>();
List<String> WSWNew = new ArrayList<>();
最后将对应牌序的牌依次放入数组
for (int i = 0; i < JQCIndex.size(); i++) {
int j = JQCIndex.get(i);
JQCNew.add(pokes.get(j));
}
for (int i = 0; i < NCHIndex.size(); i++) {
int j = NCHIndex.get(i);
NCHNew.add(pokes.get(j));
}
for (int i = 0; i < WSWIndex.size(); i++) {
int j = WSWIndex.get(i);
WSWNew.add(pokes.get(j));
}
让我们来看一下整完牌后的效果
以上就是模拟斗地主的所有代码,让我们来看一下整合以后的
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class DouDiZhu {
public static void main(String[] args){
List<String> pokes=new ArrayList<>();
List<String> colors=new ArrayList<>();
List<String> numbers=new ArrayList<>();
List<Integer> pokesIndex = new ArrayList<>();
int index = 0;
colors.add("❤");
colors.add("♠");
colors.add("♦");
colors.add("♣");
numbers.add("A");
for (int i=2;i<=10;i++){
numbers.add(i+"");
}
numbers.add("J");
numbers.add("Q");
numbers.add("K");
for (String n:numbers){
for (String c:colors){
String pai=c+n;
pokes.add(pai);
pokesIndex.add(index);
index++;
}
}
pokes.add("小🃏");
pokesIndex.add(index);
index++;
pokes.add("大🃏");
pokesIndex.add(index);
index++;
System.out.println(pokes);
//洗牌
Collections.shuffle(pokesIndex);
List<String> pokesNew = new ArrayList<>();
for (int i = 0; i < pokesIndex.size(); i++) {
int j = pokesIndex.get(i);
pokesNew.add(pokes.get(j));
}
System.out.println(pokesNew);
//留3张牌并发牌
ArrayList<String> JQC=new ArrayList<>();
ArrayList<String> NCH=new ArrayList<>();
ArrayList<String> WSW=new ArrayList<>();
ArrayList<String> dipai=new ArrayList<>();
List<Integer> JQCIndex = new ArrayList<>();
List<Integer> NCHIndex = new ArrayList<>();
List<Integer> WSWIndex = new ArrayList<>();
List<Integer> dipaiIndex = new ArrayList<>();
for (int i=0;i<pokesIndex.size();i++){
Integer pai = pokesIndex.get(i);
if (i>=51){
dipaiIndex.add(pai);
int j = pokesIndex.get(i);
dipai.add(pokes.get(j));
}else {
if (i%3==0){
JQCIndex.add(pai);
int j = pokesIndex.get(i);
JQC.add(pokes.get(j));
}else if(i%3==1){
NCHIndex.add(pai);
int j = pokesIndex.get(i);
NCH.add(pokes.get(j));
}else {
WSWIndex.add(pai);
int j = pokesIndex.get(i);
WSW.add(pokes.get(j));
}
}
}
System.out.println("地主牌:"+dipai);
System.out.println("JQC:"+JQC);
System.out.println("NCH:"+NCH);
System.out.println("WSW:"+WSW);
List<String> JQCNew = new ArrayList<>();
List<String> NCHNew = new ArrayList<>();
List<String> WSWNew = new ArrayList<>();
Collections.sort(JQCIndex);
Collections.sort(NCHIndex);
Collections.sort(WSWIndex);
for (int i = 0; i < JQCIndex.size(); i++) {
int j = JQCIndex.get(i);
JQCNew.add(pokes.get(j));
}
for (int i = 0; i < NCHIndex.size(); i++) {
int j = NCHIndex.get(i);
NCHNew.add(pokes.get(j));
}
for (int i = 0; i < WSWIndex.size(); i++) {
int j = WSWIndex.get(i);
WSWNew.add(pokes.get(j));
}
System.out.println("JQC:"+JQCNew);
System.out.println("NCH:"+NCHNew);
System.out.println("WSW:"+WSWNew);
}
}
知识总结
1、写代码之前需要先理清思路,分步完成
2、熟练掌握数组以及for循环的运用
3、了解Collections类中shuffle和sort方法