目录

​一,面向对象高级训练任务​

​1,​

​代码​

​2,​

​代码​

​二,猜拳游戏训练任务​

​描述​

​代码​


一,面向对象高级训练任务

1,

假设用户账号为:admin,密码为 123,编写用户登陆案例。 要 求:请将登陆定义为 login 方法, 并将 login 方法写在 UserService 类中 

代码

UserService.java

package com.kaikeba.demo1;

public class UserService {
private String userName;
private String passward;

// 私有属性的封装
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassward() {
return passward;
}
public void setPassward(String passward) {
this.passward = passward;
}

// login方法
public boolean login(String userName, String passward) {
if(userName.equals(this.userName)) {
if(passward.equals(this.passward)) {
System.out.println("登录成功!");
return true;
}else {
System.out.println("密码错误!");
}
}else {
System.out.println("用户名错误!");
}
return false;
}

}

UserServiceTest.java

package com.kaikeba.demo1;

import java.util.Scanner;

/*
* 1. 试题:假设用户账号为:admin,密码为 123,编写用户登陆案例。
* 要 求:请将登陆定义为 login 方法, 并将 login 方法写在 UserService 类中
*/
public class UserServiceTest {

public static void main(String[] args) {
UserService u1 = new UserService(); // 类的实体
String userName, passward; // 存放用户输入的登录名及密码
Scanner input = new Scanner(System.in);

u1.setUserName("admin"); // 设置用户名和密码
u1.setPassward("123");

for(int i = 0; i < 5; i++) {
System.out.println("你还有" + (5 - i) + "次机会");
System.out.println("输入账户名称:"); // 提示用户输入登录名
userName = input.next();
System.out.println("输入账户密码:"); // 提示用户输入密码
passward = input.next();
if(u1.login(userName, passward)) {
break;
}
System.out.println("-----------------------------");
}

}

}

2,

设置一个类, 命名为 MyList 

类中包含属性:Object[] element 

方法有如下几个: 

  • 1. 增加方法 add : 可以向数组属性中依次存储 Object,数组内容 存满时,需实现动态扩容(详解在下面)。
  • 2. 删除方法 remove :可以根据数据或下标,从数组属性中删除 Object 数据,删除后,数组后续元素需前移。
  • 3. 查询方法 get :方法传入下标,返回数组中指定下标的数据。 当前存储数据量 size : 获取当前存储的有效数据长度

动态扩容详解:无需真正增加原数组的容量,只用将原内容复制到新 的大数组,然后让原数组名称重新等于大数组即可。由于原数组数据在堆中, 失去引用会被 GC 自动回收。

代码

MyList.java

package com.kaikeba.demo1;

public class MyList {
public Object[] element = new Object[10];
private int index = -1; // 记录最后一个有效数据的位置


/*
* 增加方法 add : 可以向数组属性中依次存储 Object,数组内容 存满时,需实现动态扩容(详解在下面)
*/
public void add(Object x) {
if(index >= element.length - 1) { // 容量不足(数组中最后一个位置已被占用)
Object[] newElement = new Object[element.length + 10]; // 每次需要扩容时增添10个位置
for(int i = 0; i < element.length; i++) { // 重新复制数组
newElement[i] = element[i];
}
newElement[++index] = x; // 添加新元素
element = newElement;
}else { // 容量充足
element[++index] = x;
}
System.out.println("更新后数组元素为:");
this.display(); // 展示数组中的元素
}

/*
* 删除方法 remove :可以根据数据或下标,从数组属性中删除 Object 数据,删除后,数组后续元素需前移。
* flag:为true时按数值删除内容 为false时按下标删除内容
*/
public void remove(boolean flag, Object x) {
boolean findFlag = false; // 记录是否找到数据
if(flag) { // 按数值删除数据
for(int i = 0; i <= this.index; i++) {
if(findFlag == true) { // 已找到目标值 后续元素将前面元素覆盖
element[i - 1] = element[i];
}
if(x.equals(element[i])) { // 由于object可能为字符串 这里使用equals
findFlag = true;

}
}
if(findFlag == false) { // 未找到元素
System.out.println("未找到【" + x + "】");
}else {
this.index--; // 有效元素数目减一
System.out.println("更新后数组元素为:");
this.display(); // 展示数组中的元素
}
}else { // 按下标删除元素(假设此时传入x的为下标,即int类型)
int pos = Integer.parseInt(String.valueOf(x));
if(pos < 0 || pos > this.index) {
System.out.println("数组访问越界");
}else {
for(int i = pos + 1; i <= this.index; i++) {
element[i - 1] = element[i];
}
this.index--;
System.out.println("更新后数组元素为:"); // 展示数组中的元素
this.display();
}
}
}

/*
* 查询方法 get :方法传入下标,返回数组中指定下标的数据。
*
*/
public Object get(int index) {
if(index <= -1) { // 根据index的值判断 剩余的有效数据 根据length判断数组容量
System.out.println("数组中暂无数据");
return null;
}
if(index > this.index) {
System.out.println("访问越界");
return null;
}
return element[index];
}

/*
* 当前存储数据量 size : 获取当前存储的有效数据长度
*/
public int size() {
return index + 1;
}

/*
* 展示数组元素
*/
public void display() {
for(int i = 0; i <= this.index; i++) {
System.out.print(element[i] + " ");
}
System.out.println();
}
}

MyListTest.java

package com.kaikeba.demo1;

import java.util.Scanner;
import java.util.regex.Pattern;

public class MyListTest {

public static void main(String[] args) {
Scanner input = new Scanner(System.in);
MyList myList = new MyList();
String tem;
while(true) {
System.out.println("选择功能序号:");
System.out.println("1,增加方法");
System.out.println("2,删除方法");
System.out.println("3,查询方法");
System.out.println("4,查询有效元素数目");
System.out.println("5,退出");
tem = input.next();
if(!tem.equals("1") && !tem.equals("2") && !tem.equals("3") && !tem.equals("4") && !tem.equals("5")) {
System.out.println("请输入正确的功能序号1-4");
continue;
}
int funcNum = Integer.parseInt(tem); // 将功能码转换为数字
switch (funcNum){
case 1:
System.out.print("需要添加的元素为:");
tem = input.next();
myList.add(tem);
break;
case 2:
System.out.print("删除方式为(1:按数值删除,0:按下标删除):");
tem = input.next();
while(true) {
if(!tem.equals("0") && !tem.equals("1")) {
System.out.println("请输入正确的删除方式0、1");
}else {
break;
}
}
boolean removeFlag = (tem.equals("1")) ? true : false;
if(removeFlag == true) { // 按数值删除
System.out.print("请输入需要删除的元素值:");
tem = input.next();
myList.remove(removeFlag, tem);
}else {
System.out.print("请输入需要删除的元素下标:");
tem = input.next();
myList.remove(removeFlag, Integer.parseInt(tem));
}
break;
case 3:
System.out.print("请输入需要查找的元素下标:");
tem = input.next();
Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$"); // 正则表达式判断是否为数字
if(pattern.matcher(tem).matches()) {
if(myList.get(Integer.parseInt(tem)) != null) {
String value = myList.get(Integer.parseInt(tem)).toString(); // 将Object对象转换为String类型
System.out.println("下标" + Integer.parseInt(tem) + "对应的元素为" + value);
}
}else {
System.out.println("输入有误,必须为整数");
}
break;
case 4:
System.out.println("当前数组大小为:" + myList.size());
break;
case 5:
System.out.println("欢迎下次光临!");
return; // 退出系统

default:

}
System.out.println("----------------------------------"); // 分割线 便于区分
}

}

}

二,猜拳游戏训练任务

描述

今天的任务是通过控制台方式实现一个人机对战的猜拳游戏,用户通过输 入(1.剪刀 2.石头 3.布),机器随机生成(1.剪刀 2.石头 3.布),胜者积分, n 局以后通过积分的多少判定胜负。

代码

MoraGame.java

package com.kaikeba.demo1;

import java.util.Scanner;

/*
* 今天的任务是通过控制台方式实现一个人机对战的猜拳游戏,
* 用户通过输 入(1.剪刀 2.石头 3.布),机器随机生成(1.剪刀 2.石头 3.布),
* 胜者积分, n 局以后通过积分的多少判定胜负
*/
public class MoraGame {
private int userScore = 0; // 用户当前得分
private int mechScore = 0; // 机器当前得分
private int turn; // 局数

public int getUserScore() {
return userScore;
}
public void setUserScore(int userScore) {
this.userScore = userScore;
}
public int getMechScore() {
return mechScore;
}
public void setMechScore(int mechScore) {
this.mechScore = mechScore;
}

/*
* 生成1-3的随机数 模拟给出的手势
*/
public int getMechAnswer() {
return (int)(Math.random() * (4 - 1) + 1); // 由于强制转换是向下取整 而生成的随机数范围在[0.0, 1.0)所以最大值应为4
}

/*
* 判断机器还是用户获胜 并更新得分
* a指用户给出的手势 b指机器给出的手势
*/
public int judge(int a, int b) {
if((a == 1 && b == 3) || // 用户剪刀 机器布
(a == 2 && b == 1) || // 用户石头 机器剪刀
(a == 3 && b == 2)) { // 用户布 机器石头
this.userScore++;
return 0; // 用户胜利
}else if(a == b) {
return 1; // 平局
}else {
this.mechScore++;
return 2; // 机器胜利
}
}
/*
* 依据局数 模拟对局
*/
public void play() {
Scanner input = new Scanner(System.in);

System.out.print("请输入局数(整型):");
String str = input.next();
while(!isNum(str)) { // 循环 直到获得获得正确的局数(int类型)
System.out.print("请输入局数(整型):");
str = input.next();
}
this.turn = Integer.parseInt(str);
for(int i = 1; i <= this.turn; i++) {
System.out.println("-----------------------------------");
System.out.println("#对局" + i);
System.out.print("请输入你的选择(1.剪刀 2.石头 3.布):");
str = input.next();
while(!isNum(str) ||
Integer.parseInt(str) < 1 ||
Integer.parseInt(str) > 3) { // 循环 直到获得获得正确的手势表示(int类型)
System.out.print("请输入你的选择(1.剪刀 2.石头 3.布):");
str = input.next();
}
int a = Integer.parseInt(str); // 获得用户输入的手势
int b = this.getMechAnswer(); // 获得机器输入的手势
System.out.println("用户:" + this.convert(a)); // 展示用户输入的手势
System.out.println("机器:" + this.convert(b)); // 展示机器输入的手势

int ans = this.judge(a, b);
if(ans == 0) {
System.out.println("用户获胜");
}else if(ans == 1) {
System.out.println("平局");
}else {
System.out.println("机器获胜");
}
}
System.out.println("-----------------------------------");
System.out.println("用户得分:" + this.userScore);
System.out.println("机器得分:" + this.mechScore);
if(this.mechScore < this.userScore) {
System.out.println("Winner:用户");
}else if(this.mechScore == this.userScore) {
System.out.println("旗鼓相当");
}else {
System.out.println("Winner:机器");
}
}

/*
* 判断字符串对应是否为数字
*/
public boolean isNum(String s) {
char[] tem = s.toCharArray();
for(int i = 0; i < tem.length; i++) {
if(!Character.isDigit(tem[i])) { // 不是数字
return false;
}
}
return true;
}

/*
* 从数字到表示手势的转换
*/
public String convert(int x) {
String str;
if(x == 1) {
str = "剪刀";
}else if(x == 2) {
str = "石头";
}else {
str = "布";
}
return str;
}
}

MoraGameTest.java

package com.kaikeba.demo1;
/**
* 测试猜拳游戏
* @author 许逍遥
*
*/
public class MoraGameTest {
/*
* 今天的任务是通过控制台方式实现一个人机对战的猜拳游戏,
* 用户通过输 入(1.剪刀 2.石头 3.布),机器随机生成(1.剪刀 2.石头 3.布);
* 胜者积分, n 局以后通过积分的多少判定胜负
*/
public static void main(String[] args) {
MoraGame game = new MoraGame();
game.play();

}

}