第四章,简单的水果机游戏(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++;
			}
		}
	};

}

调试截图:


注:黑色那个是选中的数字,淡一点的会像水果机一样一直转动,最后停在某个数上,如果与选中的数一样就会显示中奖。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值