特殊语法介绍:
List<List<E>>
该语法情况比较特殊,相当于一个“二维数组”存着一个个线性表的结构,如图:
该语法的灵活性强,可适用于多种类型和多种情况。接下来就使用该语法来实现一个简单的洗牌操作。
基本流程:
我们想实现的是一副牌(去鬼牌),三个人玩,每个人开始五张牌,轮流摸。
以上述图片为例:
1.先实现52张牌,设为买牌(BuyCard)操作,牌(Card)里面有不同花色(四种)和数字(假设J,Q,K)也为数字。可以另外定义花色,通过重写toString方法来实现打印为:【花色,数字】的形式
2.再实现洗牌操作,打乱顺序,这里得用到随机数方法:Random random = new Random();
打乱顺序的实现可以为,从后往前遍历,遍历的该位置与前面随机位置调换:
则洗牌操作就可以完成了。
3.再实现摸牌操作,需要使用remove操作(删除操作),将删除的牌放入各个人的卡槽,每人放五张牌。然后可以打印出来看效果如何
实现流程:
先定义一个牌类,存放数字和花色:
再有一个类,实现买牌,洗牌,发牌操作:
先看买牌操作:
牌定义好后,就有了一副牌,然后我们需要将其打乱,写出洗牌操作:
然后进行摸牌操作,每个玩家有着五个牌:
然后可以看看甲乙丙各持的牌,顺便打印剩下的牌:
这样我们的买牌,洗牌,发牌操作就全部完成啦!
上面就是简单的洗牌操作,后续我们可以研究出怎样玩牌打牌的操作,待我后续更新!
谢谢各位的观看!
附上测试代码:
test:
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; public class Test { //简单洗牌算法 public static void main(String[] args) { CardDemo carddemo = new CardDemo(); System.out.println("买一副牌:"); //买一副牌 List<Card> card = carddemo.BuyCard(); System.out.println(card); System.out.println("洗好一副牌:"); //洗牌 carddemo.Shuffle(card); System.out.println(card); System.out.println("确定好玩家,甲,乙,丙:"); //执行发牌操作 List<List<Card>> Player = carddemo.PlayCards(card); System.out.println("甲玩家的牌:"); System.out.println(Player.get(0)); System.out.println("乙玩家的牌:"); System.out.println(Player.get(1)); System.out.println("丙玩家的牌:"); System.out.println(Player.get(2)); System.out.println("剩下的牌:"); System.out.println(card); } }
Card:
//卡牌类 public class Card { private int rand; private String suit; public Card(int rand,String suit){ this.rand = rand; this.suit = suit; } //重写toString方法 public String toString() { return "[" +suit+rand +"] "; } }
CardDemo:
import java.util.ArrayList; import java.util.List; import java.util.Random; public class CardDemo { private String[] SUIT = {"♦","♣","♥","♠"};//四个花色 //买牌 public List<Card> BuyCard(){ //先定义52大小的动态顺序表,存放类型为牌类 List<Card> ret = new ArrayList<>(52); //四个花色,十三张牌 for (int i = 0; i < 4; i++) { for (int j = 1; j <= 13; j++) { ret.add(new Card(j,SUIT[i])); } } return ret; } //洗牌 public void Shuffle(List<Card> C){ Random random = new Random();//定义随机数 //把范围给定到0~i区间,在前面取随机数来与当前i位换位置 for (int i = C.size() - 1; i > 0 ; i--) { int flg = random.nextInt(i);//范围控制在0~i以内 swap(C,i,flg);//交换牌 } } //发牌(需要玩家和一副牌) public List<List<Card>> PlayCards(List<Card> C){ List<List<Card>> player = new ArrayList<>(); List<Card> play0 = new ArrayList<>(5);//玩家一的一副牌 List<Card> play1 = new ArrayList<>(5);//玩家二的一副牌 List<Card> play2 = new ArrayList<>(5);//玩家三的一副牌 for (int i = 0; i < 5; i++) { //各个玩家抽取一轮牌,原牌会进行删除操作,抽取的是原牌第一张 play0.add(C.remove(0)); play1.add(C.remove(0)); play2.add(C.remove(0)); } player.add(play0); player.add(play1); player.add(play2); return player; } //交换牌位置 private void swap(List<Card> C,int a,int b){ Card wap = C.get(a); C.set(a,C.get(b)); C.set(b,wap); } }