1. 游戏思路

(1)用ImageView显示地鼠,初始状态将ImageView设置为不可见状态。当开始游戏后,通过sendMessageDelayed()方法延时发送消息,使ImageView显示出来,即实现了地鼠间隔出现的效果。

(2)通过Random获取随机数,给ImageView随机坐标,实现地鼠随机位置出现的效果。

(3)打中1次分数加1,同时记录出现的地鼠数量,当数量达到设定的最大数量,则游戏结束。

2. 代码

布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    tools:context="com.studying.network.GameActivity">

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/mouse"
        android:visibility="gone" />

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="80dp" />

    <Button
        android:id="@+id/button"
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="20dp"
        android:text="@string/start_game"
        android:textSize="12sp" />

</RelativeLayout>

Activity:

public class GameActivity extends Activity implements View.OnClickListener{

    private ImageView mImageView;
    private TextView mTextView;
    private Button mButton;

    private MyHandler mMyHandler = new MyHandler(this);

    public int mWidth;                              //设备屏幕宽度
    public int mHeight;                             //设备屏幕高度
    private int mTotalCount;                        //已经出现的地鼠数量
    private int mSuccessCount;                      //打中的地鼠数量

    public static final int SHOW_CODE = 100001;     //消息标识
    public static final int MAX_COUNT = 10;         //会出现的全部地鼠数量
    public static final int RANDOM_TIME = 500;      //地鼠出现的随机时间最大值

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

        initView();
        setTitle("打地鼠");
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        mWidth = dm.widthPixels;
        mHeight = dm.heightPixels;
    }

    private void initView() {
        mImageView = (ImageView) findViewById(R.id.image_view);
        mTextView = (TextView) findViewById(R.id.text_view);
        mButton = (Button) findViewById(R.id.button);
        mImageView.setOnClickListener(this);
        mButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:
                start();
                break;
            case R.id.image_view:
                mImageView.setVisibility(View.GONE);
                mSuccessCount++;
                mTextView.setText("打到了" + mSuccessCount + "只,共" + MAX_COUNT + "只");
                break;
        }
    }

    //游戏初始化
    private void start() {
        mTextView.setText("开始游戏!");
        mButton.setText("游戏中");
        mButton.setEnabled(false);
        next(0);
    }

    //设置下一只地鼠的出现
    private void next(int delayTime) {
        int positionX = new Random().nextInt(mWidth - 160);
        int positionY = new Random().nextInt(mHeight - 320);

        Message message = Message.obtain();
        message.what = SHOW_CODE;
        message.arg1 = positionX;
        message.arg2 = positionY;

        mMyHandler.sendMessageDelayed(message, delayTime);
        mTotalCount++;
    }

    private static class MyHandler extends Handler {

        private WeakReference<GameActivity>weakReference;

        MyHandler(GameActivity activity) {
            this.weakReference = new WeakReference<>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            GameActivity activity = weakReference.get();

            switch (msg.what) {
                case SHOW_CODE:
                    //游戏结束条件
                    if (activity.mTotalCount > MAX_COUNT) {
                        activity.clear();
                        Toast.makeText(activity, "地鼠打完了!", Toast.LENGTH_SHORT).show();
                        return;
                    }

                    //设置地鼠定时出现
                    int positionX = msg.arg1;
                    int positionY = msg.arg2;
                    activity.mImageView.setX(positionX);
                    activity.mImageView.setY(positionY);
                    activity.mImageView.setVisibility(View.VISIBLE);
                    int randomTime = new Random().nextInt(RANDOM_TIME) + RANDOM_TIME;
                    activity.next(randomTime);
                    break;
            }
        }
    }

    //重置游戏数据
    private void clear() {
        mTotalCount = 0;
        mSuccessCount = 0;
        mImageView.setVisibility(View.GONE);
        mButton.setText("开始游戏");
        mButton.setEnabled(true);
    }
}

Handler案例-简易打地鼠游戏(延时处理消息)的更多相关文章

  1. Android 多线程 打地鼠游戏

    前言:最近比较喜欢多线程了,看到了一些线程案例,这里总结一下打地鼠游戏的整个过程. 1.首先是主活动要加载的布局,我一般就喜欢早点把这个写上,这样就好在主活动中玩弄这些控件了.闲话不多说,一个Fram ...

  2. Android打地鼠游戏源码带道具购买的Android游戏开发

    这是一款基于安卓的打地鼠游戏,界面简洁,有level模式打地鼠和无尽模式打地鼠两种游戏模式,并可以通过商店使用金币进行道具的购买,道具可以让你更容易通关:同时金币可以在游戏通关的时候获取.工程中有较为 ...

  3. iOS版打地鼠游戏源码

    打地鼠游戏源码,游戏是一款多关卡基于cocos2d的iPad打地鼠游戏源码,这也是一款高质量的打地鼠游戏源码,可以拥有逐步上升的关卡的设置,大家可以在关卡时设置一些商业化的模式来盈利的,非常完美的一款 ...

  4. 无聊的人用JS实现了一个简单的打地鼠游戏

    直入正题,用JS实现一个简单的打地鼠游戏 因为功能比较简单就直接裸奔JS了,先看看效果图,或者 在线玩玩 吧 如果点击颜色比较深的那个(俗称坏老鼠),将扣分50:如果点击颜色比较浅的那个(俗称好老鼠) ...

  5. 打地鼠游戏iOS源码项目

    打地鼠游戏源码,游戏是一款多关卡基于cocos2d的iPad打地鼠游戏源码,这也是一款高质量的打地鼠游戏源码,可以拥有逐步上升的关卡的设置,大家可以在关卡时设置一些商业化的模式来盈利的,非常完美的一款 ...

  6. 团队项目——打地鼠游戏(SPEC)系统性能评估测试

    1.SPEC测试的目标: 本轮测试的目的是测试打地鼠游戏的需求以及确保每个需求都能得到满足的方法.编写此需求说明书是为了使用户和开发人员对所开发的系统有一致的理解.通过阅读此说明书,开发人员可以了解当 ...

  7. 打地鼠游戏ios源码

    打地鼠游戏源码,游戏是一款多关卡基于cocos2d的iPad打地鼠游戏源码,这也是一款高质量的打地鼠游戏源码,可以拥有逐步上升的关卡的设置,大家可以在关卡时设置一些商业化的模式来盈利的,非常完美的一款 ...

  8. Angular4 自制打地鼠游戏

    前端工程师新手一枚,之前一直做些小设计,以及静态页面的编写工作.刚刚接触 Angular 没有多久,四个月前对于 Javascript也只是会写 alert 之流,现在进步算是很大,下面是自制的打地鼠 ...

  9. 打地鼠游戏iOS源代码项目

    打地鼠游戏源代码,游戏是一款多关卡基于cocos2d的iPad打地鼠游戏源代码.这也是一款高质量的打地鼠游戏源代码.能够拥有逐步上升的关卡的设置,大家能够在关卡时设置一些商业化的模式来盈利的,很完美的 ...

随机推荐

  1. 理解容器之间的连通性 - 每天5分钟玩转 Docker 容器技术(34)

    通过前面小节的实践,当前 docker host 的网络拓扑结构如下图所示,今天我们将讨论这几个容器之间的连通性. 两个 busybox 容器都挂在 my_net2 上,应该能够互通,我们验证一下: ...

  2. VI修改文件

    找到路径   vi  文件名    i  添加或修改 esc   :  wq  保存退出     --------------------------------------------------- ...

  3. 利用libcurl进行post

    逛百度知道看到有个人提问:http://zhidao.baidu.com/question/1447092283140740700 C写HTTP应用只有疯子才会老老实实的SOCKET编程吧?我后来还是 ...

  4. vijos1059题解

    题目: XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木.小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木大 ...

  5. JAVA - 深入JAVA 虚拟机 1

    Java虚拟机与程序的生命周期 Java虚拟机将结束生命周期 1.call System.exit(n) Terminates the currently running JVM. 2.程序正常执行结 ...

  6. 解决window7 x64位Anaconda启动报错:AttributeError: '_NamespacePath' object has no attribute 'sort'

    最近论文需要用到python做数据分析,python语法简单,但是Windows下安装第三方包恶心的要命,statsmodels用pip死活安装不上,网上查了说包相互依赖windows下的pip不能下 ...

  7. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)A B题

    当时晚上打CF时候比较晚,加上是集训期间的室友都没有晚上刷题的习惯,感觉这场CF很不在状态.A题写复杂WA了一发后去厕所洗了个脸冷静了下,换个简单写法,可是用cin加了ios::sync_with_s ...

  8. Phpcms整理

    一.先去官网下载一个pc(http://www.phpcms.cn/)进行安装 把下载的pc包放在服务器www目录下: 在地址栏访问localhost/project/install/install. ...

  9. Java之StringBuffer,StringBuilder,Math,Date,SimpleDateFormat,UUID,File

    java.lang 类 StringBuffer java.lang.Object java.lang.StringBuffer 所有已实现的接口: Serializable, Appendable, ...

  10. ant在持续集成的应用

    一.Ant概述 Ant是一个Apache基金会下的跨平台的构建工具,它是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具. 在本文中,我主要让介绍Ant的命令.构建文件.最后部分以一个实 ...