Day 8 2021.3.9数据结构-集合-斗地主案例-自定义异常练习

这篇博客讲解了如何使用Java集合框架实现斗地主游戏的洗牌发牌规则,涉及栈、队列、数组、链表等数据结构。此外,还介绍了List、Set、Map集合及其子类的特性,如HashSet的哈希表原理,以及自定义异常的实践,如在用户名重复时抛出异常。
摘要由CSDN通过智能技术生成

Day 8 2021.3.9

集合综合案例:斗地主

介绍:按照斗地主的规则,完成洗牌发牌的动作

具体规则:

使用54张牌打乱顺序,三个玩家参与游戏,三人交错摸排,每人17张牌,最后三张留作底牌

package com.hong.Day007.DouDiZhu;

import java.util.ArrayList;
import java.util.Collections;

/*
    准备牌:54张牌存储到一个集合中
    洗牌:使用集合工具类Collections类中的方法
    static void shuffle(List<?> list)使用默认的随机源随机排列指定的列表。
    发牌:一人17张牌,剩余3张牌作为底牌
    使用选择结果 %3 有三个值
    看牌:直接打印集合
 */
public class App {
   
    public static void main(String[] args) {
   
        ArrayList<String> a = new ArrayList<String>();
        ArrayList<String> b = new ArrayList<String>();
        ArrayList<String> c = new ArrayList<String>();
        Member aa = new Member("张三",a);
        Member bb = new Member("李四",b);
        Member cc = new Member("王五",c);
//        aa.show();初始牌
//        bb.show();初始牌
//        cc.show();初始牌
        //初始牌加洗牌
        ArrayList<String> w = xiPai();
        System.out.println(w);
        ArrayList<String> ww = xiPai2(w);
        System.out.println(ww);
        ArrayList<String> d = new ArrayList<String>();
        ArrayList<String> e = new ArrayList<String>();
        ArrayList<String> f = new ArrayList<String>();
        ArrayList<String> g = new ArrayList<String>();
        //发牌
        for (int i = 0; i < 54; i++) {
   
            if (i > 50){
   
                g.add((String) ww.get(i));
                continue;
            }
            if (i % 3 == 0){
   
                Object m = ww.get(i);
                d.add((String) m);
            }else if (i % 3 == 1){
   
                Object m = ww.get(i);
                e.add((String) m);
            }else {
   
                Object m = ww.get(i);
                f.add((String) m);
            }
        }
        aa.setPi(d);
        bb.setPi(e);
        cc.setPi(f);
        aa.show();//最终牌
        bb.show();//最终牌
        cc.show();//最终牌
        System.out.println("底牌为:" + g);
    }

    //将初始有序的牌打乱
    private static ArrayList xiPai2(ArrayList w) {
   
        Collections.shuffle(w);
        return w;
    }

    //获得初始有序的牌
    public static ArrayList xiPai(){
   
        ArrayList<String> xPi = new ArrayList<String>();
        ArrayList<String> huaSe = new ArrayList<String>();
        huaSe.add("黑桃");
        huaSe.add("红桃");
        huaSe.add("方块");
        huaSe.add("梅花");
        String[] w = {
   "2","3","4","5","6","7","8","9","10","J","Q","K","A"};
        for (int i = 0; i < 4; i++) {
   
            String xHuaSe = huaSe.get(i);
            for (int j = 0; j < 13; j++) {
   
                String ww = w[j];
                xPi.add(xHuaSe+ww);
                xPi.add(xHuaSe+ww);
            }
        }
        xPi.add("大王");
        xPi.add("小王");
        return xPi;
    }
    
}
package com.hong.Day007.DouDiZhu;

import java.util.ArrayList;

/*
Member 父类,用来存储三个人的名字,以及牌
*/
public class Member {
   
    private String name;
    private ArrayList pi;

    public Member(String name, ArrayList pi) {
   
        this.name = name;
        this.pi = pi;
    }

    public String getName() {
   
        return name;
    }

    public void setName(String name) {
   
        this.name = name;
    }

    public ArrayList getPi() {
   
        return pi;
    }

    public void setPi(ArrayList pi) {
   
        this.pi = pi;
    }
    public void show(){
   
        System.out.println(name + "手里的牌是 " + pi);
    }
}

数据结构

栈(Stack)

特点:先进后出(入口与出口在同一侧)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zq0mI2II-1615288884386)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210309104855421.png)]

队列(queue)

特点:先进先出(入口与出口不在同一侧)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BuKajJFQ-1615288884388)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210309104941496.png)]

数组(Array)

特点:查询快,增删慢

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0GGgqOmb-1615288884389)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210309105343579.png)]

链表(linked list)

特点:查询慢,增删快

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qVSKzEM2-1615288884391)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210309110010617.png)]

红黑树(binary tree)

特点:趋近与平衡术,查询的速度非常快,查询叶子节点最大次数和最小次数不能超过2倍

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uvWjB3Oj-1615288884394)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210309110746673.png)]

List集合

有序集合(也称为序列 )。 该界面的用户可以精确控制列表中每个元素的插入位置。 用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。

/*
java.util.List接口:extends Collection接口
特点:
    1.有序集合(也称为序列 )。
    2.有索引
    3.允许存储重复元素
带索引的方法:
    1.boolean add(E e) 将指定的元素追加到此列表的末尾(可选操作)。
    2.E get(int index) 返回此列表中指定位置的元素。
    3.E remove(int index) 删除该列表中指定位置的元素(可选操作)。
    4.E set(int index, E element) 用指定的元素(可选操作)替换此列表中指定位置的元素。
注意:
    操作索引时要防止索引越界异常
 */

ArrayList 集合

集合数据存储的结构是数组结构,元素增删慢,查找快

LinkedList集合

双链表实现了ListDeque接口。 实现所有可选列表操作,并允许所有元素(包括null )。

/*
java.util.LinkedList<E>
LinkedList特点:
    1.底层是一个链表结果:查询慢,增删快
    2.里面包含了大量操作首尾元素的方法,(注意:不能使用多态)
常用方法:
    1.boolean add(E e)将指定的元素追加到此列表的末尾。
    2.void add(int index, E element)在此列表中的指定位置插入指定的元素。
    3.void addFirst(E e)/addLast(E e) 在该列表开头插入指定的元素。/将指定的元素追加到此列表的末尾。
    4.E get(int index)返回此列表中指定位置的元素
    5.E getFirst()/getLast() 返回此列表中的第一个元素。/返回此列表中的最后一个元素。
    6.E remove()/remove(int index) 检索并删除此列表的头(第一个元素)/删除该列表中指定位置的元素
    7.E pop()从此列表表示的堆栈中弹出一个元素。
    8.void push(E e
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值