【玩儿】Java 数字炸弹小游戏(控制台版)+ IO 数据存储

Java 数字炸弹小游戏(控制台版)+ IO 数据存储

  • 数字炸弹小游戏概述
  • 功能实现
    • 实体类
      • User.java 玩家信息实体类
      • GameRecode.java 游戏记录实体类
    • 自定义异常
      • AccountLockedException.java 账号锁定异常
      • PasswordErrorException.java 密码错误异常
      • UnknowAccountException 账号不存在异常
    • 游戏主类
      • Game.java 游戏主类

数字炸弹小游戏概述

在这里插入图片描述

数字炸弹控制台版小游戏是Java 集合、流程控制、IO、异常、常用类等技术的综合练习。核心需求如下:

实现数字炸弹游戏,要求如下:
	1、创建游戏菜单:
		1)注册
		2)登录
		3)开始游戏
		4)游戏记录
		5)游戏排行
		6)退出游戏
	2、菜单含义:
		1)注册:注册游戏玩家,要求玩家名字不能重复
		2)登录:使用玩家名字和密码进行登陆
		3)开始游戏:进入游戏,只有登录的玩家才可以开始游戏
		4)游戏记录:展示当前玩家的游戏记录,序号、炸弹、猜测次数、游戏开始时间、游戏结束时间、积分
		5)游戏排行:展示所有用户的昵称、游戏次数、总积分(倒序)
		6)退出游戏:结束游戏
	3、游戏规则
		a、生成100以内的随机值作为炸弹
		b、从控制台输入猜测的数值
		c、每次输入猜测值之后缩小猜测范围直到猜中为止
		d、本轮游戏结束之后反馈菜单(继续游戏、返回菜单)
		e、本轮游戏结束之后根据猜测次数和游戏时间换算积分
	4、游戏积分
		a、1-3次内猜中(含3次),时间在20秒以内,积分+10
		b、4-6次内猜中(含6次),时间在21-60秒,积分+5
		c、7-10次内猜中(含10次),时间在60秒以上,积分+2
		d、10次以上猜中不得分
	5、拓展功能:
		a、给游戏排行榜新加菜单选项,支持升序、降序的展示菜单。
		b、新增玩家管理功能,锁定玩家和解锁玩家。
		c、给登录功能增加异常处理,自定义:账号不存在异常、认证失败异常、锁定异常
		d、基于 IO 存储玩家信息和记录信息到文件。

功能实现

实体类

User.java 玩家信息实体类

package com.riu.collect.game2.entity;

import java.io.Serializable;
import java.util.Objects;

/**
 * 玩家类,玩家的相关信息
 */
public class User implements Comparable<User>, Serializable {
    // 账号
    private String name;
    // 密码
    private String password;
    // 总的猜测数量、游戏的次数
    private Integer totalCount;
    // 总的积分
    private Integer totalPoints;
    // 玩家锁定、解锁的标记:false(解锁状态)true(锁定状态)
    private boolean isLock = false;

    public User() {
    }

    public User(String name, String password, Integer totalCount, Integer totalPoints) {
        this.name = name;
        this.password = password;
        this.totalCount = totalCount;
        this.totalPoints = totalPoints;
    }

    public User(String name, String password, Integer totalCount, Integer totalPoints, boolean isLock) {
        this.name = name;
        this.password = password;
        this.totalCount = totalCount;
        this.totalPoints = totalPoints;
        this.isLock = isLock;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(Integer totalCount) {
        this.totalCount = totalCount;
    }

    public Integer getTotalPoints() {
        return totalPoints;
    }

    public void setTotalPoints(Integer totalPoints) {
        this.totalPoints = totalPoints;
    }

    public boolean isLock() {
        return isLock;
    }

    public void setLock(boolean lock) {
        isLock = lock;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", totalCount=" + totalCount +
                ", totalPoints=" + totalPoints +
                ", isLock=" + isLock +
                '}';
    }

    /**
     * equals 和 hashCode 可以帮助我们判断对象的唯一性
     * 当前类的唯一性的条件是:用户名字,玩家在注册时候可以保证唯一性
     * @param o
     * @return
     */
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(name, user.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }

    @Override
    public int compareTo(User o) {
        return this.getName().compareTo(o.name);
    }
}

GameRecode.java 游戏记录实体类

package com.riu.collect.game2.entity;

import java.io.Serializable;
import java.util.Date;

/**
 * 每次游戏的记录信息
 */
public class GameRecode implements Serializable {
    // 炸弹
    private Integer boom;
    // 猜测次数
    private Integer count;
    // 游戏开始时间
    private Date startTime;
    // 游戏结束时间
    private Date endTime;
    // 积分
    private Integer points;

    public Integer getBoom() {
        return boom;
    }

    public void setBoom(Integer boom) {
        this.boom = boom;
    }

    public Integer getCount() {
        return count;
    }

    public void setCount(Integer count) {
        this.count = count;
    }

    public Date getStartTime() {
        return startTime;
    }

    public void setStartTime(Date startTime) {
        this.startTime = startTime;
    }

    public Date getEndTime() {
        return endTime;
    }

    public void setEndTime(Date endTime) {
        this.endTime = endTime;
    }

    public Integer getPoints() {
        return points;
    }

    public void setPoints(Integer points) {
        this.points = points;
    }

    @Override
    public String toString() {
        return "GameRecode{" +
                "boom=" + boom +
                ", count=" + count +
                ", startTime=" + startTime +
                ", endTime=" + endTime +
                ", points=" + points +
                '}';
    }
}

自定义异常

AccountLockedException.java 账号锁定异常

package com.riu.collect.game2.exception;

/**
 * 玩家账号锁定异常
 */
public class AccountLockedException extends Exception {
    public AccountLockedException() {
        super();
    }

    public AccountLockedException(String message) {
        super(message);
    }

    @Override
    public String getMessage() {
        return super.getMessage();
    }
}

PasswordErrorException.java 密码错误异常

package com.riu.collect.game2.exception;

/**
 * 玩家密码错误,认证失败
 */
public class PasswordErrorException extends Exception {
    public PasswordErrorException() {
        super();
    }

    public PasswordErrorException(String message) {
        super(message);
    }

    @Override
    public String getMessage() {
        return super.getMessage();
    }
}

UnknowAccountException 账号不存在异常

package com.riu.collect.game2.exception;

/**
 * 玩家账号不存在异常
 */
public class UnknowAccountException extends Exception {
    public UnknowAccountException() {
        super();
    }

    public UnknowAccountException(String message) {
        super(message);
    }

    @Override
    public String getMessage() {
        return super.getMessage();
    }
}

游戏主类

Game.java 游戏主类

package com.riu.collect.game2;

import com.riu.collect.game2.entity.GameRecode;
import com.riu.collect.game2.entity.User;
import com.riu.collect.game2.exception.AccountLockedException;
import com.riu.collect.game2.exception.PasswordErrorException;
import com.riu.collect.game2.exception.UnknowAccountException;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Stream;

public class Game {
    // 创建一个用户的集合
    private List<User> userList = new ArrayList<>();
    // 玩家和记录的对应关系
    private Map<String, List<GameRecode>> recodeMap = new HashMap<>();
    // 当前登录的玩家名字
    private String loginName;
    // 判断玩家是登录的标记,默认 false 表示没有登录。
    // 等成功之后可以进行一些菜单操作
    boolean isLogin = false;

    // 两个文件路径
    private String userInfoPath = "src/com/riu/collect/game2/userInfo.txt";
    private String recodeInfoPath = "src/com/riu/collect/game2/recodeInfo.txt";
    // 定义公共的输入对象
    private Scanner scanner = new Scanner(System.in);


    public static void main(String[] args) {
        Game game = new Game();
        game.init();
        while (true){
            game.menu();
        }
    }

    /**
     * 初始化系统,从文件中将数据读取到 List
     */
    private void init(){
        try {

            /* 用户玩家信息读取 */
            File userInfoFile = new File(userInfoPath);
            if(userInfoFile.exists()){
                ObjectInputStream oisUserInfoStream = new ObjectInputStream(new FileInputStream(userInfoPath));
                Object userInfoObject = oisUserInfoStream.readObject();
                if(userInfoObject != null){
                    userList = (List<User>) userInfoObject;
                }
                oisUserInfoStream.close();
            }

            /* 用户玩家游戏记录读取 */
            File recodeInfoFile = new File(recodeInfoPath);
            if(recodeInfoFile.exists()) {
                ObjectInputStream oisRecodeInfoStream = new ObjectInputStream(new FileInputStream(recodeInfoPath));
                Object recodeObject = oisRecodeInfoStream.readObject();
                if (recodeObject != null) {
                    recodeMap = (Map<String, List<GameRecode>>) recodeObject;
                }
                oisRecodeInfoStream.close();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public void menu(){
        System.out.println("===================================");
        System.out.println("\t\t\t1)注册");
        System.out.println("\t\t\t2)登录");
        if(isLogin){
            System.out.println("\t\t\t3)开始游戏");
            System.out.println("\t\t\t4)游戏记录");
        }
        System.out.println("\t\t\t5)游戏排行");
        System.out.println("\t\t\t6)退出游戏");
        System.out.println("\t\t\t7)玩家管理");
        System.out.println("===================================");
        System.out.print("请输入菜单编号:");
        int menuNum = scanner.nextInt();
        switch (menuNum) {
            case 1:
                // 注册
                reg();
                break;
            case 2:
                // 登录
                try {
                    login();
                } catch (UnknowAccountException | PasswordErrorException | AccountLockedException e) {
                    System.out.println(e.getMessage());
                }
                break;
            case 3:
                // 开始游戏
                startGame();
                break;
            case 4:
                // 展示游戏记录
                gameRecode();
                break;
            case 5:
                // 展示游戏排行榜
                gameTop();
                break;
            case 6:
                // 退出游戏
                exit();
                break;
            case 7:
                // 退出游戏
                userControl();
                break;
        }
    }


    /**
     * 注册
     */
    private void reg() {
        System.out.print("请输入玩家昵称:");
        String name = scanner.next();
        System.out.print("请输入密码:");
        String password = scanner.next();

        // 把输入的信息封装到对象中
        User user = new User();
        user.setName(name);
        user.setPassword(password);

        // 判断集合中是否已经存在玩家信息
        // 这里使用 contains 对比,要求 user 类必须重写 equals 和 hashcode 方法
        if(userList.contains(user)){
            System.out.println("玩家已经存在,快去开始游戏吧...");
        } else {
            // 把对象添加到集合
            userList.add(user);
            System.out.println("注册成功,快去开始游戏吧...");
        }
    }

    /**
     * 登录
     * 1、账号是否存在
     * 2、账号密码是否匹配
     * 3、账号是否被锁定
     *
     * 账号是用户输入的,根据用户输入的信息,递进验证账号是否可以使用。
     * 1、账号是否存在:拿着用户输入的信息,从集合中获取用户的信息对象。可以把用户对象临时存储一下。
     * 2、账号密码是否匹配:拿着用户输入的密码,和获取到的用户对象的密码对比。
     * 3、账号是否被锁定:根据获取到的用户的对象信息中的锁定状态判断。
     */
    private void login() throws UnknowAccountException, PasswordErrorException, AccountLockedException {
        System.out.print("请输入玩家昵称:");
        String name = scanner.next();
        System.out.print("请输入密码:");
        String password = scanner.next();

        // 用于临时存储用户信息的对象
        User tempUser = null;

        // 循环遍历,找账号信息
        for (User item : userList) {
            String tempName = item.getName();

            // 用户输入的账号,和集合中获取的用户的账号对比
            // 找到用户了。
            if (name.equals(tempName)) {
                tempUser = item;
                break;
            }
        }

        // 基于账号信息(tempUser)做3种别判断
        // 1、账号是否存在
        if(tempUser == null){
            // System.out.println("账号不存在!");
            throw new UnknowAccountException("该玩家不存在!");
        } else {
            // System.out.println("账号存在!");
            // 2、账号密码是否匹配
            // 玩家输入的密码和 tempUser 的密码匹配
            if(password.equals(tempUser.getPassword())){
                // System.out.println("密码正确!");
                // 3、账号是否被锁定
                if(tempUser.isLock()){
                    // System.out.println("账号被锁定");
                    throw new AccountLockedException("账号被锁定!");
                } else {
                    System.out.println("账号可用,登录成功!");
                    // 玩家存在的标记修改为 true
                    isLogin = true;

                    // 登录成功之后把当前玩家的名字赋值给全局的变量
                    loginName = name;
                    // 登录成功了,给当前用户创建一个用于存储游戏记录的list结果
                    recodeMap.put(name, new ArrayList<>());
                }
            } else {
                // System.out.println("密码不正确,认证失败!");
                throw new PasswordErrorException("密码错误!");
            }
        }
    }

    /**
     * 开始游戏
     */
    private void startGame() {
        // 可以给循环做一个标记:lab 就是这个循环的标记名字,名字可以任意。
        lab:
        while (true){
            /* 游戏本身需要的相关变量 */
            // 区间开始和结束
            int start = 0;
            int end = 100;
            /* 游戏本身需要的相关变量 */

            /* 游戏记录数据需要的相关变量 */
            // 每一轮游戏的过程
            // 随机炸弹
            int boom = new Random().nextInt(100);

            // 开始和结束时间
            Date startTime = new Date();
            Date endTime = null;

            // 每一轮游戏猜的次数
            int count = 0;
            // 每一轮游戏的积分变量
            int points = 0;
            /* 游戏记录数据需要的相关变量 */

            while (true){
                // 猜测次数的累加
                count++;
                System.out.print("请猜:");
                int num = scanner.nextInt();
                if(num > boom){
                    end = num;
                } else if(num < boom){
                    start = num;
                } else {
                    System.out.println("💣游戏结束💣");
                    /* 游戏结束才开始收集游戏信息:开始 */
                    // 结束时间
                    endTime = new Date();

                    // 计算时间间隔
                    long l = (endTime.getTime() - startTime.getTime()) / 1000;
                    // 计算次数
                    if (count >= 1 && count <= 3) {
                        points = 10;
                    } else if (count >= 4 && count <= 6) {
                        points = 5;
                    } else if (count >= 7 && count <= 10) {
                        points = 2;
                    } else {
                        points = 0;
                    }

                    // 创建记录对象,封装游戏过程中的记录信息
                    GameRecode gameRecode = new GameRecode();
                    gameRecode.setBoom(boom);
                    gameRecode.setCount(count);
                    gameRecode.setStartTime(startTime);
                    gameRecode.setEndTime(endTime);
                    gameRecode.setPoints(points);

                    // 这些记录是哪个玩家的。把记录和玩家挂钩。
                    List<GameRecode> gameRecodeList = recodeMap.get(loginName);
                    gameRecodeList.add(gameRecode);
                    /* 游戏结束才开始收集游戏信息:结束 */

                    // 跳出猜测的循环
                    break;
                }
                System.out.println("游戏继续,区间是:[" + start + ", " + end + "]");
            }

            System.out.println("****************************************");
            System.out.println("\t\t\t1)继续游戏");
            System.out.println("\t\t\t2)返回菜单");
            System.out.println("****************************************");
            System.out.print("请输入菜单编号:");
            String menuNum = scanner.next();
            switch (menuNum) {
                case "1":
                    // 结束的是 switch
                    break;
                case "2":
                    // 结束标记是 lab 的循环
                    break lab;
            }
        }
    }

    /**
     * 展示当前用户的游戏记录
     */
    private void gameRecode() {
        // 通过玩家和记录的Map集合,获取登录玩家的记录集合
        List<GameRecode> gameRecodeList = recodeMap.get(loginName);
        // 遍历当前玩家的记录集合
        System.out.println("序号\t炸弹\t次数\t开始时间\t\t\t\t结束时间\t\t\t\t积分");
        int i = 1;
        for (GameRecode gameRecode : gameRecodeList) {
            System.out.println(
                i++ + "\t" +
                gameRecode.getBoom()+ "\t" +
                gameRecode.getCount()+ "\t" +
                formatTime(gameRecode.getStartTime())+ "\t" +
                formatTime(gameRecode.getEndTime())+ "\t" +
                gameRecode.getPoints()+ "\t"
            );
        }
    }

    /**
     * 格式化时间的方法
     * @param date
     * @return
     */
    private String formatTime(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(date);
    }

    /**
     * 按照积分的降序展示每个用户的信息
     * 用户的昵称、游戏次数、总积分(倒序)
     */
    private void gameTop() {
        // 遍历用户结果集,汇总玩家的记录数据,循环走完之后,userList 中的每个玩家的游戏次数和总积分都会有值了
        for (User user : userList) {
            // 获取当前用户游戏记录的结果集
            List<GameRecode> gameRecodeList = recodeMap.get(user.getName());

            // 遍历游戏记录结果集,统计所有积分的和
            int sumPoints = 0;
            for (GameRecode gameRecode : gameRecodeList) {
                Integer points = gameRecode.getPoints();
                sumPoints += points;
            }

            // 将统计好的结果在赋值给用户对象
            user.setTotalCount(gameRecodeList.size());
            user.setTotalPoints(sumPoints);
        }

        System.out.println("-----------------------------------");
        System.out.println("\t\t\t1)升序展示");
        System.out.println("\t\t\t2)降序展示");
        System.out.println("-----------------------------------");
        System.out.print("请输入菜单编号:");
        String menuNum = scanner.next();

        System.out.println("昵称\t游戏次数\t总积分");
        // 默认升序排序,调用 sorted 之后返回一个可以继续操作的流
        Stream<User> newStream = userList.stream();

        switch (menuNum) {
            case "1":
                newStream = newStream.sorted(Comparator.comparing(User::getTotalPoints));
                break;
            case "2":
                newStream = newStream.sorted(Comparator.comparing(User::getTotalPoints).reversed());
                break;
        }

        // 输出放到最后
        newStream.forEach(user -> {
            System.out.println(
                    user.getName()+ "\t" +
                            user.getTotalCount() + "\t\t" +
                            user.getTotalPoints()
            );
        });


        // 根据积分倒叙排序
        // 1、List 转化为 Stream 流对象
        // 2、调用 Stream 的 sorted 方法进行排序
        // 3、sorted 需要传递一个排序的规则,这个规则是 Comparator 类型。这里思考:如何获取 Comparator 类型
        // 4、Comparator.comparing 方法可以返回一个 Comparator 类型,也就是排序的规则对象。其中还要知道排序的数据是哪个?是积分
        // 解析:Comparator.comparing 构建一个规则对象。方法传递要排序的关键字(数据属性)。reversed() 就是降序
        /*userList.stream()
                .sorted(Comparator.comparing(User::getTotalPoints).reversed())
                .forEach(user -> {
                    System.out.println(
                            user.getName()+ "\t" +
                                    user.getTotalCount() + "\t\t" +
                                    user.getTotalPoints()
                    );
                });*/
    }

    /**
     * 结束游戏
     */
    private void exit() {

        // 添加 IO 的操作,把玩家的信息写入到文件。
        try {
            /* 用户信息的存储 */
            // 也就是把 userList 的数据写入到文件
            File userInfoFile = new File(userInfoPath);
            if(!userInfoFile.exists()){
                userInfoFile.createNewFile();
            }

            // 创建对象的输出流
            ObjectOutputStream oosUserInfoSteam = new ObjectOutputStream(new FileOutputStream(userInfoFile));
            oosUserInfoSteam.writeObject(userList);
            oosUserInfoSteam.close();

            /* 用户游戏记录的存储 */
            // 也就是把 userList 的数据写入到文件
            File recodeFile = new File(recodeInfoPath);
            if(!recodeFile.exists()){
                recodeFile.createNewFile();
            }

            // 创建对象的输出流
            ObjectOutputStream oosRecodeInfoSteam = new ObjectOutputStream(new FileOutputStream(recodeInfoPath));
            oosRecodeInfoSteam.writeObject(recodeMap);
            oosRecodeInfoSteam.close();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("文件操作异常!");
        }

        System.exit(0);
    }

    /**
     * 玩家管理:对玩家进行锁定和解锁
     */
    private void userControl(){
        System.out.print("请输入要管理的玩家昵称:");
        // 要匹配的玩家名字
        String userName = scanner.next();
        User lockUser = null;
        boolean isLock = false;

        for (User user : userList) {
            String name = user.getName();

            if(userName.equals(name)){
                lockUser = user;
                break;
            }
        }

        if(lockUser != null){
            // 找到玩家之后,再进行业务处理
            System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
            System.out.println("\t\t\t1)锁定玩家");
            System.out.println("\t\t\t2)解锁玩家");
            System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
            System.out.print("请输入菜单编号:");
            String menuNum = scanner.next();

            switch (menuNum){
                case "1":
                    isLock = true;
                    break;
                case "2":
                    isLock = false;
                    break;
            }

            lockUser.setLock(isLock);
            System.out.println("^^^^^操作成功^^^^^");
        } else {
            System.out.println("该玩家不存在!");
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/901969.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决JeecgBoot微服务通过Gateway访问Swagger资源出现“Knife4j文档请求异常”

1.问题描述 基于jeecgboot单体版本,参照官方推荐的纯微服务项目拆分指南,对jeecgboot项目进行微服务拆分,将gateway和system模块启动成功后,通过gateway访问访问Swagger接口文档,出现“Knife4j文档请求异常”,如下图: 2.问题定位: 1.浏览器F12打开控制台,查看异常请…

RPKI路由应急管控系统---软件著作

RPKI路由应急管控系统V2.0 说明书 1.引言 1.1产品描述 软件名称&#xff1a;RPKI路由应急管控系统V2.0 简称&#xff1a;RPKI - QCL-V2.0 开发语言&#xff1a;Rust、Python、HTML、CSS、TypeScript 功能版本&#xff1a;V2.0 1.2开发背景及内容提要 随着互联网的快速发展…

gin入门教程(7): 使用 Logrus + Lumberjack 创建日志中间件

结合 Logrus 和 Lumberjack&#xff0c;可以创建一个高效的日志中间件&#xff0c;用于记录请求和响应。以下是实现步骤&#xff1a; 1. 安装依赖 首先&#xff0c;确保安装了 Logrus 和 Lumberjack&#xff1a; go get github.com/sirupsen/logrus go get gopkg.in/natefin…

基于Python大数据的王者荣耀战队数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

SpringBoot中yaml配置文件中文字符异常以及将多个独立的IDEA项目整合到一个项目里当做模块的处理

一、SpringBoot中yaml配置文件中文字符异常 在使用 SpringBoot 中 yaml 配置注入实体类中时&#xff0c;怎么注入都不成功&#xff0c;注入类的数据 yaml 如下。 schools:name: kermitgrades: 7students: 2050address: "中国北京" 报错如下&#xff1a; java.lang.I…

Linux 命令行学习:数据流控制、文本处理、文件管理与自动化脚本 (第二天)

目标&#xff1a;掌握更多命令行技巧和文本处理工具。 1. 管道和重定向 &#xff08;1&#xff09;输入输出重定向 输出重定向 (>)&#xff1a;将命令的输出写入到文件中&#xff0c;如果文件存在&#xff0c;则覆盖。 演示 &#xff1a; 输入重定向&#xff08;<&a…

解决电脑突然没有声音

问题描述&#xff1a;电脑突然没有声音了&#xff0c;最近没有怎么动过系统&#xff0c;没有安装或者卸载过什么软件&#xff0c;也没有安装或者卸载过驱动程序&#xff0c;怎么就没有声音了呢&#xff1f; 问题分析&#xff1a;仔细观察&#xff0c;虽然音量按钮那边看不到什…

基于Arduino的LED亮灭按键控制

一、项目简介 通过一个按键控制LED的亮灭&#xff0c;实现按键按一下LED点亮&#xff0c;再按一下LED熄灭&#xff0c;交替循环。 二、控制原理 1. 按键检测原理&#xff1a; 将Arduino的监测端口设置为输入上拉模式&#xff08;INPUT_PULLUP&#xff09;&#xff0c;用于连…

初始JavaEE篇——多线程(4):生产者-消费者模型、阻塞队列

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 文章目录 阻塞队列生产者—消费者模型生产者—消费者模型的优势&#xff1a;生产者—消费者模型的劣势&#xff1a; Java标准库中的阻…

【vue3|第29期】Vue3中的插槽:实现灵活的组件内容分发

日期&#xff1a;2024年10月24日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉在这里插入代码片得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不…

多款云存储平台存在安全漏洞,影响超2200万用户

据苏黎世联邦理工学院研究人员Jonas Hofmann和Kien Tuong Turong的发现&#xff0c;端到端加密&#xff08;E2EE&#xff09;云存储平台存在一系列安全问题&#xff0c;可能会使用户数据暴露给恶意行为者。在通过密码学分析后&#xff0c;研究人员揭示了Sync、pCloud、Icedrive…

docker中部署mysql时一直报Get“http://“

原因是使用阿里镜像是网速过慢的问题 解决方式&#xff1a;重新配置镜像 j解决docker: Error response from daemon: Get “https://registry-1.docker.io/v2/“: net/http: request canc-CSDN博客

深度学习--CNN实现猫狗识别二分类(附带下载链接, 长期有效)

1. 代码实现(包含流程解释) 样本量: 8005 # # 1.导入数据集(加载图片)数据预处理# 进行图像增强, 通过对图像的旋转 ,缩放,剪切变换, 翻转, 平移等一系列操作来生成新样本, 进而增加样本容量, # 同时对图片数值进行归一化[0:1] from tensorflow.keras.preprocessing.image …

2024/10/27周报

文章目录 摘要Abstract深度学习预测进出水水质使用UCI机器学习库中的水处理数据集代码描述具体代码示例实验结果 智能比对示例数据示例比对步骤Python 代码示例结果解读应用场景 总结改进建议 摘要 本周对南宁伶俐工业园区污水处理厂进行调研&#xff0c;了解了该污水处理厂的…

H5实现PDF文件预览,使用pdf.js-dist进行加载

H5实现PDF文件预览&#xff0c;使用pdf.js-dist进行加载 一、应用场景 在H5平台上预览PDF文件是在原本已经开发完成的系统中新提出的需求&#xff0c;原来的系统业务部门是在PC端进行PDF的预览与展示&#xff0c;但是现在设备进行了切换&#xff0c;改成了安卓一体机进行文件…

记一次真实项目的性能问题诊断、优化(阿里云redis分片带宽限制问题)过程

前段时间&#xff0c;接到某项目的压测需求。项目所有服务及中间件&#xff08;redis、kafka&#xff09;、pg库全部使用的阿里云。 压测工具&#xff1a;jmeter(分布式部署)&#xff0c;3组负载机&#xff08;每组1台主控、10台linux 负载机&#xff09; 问题现象&#xff1…

基于SSM的网上购物系统的设计与实现

技术介绍 本系统运用了JSP技术、SSM框架、B/S架构和myspl数据库 MySQL 介绍 MySQL是一种关系型的数据库管理系统&#xff0c;属于Oracle旗下的产品。MySQL的语言是非结构化的&#xff0c;使用的用户可以在数据上进行工作。这个数据库管理系统一经问世就受到了社会的广泛关注…

神仙公司名单(成都)

神仙公司&#xff08;成都&#xff09; 神仙公司&#xff0c;继续。 最近对古城很感兴趣&#xff0c;加上前两周吃的串串还记忆犹新&#xff0c;这期写一下四川省省会&#xff1a;成都。 在互联网人眼中&#xff0c;成都似乎是一个存在感很低的城市&#xff0c;但实际上成都一直…

【电机控制】相电流重构——单电阻采样方案

【电机控制】相电流重构——单电阻采样方案 文章目录 [TOC](文章目录) 前言一、基于单电阻采样电流重构技术原理分析1.1 单电阻采样原理图1.2 基本电压矢量与电流采样关系 二、非观测区2.1 扇区过渡区2.2 低压调制区 三、非观测区补偿——移相法四、参考文献总结 前言 使用工具…

C语言实现栈和队列

代码已经上传我的资源&#xff0c;需要可自取 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&…