文字数:约1200字 阅读时间:20分钟
此文章为学习总结类型,文字很多且皆为基础知识
将前面的所学的集合,以练习题的形式进行的复习,主要需求是按照斗地主模式进行正常的发牌,并按照大小排序的形式来查看牌,因为目前不会使用图形化界面的设计,因此就以控制台输出的形式来模拟看牌功能了。
//----------------准备扑克---------------------
//分发给玩家的扑克(其实就是索引)
ArrayList<Integer> poker = new ArrayList<>();
//(存储扑克的样式)
HashMap<Integer,String> map = new HashMap<>();
//花色
String[] colors = {"♠", "♥", "♣", "♦"};
//数字
String[] nums = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
//按照一定顺序存储
int index = 0;
//先遍历数字(保证大小顺序)
for (String num : nums) {
//遍历花色
for (String color : colors) {
//保存此花色牌的索引
poker.add(index);
//拼接并保存
map.put(index, color+num);
//索引+1
index++;
}
}
poker.add(index);
map.put(index, "小王");
index++;
poker.add(index);
map.put(index, "大王");
//--------------模拟发牌--------------------
//洗牌(这里也可以自己编写随机)
Collections.shuffle(poker);
//玩家A
ArrayList<Integer> playerA = new ArrayList<Integer>();
//玩家B
ArrayList<Integer> playerB = new ArrayList<Integer>();
//玩家C
ArrayList<Integer> playerC = new ArrayList<Integer>();
//底牌
ArrayList<Integer> buttonCard = new ArrayList<Integer>();
//遍历扑克
for (int i = 0; i < poker.size(); i++) {
//得到索引
int card = poker.get(i);
//存储底牌
if( i >= 51){
buttonCard.add(card);
continue;
}
//给玩家A的牌
if(i % 3 == 0){
playerA.add(card);
//给玩家B的牌
}else if(i % 3 == 1){
playerB.add(card);
//给玩家C的牌
}else{
playerC.add(card);
}
}
//-------------模拟看牌-------------------------
//排序(默认从小往大排,这里也可以用冒泡排序法或者选择排序法进行排序)
Collections.sort(playerA);
//反转(按照从大往小牌)
Collections.reverse(playerA);
System.out.print("玩家A: ");
for (int i = 0; i < playerA.size(); i++) {
System.out.print(map.get(playerA.get(i))+" ");
}
System.out.println();
Collections.sort(playerB);
Collections.reverse(playerB);
System.out.print("玩家B: ");
for (int i = 0; i < playerB.size(); i++) {
System.out.print(map.get(playerB.get(i))+" ");
}
System.out.println();
Collections.sort(playerC);
Collections.reverse(playerC);
System.out.print("玩家C: ");
for (int i = 0; i < playerB.size(); i++) {
System.out.print(map.get(playerC.get(i))+" ");
}
System.out.println();
Collections.sort(buttonCard);
Collections.reverse(buttonCard);
System.out.print("底牌: ");
for (int i = 0; i < buttonCard.size(); i++) {
System.out.print(map.get(buttonCard.get(i))+" ");
}
System.out.println();
下面,是将上面的代码结合前面所总结的知识点进行了优化。
首先,存储扑克的集合如果是局部变量也就只能在当前方法使用,这样如果其他类要用就还需要再次创建,因此将集合提升为成员变量,这样就可以在其他类中也是可以是用的。后面的方法中都写成了静态方法,因此也需要设计出静态成员变量。(其中设计为私有变量是为了保护里面的数据因某些因素而被修改)
private static List<Integer> poker;
private static Map<Integer,String> map
然后,扑克只需要创建一次即可,但是在上面的方法中,每次使用时都会重新的制作一份扑克,这样是非常消耗资源的,而前面所总结的方法中,有个static静态代码块,仅在初次使用该类时运行后面就不会在此运行,因此此处可以使用static来进行优化
static{
String[] colors = {"♠", "♥", "♣", "♦"};
String[] nums = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
int index = 0;
for (String num : nums) {
for (String color : colors) {
poker.add(index);
map.put(index, color+num);
index++;
}
}
poker.add(index);
map.put(index, "小王");
index++;
poker.add(index);
map.put(index, "大王");
}
上面的优化代码可以将其单独存放于一个类中,并编写get方法,来获取成员变量,这样也符合编程设计里的“高内聚,低耦合”的特性。下面就是本类中的get方法
public static List<Integer> getPoker(){
return poker;
}
public static Map<Integer,String> getPokerMap(){
return map;
}
在发牌阶段,可以将其单独定义为单独一个方法,设定接收参数和返回参数。便于代码的复用性。(参数结合前面的总结,设计为可变参数类型,返回值为底牌)
public static List<Integer> sendCard(ArrayList<Integer> ...Card){
if(Card.length < 3 || Card.length > 3){
throw new RuntimeException("请选择三名玩家。。。")
}
List<Integer> button =new ArrayList<>();
List<Integer> poker = Pokers.getPoker();
Collections.shuffle(poker);
for (int i = 0; i < poker.size(); i++) {
int card = poker.get(i);
if( i >= 51){
button.add(card);
continue;
}
if(i % 3 == 0){
Card[0].add(card);
}else if(i % 3 == 1){
Card[1].add(card);
}else{
Card[2].add(card);
}
}
return button;
}
而在看牌部分,可以看到都是相类似的方法,因此,在此将此抽取成一个方法,设置参数的时候为了便于直观的查看,也就仅接收一个集合来遍历。(这里主要体现在减少代码的重复使用上)
public static void lookCard(String name , ArrayList<Integer> player){
Collections.sort(player);
Collections.reverse(player);
System.out.print(name+": ");
Map<Integer, String> map = Pokers.getPokerMap();
for (int i = 0; i < player.size(); i++) {
System.out.print(map.get(player.get(i))+" ");
}
System.out.println();
}