模拟斗地主的洗牌和发牌
思路:
1)创建一个牌盒(容器:集合)
ArrayList<String>
2)装牌
红桃A,黑桃A,方片A,梅花A...
3)洗牌
Collections中的随机置换功能:shuffle()
4)发牌
遍历集合,获取集合中具体的牌
通过选择语句进行判断:
1--->A, 2--->B, 2--->C
4--->A,...
发给3个人,3个人分别用ArrayList<String>接收
如果当前牌 %3 == 0,1,2
5)看牌
思路:
1)创建一个牌盒(容器:集合)
ArrayList<String>
2)装牌
红桃A,黑桃A,方片A,梅花A...
3)洗牌
Collections中的随机置换功能:shuffle()
4)发牌
遍历集合,获取集合中具体的牌
通过选择语句进行判断:
1--->A, 2--->B, 2--->C
4--->A,...
发给3个人,3个人分别用ArrayList<String>接收
如果当前牌 %3 == 0,1,2
5)看牌
将看牌封装成一个独立的功能
代码如下:
import java.util.ArrayList;
import java.util.Collections;
public class Poker {
public static void main(String[] args) {
//1.创建牌盒
ArrayList<String> array = new ArrayList<String>() ;
//2.装牌
//2.1创建花色数组
String[] colors = {"♥","♠","♦","♣"} ;
//2.2 创建点数数组
String[] numbers = {"A","2","3","4","5","6","7","8","9",
"10","J","Q","K"} ;
for(String color :colors) {
for(String number:numbers) {
String poker = color.concat(number) ;
array.add(poker) ;
}
}
//添加大王和小王
array.add("大王") ;
array.add("小王") ;
//3.洗牌
Collections.shuffle(array);
//System.out.println(array);
//4.发牌
//现在3个人玩,把每个人都看做一个ArrayList
ArrayList<String> player1 = new ArrayList<String>() ;
ArrayList<String> player2 = new ArrayList<String>() ;
ArrayList<String> player3 = new ArrayList<String>() ;
ArrayList<String> diPai = new ArrayList<String>() ;
//遍历ArrayList集合,使用普通for循环,获取到集合的元素
//通过元素 % 玩家人数 = 0 /1/2 /..
for(int x = 0 ; x < array.size() ; x ++) {
//获取到每一个元素
if(x >= array.size() -3) {
//底牌
diPai.add(array.get(x)) ;
}else if(x % 3 == 0) {
//玩家1
player1.add(array.get(x)) ;
}else if(x % 3 == 1) {
//玩家2
player2.add(array.get(x)) ;
}else if(x % 3 == 2) {
//玩家3
player3.add(array.get(x)) ;
}
}
//5.看牌
//3个人看牌,将看牌封装成一个功能
lookPoker("玩家1", player1);
lookPoker("玩家2", player2);
lookPoker("玩家3", player3);
lookPoker("底牌", diPai);
}
public static void lookPoker(String name,ArrayList<String> array) {
System.out.print(name+"的牌是:");
for(String s : array) {
System.out.print(s+" ");
}
System.out.println();
}
}
运行后发现,虽然牌发到每一个人手中的基本功能完成了,但怎样才能保证牌发到每个人的手中都是有序的呢?我们可以通过Collections的sort()功能进行排序,但这种方法是以花色来排序的,也就是说每个花色都是有序的,但花色之间不是有序的(这种方法大家可以下去自己试一下),那怎么才能以点数来排序呢?我们联想到之前学习过的TreeMap集合:
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;
public class Poker2 {
public static void main(String[] args) {
//1. 创建两个集合:HashMap<Integer,String>,ArrayList<Integer>
HashMap<Integer, String> hm = new HashMap<Integer, String>();
ArrayList<Integer> array = new ArrayList<Integer>();
//2.装牌
//2.1 定义花色数组和点数数组
String[] colors = { "♥", "♠", "♦", "♣" };
String[] numbers = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2" };
//从0开始编号,将编号与编号对应的牌存储到HahMap集合中,同时往ArrayList集合中单独存储编号
int index = 0;
//拼接
for (String number : numbers) {
for (String color : colors) {
String poker = color.concat(number);
hm.put(index, poker);
array.add(index);
index++;
}
}
//装大王和小王
hm.put(index, "大王");
array.add(index);
index++;
hm.put(index, "小王");
array.add(index);
//不能再++了,否则会出现角标越界
//洗牌
Collections.shuffle(array);
//System.out.println(array);
//4.发牌
//发的也是编号,为了保证牌有序,用TreeSet集合接收
TreeSet<Integer> player1 = new TreeSet<Integer>();
TreeSet<Integer> player2 = new TreeSet<Integer>();
TreeSet<Integer> player3 = new TreeSet<Integer>();
TreeSet<Integer> diPai = new TreeSet<Integer>();
//遍历ArrayList集合,使用普通for循环,获取到集合的元素
//通过元素 % 玩家人数 = 0 /1/2 /..
for (int x = 0; x < array.size(); x++) {
//获取到每一个元素
if (x >= array.size() - 3) {
//底牌
diPai.add(array.get(x));
} else if (x % 3 == 0) {
//玩家1
player1.add(array.get(x));
} else if (x % 3 == 1) {
//玩家2
player2.add(array.get(x));
} else if (x % 3 == 2) {
//玩家3
player3.add(array.get(x));
}
}
//5.看牌,封装功能
lookPoker("玩家1", player1, hm);
lookPoker("玩家2", player2, hm);
lookPoker("玩家3", player3, hm);
lookPoker("底牌", diPai, hm);
}
public static void lookPoker(String name,TreeSet<Integer> ts,
HashMap<Integer, String> hm) {
System.out.print(name+"的牌是:");
//遍历TreeSet集合获取到每一个编号
for(Integer key :ts) {
//获取编号,通过编号找牌(在HashMap中找)
String value = hm.get(key) ;
System.out.print(value+" ");
}
System.out.println();
}
}
至此,斗地主的小游戏就完成了~