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集合
双链表实现了List
和Deque
接口。 实现所有可选列表操作,并允许所有元素(包括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