原来斗地主还可以这样写(用JAVA模拟斗地主洗牌、发牌、整牌)

斗地主相信大家都玩过,但是作为一名程序员,你会用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方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值