[从0开始学Java|第二十五天]项目阶段(综合练习&斗地主小游戏)

综合练习

综合练习1:随机点名器的两种实现方式

(源代码)

java 复制代码
package com.itheima.a08test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class Test1 {
    public static void main(String[] args) {
        /* 班级里有N个学生,学生属性:姓名,年龄,性别。
        实现随机点名器。*/

        ArrayList<String> list = new ArrayList<>();

        Collections.addAll(list,"张三","李四","王五","赵六","钱七");

        //方式一:
        Random r = new Random();
        int index = r.nextInt(list.size());
        String name1 = list.get(index);
        System.out.println(name1);

        System.out.println("------------------------------");

        //方式二:
        Collections.shuffle(list);
        String name2 = list.get(0);
        System.out.println(name2);

    }

}

(运行结果截图)

综合练习2:带有概率的随机点名

(源代码)

java 复制代码
package com.itheima.a08test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class Test2 {
    public static void main(String[] args) {
        /* 班级里有N个学生
        要求:
        70%的概率随机到男生
        30%的概率随机到女生

        "范闲","范建","范统","杜子腾","宋合泛","侯笼藤","朱益群","朱穆朗玛峰"
        "杜琦燕","袁明媛","李猜","田蜜蜜"
        */
        //1.创建集合
        ArrayList<Integer> list = new ArrayList<>();
        //2.添加数据
        Collections.addAll(list,1,1,1,1,1,1,1);
        Collections.addAll(list,0,0,0);
        //3.打乱集合中的数据
        Collections.shuffle(list);
        System.out.println(list);
        //4.从list集合中随机抽取0或者1
        Random r = new Random();
        int index = r.nextInt(list.size());
        int number = list.get(index);
        System.out.println(number);
        //5.创建两个集合分别存储男生和女生的名字
        ArrayList<String> boyList = new ArrayList<>();
        ArrayList<String> girlList = new ArrayList<>();

        Collections.addAll(boyList,"范闲","范建","范统","杜子腾","宋合泛","侯笼藤","朱益群","朱穆朗玛峰");
        Collections.addAll(girlList,"杜琦燕","袁明媛","李猜","田蜜蜜");

        //6.判断此时是从boyList里面抽取还是从girlList里面抽取
        if(number == 1){
            //boyList
            int boyIndex = r.nextInt(boyList.size());
            String boy = boyList.get(boyIndex);
            System.out.println(boy);

        }else{
            //girlList
            int girlIndex = r.nextInt(girlList.size());
            String girl = boyList.get(girlIndex);
            System.out.println(girl);

        }









    }
}

(运行结果截图)

综合练习3:不重复的随机点名

shift + F6 批量改名

Ctrl + Alt + L 格式化代码

(源代码)

java 复制代码
package com.itheima.a08test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class Test3 {
    public static void main(String[] args) {
        /* 班级里有N个学生
        要求:
        被点到的学生不会再被点到。
        但是如果班级中所有的学生都点完了,需要重新开启第二轮点名。
        "范闲", "范建", "范统", "杜子腾", "杜琦燕", "宋合泛", "侯笼藤", "朱益群", "朱穆朗玛峰", "袁明媛"*/

        ArrayList<String> list = new ArrayList<>();

        Collections.addAll(list,"范闲", "范建", "范统", "杜子腾", "杜琦燕", "宋合泛", "侯笼藤", "朱益群", "朱穆朗玛峰", "袁明媛");

        ArrayList<String> list2 = new ArrayList<>();

        for (int i = 0; i < 10; i++) {
            System.out.println("第" + i + "轮点名开始了");
            int length = list.size();
            Random r = new Random();
            for (int j = 0; j < length; j++) {
                int index = r.nextInt(list.size());
                String name = list.remove(index);
                list2.add(name);
                System.out.println(name);

            }
            list.addAll(list2);
            list2.clear();
        }
        


    }
}

(运行结果截图)

综合练习6:集合嵌套

shift + F6 批量更改

(源代码)

java 复制代码
package com.itheima.a08test;

import java.util.*;

public class Test6 {
    public static void main(String[] args) {
        /* 需求
        定义一个Map集合,键用表示省份名称province,值表示市city,但是市会有多个。
        添加完毕后,遍历结果格式如下:
                江苏省 = 南京市,扬州市,苏州市,无锡市,常州市
                湖北省 = 武汉市,孝感市,十堰市,宜昌市,鄂州市
                河北省 = 石家庄市,唐山市,邢台市,保定市,张家口市*/
        HashMap<String,ArrayList<String>> hm = new HashMap<>();

        ArrayList<String> list1 = new ArrayList<>();
        list1.add("南京市");
        list1.add("扬州市");
        list1.add("苏州市");
        list1.add("无锡市");
        list1.add("常州市");

        ArrayList<String> list2 = new ArrayList<>();
        list2.add("武汉市");
        list2.add("孝感市");
        list2.add("十堰市");
        list2.add("宜昌市");
        list2.add("鄂州市");


        ArrayList<String> list3 = new ArrayList<>();
        list3.add("石家庄市");
        list3.add("唐山市");
        list3.add("邢台市");
        list3.add("保定市");
        list3.add("张家口市");

        hm.put("江苏省",list1);
        hm.put("湖北省",list2);
        hm.put("河北省",list3);

        //把数据添加到HashMap
        Set<HashMap.Entry<String,ArrayList<String>>> entries = hm.entrySet();

        for (Map.Entry<String, ArrayList<String>> entry : entries) {
            String key = entry.getKey();
            ArrayList<String> value = entry.getValue();
            //拼接
            StringJoiner sj = new StringJoiner(",");
            for (String s : value) {
                sj.add(s);
            }
            System.out.println(key + " = " + sj);
        }

    }
}

(运行结果截图)

斗地主

01-准备牌、洗牌、发牌

(分析)

(源代码)

App

java 复制代码
package com.itheima.doudizhu1;

public class App {
    public static void main(String[] args) {
        /*
        完成控制台版的三步:
          准备牌
          洗牌
          发牌


       */
        
        new PokerGame();

        

    }
}

PokerGame

java 复制代码
package com.itheima.doudizhu1;

import java.util.ArrayList;
import java.util.Collections;

public class PokerGame {

    static ArrayList<String> list = new ArrayList<>();


    //准备牌
    static{
        String[] color = {"♥","♦","♣","♠"};
        String[] number = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};

        for(String c : color){
            for(String n : number) {
                list.add(c + n);
            }

        }
       list.add("大王");
       list.add("小王");

    }


    public PokerGame() {

        System.out.println(list);

        //洗牌
        Collections.shuffle(list);


        //发牌
        ArrayList<String> load = new ArrayList<>();
        ArrayList<String> player1 = new ArrayList<>();
        ArrayList<String> player2 = new ArrayList<>();
        ArrayList<String> player3 = new ArrayList<>();

        for (int i = 0; i < list.size(); i++) {
            String poker = list.get(i);
            if (i <= 2) {
                load.add(poker);
                continue;
            }

            if (i % 3 == 0) {
                player1.add(poker);
            } else if (i % 3 == 1) {
                player2.add(poker);
            } else if (i % 3 == 2) {
                player3.add(poker);
            }


        }

        lookPoker("底牌",load);
        lookPoker("刚脑壳",player1);
        lookPoker("大帅比",player2);
        lookPoker("蛋筒",player3);


    }


    //看牌
    public  void lookPoker(String name,ArrayList<String> list) {
        System.out.print(name + ":");
        for(String poker : list){
            System.out.print(poker + " ");
        }
        System.out.println();


    }




}

(运行结果截图)

02-第一种排序方式

(分析)

(源代码)

App

java 复制代码
package com.itheima.doudizhu2;

public class App {
    public static void main(String[] args) {


        new PokerGame();


    }
}

PokerGame

java 复制代码
package com.itheima.doudizhu2;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;

public class PokerGame {

    //牌盒
    static HashMap<Integer,String> hm = new HashMap<>();
    static ArrayList<Integer> list = new ArrayList<>();

    static{
        String[] color = {"♥","♦","♣","♠"};
        String[] number = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};

        int serialNumber = 1;
        for (String n : number) {
            for (String c : color) {
                hm.put(serialNumber,c + n);
                list.add(serialNumber);
                serialNumber++;
            }
        }

        hm.put(serialNumber,"小王");
        list.add(serialNumber);
        serialNumber++;
        hm.put(serialNumber,"大王");
        list.add(serialNumber);


        /*System.out.println(hm);
        {1=♥3, 2=♦3, 3=♣3, 4=♠3, 5=♥4, 6=♦4, 7=♣4, 8=♠4, 9=♥5, 10=♦5, 11=♣5, 12=♠5, 13=♥6, 14=♦6, 15=♣6, 16=♠6,
         17=♥7, 18=♦7, 19=♣7, 20=♠7, 21=♥8, 22=♦8, 23=♣8, 24=♠8, 25=♥9, 26=♦9, 27=♣9, 28=♠9, 29=♥10, 30=♦10, 31=♣10, 32=♠10,
          33=♥J, 34=♦J, 35=♣J, 36=♠J, 37=♥Q, 38=♦Q, 39=♣Q, 40=♠Q, 41=♥K, 42=♦K, 43=♣K, 44=♠K, 45=♥A, 46=♦A, 47=♣A, 48=♠A,
          49=♥2, 50=♦2, 51=♣2, 52=♠2, 53=小王, 54=大王}
        */


    }

    public PokerGame(){
        //洗牌
        Collections.shuffle(list);

        //发牌
        TreeSet<Integer> load = new TreeSet<>();
        TreeSet<Integer> player1 = new TreeSet<>();
        TreeSet<Integer> player2 = new TreeSet<>();
        TreeSet<Integer> player3 = new TreeSet<>();

        for (int i = 0; i < list.size(); i++) {
            int serialNumber = list.get(i);

            if(i <= 2){
                load.add(serialNumber);
                continue;
            }

            if(i % 3 == 0){
                player1.add(serialNumber);
            }else if(i % 3 ==1){
                player2.add(serialNumber);
            }else{
                player3.add(serialNumber);
            }


        }

        //看牌
        lookPoker("底牌",load);
        lookPoker("刚脑壳",player1);
        lookPoker("大帅比",player2);
        lookPoker("蛋筒",player3);





    }

    public void lookPoker(String name,TreeSet<Integer> ts){
        System.out.print(name + ":");
        for (int serialNumber : ts) {
            String poker = hm.get(serialNumber);
            System.out.print(poker + " ");
        }
        System.out.println();

    }




}

(运行结果截图)

03-第二种排序方式

(源代码)

java 复制代码
package com.itheima.doudizhu3;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;


public class PokerGame {
    //牌盒
    static ArrayList<String> list = new ArrayList<>();

    //创建一个集合,用来添加牌的价值
    static HashMap<String, Integer> hm = new HashMap<>();

    static {
        //准备牌
        String[] color = {"♦", "♣", "♥", "♠"};
        String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};

        for (String c : color) {
            for (String n : number) {
                list.add(c + n);
            }
        }
        list.add(" 小王");
        list.add(" 大王");


        //指定牌的价值
        //牌上的数字到Map集合中判断是否存在
        //存在,获取价值
        //不存在,本身的数字就是价值
        hm.put("J", 11);
        hm.put("Q", 12);
        hm.put("K", 13);
        hm.put("A", 14);
        hm.put("2", 15);
        hm.put("小王", 50);
        hm.put("大王", 100);


    }

    public PokerGame() {
        //洗牌
        Collections.shuffle(list);

        //发牌
        ArrayList<String> lord = new ArrayList<>();
        ArrayList<String> player1 = new ArrayList<>();
        ArrayList<String> player2 = new ArrayList<>();
        ArrayList<String> player3 = new ArrayList<>();

        for (int i = 0; i < list.size(); i++) {
            String poker = list.get(i);
            //发底牌
            if (i <= 2) {
                lord.add(poker);
                continue;
            }

            //给三个玩家轮流发牌
            if (i % 3 == 0) {
                player1.add(poker);
            } else if (i % 3 == 1) {
                player2.add(poker);
            } else {
                player3.add(poker);
            }
        }


        //排序
        order(lord);
        order(player1);
        order(player2);
        order(player3);


        //看牌
        lookPoker("底牌",lord);
        lookPoker("钢脑壳",player1);
        lookPoker("大帅比",player2);
        lookPoker("蛋筒",player3);
    }


    /*
     * 参数一:玩家的名字
     * 参数二:每位玩家的牌
     * */
    public void lookPoker(String name, ArrayList<String> list){
        System.out.print(name + ": ");
        for (String poker : list) {
            System.out.print(poker + " ");
        }
        System.out.println();

    }


    //利用牌的价值进行排序
    //参数:集合
    //♥5 ♥3 ♥6 ♥7 ♥9
    public void order(ArrayList<String> list){
        Collections.sort(list, new Comparator<String>() {
            //Array.sort (插入排序 + 二分查找)
            @Override
            public int compare(String o1, String o2) {
                //o1:表示当前要插入到有序序列中的牌
                //o2:表示已经在有序序列中存在的牌

                //负数:o1小 插入到前面
                //正数:o1大 插入到后面
                //0:o1的数字跟o2的数字是一样的,需要按照花色再次排序

                //1.计算o1的花色和价值   大王
                String color1 = o1.substring(0, 1);
                int value1 = getValue(o1);

                //2.计算o2的花色和价值
                String color2 = o2.substring(0, 1);
                int value2 = getValue(o2);

                //3.比较o1和o2的价值    ♥3  ♠3
                int i = value1 - value2;
                return i == 0 ? color1.compareTo(color2) : i;

            }
        });
    }

    //计算牌的价值
    //参数:牌
    //返回值:价值
    public int getValue(String poker){//♥3
        //获取牌上的数字
        String number = poker.substring(1);//把这里截取出来的结果,让这个结果再Map集合中存在 " 大王"
        //拿着数字到map集合中判断是否存在
        if(hm.containsKey(number)){
            //存在,获取价值
            return hm.get(number);
        }else{
            //不存在,类型转换
            return Integer.parseInt(number);
        }
    }
}

(运行结果截图)

相关推荐
Demon1_Coder1 小时前
Day4-微服务-Seata默认事务
java·数据库·微服务
Sunia1 小时前
《AgentX 专栏》08-工作流引擎:AgentWorkflow怎么把工具记忆流程串成一条流水线
java·架构
huipeng9261 小时前
企业级微服务开发实战(二):微服务基础设施搭建与中间件部署
java·redis·mysql·spring cloud·微服务·nacos·rabbitmq
Jabes.yang1 小时前
Java电商订单系统面试全流程解析:接口设计、数据库、微服务与分布式事务实战
java·微服务·mybatis·分布式事务·电商·订单系统·接口设计
码语智行1 小时前
导入模板下载
java
摇滚侠2 小时前
IDEA 创建 Java 项目 推送到远程 Git 仓库
java·git·intellij-idea
可乐ea2 小时前
【知识获取与分享社区项目 | 项目日记第 24 天】终章总结:从认证、发布、计数、Feed、搜索到 RAG:完整复盘一个知识社区后端系统
java·spring boot·redis·mysql·elasticsearch·ai·kafka
Jabes.yang2 小时前
Java面试实录:AIGC场景下的Stream、微服务、Redis、Kafka与安全实战
java·spring boot·redis·微服务·面试·kafka·aigc
lwf0061642 小时前
实战:用 Java 模拟登录阿里云控制台,爬取没有 OpenAPI 的数据
java·阿里云