任务卡_02-面向对象_第4节 面向对象高级

目录

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

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();

	}

}

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值