- package cn.itcast;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.TreeSet;
- /*
- * 三个人斗地主
- * 分析:
- * 首先要有牌,牌有花色和面值,另有大小王各一张
- * 所以分别用数组定义花色和面值
- *
- * 有了牌以后要进行储存
- *
- * 储存以后,打乱牌的顺序,按乱序以后顺序发牌
- *
- * 分别依次发给三个人,在发到还有三张牌的时候留作底牌
- *
- * 发牌结束进行看牌
- *
- * 这个时候发现一个问题,牌的排列很乱,这样不利于我们看
- * 于是从更加细致的角度来思考这个问题
- *
- * 定义牌的大小,每张牌对应一个索引,存入Map集合中
- * 在排序和发牌时,只是对索引进行操作
- * 在看牌时,显示已按大小顺序排好索引对应的值
- *
- * 步骤:
- * 1.定义HashMap集合,定义ArrayList集合
- * 2.定义两个数组,花色和面值
- * 3.定义索引,将索引和牌存入Map,索引存入ArrayList
- * 4.对ArrayList进行乱序
- * 5.按照索引对每一张牌进行发放
- * 6.定义功能看牌
- *
- */
- public class PokerDemo2 {
- public static void main(String[] args) {
- // 定义集合
- HashMap<Integer, String> hm = new HashMap<Integer, String>();
- ArrayList<Integer> al = new ArrayList<Integer>();
- // 定义数组
- String[] huase = { "♥", "♠", "♧", "♢" };
- String[] mianzhi = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q",
- "K", "A", "2" };
- // 定义索引存入集合
- int index = 0;
- // 外循环应该是数值,内循环是花色,这个是牌的大小决定的
- for (String num : mianzhi) {
- for (String color : huase) {
- hm.put(index, color.concat(num));
- al.add(index);
- index++;
- }
- }
- // 两张特殊的牌
- hm.put(index, "小王");
- al.add(index);
- index++;
- hm.put(index, "大王");
- al.add(index);
- // 牌已经装好,现在需要打乱顺序,只需要对ArrayList操作
- Collections.shuffle(al);
- // 发牌,对每一张牌的索引进行处理,希望可以自动排序,就使用TreeSet进行存储
- TreeSet<Integer> player1 = new TreeSet<Integer>();
- TreeSet<Integer> player2 = new TreeSet<Integer>();
- TreeSet<Integer> player3 = new TreeSet<Integer>();
- TreeSet<Integer> retain = new TreeSet<Integer>();
- for (int x = 0; x < al.size(); x++) {
- // 需要留三张底牌
- if (x >= al.size()-3) {
- retain.add(al.get(x));
- } else if (x % 3 == 0) {
- player1.add(al.get(x));
- } else if (x % 3 == 1) {
- player2.add(al.get(x));
- } else if (x % 3 == 2) {
- player3.add(al.get(x));
- }
- }
- // 发牌结束,想要看看玩家的牌,可以定义功能实现
- // 想看谁的牌就可以看了
- lookPocker("玩家1", player1, hm);
- lookPocker("玩家2", player2, hm);
- lookPocker("玩家3", player3, hm);
- lookPocker("留底", retain, hm);
- }
- /*
- * 两个明确:应该是没有具体返回值类型的,因为是看牌,直接输出结果即可。
- * 参数列表的思考:看谁的牌,需要调用TreeSet和HashMap两个集合,因为看牌需要输出牌而不是索引
- */
- public static void lookPocker(String name, TreeSet<Integer> ts,
- HashMap<Integer, String> hm) {
- System.out.print(name + "的牌:");
- for (Integer key : ts) {
- String value = hm.get(key);
- System.out.print(value + " ");
- }
- System.out.println();
- }
- }
复制代码
|
|