程式說明:
本遊戲提供 1~9 位數的猜數字遊戲,並且紀錄最佳成績。
按鈕功能說明:
- 【開始玩】按鈕:輸入要玩幾位數的猜數字遊戲後,按【開始玩】進入【猜數字模式】。
- 【重玩】按鈕:重玩。
- 【猜看看】按鈕:【猜數字模式】時,當猜的數字輸入完畢後,按【猜看看】觀看結果。
- 【看答案】按鈕:【猜數字模式】時,按【看答案】中止猜數直接看答案。
- 【清除紀錄】按鈕:清除所有最佳紀錄。
- 【離開】按鈕:離開遊戲程式。
【輸入要玩幾位數的猜數字遊戲】後,按【開始玩】進入【猜數字模式】。
按【清除紀錄】清除所有最佳紀錄。
【猜數字模式】時,當猜的數字輸入完畢後,按【猜看看】觀看結果。
【猜數字模式】時,按【看答案】中止猜數直接看答案。
<ABGuessNumberGame.java>
1: package com.android.abguessnumbergame;
2:
3: import java.util.ArrayList;
4: import java.util.Random;
5:
6: import android.app.Activity;
7: import android.content.Context;
8: import android.content.SharedPreferences;
9: import android.graphics.Color;
10: import android.os.Bundle;
11: import android.text.InputFilter;
12: import android.view.View;
13: import android.view.View.OnClickListener;
14: import android.view.inputmethod.InputMethodManager;
15: import android.widget.ArrayAdapter;
16: import android.widget.Button;
17: import android.widget.EditText;
18: import android.widget.ListAdapter;
19: import android.widget.ListView;
20: import android.widget.TextView;
21:
22: public class ABGuessNumberGame extends Activity {
23:
24: public static final String PREF = "GameScore";
25: public static final String PREF_SCORE[] = { "NoneUse" , "1DigitsScore", "2DigitsScore",
26: "3DigitsScore", "4DigitsScore", "5DigitsScore",
27: "7DigitsScore", "7DigitsScore", "8DigitsScore",
28: "9DigitsScore" };
29: private EditText edittextGuessDigits, edittextGuessNumber;
30: private Button btnPlayorNew, btnExit, btnGuess, btnGiveUp, btnClear;
31: private TextView textviewMessage, textviewThisScore, textviewBestScore;
32: private ListView listviewResult;
33: private ListAdapter laSimple1;
34: private ArrayList<String> listItems = new ArrayList<String>();
35: private boolean playFlag = false, bingoFlag;
36: private int playDigits, n , m, intBestScore;
37: private String strAnswerNumber, strOutputString;
38:
39:
40: @Override
41: public void onCreate(Bundle savedInstanceState) {
42: super.onCreate(savedInstanceState);
43: setContentView(R.layout.main);
44: findViews();
45: initialSetup();
46: setButtonListeners();
47: }
48:
49:
50: private void findViews(){
51: // 設定 Widgets 的 findViewById
52: edittextGuessDigits = (EditText) findViewById(R.id.guessdigitsEditText);
53: edittextGuessNumber = (EditText) findViewById(R.id.guessnumberEditText);
54: btnPlayorNew = (Button) findViewById(R.id.playornewBtn);
55: btnGuess = (Button) findViewById(R.id.guessBtn);
56: btnGiveUp = (Button) findViewById(R.id.giveupBtn);
57: btnExit = (Button) findViewById(R.id.exitBtn);
58: btnClear = (Button) findViewById(R.id.clearBtn);
59: textviewMessage = (TextView) findViewById(R.id.messageTextView);
60: textviewThisScore = (TextView) findViewById(R.id.thisscoreTextView);
61: textviewBestScore = (TextView) findViewById(R.id.bestscoreTextView);
62: listviewResult = (ListView) findViewById(R.id.resultListView);
63: }
64:
65:
66: private void initialSetup(){
67: // 設定 edittextGuessDigits, edittextGuessNumber 屬性
68: edittextGuessDigits.setText("");
69: edittextGuessDigits.setTextColor(Color.BLUE);
70: edittextGuessDigits.setEnabled(true);
71: edittextGuessDigits.requestFocus();
72: edittextGuessNumber.setText("");
73: edittextGuessNumber.setEnabled(false);
74:
75: // 設定 btnPlayorNew, btnGuess, btnGiveUp 屬性
76: btnPlayorNew.setText(R.string.strPlay);
77: btnGuess.setEnabled(false);
78: btnGiveUp.setEnabled(false);
79:
80: // 清除 ListView 資料
81: clearResults();
82:
83: // 隱藏 SoftKeyboard
84: hideSoftKeyboard();
85: }
86:
87: private void setButtonListeners(){
88: // set Buttons Listeners
89:
90: btnPlayorNew.setOnClickListener(new View.OnClickListener() {
91: // 執行 【開始玩】 或 【重玩】
92: public void onClick(View v) {
93:
94: if ( edittextGuessDigits.length() != 1) // 沒輸入猜幾位數時,按鈕無效
95: return;
96:
97: playFlag = (!playFlag);
98:
99: if ( playFlag ) {
100: // 切換【猜數字模式】
101: // 設定 edittextGuessDigits , btnPlayorNew , btnGuess 屬性
102: edittextGuessDigits.setEnabled(false);
103: btnPlayorNew.setText(R.string.strNew);
104: btnGuess.setEnabled(true);
105: btnGiveUp.setEnabled(true);
106: btnClear.setEnabled(false);
107:
108: // 設定 edittextGuessNumber 的輸入長度
109: playDigits = Integer.valueOf(edittextGuessDigits.getText().toString());
110: InputFilter[] FilterArray = new InputFilter[1];
111: FilterArray[0] = new InputFilter.LengthFilter(playDigits);
112: edittextGuessNumber.setFilters(FilterArray);
113: edittextGuessNumber.setHint("請輸入(1..9)不同數字的" + playDigits + "位數數字");
114:
115: // 設定 edittextGuessNumber 屬性
116: edittextGuessNumber.setText("");
117: edittextGuessNumber.setEnabled(true);
118: edittextGuessNumber.requestFocus();
119:
120: // 讀取最佳紀錄
121: intBestScore = getSharedPreferences(playDigits);
122:
123: if ( intBestScore == 999 ) // 999 代表尚苂最佳紀錄
124: textviewBestScore.setText(getString(R.string.strBestScore)+"<尚無紀錄>");
125: else
126: textviewBestScore.setText( getString(R.string.strBestScore) +
127: "猜數 " + intBestScore + " 次");
128:
129: // 利用亂數產生一組數字, 儲放於 strAnswerNUmber
130: generateAnswerNumber();
131: }
132: else {
133: // 【輸入猜數位數模式】
134: // 設定 edittextGuessDigits, edittextGuessNumber 屬性
135: edittextGuessDigits.setText("");
136: edittextGuessDigits.setEnabled(true);
137: edittextGuessDigits.requestFocus();
138: edittextGuessNumber.setText("");
139: edittextGuessNumber.setEnabled(false);
140:
141: // 設定 btnPlayorNew, btnGuess, btnGiveUp, btnClear 屬性
142: btnPlayorNew.setText(R.string.strPlay);
143: btnGuess.setEnabled(false);
144: btnGiveUp.setEnabled(false);
145: btnClear.setEnabled(true);
146:
147: // 清除 ListView 資料
148: clearResults();
149: }
150: }
151: });
152:
153: btnGuess.setOnClickListener(new OnClickListener(){
154: // 執行 【猜看看】
155: public void onClick(View v) {
156: if ( edittextGuessNumber.getText().toString().length() == playDigits )
157: {
158: if ( validateGuessNumber(edittextGuessNumber.getText().toString()) )
159: // 輸入數字正確時
160: {
161: // 檢查猜對幾個數字
162: checkMatchResult();
163:
164: // 顯示猜數結果
165: showMatchResult();
166: }
167: else
168: {
169: // 輸入數字錯誤時
170: textviewMessage.setText(getString(R.string.strMessage) +
171: edittextGuessNumber.getText().toString() +
172: " 輸入錯誤!");
173: edittextGuessNumber.setText("");
174: }
175: }
176: }
177: });
178:
179: btnGiveUp.setOnClickListener(new OnClickListener(){
180: // 執行 【看答案】
181: public void onClick(View v) {
182: // 顯示謎底答案
183: textviewMessage.setText(getString(R.string.strMessage) + strAnswerNumber);
184:
185: // 設定 edittextGuessNumber 屬性
186: edittextGuessNumber.setEnabled(false);
187: edittextGuessNumber.clearFocus();
188:
189: // 設定 btnGuess, btnGiveUp 屬性
190: btnGuess.setEnabled(false);
191: btnGiveUp.setEnabled(false);
192:
193: // 隱藏 SoftKeyboard
194: hideSoftKeyboard();
195: }
196: });
197:
198:
199: btnClear.setOnClickListener(new OnClickListener(){
200: // 執行 【清除紀錄】
201: public void onClick(View v) {
202: // 清除 SharedPreferences 所有資料
203: clearSharedPreferences();
204: }
205: });
206:
207: btnExit.setOnClickListener(new OnClickListener(){
208: // 執行 【離開】
209: public void onClick(View v) {
210: android.os.Process.killProcess(android.os.Process.myPid());
211: }
212: });
213: }
214:
215:
216: private void generateAnswerNumber() {
217: // 產生一組 playDigits 位數的數字,並且將產生的數寀儲放於 strAnswerNumber
218:
219: strAnswerNumber = "";
220:
221: for ( int i = 1 ; i <= playDigits ; i++ ) {
222: int randomNo;
223: boolean exitFlag;
224: do {
225: exitFlag = true;
226: Random generator = new Random(System.currentTimeMillis());
227:
228: // 產生 1~9 之間的一個亂數整數
229: do {
230: randomNo = generator.nextInt(10);
231: } while ( randomNo == 0);
232:
233: // 檢查這一個亂數整數與前面已產生的亂數整數是否重複
234: if ( i > 1 ) {
235: for ( int j = 0 ; j <= ( i - 2 ) ; j++) {
236: String chkDigitNo = strAnswerNumber.substring(j, j + 1);
237: if (chkDigitNo.equals(String.valueOf(randomNo))) {
238: // 數字重複時,將 exitFlag 設為 false
239: exitFlag = false;
240: }
241: }
242: }
243: } while ( i > 1 && (! exitFlag) );
244:
245: // 依序組合系統自動所產生的亂數整數
246: if ( i == 1)
247: strAnswerNumber = String.valueOf(randomNo);
248: else
249: strAnswerNumber += String.valueOf(randomNo);
250: }
251: }
252:
253:
254: private boolean validateGuessNumber(String guessNumber) {
255: // 檢查輸入猜的數字中是否有重複?有重複時傳回 false;沒有重複時傳回 true
256:
257: for ( int i = 0 ; i < guessNumber.length() - 1 ; i++) {
258: String digit1 = guessNumber.substring(i, i+1);
259: for ( int j = i + 1 ; j < guessNumber.length() ; j++ ) {
260: String digit2 = guessNumber.substring(j, j+1);
261: if ( digit1.equals(digit2) )
262: return false;
263: }
264: }
265: return true;
266: }
267:
268:
269: private void checkMatchResult() {
270: // 檢查猜中幾個數字,傳回 n A , m B 結果
271: n = 0;
272: m = 0;
273: String strInputNumber = edittextGuessNumber.getText().toString();
274: for( int i = 0 ; i < playDigits ; i++) {
275: String strInputDigit = strInputNumber.substring( i , i + 1 );
276: for ( int j = 0 ; j < playDigits ; j++ ) {
277: String strAnswerDigit = strAnswerNumber.substring( j , j + 1 );
278: if ( strAnswerDigit.equals(strInputDigit)) {
279: if ( i== j ) // 數字與位置都正確時,累計 n 值
280: n++;
281: else { // 數字正確但位置不對時,累計 m 值
282: m++;
283: }
284: }
285: }
286: }
287:
288: // 將猜數字結果放入 strOutputString
289: if ( n == playDigits )
290: {
291: // BINGO
292: bingoFlag = true;
293: strOutputString = strInputNumber + " " + "BINGO !!";
294:
295: }
296: else
297: {
298: // n A m B
299: bingoFlag = false;
300: strOutputString = strInputNumber + " " + n + " A " + m + " B ";
301: }
302:
303: // 將 strOutputString 放入 ListView 的 listItems
304: listItems.add(strOutputString);
305: }
306:
307:
308: private void showMatchResult(){
309: // 顯示 listItems 的所有資料
310: laSimple1 = new ArrayAdapter<String>( this,
311: R.layout.my_list_row,
312: listItems);
313: listviewResult.setAdapter(laSimple1);
314:
315: // 顯示訊息區
316: textviewMessage.setText( getString(R.string.strMessage) + strOutputString);
317:
318: // 顥示猜數總次數
319: textviewThisScore.setText(getString(R.string.strScore)+listItems.size()+" 次");
320:
321: // 清除 edittextGuessNumber 欄位
322: edittextGuessNumber.setText("");
323:
324: if ( bingoFlag )
325: // 全部數字猜對時 ( BINGO )
326: {
327: // 設定 edittextGuessNumber 屬性
328: edittextGuessNumber.setEnabled(false);
329: edittextGuessNumber.clearFocus();
330:
331: // 設定 btnGuess, btnGiveUp 屬性
332: btnGuess.setEnabled(false);
333: btnGiveUp.setEnabled(false);
334:
335: if ( listItems.size() < intBestScore ) // 本次紀錄是最佳紀錄
336: {
337: // 顯示最佳紀錄
338: textviewBestScore.setText( getString(R.string.strBestScore) +
339: listItems.size() + " 次" +
340: " <破紀錄!>");
341: // 儲存最佳紀錄
342: SharedPreferences settings = getSharedPreferences("PREF", 0);
343: SharedPreferences.Editor preEdit = settings.edit();
344: preEdit.putInt(PREF_SCORE[playDigits], listItems.size());
345: preEdit.commit();
346: }
347:
348: if ( listItems.size() == intBestScore ) // 本次紀錄平最佳紀錄
349: {
350: // 顯示最佳紀錄
351: textviewBestScore.setText( getString(R.string.strBestScore) +
352: listItems.size() + " 次" +
353: " <平紀錄!>");
354: }
355:
356: }
357:
358: // 隱藏 SoftKeyboard
359: hideSoftKeyboard();
360: }
361:
362:
363: private void clearResults(){
364: // 清除 listItems 的所有資料
365: listItems.clear();
366: laSimple1 = new ArrayAdapter<String>( this,
367: R.layout.my_list_row,
368: listItems);
369: listviewResult.setAdapter(laSimple1);
370:
371: // 清除訊息區
372: textviewMessage.setText(getString(R.string.strMessage));
373:
374: // 清除紀錄
375: textviewThisScore.setText(getString(R.string.strScore));
376: textviewBestScore.setText(getString(R.string.strBestScore));
377:
378:
379: }
380:
381:
382: private void hideSoftKeyboard(){
383: // 隱藏 SoftKeyboard
384: InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
385: imm.hideSoftInputFromWindow(getWindow().peekDecorView().getWindowToken(), 0);
386: }
387:
388:
389: private int getSharedPreferences(int level) {
390: // 讀取 SharedPreferences 資料
391: SharedPreferences settings = getSharedPreferences("PREF", 0);
392: int levelScore = settings.getInt(PREF_SCORE[level], 999);
393: return levelScore;
394: }
395:
396:
397: private void clearSharedPreferences() {
398: // 清除 SharedPreferences 資料
399: SharedPreferences settings = getSharedPreferences("PREF", 0);
400: settings.edit().clear().commit();
401: }
402:
403: }
<main.xml>
1: <?xml version="1.0" encoding="utf-8"?>
2: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3: android:layout_width="fill_parent"
4: android:layout_height="fill_parent"
5: android:orientation="vertical" >
6:
7: <TextView
8: android:layout_width="fill_parent"
9: android:layout_height="40dp"
10: android:gravity="center"
11: android:text="@string/strTitle"
12: android:textSize="16dp" />
13:
14: <LinearLayout
15: android:id="@+id/linearLayout1"
16: android:layout_width="wrap_content"
17: android:layout_height="wrap_content" >
18:
19: <EditText
20: android:id="@+id/guessdigitsEditText"
21: android:layout_width="wrap_content"
22: android:layout_height="40dp"
23: android:digits="123456789"
24: android:hint="@string/strDigitsHint"
25: android:inputType="number"
26: android:maxLength="1"
27: android:textSize="12dp" >
28:
29: <requestFocus />
30: </EditText>
31:
32: <Button
33: android:id="@+id/playornewBtn"
34: android:layout_width="60dp"
35: android:layout_height="40dp"
36: android:text="@string/strPlay"
37: android:textSize="12dp" />
38:
39: <Button
40: android:id="@+id/exitBtn"
41: android:layout_width="60dp"
42: android:layout_height="40dp"
43: android:text="@string/strExit"
44: android:textSize="12dp" />
45: </LinearLayout>
46:
47: <LinearLayout
48: android:layout_width="wrap_content"
49: android:layout_height="wrap_content" >
50:
51: <EditText
52: android:id="@+id/guessnumberEditText"
53: android:layout_width="236dp"
54: android:layout_height="40dp"
55: android:digits="123456789"
56: android:ems="10"
57: android:hint="@string/strGuessHint"
58: android:inputType="number"
59: android:textSize="12dp" />
60:
61: <Button
62: android:id="@+id/guessBtn"
63: android:layout_width="60dp"
64: android:layout_height="40dp"
65: android:text="@string/strGuess"
66: android:textSize="12dp" />
67: </LinearLayout>
68:
69:
70:
71: <LinearLayout
72: android:layout_width="match_parent"
73: android:layout_height="wrap_content" >
74:
75: <TextView
76: android:id="@+id/messageTextView"
77: android:layout_width="236dp"
78: android:layout_height="40dp"
79: android:gravity="center|left"
80: android:text="@string/strMessage" />
81:
82: <Button
83: android:id="@+id/giveupBtn"
84: android:layout_width="60dp"
85: android:layout_height="40dp"
86: android:layout_marginRight="20dp"
87: android:text="@string/strGiveUp"
88: android:textSize="12dp" />
89:
90: </LinearLayout>
91:
92: <LinearLayout
93: android:layout_width="match_parent"
94: android:layout_height="wrap_content"
95: android:orientation="vertical" >
96:
97: <TextView
98: android:id="@+id/textView1"
99: android:layout_width="match_parent"
100: android:layout_height="wrap_content"
101: android:text="@string/strDash" />
102:
103: </LinearLayout>
104:
105: <LinearLayout
106: android:id="@+id/linearLayout2"
107: android:layout_width="wrap_content"
108: android:layout_height="wrap_content" >
109:
110: <LinearLayout
111: android:id="@+id/linearLayout3"
112: android:layout_width="180dp"
113: android:layout_height="match_parent"
114: android:orientation="vertical" >
115:
116: <TextView
117: android:id="@+id/thisscoreTextView"
118: android:layout_width="match_parent"
119: android:layout_height="40dp"
120: android:gravity="center|left"
121: android:text="@string/strScore" />
122:
123: <TextView
124: android:id="@+id/bestscoreTextView"
125: android:layout_width="match_parent"
126: android:layout_height="40dp"
127: android:gravity="center|left"
128: android:text="@string/strBestScore" />
129:
130: <Button
131: android:id="@+id/clearBtn"
132: android:layout_width="80dp"
133: android:layout_height="40dp"
134: android:text="@string/strClear"
135: android:textSize="12dp" />
136:
137: <TextView
138: android:id="@+id/textView3"
139: android:layout_width="match_parent"
140: android:layout_height="40dp"
141: android:gravity="center|left"
142: android:text="@string/strCopyright" />
143:
144: </LinearLayout>
145:
146: <LinearLayout
147: android:id="@+id/linearLayout4"
148: android:layout_width="wrap_content"
149: android:layout_height="match_parent"
150: android:orientation="vertical" >
151:
152: <ListView
153: android:id="@+id/resultListView"
154: android:layout_width="137dp"
155: android:layout_height="wrap_content" >
156: </ListView>
157: </LinearLayout>
158: </LinearLayout>
159:
160: </LinearLayout>
<my_list_row.xml>
1: <?xml version="1.0" encoding="utf-8"?>
2: <TextView xmlns:android="http://schemas.android.com/apk/res/android"
3: android:layout_width="match_parent"
4: android:layout_height="match_parent"
5: android:gravity="center"
6: android:textSize="12dp" >
7:
8: </TextView>
<strings.xml>
1: <?xml version="1.0" encoding="utf-8"?>
2: <resources>
3:
4: <string name="hello">Hello World, ABGuessNumberGame!</string>
5: <string name="app_name">猜數字遊戲</string>
6: <string name="strTitle">【AB Guess Number Game 猜數字遊戲】</string>
7: <string name="strDigitsHint">請問要玩幾位數的猜數字遊戲</string>
8: <string name="strPlay">開始玩</string>
9: <string name="strExit">離開</string>
10: <string name="strNew">重玩</string>
11: <string name="strGuessHint">請輸入(1..9)不同數字的數</string>
12: <string name="strScore">本次紀錄:</string>
13: <string name="strGuseeCount">已猜數次數:</string>
14: <string name="strGuess">猜看看</string>
15: <string name="strCopyright">Copyright : Terry Wu</string>
16: <string name="strMessage">訊息:</string>
17: <string name="strGiveUp">看答案</string>
18: <string name="strBestScore">最佳紀錄:</string>
19: <string name="strDash">---------------------------------------------------------------</string>
20: <string name="strClear">清除紀錄</string>
21:
22: </resources>
沒有留言:
張貼留言