import java.util.Scanner;
public class Guess {
public static void main(String[] args) {
// TODO Auto-generated method stub
//第一步:定义数据结构:
/*Input:*/
char[] chs = new char[5];//保存随机生成的5个字母
char[] input = new char[5];//保存用户输入的5个字母
/*Output:*/
//第几次尝试,猜对几个字母,几个字母的位置正确
int times=0,right=0,position=0;
int score=0;//分数
char[] realtime=new char[5];//保存实时显示猜对位置字母的数组
/*隐含变量*/
String inStr=" ";//临时保存从控制台录入的字符串
/*process*/
generate(chs);
/*打桩测试*/
for(int i=0;i<chs.length;i++){
System.out.print(chs[i]+",");
}
/*主程序循环*/
Scanner sc=new Scanner(System.in);//只有从控制台获得用户输入就用Scanner
System.out.println("游戏开始...");
//循环
/*字符串不是基本类型,做等值比较,不能用==
* 应该使用Java专门的API比较字符串是否相等
* 语法:字符串1.equals(字符串2);
*/
while(!inStr.equals("EXIT")&&position!=chs.length){
System.out.println("请输入5个字母,按回车继续...(exit-退出)");
//Step2:获得用户输入:
/*获得用户输入的字符串:sc.next()——返回输入整个字符串
* 防止、去掉空格:字符串.trim()——去掉字符前后空格
* 将输入的字符串中所有的小写字母,统一转换为大写字母:
* 字符串.toUpperCase()
*/
inStr=sc.next().trim().toUpperCase();
//Stpe3:判断:如果用户输入的不是exit,才继续
if(!inStr.equals("EXIT")){
//Stpe4:将字符串,转化为字符数组,保存到input数组中
//将字符串转换为字符数组的API:字符数组=字符串.toCharArray()
input=inStr.toCharArray();
//Step5:比较chs和input两个数组的相似程度
//得到right:猜对几个字母
//得到position:猜对位置的有几个
//得到realtime:猜对位置的实时数组
int[] result=compare(chs,input,realtime);
right=result[0];
position=result[1];
//Step6:如果没有都猜对
if(position!=chs.length){
//将尝试次数+1
times++;
System.out.println("第"+times+"次尝试:"+"猜对了"
+right+"个字母,"+"其中"+position+
"个位置正确");
for(int i=0;i<realtime.length;i++){
System.out.print(realtime[i]+",");
}
System.out.println();
}
}
}
/*如果推出循环,只有两种情况:
* 1用户输入exit,主动退出,输入欢迎下次再来
* 2用户猜对了(position==chs.length)
* 计算得分:100*chs.length-10*times
* 输出,恭喜你猜对了
* */
if(inStr.equals("EXIT")){
System.out.println("欢迎下次再来!");
}else{
score=100*chs.length-10*times;
System.out.println("恭喜您,猜对了,本次得分:"+score);
}
}
/**
* 比较两个数组
* 1.求出猜对几个字母,有几个字母的位置正确
* 2.将比较结果分别保存在返回值数组的第一个元素和第二个元素中
* 3.将位置正确的字母在realtime中实时显示
* @param chs 随机生成的目标数组
* @param input 用户输入的数组
* @param realtime 实时显示猜对位置的元素数组
* @return 1个数:[0]保存猜对字母的个数
* [1]保存猜对位置的个数
*/
public static int[] compare(char[]chs,char[]input,char[]realtime){
//数组的第一个元素[0],表示有几个相同的字母
//数组第二个元素[1],表示位置有几个相同的字母
int[] result=new int[2];//新建两个整数元素的数组
/*
* 反复取出input数组中每个元素和chs数组中每个元素比较
* 只有input中的元素和chs中的元素相等
* 对result[0]+1,表示猜对了一个字母
* 立刻判断此时的位置是否相同(i==j)
* 如果i==j
* 对result[1]+1,表示猜对了一个位置
* 将才对的字母,填入realtime数组相同的位置
*/
for(int i=0;i<input.length;i++){
for(int j=0;i<chs.length;i++){
if(input[1]==chs[j]){
result[0]++;
if(i==j){
result[1]++;
realtime[i]=input[i];
}
break;
}
}
}
return result;
}
/**
* 自动生成5个不重复的字母,直接保存在数组chs中
* @param chs:传入一个空数组。
* 方法内,对数组的更改,直接作用于原数组
*/
public static void generate(char[] chs){
/*
* 反复生成多个字母,就要用循环:
* 循环变量:int i=0;
* 循环条件:i<chs.length;
* 迭代循环变量:无规律
* 只有生成字母不重复时,才+1!
* 循环体:随机生成65~90之间的1个整数。
* 判断刚生成的整数,在数组中是否重复
* 如果没有重复,就加入数组chs中,并且i++
* (否则什么都不做,再生成一个新字母,再比较)
*/
//因为循环次数和迭代规律不确定,所以使用while循环
int i = 0;//定义循环变量
while(i<chs.length){
//随机生成65-90之间的整数
int r=(int)(Math.random()*(90-65+1)+65);
//判断r是否在数组中包含
//定义1个布尔类型变量,表示r是否可用。默认是ture.
boolean enable=true;
//循环遍历数组的每个元素,和r比。
//只要任意1个元素等于r,则改变变量enable=false,表示r不可用。
for(int j=0;j<i;j++){
if(chs[j]==r){
enable=false;
}
}
if(enable){//如果r可用
chs[i]=(char)r;
i++;
}
}
}
}