Java用IO实现简单的用户注册登录并玩猜数字小游戏demo

news2025/2/27 2:37:27

项目场景:

简单的用Java IO读写操作完整实现用户注册登录并玩猜数字小游戏案例。
(猜数字游戏:系统随机生成一位1-100之间的数字让用户猜,给出猜大了,猜小了,及第几次猜对了的提示)


分析:

有哪些类?
–用户类
–测试类

每个类有哪些内容?
–用户类:
–成员变量:username(用户名),password(密码)
–构造方法:无参构造
–成员方法:getXxx() / setXxx()
–测试类:
–main()方法

类与类之间的关系是什么?
–在测试类中创建用户操作类和用户基本描述类的对象,并使用其功能。

按功能分包
–用户基本描述类包 pojo
–用户操作接口 dao
–用户操作类包 dao.impl
–用户测试类 test

项目目录结构如图所示
项目目录结构


实现:

用户基本描述类 User.java

package pojo;

public class User {
    // 用户名
    private String username;
    // 密码
    private String password;

    public User() {
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

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


用户操作接口 UserDao.java

package dao;

import pojo.User;

/**
 * 这是针对用户进行操作的接口
 *
 * @author Y
 * @version V1.0
 *
 */

public interface UserDao {
    /**
     * 这是用户登录功能
     *
     * @param username
     *           用户名
     * @param password
     *            密码
     * @return 返回登录是否成功
     */
    public abstract boolean isLogin(String username, String password);

    /**
     *
     * @param user
     *           要注册的用户信息
     */
    public void regist(User user);
}


用户操作类的具体实现 UserDaoImpl.java

package dao.impl;

import dao.UserDao;
import pojo.User;

import java.io.*;

/**
 * 这是用户操作的具体实现类 (IO版)
 *
 * @author Y
 * @version V1.1
 */

public class UserDaoImpl implements UserDao {
    // 为了保证文件一加载就创建
    private static File file = new File("user.txt");

    static {
        try {
            file.createNewFile();
        } catch (IOException e) {
            System.out.println("创建文件失败!");
        }
    }

    @Override
    public boolean isLogin(String username, String password) {
        boolean flag = false;
        BufferedReader br = null;
        try {
//            br = new BufferedReader(new FileReader("user.txt"));
            br = new BufferedReader(new FileReader(file));
            String line = null;
            while ((line = br.readLine()) != null) {
                // 用户名=密码
                String datas[] = line.split("=");
                if (datas[0].equals(username) && datas[1].equals(password)) {
                    flag = true;
                    break;
                }
            }
        } catch (FileNotFoundException e) {
            System.out.println("登录找不到注册信息所在的文件!");
        } catch (IOException e) {
            System.out.println("用户登录失败!");
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    System.out.println("用户登录释放资源失败!");
                }
            }
        }
        return flag;
    }

    @Override
    public void regist(User user) {
        /* 为了让注册的数据有一定的规则,自己定义规则如下:
         *用户名=密码
         */
        BufferedWriter bw = null;
        try {
//            bw = new BufferedWriter(new FileWriter("user.txt"));
            // 为了保证数据是追加写入,必须加true
            bw = new BufferedWriter(new FileWriter(file, true));
            bw.write(user.getUsername() + "=" + user.getPassword());
            bw.newLine();
            bw.flush();
        } catch (IOException e) {
            System.out.println("用户注册失败!");
//            e.printStackTrace();
        } finally {
            if (bw != null) {
                try {
                    bw.close();
                } catch (IOException e) {
                    System.out.println("用户注册释放资源失败!");
                    e.printStackTrace();
                }
            }
        }
    }
}




猜数字小游戏 GuessNumber.java

package game;

import java.util.Scanner;

/**
 * 猜数字小游戏
 *
 * @author Y
 * @version V1.0
 *
 */

public class GuessNumber {
    private GuessNumber() {
    }

    public static void start() {
        // 产生一个随机数
        int number = (int) (Math.random() * 100) + 1;

        // 定义一个统计变量
        int count = 0;

        while (true) {

            // 键盘录入一个数据
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入数据(1-100):");
            int guessNumber = sc.nextInt();

            count++;

            // 判断
            if (guessNumber > number) {
                System.out.println("你猜的数据" + guessNumber + "大了");
            } else if (guessNumber < number) {
                System.out.println("你猜的数据" + guessNumber + "小了");
            } else {
                System.out.println("恭喜你" + count + "次就猜中了");
                break;
            }
        }
    }
}


用户测试类的实现 UserTest.java

import dao.UserDao;
import dao.impl.UserDaoImpl;
import game.GuessNumber;
import pojo.User;

import java.util.Scanner;

/**
 * 用户测试类
 *
 * @author Y
 * @version V1.1
 *
 */
public class UserTest {
    public static void main(String[] args) {
        // 为了能够回到首界面
        while (true) {
            // 欢迎界面给出选择项
            System.out.println("------------欢迎光临------------");
            System.out.println("1登录");
            System.out.println("2注册");
            System.out.println("3退出");
            System.out.println("请输入你的选择");
            // 键盘录入选择,根据选择做不同的操作
            Scanner sc = new Scanner(System.in);
            String choiceString = sc.nextLine();

            // switch语句的多个地方要使用,因此定义在外面
            // 多态
            UserDao ud = new UserDaoImpl();

            switch (choiceString) {
                case "1":
                    // 登录界面,输入用户名和密码
                    System.out.println("------------登录界面------------");
                    System.out.println("请输入用户名:");
                    String username = sc.nextLine();
                    System.out.println("请输入密码:");
                    String password = sc.nextLine();

                    // 调用登录功能
                    boolean flag = ud.isLogin(username, password);
                    if (flag) {
                        System.out.println("登录成功!");

                        System.out.println("你玩猜数字游戏吗?y/n");
                        while (true) {
                            String resultString = sc.nextLine();
                            if (resultString.equalsIgnoreCase("y")) {
                                // 玩猜数字游戏
                                GuessNumber.start();
                                System.out.println("你还玩吗?y/n");
                            } else {
                                break;
                            }
                        }
                        System.out.println("谢谢使用,欢迎下次再来!");
                        System.exit(0);
                        // 这里如果用break,结束的是switch
                    } else {
                        System.out.println("用户名或密码错误,登录失败");
                    }
                    break;
                case "2":
                    // 欢迎界面,请输入用户名和密码
                    System.out.println("------------注册界面------------");
                    System.out.println("请输入用户名:");
                    String newUsername = sc.nextLine();
                    System.out.println("请输入密码:");
                    String newPassword = sc.nextLine();

                    // 把用户名和密码封装到一个对象中
                    User user = new User();
                    user.setUsername(newUsername);
                    user.setPassword(newPassword);

                    // 调用注册功能
                    // 具体类使用
                    ud.regist(user);
                    System.out.println("注册成功!");
                    break;
                case "3":
                default:
                    System.out.println("谢谢使用,欢迎下次再来!");
                    System.exit(0);
                    break;
            }
        }
    }
}



演示:

注册了六个用户:zhaomeng、yuwenwen、liulian、zhangli、zhangtianai、Jessica
用户注册
注册后在工程目录下由程序中的IO写入文档 user.txt 如下图所示:
注册文档

用户zhaomeng登录,选择是否玩猜数字游戏,选择玩
登录玩猜数字


参考引用:

参考刘意JavaSE视频

Java集合实现简单的用户注册登录并玩猜数字小游戏demo

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Shell基础知识汇总

一、变量 1.变量的类型 变量根据作用范围的大小主要分为局部变量、全局变量、环境变量&#xff1a; &#xff08;1&#xff09;局部变量&#xff1a;在Shell脚本中的函数内显示使用local关键字定义的变量。其作用域局限于函数内&#xff0c;当local变量名与global变量名同名时…

激活函数高频面试题集合

激活函数激活函数的作用是什么&#xff1f;常用的激活函数Relu引入Relu的原因Relu顺序relu在零点可导吗&#xff0c;不可导如何进行反向传播&#xff1f;Geluleaky relu优点缺点softmaxsigmoid缺陷tanh缺点如何选择激活函数Bert、GPT、GPT2中用的激活函数是什么&#xff1f;为什…

我在chatgpt学习requestIdleCallback

react对接chatgpt&#xff0c;导入json形成记忆数据继续提问&#xff0c;想要私聊 [{"role": "user","content": "requestIdleCallback 怎么使用" }, {"role": "assistant","content": "requestI…

电子采购系统的优缺点分析及选型建议

在现今&#xff0c;电子采购系统的出现&#xff0c;为企业采购带来了全新的解决方案。它可以使采购过程更加自动化、高效化&#xff0c;减少采购成本和人力资源的浪费。本文将对电子采购系统的优缺点进行分析&#xff0c;并提供选型建议。 电子采购系统优点&#xff1a; 1、自…

(Linux) make/makefile的简单介绍以及使用

make和makefile的功能make和makefile的使用规则make和makefile的功能 什么是make和makefile,它有什么作用&#xff1f;我相信这是大部分人在刚接触make和makefile时疑惑。那我们就一起来看看它的答案吧。 make是一条命令&#xff0c;makefile是一个文件&#xff0c;两个搭配使…

基于ZC序列的帧同步

Zadoff-Chu序列是一种特殊的序列&#xff0c;具有良好的自相关性和很低的互相关性&#xff0c;这种性能可以被用来产生同步信号&#xff0c;作为对时间和频率的相关运算在TD-LTE系统中&#xff0c;Zadoff-Chu(ZC)序列主要应用于上行RS序列生成、PRACH前导序列生成以及主同步信号…

CIMCAI mature AI product, digital port intelligent port waterway

全球港航人工智能领军企业中集飞瞳CIMCAI&#xff0c;成熟港航人工智能产品全球领先&#xff0c;核心技术世界顶尖水平数字化港航自动化。全球集装箱人工智能AI领军企业CIMCAI中集飞瞳&#xff0c;全球航运港口高科技领军企业&#xff0c;率先将港口人工智能Ceaspectus™产品做…

python入门(六) opencv的安装,图片操作,绘制文字图形,视频操作

文章目录课程目标认识openCV如何安装openCVOpenCV 读取、缩放、翻转、写入图像读取图片缩放图片翻转图片写入图片openCV绘制图形和文字创建一个纯黑色的底图画一个矩形再画一个正方形再画一个圆形再画一个实心圆画一条线画多边形在真实的图片上加载图形在真实的图片上加载文字O…

创建菜单栏、菜单、菜单项

1、QMainWindow窗口 1.1、创建菜单栏 this 代表的是 当前窗口&#xff08;主窗口&#xff09;&#xff0c;也就是 当前窗口中添加/设置 菜单栏 this->resize(800,600); //创建 菜单栏 QMenuBar *menuBar new QMenuBar(this); //将菜单栏 添加到主窗口的特殊位置 this-&g…

第12届蓝桥杯省赛真题剖析-2020年12月20日Scratch编程初级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第123讲。 第12届蓝桥杯省赛举办了两次&#xff0c;这是2020年10月20日举行的第一次省赛初级组试题&#xff0c;比赛仍…

<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)

&#xff1c;STM32&#xff1e;STM32CubeMX-串口收发通信(DMA传输)&#xff08;6&#xff09; 本节主要讲解串口DMA通信的功能&#xff0c;主要采用DMA接收数据的方式&#xff1b; DMA、串口的详细解说可参考《STM32F4XXX中文参考手册》&#xff0c;资料有详细的讲解和说明&am…

【机器视觉------标定篇(二)】三点成圆算法(求相机旋转中心)

应用场景 机器视觉项目应用中&#xff0c;相机安装在机器人上&#xff0c;并且需要定位产品返回坐标偏差以及角度偏差。 与九点标定配合使用&#xff0c;实现精准角度补偿。 算法输入 不共线的三点坐标 A&#xff08;X₁,Y₁&#xff09; &#xff0c;B&#xff08;X₂,Y₂&…

关于加解密方法报错java.security.InvalidKeyException: Illegal key size

1、找到自己的jdk安装路径下去&#xff1b; 2、找到java.security查看是否存在#crypto.policyunlimited,如果有把该#号去掉&#xff0c;注释打开&#xff1b; 3、若java.security文件中不存在#crypto.policyunlimited&#xff0c;则应该去从官网下载jce策略文件&#xff08;补丁…

springboot+vue旧物置换网站(完整源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的旧物置换网站。项目源码请联系风歌&#xff0c;文末附上联系信息 。 目前有各类成品java毕设&#xff0c;需要请看文末联系方式 。ja…

Python|基于粒子群和遗传算法的微电网优化调度

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Hadoop2.0伪分布式平台环境搭建

一、搭建环境的前提条件 环境&#xff1a;ubuntu-16.04 hadoop-2.6.0 jdk1.8.0_161。这里的环境不一定需要和我一样&#xff0c;基本版本差不多都ok的&#xff0c;所需安装包和压缩包自行下载即可。 因为这里是配置Hadoop的教程&#xff0c;配置Java以及安装VMware Tools就自行…

为什么2017年之后操作系统仍将扮演重要角色?

操作系统的历史虽然不像计算科学那么久远&#xff0c;但却也已经拥有相当可观的发展历程。大型机客户于上世纪五十年代末编写了第一批操作系统&#xff0c;这些系统直到数十年后的今天仍拥有相当的知名度——其中包括来自IBM公司的OS/360以及贝尔实验室打造的Unix。 在可预期的…

详解二叉搜索树 --- key模型和key/value模型

&#x1f340;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;数据结构 一、认识二叉搜索树的key模型和key/value模型 key的模型是指每个节点只有一个键值&#xff0c;用于确定节点在树中的位置。节点的键值必须满足二叉搜索树的性质&#xff0c;即左子节点的键值小于…

SpringBoot 中使用Guava实现单机令牌桶限流

SpringBoot项目中如何对接口进行限流&#xff0c;有哪些常见的限流算法&#xff0c;如何优雅的进行限流。 首先就让我们来看看为什么需要对接口进行限流&#xff1f; 为什么要进行限流&#xff1f; 因为互联网系统通常都要面对大并发大流量的请求&#xff0c;在突发情况下&a…

你还还还没学会RabbitMQ?-----------RabbitMQ详解及快速入门(工作模式)

你像天外来物一样&#xff0c;求之不得&#xff08;咳咳&#xff0c;指offer&#xff09;&#x1f339; 文章目录什么是MQ&#xff1f;MQ的优势与劣势使用MQ需要满足的条件常见的MQ产品关于RabbitMQ生产者消费者工作模式订阅模式路由模式通配符模式什么是MQ&#xff1f; Messa…