ArrayList——简单洗牌算法

特殊语法介绍:

List<List<E>>

该语法情况比较特殊,相当于一个"二维数组"存着一个个线性表的结构,如图:

该语法的灵活性强,可适用于多种类型和多种情况。接下来就使用该语法来实现一个简单的洗牌操作。

基本流程:

我们想实现的是一副牌(去鬼牌),三个人玩,每个人开始五张牌,轮流摸。

以上述图片为例:

1.先实现52张牌,设为买牌(BuyCard)操作,牌(Card)里面有不同花色(四种)和数字(假设J,Q,K)也为数字。可以另外定义花色,通过重写toString方法来实现打印为:【花色,数字】的形式

2.再实现洗牌操作,打乱顺序,这里得用到随机数方法:Random random = new Random();

打乱顺序的实现可以为,从后往前遍历,遍历的该位置与前面随机位置调换:

则洗牌操作就可以完成了。

3.再实现摸牌操作,需要使用remove操作(删除操作),将删除的牌放入各个人的卡槽,每人放五张牌。然后可以打印出来看效果如何

实现流程:

先定义一个牌类,存放数字和花色:

再有一个类,实现买牌,洗牌,发牌操作:

先看买牌操作:

牌定义好后,就有了一副牌,然后我们需要将其打乱,写出洗牌操作:

然后进行摸牌操作,每个玩家有着五个牌:

然后可以看看甲乙丙各持的牌,顺便打印剩下的牌:

这样我们的买牌,洗牌,发牌操作就全部完成啦!

上面就是简单的洗牌操作,后续我们可以研究出怎样玩牌打牌的操作,待我后续更新!

谢谢各位的观看!

附上测试代码:

test:

复制代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class Test {
  
    //简单洗牌算法
    public static void main(String[] args) {
        CardDemo carddemo = new CardDemo();
        System.out.println("买一副牌:");
        //买一副牌
        List<Card> card = carddemo.BuyCard();
        System.out.println(card);
        System.out.println("洗好一副牌:");
        //洗牌
        carddemo.Shuffle(card);
        System.out.println(card);
        System.out.println("确定好玩家,甲,乙,丙:");
        //执行发牌操作
        List<List<Card>> Player = carddemo.PlayCards(card);
        System.out.println("甲玩家的牌:");
        System.out.println(Player.get(0));
        System.out.println("乙玩家的牌:");
        System.out.println(Player.get(1));
        System.out.println("丙玩家的牌:");
        System.out.println(Player.get(2));
        System.out.println("剩下的牌:");
        System.out.println(card);

    }
}

Card:

复制代码
//卡牌类
public class Card {
    private int rand;
    private String suit;

    public Card(int rand,String suit){
        this.rand = rand;
        this.suit = suit;
    }

    //重写toString方法
    public String toString() {
        return "[" +suit+rand +"] ";
    }
}

CardDemo:

复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.Random;


public class CardDemo {
    private String[] SUIT = {"♦","♣","♥","♠"};//四个花色


    //买牌
    public List<Card> BuyCard(){
        //先定义52大小的动态顺序表,存放类型为牌类
        List<Card> ret = new ArrayList<>(52);
        //四个花色,十三张牌
        for (int i = 0; i < 4; i++) {
            for (int j = 1; j <= 13; j++) {
                ret.add(new Card(j,SUIT[i]));
            }
        }

        return ret;
    }
    //洗牌
    public void Shuffle(List<Card> C){
        Random random = new Random();//定义随机数
        //把范围给定到0~i区间,在前面取随机数来与当前i位换位置
        for (int i = C.size() - 1; i > 0 ; i--) {
            int flg = random.nextInt(i);//范围控制在0~i以内
            swap(C,i,flg);//交换牌
        }

    }


    //发牌(需要玩家和一副牌)
    public List<List<Card>> PlayCards(List<Card> C){
        List<List<Card>> player = new ArrayList<>();
        List<Card> play0 = new ArrayList<>(5);//玩家一的一副牌
        List<Card> play1 = new ArrayList<>(5);//玩家二的一副牌
        List<Card> play2 = new ArrayList<>(5);//玩家三的一副牌
        for (int i = 0; i < 5; i++) {
            //各个玩家抽取一轮牌,原牌会进行删除操作,抽取的是原牌第一张
            play0.add(C.remove(0));
            play1.add(C.remove(0));
            play2.add(C.remove(0));
        }
        player.add(play0);
        player.add(play1);
        player.add(play2);
        return player;
    }



    //交换牌位置
    private void swap(List<Card> C,int a,int b){
        Card wap = C.get(a);
        C.set(a,C.get(b));
        C.set(b,wap);
    }


}
相关推荐
纪元A梦4 分钟前
贪心算法应用:K-Means++初始化详解
算法·贪心算法·kmeans
月阳羊5 分钟前
【硬件-笔试面试题-95】硬件/电子工程师,笔试面试题(知识点:RC电路中的时间常数)
java·经验分享·单片机·嵌入式硬件·面试
Bigemap9 分钟前
BigemapPro快速添加历史影像(Arcgis卫星地图历史地图)
java·开发语言
IT学长编程13 分钟前
计算机毕业设计 基于Hadoop的健康饮食推荐系统的设计与实现 Java 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
java·大数据·hadoop·毕业设计·课程设计·推荐算法·毕业论文
_不会dp不改名_18 分钟前
leetcode_21 合并两个有序链表
算法·leetcode·链表
hrrrrb21 分钟前
【Python】字符串
java·前端·python
mark-puls28 分钟前
C语言打印爱心
c语言·开发语言·算法
mkhase29 分钟前
9.12-QT-基本登陆界面实现
java·jvm·qt
Python技术极客31 分钟前
将 Python 应用打包成 exe 软件,仅需一行代码搞定!
算法
yinke小琪32 分钟前
说说hashCode() 和 equals() 之间的关系
java·后端·面试