目录
一.创建牌的对象
分为花色 和 牌数(这里的J Q K用数字代替)
1.构建包
2.在Card代码实现
import java.util.ArrayList;
import java.util.List;
public class Card {
public String suit; // 花⾊
public int rank; // 牌⾯值
public Card( String suit,int rank) {
this.suit = suit;
this.rank = rank;
}
@Override
public String toString() {
return "[" +
"花色='" + suit + '\'' +
",牌面=" + rank +
']';
}
}
二.算法实现或方法构建
1.定义花色
public static final String[] SUITS = {"♠", "♥", "♣", "♦"};
2.首先构建一副牌
//获得一副牌
private static List<List<Card>> buyDeck(){
List<List<Card>> listList = new ArrayList<List<Card>>();
// 花色数
for (int i = 0; i < SUITS.length; i++) {
// 存储每一种花色的牌
List<Card> list = new ArrayList<>();
// 牌数
for (int j = 0; j < 13; j++) {
Card card = new Card(SUITS[i], j+1);
list.add(card);
}
listList.add(list);
}
return listList;
}
3.开始洗牌
这里的逻辑: 洗后的牌 不能影响 原来 牌的排列顺序
<1>实现Cloneable接口并完成copy
//深拷贝
public Object clone() throws CloneNotSupportedException {
//创建新的实例
CardDem cardDem = (CardDem) super.clone();
//获得 原始牌组
List<List<Card>> originalBuyBeck = buyDeck();
//创建克隆的 存储牌组
List<List<Card>> clonedBuyBeck = new ArrayList<>();
for (int i = 0; i < originalBuyBeck.size(); i++) {
List<Card> tmp = new ArrayList<>();
for (int j = 0; j < originalBuyBeck.get(i).size(); j++) {
tmp.add(new Card(originalBuyBeck.get(i).get(j).suit
,originalBuyBeck.get(i).get(j).rank));
}
clonedBuyBeck.add(tmp);
}
return clonedBuyBeck;
}
<2>开始乱序
private static void swap(List<List<Card>> listList){
Random random = new Random();
for (int i = listList.size() - 1; i > 0; i--) {
for (int j = listList.get(i - 1).size() - 1;j >= 0;j--){
// 1.产生随机数
int rowBound = random.nextInt(i);//产生行 0---(i-1)的随机数
int colBound = random.nextInt(13);//产生列 0---13的随机数
// 2.拿到随机数的下标的元素
Card tmp = listList.get(rowBound).get(colBound);
// 3.拿到最后一个元素 并赋值 随机数下标的元素
Card lastElem = listList.get(i).get(j);
listList.get(rowBound).set(colBound,lastElem);
// 4.tmp赋值最后一个元素
listList.get(i).set(j,tmp);
}
}
}
4.完整代码
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class CardDem implements Cloneable{
//定义四种花色
public static final String[] SUITS = {"♠", "♥", "♣", "♦"};
//获得一副牌
private static List<List<Card>> buyDeck(){
List<List<Card>> listList = new ArrayList<List<Card>>();
// 花色数
for (int i = 0; i < SUITS.length; i++) {
// 存储每一种花色的牌
List<Card> list = new ArrayList<>();
// 牌数
for (int j = 0; j < 13; j++) {
Card card = new Card(SUITS[i], j+1);
list.add(card);
}
listList.add(list);
}
return listList;
}
//乱序顺序表
private static void swap(List<List<Card>> listList){
Random random = new Random();
for (int i = listList.size() - 1; i > 0; i--) {
for (int j = listList.get(i - 1).size() - 1;j >= 0;j--){
// 1.产生随机数
int rowBound = random.nextInt(i);//产生行 0---(i-1)的随机数
int colBound = random.nextInt(13);//产生列 0---13的随机数
// 2.拿到随机数的下标的元素
Card tmp = listList.get(rowBound).get(colBound);
// 3.拿到最后一个元素 并赋值 随机数下标的元素
Card lastElem = listList.get(i).get(j);
listList.get(rowBound).set(colBound,lastElem);
// 4.tmp赋值最后一个元素
listList.get(i).set(j,tmp);
}
}
}
//深拷贝
public Object clone() throws CloneNotSupportedException {
//创建新的实例
CardDem cardDem = (CardDem) super.clone();
//获得 原始牌组
List<List<Card>> originalBuyBeck = buyDeck();
//创建克隆的 存储牌组
List<List<Card>> clonedBuyBeck = new ArrayList<>();
for (int i = 0; i < originalBuyBeck.size(); i++) {
List<Card> tmp = new ArrayList<>();
for (int j = 0; j < originalBuyBeck.get(i).size(); j++) {
tmp.add(new Card(originalBuyBeck.get(i).get(j).suit
,originalBuyBeck.get(i).get(j).rank));
}
clonedBuyBeck.add(tmp);
}
return clonedBuyBeck;
}
public static void main(String[] args) {
CardDem cardDem = new CardDem();
List<List<Card>> listList = CardDem.buyDeck();
System.out.println("原来的牌>:");
System.out.println(listList);
try{
List<List<Card>> newListList = (List<List<Card>>)cardDem.clone();
swap(newListList);
System.out.println("洗后的牌>:");
System.out.println(newListList);
//开始拿牌
// 创建三个对象: 张三 李四 王五
List<List<Card>> gamePeople = new ArrayList<>();
List<Card> Zhang_san = new ArrayList<>();
List<Card> Li_si = new ArrayList<>();
List<Card> Wang_wu = new ArrayList<>();
gamePeople.add(Zhang_san);
gamePeople.add(Li_si);
gamePeople.add(Wang_wu);
//开始拿牌
//规定每人拿一张牌,每次拿五张
//这里有两种写法,
// 一种就是按规则来;
// 另外一种每个人依次一次性拿完五张牌(因为我已经乱序)
//这里采取按规则来
for (int i = 0; i < 5; i++) {//这里的 5 3可以存入Constant里
for (int j = 0; j < 3; j++) {//方便对游戏规则修改
//取出乱序的前五个元素
Card tmp = newListList.get(j).get(i);
//这里注意,取出来牌牌库就没有了
newListList.get(j).remove(tmp);
//存放
gamePeople.get(j).add(tmp);
}
}
System.out.println("张三的牌>:");
System.out.println(gamePeople.get(0));
System.out.println("李四的牌>:");
System.out.println(gamePeople.get(1));
System.out.println("王五的牌>:");
System.out.println(gamePeople.get(2));
System.out.println("剩余的牌>:");
System.out.println(newListList);
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
}
}
三.开始使用
1.代码实现
public static void main(String[] args) {
CardDem cardDem = new CardDem();
List<List<Card>> listList = CardDem.buyDeck();
System.out.println("原来的牌>:");
System.out.println(listList);
try{
List<List<Card>> newListList = (List<List<Card>>)cardDem.clone();
swap(newListList);
System.out.println("洗后的牌>:");
System.out.println(newListList);
//开始拿牌
// 创建三个对象: 张三 李四 王五
List<List<Card>> gamePeople = new ArrayList<>();
List<Card> Zhang_san = new ArrayList<>();
List<Card> Li_si = new ArrayList<>();
List<Card> Wang_wu = new ArrayList<>();
gamePeople.add(Zhang_san);
gamePeople.add(Li_si);
gamePeople.add(Wang_wu);
//开始拿牌
//规定每人拿一张牌,每次拿五张
//这里有两种写法,
// 一种就是按规则来;
// 另外一种每个人依次一次性拿完五张牌(因为我已经乱序)
//这里采取按规则来
for (int i = 0; i < 5; i++) {//这里的 5 3可以存入Constant里
for (int j = 0; j < 3; j++) {//方便对游戏规则修改
//取出乱序的前五个元素
Card tmp = newListList.get(j).get(i);
//这里注意,取出来牌牌库就没有了
newListList.get(j).remove(tmp);
//存放
gamePeople.get(j).add(tmp);
}
}
System.out.println("张三的牌>:");
System.out.println(gamePeople.get(0));
System.out.println("李四的牌>:");
System.out.println(gamePeople.get(1));
System.out.println("王五的牌>:");
System.out.println(gamePeople.get(2));
System.out.println("剩余的牌>:");
System.out.println(newListList);
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
2.运行截图
到这里就结束了,如果对你有帮助点个赞在再走吧~~~~~~