【发牌游戏】基于顺序表实现

前言:

小编这里将运用顺序表实现模拟发牌的规则,前提是阅读这篇文章的uu具备相应的知识

并且小编在编写代码时,忽略了大小王,以及J,Q,K都是由11,12,13代替的。

 思路分析:

首先我们要明白在一副扑克牌中有花色,和数字,所以我们在面向对象编程时,首先要先定义一个类,初始化这两个变量,然后分析,我们肯定要将一副牌表示出来,然后打乱这幅牌,者涉及到两个方法,最后实现分牌,这也是一个方法,最后主函数实现。

相关代码:

按照以上思路讲解,有以下几个步骤和讲解。

1.初始化相关变量:

public class Card {
    private int rank;
    private String suit;

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

    public int getRank() {
        return rank;
    }

    public void setRank(int rank) {
        this.rank = rank;
    }

    public String getSuit() {
        return suit;
    }

    public void setSuit(String suit) {
        this.suit = suit;
    }

    @Override
    public String toString() {
        return "("+suit+":"+rank+")";
    }
}

首先小编定义了两个变量rank代表数值,suit代表花色,然后就是经典的构造方法,以及get和set函数 ,(这两个变量是私有的,需要通过共有的get set函数调用,构造方法,方便在实例化对象时直接赋值)然后重写了tostring方法,这里方便按照指定格式直接输出对象。

2.实现所有牌的打印:

代码如下:

public class Cardlist {
    public static final String[] SUIT={"♥","♣","♦","♠"};

    
    //存放牌
    public  List<Card> cards(){
        List<Card> list=new ArrayList<>(52);
        for (int i=0;i<SUIT.length;i++){
            for (int j = 1; j <=13 ; j++) {
                int rank=j;
                String suit=SUIT[i];
                Card card=new Card(j,suit);
                list.add(card);
            }
        }
        return list;
    }

这里首先初始话数组,将,梅花,红桃,黑桃,方片存入,定义一个存放牌的顺序表并声明它的范围,通过双重循环,将四种花色,13种数字对应的牌放到顺序表中。(这里将花色,与数字的信息放到card对象中后,通过顺序表list的方法add添加进去

3.实现牌的打乱操作 :

代码如下:

 public List<Card> swap(List<Card> list){
        for (int i = list.size()-1; i >0; i--) {
            Random r=new Random();
            int index=r.nextInt(i);
            Card card=list.get(i);
            list.set(i,list.get(index));
            list.set(index, card);
        }
        return list;
    }

这里小编的思路是,通过随机函数,随机出来数字,然后交换实现打乱,这里通过顺序表中最后一个位置与随机前面的数(注意不包含最后一个位置,每次随机都是不能包含要交换的位置)实现交换,这样就不会随机到自己本身的索引。(在交换时通过顺序表get下标对应的扑克牌的信息,然后存入一个对象中,再实现交换,最后将对象拿给顺序表),这里与冒泡排序一样的道理。

4.实现扑克牌的发牌操作:

代码如下:

 public List<List<Card>> getCard(List<Card> list){
        List<List<Card>> person=new ArrayList<>();
        List<Card> person1=new ArrayList<>();
        List<Card> person2=new ArrayList<>();
        List<Card> person3=new ArrayList<>();

        person.add(person1);
        person.add(person2);
        person.add(person3);

        for (int i = 0; i <5 ; i++) {
            for (int j = 0; j <3 ; j++) {
                Card card=list.remove(0);
                person.get(j).add(card);
            }
        }
        return person;

    }

这里小编用了List<List<Card>>,表示在一个顺序表中还含有一个顺序表:

如下图所示:

其中0下表对应一个地址代表person1, 1下表对应一个地址代表person2, 2下表对应一个地址代表person3, 然后每个person1,person2,person3,都是一个顺序表,用这个顺序表里存放每个人的牌

代码通过person对象add(person1,person2,person3)添加了每个列表,然后通过双重循环,将打乱的牌的第一个牌删除并传给card(模拟了摸牌的操作),在通过person的get函数去调用第一个person1列表,并将card传给person1,就完成了发牌的操作。

5.主函数:

 public static void main(String[] args) {
        Cardlist cardlist=new Cardlist();
        List<Card> ret=cardlist.cards();
        System.out.println(ret);
        System.out.println("把牌洗乱后");
        List<Card> ret1=cardlist.swap(ret);
        System.out.println(ret1);


        List<List<Card>> ret2=cardlist.getCard(ret1);
        System.out.println("第一个人的牌:"+ret2.get(0));
        System.out.println("第二个人的牌:"+ret2.get(1));
        System.out.println("第三个人的牌:"+ret2.get(2));

在最后输出时,ret2相当于person顺序表,调用get函数实现得到对应位置的顺序表,并打印其中的信息。

6.输出效果:

[(♥:1), (♥:2), (♥:3), (♥:4), (♥:5), (♥:6), (♥:7), (♥:8), (♥:9), (♥:10), (♥:11), (♥:12), (♥:13), (♣:1), (♣:2), (♣:3), (♣:4), (♣:5), (♣:6), (♣:7), (♣:8), (♣:9), (♣:10), (♣:11), (♣:12), (♣:13), (♦:1), (♦:2), (♦:3), (♦:4), (♦:5), (♦:6), (♦:7), (♦:8), (♦:9), (♦:10), (♦:11), (♦:12), (♦:13), (♠:1), (♠:2), (♠:3), (♠:4), (♠:5), (♠:6), (♠:7), (♠:8), (♠:9), (♠:10), (♠:11), (♠:12), (♠:13)]
把牌洗乱后
[(♥:5), (♥:10), (♦:6), (♥:8), (♠:5), (♥:1), (♥:13), (♠:12), (♣:5), (♥:3), (♠:13), (♣:9), (♣:11), (♣:6), (♥:7), (♥:6), (♣:7), (♦:7), (♦:5), (♠:11), (♦:4), (♦:9), (♥:2), (♣:1), (♦:1), (♣:8), (♦:2), (♥:12), (♦:11), (♣:4), (♠:10), (♦:12), (♠:3), (♦:10), (♦:3), (♠:1), (♠:6), (♣:12), (♥:11), (♠:4), (♠:7), (♣:3), (♦:13), (♠:8), (♠:9), (♣:10), (♥:4), (♥:9), (♠:2), (♣:2), (♦:8), (♣:13)]
第一个人的牌:[(♥:5), (♥:8), (♥:13), (♥:3), (♣:11)]
第二个人的牌:[(♥:10), (♠:5), (♠:12), (♠:13), (♣:6)]
第三个人的牌:[(♦:6), (♥:1), (♣:5), (♣:9), (♥:7)]

这里小编这给每个人发了五张牌。 

总结:

限于小编能力有限,并且这只是一个发牌的模拟,没有非常完善,希望各位uu在评论区发表宝贵意见。代码在这里:Sequence: 顺序表相关代码,里面的Card包里哦;

制作不易,麻烦给小编点一个赞吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值