Java之斗地主案例
第一种
步骤分析:
- 定义数字数组
- 定义花色数组
- 定义扑克牌盒子集合
- 将大小王单独添加到盒子集合
- 循环遍历将数字数组与花色数组进行组合连接,然后添加进扑克牌集合
- 将扑克牌集合进行随机排序
- 定义3人与底牌集合
- 遍历存储(发牌)
- 看牌
package cn.ddz;
import java.util.ArrayList;
import java.util.Collections;
public class FAL {
public static void main(String[] args) {
String num[] = {"A","2","3","4","5","6","7","8","9","J","Q","K"};//定义数字数组
String[] fc = {"♣","♠","♦","♥"};//定义梅花那些东西数组
ArrayList<String> puker = new ArrayList<>();//定义扑克牌盒子集合
//将大小王单独添加到盒子集合
puker.add("大鬼");
puker.add("小鬼");
//循环遍历将数字数组与花色数组合添加进扑克牌集合
for(String f : fc) {
for(String n : num) {
puker.add(f.concat(n));//concat():String中的方法
}
}
Collections.shuffle(puker);//进行随机排序
//定义3人与底牌集合
ArrayList<String> zhangSan = new ArrayList<String>();
ArrayList<String> liSi = new ArrayList<String>();
ArrayList<String> zhaoLiu = new ArrayList<String>();
ArrayList<String> diPai = new ArrayList<String>();
//遍历存储
for(int i=0; i<puker.size(); i++) {
//底牌
if(i>=puker.size()-3) {
diPai.add(puker.get(i));
}
//对三人进行发牌
if(i % 3 == 0) {
//zhangSan
zhangSan.add(puker.get(i));
}else if(i % 3 == 1) {
//liSi
liSi.add(puker.get(i));
}else {
//zhaoLiu
zhaoLiu.add(puker.get(i));
}
}
//展示牌
System.out.println("张三:"+zhangSan);
System.out.println("李四:"+liSi);
System.out.println("赵柳:"+zhaoLiu);
System.out.println("底牌:"+diPai);
}
}
结果:
可以看的出来发的牌都是无序的,而我们(大部分人)看牌的时候都会把牌进行排序。
而接下来的第二种就是“排序”写法!
第二种
步骤分析:
- 定义数字数组
- 定义花色数组
- 定义Map<Integer,String>集合,和ArrayList
- 拼接1&&2,存储到Map集合中,把Integer添加到ArrayList集合中单独添加大小王
- 定义TreeSet*4(一个底牌)
- 发牌
- 看牌
package cn.ddz;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;
public class FAL2 {
public static void main(String[] args) {
String num[] = {"3","4","5","6","7","8","9","J","Q","K","A","2"};//定义数字数组
String[] fc = {"♣","♠","♦","♥"};//定义梅花那些东西数组
//定义Map<Integer,String>集合,和ArrayList<Integer>
HashMap<Integer,String> hm = new HashMap<Integer,String>();
ArrayList<Integer> al = new ArrayList<>();
//拼接1&&2,存储到Map集合中,把Integer添加到ArrayList<Integer>集合中
int index = 0;//定义索引值
for(String n : num) {
for(String f : fc) {
hm.put(index, f.concat(n));
al.add(index);
index++;
}
}
//单独添加大小王
hm.put(index, "大鬼");
al.add(index);
index++;
hm.put(index, "小鬼");
al.add(index);
Collections.shuffle(al);//洗牌
//定义TreeSet<Integer>*4(一个底牌)
TreeSet<Integer> zs = new TreeSet<>();
TreeSet<Integer> ls = new TreeSet<>();
TreeSet<Integer> zl = new TreeSet<>();
TreeSet<Integer> dp = new TreeSet<>();
//发牌
for(int i=0; i<al.size(); i++) {
//底牌
if(i>=al.size()-3) {
dp.add(al.get(i));
}
//用户
if(i%3==0) {
zs.add(al.get(i));
}else if(i%3==1) {
ls.add(al.get(i));
}else {
zl.add(al.get(i));
}
}
//看牌
look(hm, zs, "张三");
look(hm, ls, "李四");
look(hm, zl, "赵柳");
look(hm, dp, "底牌");
}
/**
* 发牌功能
*/
public static void look(HashMap<Integer,String> hm, TreeSet<Integer> ts, String name) {
System.out.print(name+"的牌:");
for(Integer key : ts) {
System.out.print(hm.get(key)+" ");
}
System.out.println();
}
}
结果:
可以看的出来,这些牌都有着顺序。
斗地主第二种–代码分析:
首先,上面的图你们要是看懂了,那就成功一半了。
由图可以看的出来HashMap的键用来存储索引,值存储牌,看得出来,每一个索引对应着一种牌。
然后将索引存储到ArrayList集合中,然后再将ArrayList的索引添加至TreeSet集合中,(在这之前还有个洗牌动作,所以添加进去的元素是无序的)。
最后HashMap再根据TreeSet中存储的索引去获取值。
问:为什么要用TreeSet集合存储?
答:因为TreeSet有一个自然排序,也就是compareTo()方法,会进行自动排序,(如果不知道的我建议你先去学习一下TreeSet集合)
有个洗牌动作,所以添加进去的元素是无序的)。
别想太复杂,简简单单的~~~~