GDPU 天码行空11

(一)实验目的

1、掌握JAVA中IO中各种类及其构造方法;
2、重点掌握IO中类所具有的IO操作方法;
3、熟悉软件中登录模块的开发方法;
4、掌握IO中读写常用方法。
5、进一步熟悉正则规则的使用方法。

(二)实验内容和步骤

1、游戏中有一个用户注册与登录模块,用于用户注册和登录。请编写一个用户注册和登录程序,通过选择注册、登录和退出进入相应处理。当选择注册时,新用户可以输入用户名和密码,显示该用户在xxxx年xx月xx日xx时xx分注册成功,并将用户名和密码保存到文件中,选择登录时,通过比对用户输入的用户各和密码是否与已经保存的文件中的用户名和密码提示用户登录成功或失败,当失败时,提示用户重新输入,并提示剩余的可输入次数,登录输入有三次机会,三次输入均错误则锁定账户并提示用户与管理员联系。选择退出时程序退出。(进阶:如能完成上述功能,可以增加下述功能:增加一个验证码,验证码为随机生成的1-100的数字;用户名必须为字母,密码可以是字母也可以是数字,长度必须在6-22位之间;在注册时,要求用户输入两次密码,并对两次输入的密码进行比对,两次相同时通过,不同时提示两次密码输入不一致,请重新输入。)

💖 UserAuthentication.java

import java.io.*;
import java.nio.file.*;
import java.time.*;
import java.util.Scanner;public class UserAuthentication {private static final String USER_FILE = "users.txt";private static final int MAX_ATTEMPTS = 3;public static void main(String[] args) {ensureUserFileExists();Scanner scanner = new Scanner(System.in);while (true) {System.out.println("请选择操作:");System.out.println("1. 注册");System.out.println("2. 登录");System.out.println("3. 退出");System.out.print("请输入你的选择(1/2/3): ");int choice = scanner.nextInt();switch (choice) {case 1:registerUser(scanner);break;case 2:loginUser(scanner);break;case 3:System.out.println("程序退出。");scanner.close();System.exit(0);default:System.out.println("无效的选择,请重新输入。");}}}private static void ensureUserFileExists() {Path path = Paths.get(USER_FILE);if (!Files.exists(path)) {try {Files.createFile(path);} catch (IOException e) {System.out.println("创建用户文件失败。");e.printStackTrace();}}}private static void registerUser(Scanner scanner) {System.out.print("请输入用户名: ");String username = scanner.next();if (!username.matches("[a-zA-Z]+")) {System.out.println("用户名必须为字母。");return;}System.out.print("请输入密码: ");String password1 = scanner.next();System.out.print("请再次输入密码: ");String password2 = scanner.next();if (!password1.equals(password2)) {System.out.println("两次密码输入不一致,请重新输入。");return;}if (password1.length() < 6 || password1.length() > 22) {System.out.println("密码长度必须在6-22位之间。");return;}// 检查用户名是否已存在if (isUsernameExists(username)) {System.out.println("用户名已存在,请选择其他用户名。");return;}// 写入用户信息到文件writeUserInfoToFile(username, password1, LocalDateTime.now());System.out.println("注册成功,用户名: " + username + " 在 " + LocalDateTime.now() + " 注册成功。");}private static boolean isUsernameExists(String username) {try (BufferedReader reader = Files.newBufferedReader(Paths.get(USER_FILE))) {String line;while ((line = reader.readLine()) != null) {String[] parts = line.split(",");if (parts.length > 0 && username.equals(parts[0])) {return true;}}} catch (IOException e) {System.out.println("读取用户文件失败。");e.printStackTrace();}return false;}private static void writeUserInfoToFile(String username, String password, LocalDateTime registrationTime) {String userInfo = username + "," + password + "," + registrationTime + "\n";try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(USER_FILE), StandardOpenOption.CREATE, StandardOpenOption.APPEND)) {writer.write(userInfo);} catch (IOException e) {System.out.println("写入用户信息失败。");e.printStackTrace();}}private static void loginUser(Scanner scanner) {System.out.print("请输入用户名: ");String username = scanner.next();System.out.print("请输入密码: ");String password = scanner.next();if (verifyUser(username, password)) {System.out.println("登录成功。");} else {System.out.println("用户名或密码错误,登录失败。");}}private static boolean verifyUser(String username, String password) {try (BufferedReader reader = Files.newBufferedReader(Paths.get(USER_FILE))) {String line;while ((line = reader.readLine()) != null) {String[] parts = line.split(",");if (parts.length > 1 && username.equals(parts[0]) && password.equals(parts[1])) {return true;}}} catch (IOException e) {System.out.println("读取用户文件失败。");e.printStackTrace();}return false;}
}

⭐ 运行结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux内核之获取文件系统超级块:sget用法实例(六十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

SpringBoot+Vue+Element-UI实现医患档案管理系统

目录 前言介绍 系统展示 管理员页面 患者管理 诊疗信息管理 病历信息管理 处方信息管理 患者页面 医生页面 部分核心代码 病历信息 上传文件 数据库配置 前言介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技…

【LAMMPS学习】八、基础知识(5.9)LAMMPS 近场动力学

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各种模拟。 …

20240506 深度学习高级技术点

1.基于BN层剪枝 基于Batch Normalization (BN)层进行剪枝是一种常用的模型压缩方法&#xff0c;特别是在卷积神经网络(CNNs)中。BN层在训练期间用于加速收敛和提高模型的泛化能力&#xff0c;而在剪枝过程中&#xff0c;BN层提供的统计信息&#xff08;特别是均值(mean)和方差…

【练习2】

1.汽水瓶 ps:注意涉及多个输入&#xff0c;我就说怎么老不对&#xff0c;无语~ #include <cmath> #include <iostream> using namespace std;int main() {int n;int num,flag,kp,temp;while (cin>>n) {flag1;num0;temp0;kpn;while (flag1) {if(kp<2){if(…

Redis(Redis配置和订阅发布)

文章目录 1.Redis配置1.网络配置1.配置文件位置 /etc/redis.conf2.bind&#xff08;注销支持远程访问&#xff09;1.默认情况bind 127.0.0.1 只能接受本机的访问2.首先编辑配置文件3.进入命令模式输入/bind定位&#xff0c;输入n查找下一个&#xff0c;shift n查找上一个&…

【微服务】网关(详细知识以及登录验证)

微服务网关 网关网关路由快速入门路由属性 路由断言网关登录校验自定义过滤器实现登录校验网关传递用户OpenFeign传递用户 网关 网络的关口&#xff0c;负责请求的路由&#xff0c;转发&#xff0c;身份校验 当我们把一个单体项目分成多个微服务并部署在多台服务器中&#xff…

运动控制“MC_MoveVelocity“功能块详细应用介绍

1、运动控制单位u/s介绍 运动控制单位[u/s]介绍-CSDN博客文章浏览阅读91次。运动控制很多手册上会写这样的单位,这里的u是英文单词unit的缩写,也就是单位的意思,所以这里的单位不是微米/秒,也不是毫米/秒,这里是一个泛指,当我们的单位选择脉冲时,它就是脉冲/秒,也就是…

如何解决3D模型变黑或贴图不显示的问题---模大狮模型网

在进行3D建模和视觉渲染时&#xff0c;经常会遇到模型表面变黑或贴图不显示的问题&#xff0c;这可能严重影响最终视觉效果的质量。这些问题通常与材质设置、光照配置或文件路径错误有关。本文将探讨几种常见原因及其解决方法&#xff0c;帮助3D艺术家和开发者更有效地处理这些…

3D相机及应用

无论是2D相机和3D相机&#xff0c;在工业应用中都有着不可或缺的作用。3D相机与2D相机的最大区别在于&#xff0c;3D相机可以获取真实世界尺度下的3D信息&#xff0c;而2D相机只能获取像素尺度下的2D平面图像信息。通过3D相机得到的数据&#xff0c;我们可以还原出被测量物体的…

最新版Ceph( Reef版本)块存储简单对接k8s

当前ceph 你的ceph集群上执行 1.创建名为k8s-rbd 的存储池 ceph osd pool create k8s-rbd 64 642.初始化 rbd pool init k8s-rbd3 创建k8s访问块设备的认证用户 ceph auth get-or-create client.kubernetes mon profile rbd osd profile rbd pool=k8s-rbd部署 ceph-rbd-csi …

Devin AI程序员是如何设计出来的

背景 Devin是一个能够执行复杂工程任务并与用户在软件开发项目上积极合作的自主人工智能软件工程师&#xff0c;它擅长planning、tool use、reflecting&#xff0c;碾压大部分初级开发。 设计思路 一、界面设计 先来看 Devin 的界面&#xff0c;左边是对话框&#xff0c;记…