1. 程式人生 > >Java 基礎 猜字元小遊戲

Java 基礎 猜字元小遊戲

猜字元小遊戲是對Java 語言基礎的總結,幾乎涵蓋的了語言基礎中的所有知識,包括 順序機構,分支結構,迴圈結構,陣列,以及方法的呼叫.

本文原始碼中有詳細的註解,如果有看不懂的,歡迎留言問答!本文是提供給入門的新手的,還望路過的大牛,不喜勿噴.

 

package GuessGame;

import java.util.Scanner;

public class Guessing {

	public static void main(String[] args) {
		char [] chs = character();// 獲取控制檯許可權
		System.out.println(chs);// 作弊,列印的結果
		Scanner scanner = new Scanner(System.in);//獲取控制檯許可權
		int count = 0;//宣告次數
		while(true){//自造死迴圈
			System.out.println("Guess!(猜吧)");
			String str = scanner.nextLine().toUpperCase();//將使用者輸入的轉為大寫
			if(str.equals("EXIT")) {//如果使用者輸入EXIT直接退出程式
				System.out.println("Game Over! Welcome to come again(遊戲結束!歡迎下次再來) ");
				return;
			}
			char [] input = str.toCharArray();//將使用者輸入的字串轉為字元陣列
			int [] result =check(chs,input);//對比隨機陣列chs 和使用者輸入的 input陣列 是否正確
			if(result[1] == chs.length){// 如果字元對的位置個數與chs的長度相同,說明猜對了
				int score = 100 * chs.length - count * 10;
				System.out.println("Congratulations! Your score is(恭喜你猜對了,你的得分為):"+score);
				return;
			}else {
				count ++;//猜錯的次數自增
				System.out.println("Number of characters correctly guessed(猜對的字元個數為):"+result[0]+
						" Number of correct character positions(猜對的字元位置個數為):" +result[1]);
			}
		}
	}
	// 生成隨機字元陣列
	public static char [] character(){
		char [] chs = new char [5]; // 隨機字元陣列
		char [] letters = new char [26];// 26個英文字元的範圍,然後遍歷賦值,此處可以有另外一種方法生成,雖然比較麻煩但不需要遍歷賦值,下面註釋中演示
		for (int i = 0; i < letters.length; i++) {
			letters [i] = (char) ('A'+i);
		}
		/*char[] letters = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
				'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
				'W', 'X', 'Y', 'Z' };*/ //隨機字元的範圍
		boolean [] flags = new boolean [letters.length];// 開關資料用來比較去除重複
		for(int i = 0; i <chs.length; i++){//遍歷賦值隨機字元
			int index;// 下標
			do {
				index = (int)(Math.random()*letters.length);//生成隨機下標
			} while (flags[index] == true);//當下標index對應的開關為true時,表示對應字元已存過,則重新生成下標index
            //當下標index對應的開頭為false時,表示對應字元未存過,則迴圈結束
			chs [i] = letters[index];//基於下標index到letters中獲取字元,並賦值給chs中的每一個元素
			flags [index] = true;// //將下標index對應的開關修改為true,表示對應字元已存過
		}
		return chs;
	}
	
	// 比較去重的過程
	/*i=0 index=0	chs[0]='A'  flags[0]=true
	 * i=1 index=25	chs[1]='Z'	flags[25]=true
	 * i=2 index=0/25/0/1	chs[2]='B'  flags[1]=true*/
	
	// 對比chs 字元陣列和 input 字元陣列
	public static int [] check(char [] chs, char [] input){
		int [] result = new int [2];// 對比結果(0,0) 假設 result[0]為字元對的個數,result[1]為字元位置對的個數
		for (int i = 0; i < chs.length; i++) {//遍歷隨機字元陣列
			for (int j = 0; j < input.length; j++) {//遍歷使用者輸入的字元陣列
				if(chs[i] == input[j]){// 字元正確
					result [0]++;// 字元對的個數自增
					if(i == j){//字元位置正確
						result [1]++;//字元對的位置自增
					}
					break;//剩餘的input元素本輪不再比較
				}
			}
		}
		return result;
	}
}