第四章,簡單的水果機遊戲(Android)

首先說明一點,這個例子有個致命bug,是寫到後面才發現的,就是快速連續點“start”和“stop”按鈕會出錯,因爲用的handler,所以會不斷開啓線程,後來也想了一些辦法來補救,但是還是不能讓自己滿意。於是只能就此作罷。不過,其他地方都是還不錯的。

主要用的知識點:1.handler。2.自定義按鈕

三個按鈕的佈局:

在res下drawable文件夾(如沒有這個文件夾,就新建)創建xml文件,選layer-list。

button_false.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item>
        <shape>
            <solid android:color="#ffffff" />
        </shape>
    </item>
    <item
        android:bottom="5dp"
        android:right="5dp"
        android:left="5dp"
        android:top="5dp"
        >
        <shape>
            <solid android:color="#c0c0c0" />
        </shape>
    </item>

</layer-list>

button_true.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item>
        <shape>
            <solid android:color="#ffffff" />
        </shape>
    </item>
    <item
        android:bottom="5dp"
        android:right="5dp"
        android:left="5dp"
        android:top="5dp"
        >
        <shape>
            <solid android:color="#808a87" />
        </shape>
    </item>

</layer-list>
button_select.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item>
        <shape>
            <solid android:color="#ffffff" />
        </shape>
    </item>
    <item
        android:bottom="5dp"
        android:right="5dp"
        android:left="5dp"
        android:top="5dp"
        >
        <shape>
            <solid android:color="#292421" />
        </shape>
    </item>

</layer-list>

MainActivity

package com.example.demo06;

import java.util.Random;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

	LinearLayout layout_main, layout_01, layout_02;

	// 建立按鈕數組,用來存儲用到的對象
	Button bs[] = new Button[10];

	// 實例化隨機數對象
	Random r = new Random();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// setContentView(R.layout.activity_main);

		// 初始化背景佈局
		layout_main = new LinearLayout(this);
		layout_main.setOrientation(LinearLayout.VERTICAL);
		setContentView(layout_main);

		// 初始化子佈局
		layout_01 = new LinearLayout(this);
		layout_02 = new LinearLayout(this);

		// 設置排列方向
		layout_01.setOrientation(LinearLayout.HORIZONTAL);
		layout_02.setOrientation(LinearLayout.HORIZONTAL);

		layout_01.setPadding(5, 5, 5, 0);

		layout_02.setPadding(5, 0, 5, 5);

		// 獲取屏幕的長寬
		DisplayMetrics om = new DisplayMetrics();
		getWindowManager().getDefaultDisplay().getMetrics(om);
		int width = om.widthPixels;
		int height = om.heightPixels;

		// 生成所有按鈕
		for (int i = 0; i < 10; i++) {
			Button b = new Button(this);
			b.setWidth((width - 10) / 5);
			b.setHeight(height / 7);
			b.setText(i + "");
			b.setBackgroundResource(R.drawable.button_false);

			b.setTag(false);
			b.setId(i);
			b.setOnClickListener(this);

			bs[i] = b;
		}
		// 把按鈕添加到子佈局中
		for (int i = 0; i < 10; i++) {
			if (i < 5) {
				layout_01.addView(bs[i]);
			} else {
				layout_02.addView(bs[14 - i]);
			}
		}

		// 設置子佈局添加到主佈局中
		layout_main.addView(layout_01);
		layout_main.addView(layout_02);

		// 生成開始按鈕
		Button b_start = new Button(this);
		b_start.setText("start");
		b_start.setId(11);
		b_start.setTag(false);
		b_start.setBackgroundResource(R.drawable.button_false);
		b_start.setHeight(height / 7);
		b_start.setOnClickListener(this);
		layout_main.addView(b_start);

	}

	// 定義下面要用到的參數
	private int num = -1, flag = 0, sysnum = -1;

	// ************所有的按鈕點擊**************
	@Override
	public void onClick(View arg0) {

		// *************點擊了數字按鈕***************

		if (arg0.getId() < 10) {

			// 系統運行時sysnum = -2
			if (sysnum == -2) {
				Toast.makeText(getApplication(), "運行時不可選擇!", Toast.LENGTH_SHORT)
						.show();
				return;
			}
			// 爲了退出中獎循環,只要sysnum<0即可退出中獎循環
			sysnum = -3;
			if ((Boolean) arg0.getTag()) {
				arg0.setTag(false);
				arg0.setBackgroundResource(R.drawable.button_false);
				((TextView) arg0).setTextColor(Color.BLACK);
				num = -1;

			} else {
				if (num > -1) {

					bs[num].setTag(false);
					bs[num].setBackgroundResource(R.drawable.button_false);
					bs[num].setTextColor(Color.BLACK);
				}
				arg0.setTag(true);
				arg0.setBackgroundResource(R.drawable.button_select);
				((TextView) arg0).setTextColor(Color.WHITE);
				num = arg0.getId();
			}

			// *********點擊了開始和停止按鈕********

		} else {
			// 在開始時必須要選一個數字
			if (num == -1) {
				Toast.makeText(getApplication(), "請選擇一個數字!", Toast.LENGTH_SHORT)
						.show();
				return;
			}
			// --------點擊了開始--------
			if (!(Boolean) arg0.getTag()) {
				// 將開始按鈕的文字改爲“stop”
				((TextView) arg0).setText("stop");

				// 將系統生成值初始化
				sysnum = -2;
				// 每次都從 0 開始

				if (flag > 0 && num != (flag - 1)) {
					bs[flag - 1].setBackgroundResource(R.drawable.button_false);
				} else if (flag == 0 && num != (flag - 1)) {
					bs[0].setBackgroundResource(R.drawable.button_false);
				} else {
					bs[num].setBackgroundResource(R.drawable.button_select);
				}

				// 將循環的開始數定爲0
				flag = 0;

				// 將按鈕值轉爲 true
				arg0.setTag(true);
				// 開啓子線程開始發送消息
				new Thread() {
					public void run() {
						while (true) {
							// 判斷系統生成的數字,點stop之前是-1
							if (sysnum == bs[flag].getId()) {

								// 中獎循環
								if (num == sysnum) {
									for (int i = 0; sysnum > 0; i++) {
										handler.sendEmptyMessage(2 + i);
										try {
											// 休息0.5秒
											Thread.sleep(500);
										} catch (InterruptedException e) {
											e.printStackTrace();
										}
									}
								}
								sysnum = -1;

								break;
							}
							try {
								// 休息0.1秒
								Thread.sleep(100);
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
							// 發送空消息
							handler.sendEmptyMessage(0);
						}
					}

				}.start();
				// --------點擊了停止-------
			} else {

				((TextView) arg0).setText("start");
				// 產生隨機數
				sysnum = r.nextInt(10);
				arg0.setTag(false);
			}
		}
	}

	// 實例化handler
	Handler handler = new Handler() {
		public void handleMessage(Message msg) {

			if (msg.what > 1) {
				if (msg.what == 3)
					Toast.makeText(getBaseContext(), "中獎了", Toast.LENGTH_SHORT)
							.show();

				if (msg.what % 2 == 0) {
					bs[num].setBackgroundResource(R.drawable.button_select);
				} else {
					bs[num].setBackgroundResource(R.drawable.button_true);
				}

			} else {

				// ------分兩種情況,1.循環到0時,2.不是0時
				// ---------1.當循環到0時-------------
				if (flag == 0) {
					// 所處的那個按鈕的顏色
					if (num == 0) {
						bs[flag].setBackgroundResource(R.drawable.button_select);
					} else {
						bs[flag].setBackgroundResource(R.drawable.button_true);
					}
					// 所處的按鈕後一個按鈕的顏色
					if (num == 9) {
						bs[9].setBackgroundResource(R.drawable.button_select);
					} else {
						bs[9].setBackgroundResource(R.drawable.button_false);
					}
					// ---------當循環到非0時-----------
				} else {
					// 所處的那個按鈕的顏色
					if (num == flag) {
						bs[flag].setBackgroundResource(R.drawable.button_select);
					} else {
						bs[flag].setBackgroundResource(R.drawable.button_true);
					}
					// 所處的按鈕後一個按鈕的顏色
					if (num == (flag - 1)) {
						bs[flag - 1]
								.setBackgroundResource(R.drawable.button_select);
					} else {
						bs[flag - 1]
								.setBackgroundResource(R.drawable.button_false);
					}
				}
				// 當計數到9時歸零再次循環,因爲下面要++,所以爲-1
				if (flag == 9) {
					flag = -1;
				}
				flag++;
			}
		}
	};

}

調試截圖:


注:黑色那個是選中的數字,淡一點的會像水果機一樣一直轉動,最後停在某個數上,如果與選中的數一樣就會顯示中獎。



發佈了44 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章