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.mzph.cn/pingmian/7629.shtml

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

相关文章

上岸武汉顶级985!苦尽甘来的那一天,山河星月都作贺礼。

今天分享经验的同学是小马哥梦马强化班的学员&#xff0c;一战高分上岸武汉大学&#xff01; 经验分享 很高兴有机会在这里给大家分享我的考研历程。 首先介绍一下我自己&#xff0c;我本科就读于吉林大学空间信息与数字技术&#xff0c;成绩不是很好。六级是在考研期间12月…

C语言逻辑语句

叠甲:以下文章主要是依靠我的实际编码学习中总结出来的经验之谈,求逻辑自洽,不能百分百保证正确,有错误、未定义、不合适的内容请尽情指出! 文章目录 1.何为控制语句2.控制语句-分支语句2.1.if2.2.switch3.控制语句-循环语句3.1.while3.2.do...while3.3.for4.控制语句-转向…

ue引擎游戏开发笔记(32)——为游戏添加新武器装备

1.需求分析&#xff1a; 游戏中角色不会只有一种武器&#xff0c;不同武器需要不同模型&#xff0c;甚至可能需要角色持握武器的不同位置&#xff0c;因此需要添加专门的武器类&#xff0c;方便武器后续更新&#xff0c;建立一个武器类。 2.操作实现&#xff1a; 1.在ue5中新建…

如何用DeepDiff测接口数据源变更?

开发同学最近变更了部分业务查询接口底层的数据源&#xff0c;希望测试同学能够针对这些接口进行一些回归验证&#xff0c;校验底层数据源更新前后业务查询接口返回的一致性&#xff0c;保证更新后对正常业务没有影响。 这个回归测试和一般接口测试有所区别&#xff0c;不仅仅…

C++基础-编程练习题2

文章目录 前言一、查找“支撑数”二、数组元素的查找三、爬楼梯四、数字交换五、找高于平均分的人 前言 C基础-编程练习题和答案 一、查找“支撑数” 【试题描述】 在已知一组整数中&#xff0c; 有这样一种数非常怪&#xff0c; 它们不在第一个&#xff0c; 也不在最后一个&…

使用Simulink Test进行单元测试

本文摘要&#xff1a;主要介绍如何利用Simulink Test工具箱&#xff0c;对模型进行单元测试。内容包括&#xff0c;如何创建Test Harness模型&#xff0c;如何自动生成excel格式的测试用例模板来创建测试用例&#xff0c;如何手动填写excel格式的测试用例模板来手动创建测试用例…

精通 Docker:简化开发、部署与安全保障

踏上 Docker 之旅&#xff0c;每一条命令都是高效与可靠的新境界。Docker 彻底改变了软件开发&#xff0c;为构建、部署和保障应用程序提供了前所未有的便利。从打造精益敏捷的镜像到编排复杂的微服务架构&#xff0c;Docker 让开发人员和运维人员都倍感轻松。让我们深入探索 D…

Redis---------实现查询缓存业务

目录 数据库与缓存之间的工作业务逻辑&#xff1a; 接下来看查询缓存代码实现&#xff0c;主要是捋清楚业务逻辑&#xff0c;代码实现是死的&#xff1a; Controller: Service: P37作业实现&#xff1a;总体逻辑跟上面的业务逻辑差不多 Controller&#xff1a; Service&#…

头歌-Java编程基础进阶

第1关 两整数的四则运算 package step1;import java.util.Scanner;public class Arithmetic2Num {public static void main(String[] args) { // ---------------------Begin------------------------Scanner scnew Scanner(System.in);int asc.nextInt();int bsc.nextInt();…

对象存储的几个概念

媒体存储-帮助中心 - 天翼云 媒体存储 对象存储&#xff08;经典版&#xff09;I型 -帮助中心- 天翼云 OOS https://www.ctyun.cn/document/10026735/10028989 ZOS 成长地图_对象存储服务 OBS OBS 以上是对象存储 的几个概念&#xff0c;可以反复的理解下。

Azure AKS日志查询KQL表达式

背景需求 Azure&#xff08;Global&#xff09; AKS集群中&#xff0c;需要查询部署服务的历史日志&#xff0c;例如&#xff1a;我部署了服务A&#xff0c;但服务A的上一个版本Pod已经被杀掉由于版本的更新迭代&#xff0c;而我在命令行中只能看到当前版本的pod日志&#xff…

SparkSql介绍

概述 SparkSQL&#xff0c;顾名思义&#xff0c;就是Spark生态体系中的构建在SparkCore基础之上的一个基于SQL的计算模块。SparkSQL的前身不叫SparkSQL&#xff0c;而叫Shark&#xff0c;最开始的时候底层代码优化&#xff0c;sql的解析、执行引擎等等完全基于Hive&#xff0c…

使用 Lambda 匿名函数在 Python 中轻松地进行排序

排序是 Python 编程中的常见操作&#xff0c;Python 提供了许多强大的函数方法方便的完成排序功能&#xff0c;比如 sorted() 和 sort()。在本文中&#xff0c;我们将结合 lambda 函数进行排序。它被称为匿名函数&#xff0c;可以灵活轻松地完成各种形式的排序。 字符串列表排…

前端安全防护实战:XSS、CSRF防御与同源策略详解(react 案例)

前端安全防护实战中&#xff0c;主要涉及三个方面&#xff1a;XSS (Cross-Site Scripting) 攻击的防御、CSRF (Cross-Site Request Forgery) 攻击的防御&#xff0c;以及浏览器的同源策略。以下是这三个方面的详细说明&#xff1a; XSS 防御详解 XSS 概述 XSS攻击是一种让攻…

科创板门槛升级!解析中国量子企业的上市之路与国际比拼

4月30日晚&#xff0c;中国证监会于发布了修订后的《科创属性评价指引&#xff08;试行&#xff09;》&#xff08;以下简称“新指引”&#xff09;&#xff0c;该指引自发布日起正式生效。本次修订对原有指引中的部分标准进行了调整&#xff0c;具体如下&#xff1a; 1&#x…

如何用Kimi,5秒1步生成流程图

引言 在当前快节奏的工作环境中&#xff0c;拥有快速、专业且高效的工具不可或缺。 Kimi不仅能在5秒内生成专业的流程图&#xff08;kimi&#xff09;&#xff0c;还允许实时编辑和预览&#xff0c;大幅简化了传统流程图的制作过程。 这种迅速的生成能力和高度的可定制性使得…

有哪些方法可以在运行时动态生成一个Java类?

使用 Java 反射 API&#x1f6a9;&#xff1a; Java 的反射 API 允许在运行时查询和操作类和对象。虽然反射 API 本身不直接提供生成新类的功能&#xff0c;但可以用于动态调用构造函数、方法和访问字段&#xff0c;这在某些情况下可以作为动态生成类的一部分。 字节码操作库&…

Day28:ElasticSearch入门、Spring整合ES、开发社区搜索功能

ElasticSearch入门 Elasticsearch简介 一个分布式的、Restful风格的搜索引擎。支持对各种类型的数据的检索&#xff08;非结构化的也可以&#xff09;。搜索速度快&#xff0c;可以提供实时的搜索服务。便于水平扩展&#xff08;集群式部署&#xff09;&#xff0c;每秒可以处…

一文读懂计算机视觉4大任务:分类任务、检测任务、目标分割任务、关键点检测任务

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

算法系列--多源BFS问题

&#x1f495;"对相爱的人来说&#xff0c;对方的心意&#xff0c;才是最好的房子。"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–多源BFS问题 大家好,今天为大家带来的是算法系列--多源BFS问题 前言: 之前我们已经学习过单源的最短路问…