今天下午,找到了一个用Java代码实现发牌的功能,记录一下自己的思路。
这个问题可以有两种方法实现:
第一种方法:用Map和List这两个集合实现,思路如下:
一副斗地主的牌一般有54张牌其中 : 4中花色;1-54的编号;2-10的数字牌,A,J,Q,K 四个字母牌 大王,小王
①.创建一个map集合储存花色和A到K(包含2-10)的组合 。如:♠1。
②.创建一个list集合储存1-54的编号。
③.创建俩个数组储存4种花色,A到K的值。
④.进行操作,把值放进对应集合中
⑤.上述执行完后,还缺少大王和小王这俩张牌,单独的将他们添加进map数组中
⑥.现在这和Map集合就是一副完整的牌。
⑦.打乱这副牌 使用Collections.shuffle();
⑧.创建3个空的List集合 相当于三个人物。
⑨.然后通过,从1到10取余发现结果都是0,1,2 可以得到:
1到54分给3个人的话, 取余都是 0,1,2这三个数
所以进行循环 前三个数作为底牌;
3到53分别取余与3
等于0的盒子中的这个分给一人;
等于1的分给一人;
等于2的分给一人
到此发牌结束。
下面附上代码,以供参考:
import java.util.*;
public class Demo {
/**
* 1.使用集合实现发牌模式
* 一副牌: 54张 4中花色 J,Q,K,A 2....8;
* 创建1.个map来储存花色和A...K
*
* 2.创建一个list来储存1到54的编号
*
* 3.创建2和数组储存 4中花色和A到K
*
* 4.将牌的具体内容放进map和list
*
* @param args
*/
public static void main(String[] args) {
Map<Integer,String> map=new HashMap<>();
List<Integer> list=new ArrayList<>();
String [] color={"♠","♥","♦","♣"};
String[] Num={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
int index=0;
for (String num:Num) {
for (String colors:color) {
map.put(index,colors+num);
list.add(index);
index++;
}
}
//还差大王和小王
list.add(52);
list.add(53);
map.put(52,"大王");
map.put(53,"小王");
//将其打乱
Collections.shuffle(list);
List<Integer> p1=new ArrayList<>();
List<Integer> p2=new ArrayList<>();
List<Integer> p3=new ArrayList<>();
List<Integer> p4=new ArrayList<>();
//发牌
for (int i = 0; i <list.size() ; i++) {
if(i<3){
p4.add(i);
}else if (i%3==0){//0
p1.add(i);
}else if (i%3==1){
p2.add(i);
}else {
p3.add(i);
}
}
Collections.sort(p1);
Collections.sort(p2);
Collections.sort(p3);
Collections.sort(p4);
//显示谁的牌
show("张三",p1,map);
show("李四",p2,map);
show("王金刚",p3,map);
show("底牌",p4,map);
}
private static void show(String name, List<Integer> arrayList, Map<Integer, String> map) {
System.out.print(name+": ");
for (int i = 0; i <arrayList.size() ; i++) {
System.out.print(map.get(arrayList.get(i))+"");
}
System.out.println();
}
}
第二种方法:用List集合实现 思路如下:
①.创建一个list类保存花色
②.创建一个list类保存A到K 包括(2-10)
③.然后创建一个盒子将花色和A到K一起组合
④.然后打乱list盒子的排序取出前三个座位底牌
⑤.然后从1到10取余发现结果都是0,1,2
即1到54分给3个人的话 取余都是 0,1,2这三个数
所以进行循环 3到53分别取余与3 等于0的盒子中的这个分给一人;等于1的分给一人;等于2的分给一人
到此发牌结束。
下面附上代码,以供参考:
package cn.cx.arry;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ListDemo {
/*
1.使用集合实现发牌模式
* 一副牌: 54张 4中花色 J,Q,K,A 2....8;
* 创建1.个map来储存花色和A...K
*
* 2.创建一个list来储存1到54的编号
*
* 3.创建2和数组储存 4中花色和A到K
*
* 4.将牌的具体内容放进map和list
color 储存花色
Number 储存2-10
AJQK 子集添加
Num 储存1-54的编号
创建一个list类保存花色
创建一个list类保存A到K 包括(2-10)
然后创建一个盒子将花色和A到K一起组合
然后打乱list盒子的排序取出前三个座位底牌
然后从1到10取余发现结果都是0,1,2
即1到54分给3个人的话 取余都是 0,1,2这三个数
所以进行循环 3到53分别取余与3 等于0的盒子中的这个分给一人;等于1的分给一人;等于2的分给一人
*/
public static void main(String[] args) {
List<String> zong=new ArrayList<>();
List<String> color=new ArrayList<>();
List<Integer> pid=new ArrayList<>();
List<String> arrayList=new ArrayList<>();
color.add("♠");
color.add("♦");
color.add("♣");
color.add("♥");
List<String> Number=new ArrayList<>();
for (int i = 2; i <11 ; i++) {
Number.add(i+"");
}
Number.add("J");
Number.add("Q");
Number.add("K");
Number.add("A");
int count=0;
for (String in:color) {
for (String str:Number) {
zong.add(in+str);
}
}
//还差大小王
zong.add("大王");
zong.add("小王");
Collections.shuffle(zong);
List<String> p1=new ArrayList<>();
List<String> p2=new ArrayList<>();
List<String> p3=new ArrayList<>();
List<String> p4=new ArrayList<>();
//发牌
for (int i = 0; i <zong.size() ; i++) {
String card=zong.get(i);
if(i<3){
p4.add(card);
}else if (i%3==0){//0
p1.add(card);
}else if (i%3==1){
p2.add(card);
}else {
p3.add(card);
}
}
System.out.println(p1);
System.out.println(p2);
System.out.println(p3);
System.out.println(p4);
}
``
# 一级目录
## 二级目录
### 三级目录