博客作为日常教学记录补充,将自己和学生的小思路和灵感进行简要记录,今天讲解完集合,布置了一个集合实现斗地主发牌的小练习,并进行结合面向对象思想的讲解,学生在课程完毕后,提出了更简便的思路,特此记录:
1.面向过程思路+集合
// 扑克牌
Map<Integer,String> pokerMap = new HashMap<>();
// 牌的顺序
List<Integer> sort = new ArrayList<>();
// 1.买扑克
// 1.1 花色
String[] flower = {"♠","♦","♣","♥"};
// 1.2 数字
String[] nums = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
int a = 1;
// 组合
for(int i = 0 ; i < nums.length ; i ++){
for(int j = 0; j < flower.length ; j++){
String str = nums[i] + flower[j];
sort.add(a);
pokerMap.put(a,str);
a++;
}
}
sort.add(a);
pokerMap.put(a,"小王");
a++;
sort.add(a);
pokerMap.put(a,"大王");
System.out.println(pokerMap);
System.out.println(sort);
// 2.洗牌
Collections.shuffle(sort);
System.out.println(sort);
// 3.发牌(三人+底牌)
List<Integer> player1 = new ArrayList<>();
List<Integer> player2 = new ArrayList<>();
List<Integer> player3 = new ArrayList<>();
List<Integer> floor = new ArrayList<>();
for(int i = 0; i < sort.size(); i++){
// 前三张作为底牌抽出
if(i < 3){
floor.add(sort.get(i));
}else if(i % 3 == 0){// player1
player1.add(sort.get(i));
}else if(i % 3 == 1){// player2
player2.add(sort.get(i));
}else if(i % 3 == 2){// player3
player3.add(sort.get(i));
}
}
// 整牌
Collections.sort(player1);
Collections.sort(player2);
Collections.sort(player3);
// 4.看牌
System.out.println("玩家1:");
for(int i = 0 ; i < player1.size();i++){
String str = pokerMap.get(player1.get(i));
System.out.print(str + "\t");
}
System.out.println();
System.out.println("玩家2:");
for(int i = 0 ; i < player2.size();i++){
String str = pokerMap.get(player2.get(i));
System.out.print(str + "\t");
}
System.out.println();
System.out.println("玩家3:");
for(int i = 0 ; i < player3.size();i++){
String str = pokerMap.get(player3.get(i));
System.out.print(str + "\t");
}
System.out.println();
System.out.println("底牌:");
for(int i = 0 ; i < floor.size();i++){
String str = pokerMap.get(floor.get(i));
System.out.print(str + "\t");
}
2.面向对象思路+集合
/**
* @Auther: Xulu
* @ProjectName: JavaDay12
* @Date: 2019/7/24 15:03
* @Description:面向对象思想实现斗地主发牌
*/
public class Porker {
// 扑克牌
private static Map<Integer,String> pokerMap = new HashMap<>();
// 牌的顺序
private static List<Integer> sort = new ArrayList<>();
/**
* 买牌
*/
public static void getPoker(){
// 1.1 花色
String[] flower = {"♠","♦","♣","♥"};
// 1.2 数字
String[] nums = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
int a = 1;
// 组合
for(int i = 0 ; i < nums.length ; i ++){
for(int j = 0; j < flower.length ; j++){
String str = nums[i] + flower[j];
sort.add(a);
pokerMap.put(a++,str);
}
}
sort.add(a);
pokerMap.put(a++,"小王");
sort.add(a);
pokerMap.put(a,"大王");
System.out.println(pokerMap);
System.out.println(sort);
}
/**
* 洗牌
*/
public static void shufflePoker(){
Collections.shuffle(sort);
System.out.println(sort);
}
/**
* 发牌
*/
public static void deal(List<Integer> player1,List<Integer> player2,
List<Integer> player3,List<Integer> floor){
for(int i = 0; i < sort.size(); i++){
// 前三张作为底牌抽出
if(i < 3){
floor.add(sort.get(i));
}else if(i % 3 == 0){// player1
player1.add(sort.get(i));
}else if(i % 3 == 1){// player2
player2.add(sort.get(i));
}else if(i % 3 == 2){// player3
player3.add(sort.get(i));
}
}
// 排序+看牌
System.out.println("玩家1:");
showPoker(player1);
System.out.println("玩家2:");
showPoker(player2);
System.out.println("玩家3:");
showPoker(player3);
System.out.println("底牌:");
showPoker(floor);
}
/**
* 排序+看牌
* @param player
*/
private static void showPoker(List<Integer> player) {
Collections.sort(player);
for(int i = 0 ; i < player.size();i++){
String str = pokerMap.get(player.get(i));
System.out.print(str + "\t");
}
System.out.println();
}
}
public static void main(String[] args) {
List<Integer> player1 = new ArrayList<>();
List<Integer> player2 = new ArrayList<>();
List<Integer> player3 = new ArrayList<>();
List<Integer> floor = new ArrayList<>();
// 买
Porker.getPoker();
// 洗牌
Porker.shufflePoker();
// 发牌
Porker.deal(player1,player2,player3,floor);
}
以上为集合实现斗地主的常规做法,利用map存放牌的排序位置以及花色,利用list集合sort进行记录当前牌的排序情况。学生在课后提出可以直接使用List集合完成顺序记录以及牌面数字花色记录,但这种方案在前面操作是没有问题的,当进行到需要对发好的牌进行排序时会有问题。