版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
一、任务描述:
共有54张牌,牌面由花色和数字(包括J,Q,K,A)组成,花色有黑桃♠,红桃♥,方块♦和梅花♣,还有小王,大王。
将这54张牌打乱,共有3位玩家参与游戏,没人轮流摸一张牌,剩余3张留为底牌。
程序结束打印每人手上的纸牌还有底牌,
二、运行结果:
三、实现思路:
1、准备牌
花色和数字都是普通数据类型,用ArrayList存储即可,它相当于长度不固定的数组,而且有很多方法可以调用
创建 ArrayList 存储花色,创建 ArrayList 存储数字
//创建集合存储花色
ArrayList<String> arrSuit = new ArrayList<String>();
arrSuit.add("♠");
arrSuit.add("♥");
arrSuit.add("♦");
arrSuit.add("♣");
//创建集合存储数字(包括J,Q,K)
ArrayList<String> arrNumber = new ArrayList<String>();
for (int i = 2; i < 11; i++) {
//获取变量的值 !!!
arrNumber.add(i + "");
}
arrNumber.add("A");
arrNumber.add("J");
arrNumber.add("Q");
arrNumber.add("K");
//System.out.println(arrNumber);
创建HashMap存储 序号和牌 的键值对
//创建HashMap 存储 序号和牌面的 键值对
HashMap<Integer, String> map = new HashMap<Integer, String>();
int index = 0;
for (String suit : arrSuit) { //循环花色
for (String number : arrNumber) { //循环数字
map.put(index++, suit + number);
}
}
//加上大王小王
map.put(52, "大王");
map.put(53, "小王");
2、发牌
打乱序号集合
//创建集合存储序号0-53
ArrayList<Integer> order = new ArrayList<Integer>();
for (int i = 0; i < 54; i++) {
order.add(i);
}
//把所有序号打乱
Collections.shuffle(order);
把所有序号分配出去
//分配给3个玩家,并留下3张底牌
ArrayList<Integer> player1 = new ArrayList<Integer>();
ArrayList<Integer> player2 = new ArrayList<Integer>();
ArrayList<Integer> player3 = new ArrayList<Integer>();
ArrayList<Integer> finalCards = new ArrayList<Integer>();
//如果对集合本身不做处理的话,用Iterator很方便
for (Integer thisOrder : order) {
if (thisOrder > 50) {
finalCards.add(thisOrder);
} else {
if (thisOrder % 3 == 0) {
player1.add(thisOrder);
} else if (thisOrder % 3 == 1) {
player2.add(thisOrder);
} else {
player3.add(thisOrder);
}
}
}
3、打印牌
把每个玩家的牌重新排序
Collections.sort(player1);
Collections.sort(player2);
Collections.sort(player3);
Collections.sort(finalCards);
调用函数,根据序号,从HashMap里取出值
//调用函数打印
System.out.println("player1: " + printCards(map, player1));
System.out.println("player2: " + printCards(map, player2));
System.out.println("player3: " + printCards(map, player3));
System.out.println("finalCards: " + printCards(map, finalCards));
}
//打印纸牌的方法
public static String printCards(HashMap<Integer, String> map, ArrayList<Integer> arrayList) {
StringBuilder stringBuilder = new StringBuilder();
for (Integer thisOrder : arrayList) {
String card = map.get(thisOrder); //获取键值
stringBuilder.append(card + " ");
}
return stringBuilder.toString();
}
四、实现代码:
//获取变量的值 !!!
arrNumber.add(i +"");
//集合中存储的没有基本数据类型,都是对象 没有int
HashMap<Integer, String> map = new HashMap<Integer, String>();
//把所有序号打乱
Collections.shuffle(order);
//把集合重新排序
Collections.sort(player1);
package cn.itcast.task03;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
/**
* @author wangyue
* @version 1.0
* @date 2019/6/28 14:22
* @describe: 斗地主之洗牌发牌
*/
public class PokerShuffleCards {
public static <in> void main(String[] args) {
//1、准备扑克牌
//创建集合存储花色
ArrayList<String> arrSuit = new ArrayList<String>();
arrSuit.add("♠");
arrSuit.add("♥");
arrSuit.add("♦");
arrSuit.add("♣");
//创建集合存储数字(包括J,Q,K)
ArrayList<String> arrNumber = new ArrayList<String>();
for (int i = 2; i < 11; i++) {
//获取变量的值 !!!
arrNumber.add(i + "");
}
arrNumber.add("A");
arrNumber.add("J");
arrNumber.add("Q");
arrNumber.add("K");
//System.out.println(arrNumber);
//创建HashMap 存储 序号和牌面的 键值对
HashMap<Integer, String> map = new HashMap<Integer, String>();
int index = 0;
for (String suit : arrSuit) { //循环花色
for (String number : arrNumber) { //循环数字
map.put(index++, suit + number);
}
}
//加上大王小王
map.put(52, "大王");
map.put(53, "小王");
//2、给三个玩家发牌
//创建集合存储序号0-53
ArrayList<Integer> order = new ArrayList<Integer>();
for (int i = 0; i < 54; i++) {
order.add(i);
}
//把所有序号打乱
Collections.shuffle(order);
//分配给3个玩家,并留下3张底牌
ArrayList<Integer> player1 = new ArrayList<Integer>();
ArrayList<Integer> player2 = new ArrayList<Integer>();
ArrayList<Integer> player3 = new ArrayList<Integer>();
ArrayList<Integer> finalCards = new ArrayList<Integer>();
//如果对集合本身不做处理的话,用Iterator很方便
for (Integer thisOrder : order) {
if (thisOrder > 50) {
finalCards.add(thisOrder);
} else {
if (thisOrder % 3 == 0) {
player1.add(thisOrder);
} else if (thisOrder % 3 == 1) {
player2.add(thisOrder);
} else {
player3.add(thisOrder);
}
}
}
//3、把玩家的牌和三张底牌打印出来
//把每个玩家的牌重新排序
Collections.sort(player1);
Collections.sort(player2);
Collections.sort(player3);
Collections.sort(finalCards);
//调用函数打印
System.out.println("player1: " + printCards(map, player1));
System.out.println("player2: " + printCards(map, player2));
System.out.println("player3: " + printCards(map, player3));
System.out.println("finalCards: " + printCards(map, finalCards));
}
//打印纸牌的方法
public static String printCards(HashMap<Integer, String> map, ArrayList<Integer> arrayList) {
StringBuilder stringBuilder = new StringBuilder();
for (Integer thisOrder : arrayList) {
String card = map.get(thisOrder); //获取键值
stringBuilder.append(card + " ");
}
return stringBuilder.toString();
}
}
输出
player1: ♠2 ♠5 ♠8 ♠A ♠K ♥4 ♥7 ♥10 ♥Q ♦3 ♦6 ♦9 ♦J ♣2 ♣5 ♣8 ♣A
player2: ♠3 ♠6 ♠9 ♠J ♥2 ♥5 ♥8 ♥A ♥K ♦4 ♦7 ♦10 ♦Q ♣3 ♣6 ♣9 ♣J
player3: ♠4 ♠7 ♠10 ♠Q ♥3 ♥6 ♥9 ♥J ♦2 ♦5 ♦8 ♦A ♦K ♣4 ♣7 ♣10 ♣Q
finalCards: ♣K 大王 小王
PS:界面实现