此案例的需求如下:
1.系统随机猜拳(石头,剪刀,布)
2.控制台输入 石头,剪刀,布,其中之一
3.对比判断
4.当猜拳赢了,程序提示”你赢了!游戏结束“程序退出
Step1具体的逻辑:
Step1:将系统随机猜拳的逻辑封装
1.1:我们需要一个库来装石头,剪刀,布
String[] ownership = {
"石头","剪刀","布"};//将用来对比的石头,剪刀,布存到数组中
1.2:我们虽然不能直接随机出字符串(石头,剪刀,布)
但是我们可以创建一个变量当作下标来随机库的长度的数就得到了一个具体的下标的值,
然后再用数组(库)名[下标变量]确定具体的元素再赋值给最终返回值的变量,
就实现了随机石头,剪刀,布其中之一
// 随机一个ownership数组的下标
int index = (int)(Math.random()*ownership.length);
// 去除下标对应的元素赋值给最终返回值的变量
random = ownership[index];
return random;
Step2:将对比的逻辑封装
因为我们最终要输出的结果是一个字符串类型的值,所以我们的返回值类型是String,其次我们需要拿两个参数进行判断,所以参数是两个,其次因为我们是拿两个字符串对比,则参数的类型就是String了,两个参数分别是系统随机生成的字符串(computers方法),控制台输入的字符串,
// 将猜拳对比的逻辑封装
static String comparison(String computers,String input){
1.对比的逻辑:
首先假设系统出的是石头,
假设控制台输入的是石头则平局
假设控制台输入的是剪刀则失败
假设控制台输入的是布则胜利
假设系统出的是布,
假设控制台输入的是石头则失败
假设控制台输入的是剪刀则胜利
假设控制台输入的是布则平局
假设系统出的是剪刀,
假设控制台输入的是石头则胜利
假设控制台输入的是剪刀则平局
假设控制台输入的是布则失败
对比逻辑具体实现One:
static String comparison(String random,String input){
String result = "";//最终返回值的变量
// 对比逻辑
if ("石头".equals(random)){
//假设系统出石头
if ("石头".equals(input)){
//假设控制台输入的是石头
result = "平局";
}else if ("剪刀".equals(input)){
//假设控制台输入的是剪刀
result = "失败";
}else if ("布".equals(input)){
//假设控制台输入的是布
result = "胜利";
}
}
if ("剪刀".equals(random)){
//假设系统出剪刀
if ("石头".equals(input)){
//假设控制台输入的是石头
result = "胜利";
}else if ("剪刀".equals(input)){
//假设控制台输入的是剪刀
result = "平局";
}else if ("布".equals(input)){
//假设控制台输入的是布
result = "失败";
}
}
if ("布".equals(random)){
//假设系统出布
if ("石头".equals(input)){
//假设控制台输入的是石头
result = "失败";
}else if ("剪刀".equals(input)){
//假设控制台输入的是剪刀
result = "胜利";
}else if ("布".equals(input)){
//假设控制台输入的是布
result = "平局";
}
}
return result;
}
}
这样捋的话思路比较清晰,但是代码量较大。
仔细观察我们发现平局的情况下两个参数的字符串是一样的所以可以将它优化成一组if分支 其次当我们可以先列举出玩家胜利的情况或失败的情况,若不符合我们列举的可能,则结果就相反了
例如我们列举出玩家胜利的情况:
当系统出石头,玩家出布
当系统出剪刀,玩家出石头
当系统出布,玩家出剪刀
若这些胜利的情况都不符合则说明玩家输了
对比逻辑优化后的具体实现:
static String bunko(String random, String input){
String WinLos="";//最终返回值的变量
// 判断输赢的逻辑
if (random.equals(input)){
//当两个字符串一致时
WinLos="平局";
}else
// 列举出玩家赢的情况,若都不符合则是失败
if (("石头".equals(random) && "布".equals(input))||("布".equals(random) && "剪刀".equals(input))||("剪刀".equals(random) && "石头".equals(input)) ){
WinLos="胜利";
}else{
WinLos="失败";
}
return WinLos;
}
}
然后在main方法中去整理,然后将需求按主次一次套入就好了
最后进行了一系列的逻辑优化后的代码如下:
代码的最终形式:
package game;
import java.util.Scanner;
/**
* 用java实现猜拳案例WayOne
*/
public class Conjecture {
// 将系统随机出拳的逻辑封装
static String computers(){
String random = "";//最终返回值的变量
String[] ownership = {
"石头","剪刀","布"};//列举出系统可能出现的对比数据
// 随机一个ownership数组的下标
int index = (int)(Math.random()*ownership.length);
// 去除下标对应的元素赋值给最终返回值的变量
random = ownership[index];
return random;
}
// 将猜拳对比的逻辑封装
static String comparison(String computers,String input){
String result = "";//最终返回值的变量
// 判断输赢的逻辑
if (random.equals(input)){
//当两个字符串一致时
WinLos="平局";
}else
// 列举出玩家赢的情况,若都不符合则是失败
if (("石头".equals(random) && "布".equals(input))||("布".equals(random) && "剪刀".equals(input))||("剪刀".equals(random) && "石头".equals(input)) ){
WinLos="胜利";
}else{
WinLos="失败";
}
return result;
}
// 主入口中整理,执行封装的逻辑
public static void main(String[] args) {
// 控制台输入
Scanner sc=new Scanner(System.in);
// 需求One:若没有猜对则继续猜,直到猜对为止
while(true){
//自造死循环
// 调用computers方法
String random = computers();
// 作弊一下
System.out.println(random);
// 友好提示
System.out.println("猜吧");
// 接收控制台输入
String input = sc.next();
// 需求:当输入的是EXIT的时候程序终止且退出
if ("EXIT".equals(input)){
System.out.println("程序退出");
}else {
// 调用comparison方法对比
String result = comparison(random,input);
// 需求:猜对则游戏退出
if ("胜利".equals(result)) {
// 输出对比结果
System.out.println(result);
break;
} else {
// 输出对比结果
System.out.println(result);
}
}
}
}
}
逻辑2:
因为计算机是不懂我们的语言的,所以我们就要转换成计算机的语言,那么计算机是拿怎么对比的呢?当然是数字了
逻辑2的具体实现:
那么换成数字该如何实现呢? 逻辑2的思路是和逻辑1一样的,只需将库的元素换成数字 ,将除了第二方法的返回值的类型以外的其他类型全部转换成int类型就好然后对比中就将石头剪刀布改成1,2,3就可以实现啦
package game;
import java.net.SecureCacheResponse;
import java.util.Scanner;
/**
* 用java实现猜拳案例WayTwo
*/
public class ConjectureTwo {
// 将系统随机值的逻辑封装
static int computers(){
int random;//最终返回值
// 将所有可能出现的装到库中ownership
int[] ownership = {
1,2,3};//1-石头 2-布 3-剪刀
// 随机一个ownership下标
int index=(int)(Math.random()*ownership.length);
// 将下标对应的元素赋值给ramdom
random = ownership[index];
return random;
}
// 将对比逻辑封装
static String comparison(int random,int input){
String result = null;//初始化最终返回值
// 对比逻辑
if (random==input){
//若相同
result = "平局";
}else if ((random==1 && input==2) || (random==2 && input==3) || (random==3 && input==1) ){
//
result = "胜利";
}else{
//否则
result = "失败";
}
return result;
}
public static void main(String[] args) {
// 控制台输入
Scanner sc = new Scanner(System.in);
// 需求:若没有胜利则一直猜拳
while (true){
// 友好提示
System.out.println("猜吧!(石头-1 布-2 剪刀-3)");
// 调用computers方法
int random = computers();
// 作弊一下
System.out.println(random);
// 接收控制台输入
int input = sc.nextInt();
// 调用comparison方法进行对比
String result = comparison(random,input);
// 需求:若赢了程序退出
if ("胜利".equals(result)){
System.out.println(result);
break;//跳出循环,程序结束
}else{
System.out.println(result);//友好提示
}
}
}
}
总结:
此逻辑主要用到了if–else分支,
当我们把if–else的执行逻辑搞透彻后此案例的逻辑就会很清晰了