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++;
}
}
}
}
**_for(int j=0;j<chs.length;j++){//第一部分
if(input[i]==chs[j]){//第二部分**_