Handler实现的打地鼠游戏

通过自定义的CountingHandler实现打地鼠小游戏,单击地鼠表示打中,并记录打中地鼠总数(地鼠一共出现10次);

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener,
        View.OnTouchListener {
    public static final int CODE = 10001;
    public static final int DELAY_TIME = 500;
    private TextView resultText;
    private Button beginBtn;
    private ImageView susliksImg;
    //地鼠位置的坐标
    public int[][] mPositions = new int[][]{
            {123,323},{434,234},
            {231,242},{264,111},
            {300,400},{329,111},
            {231,231},{452,427}
    };
    private int MAX_COUNT = 10;
    private int totalCount = 0;
    private int hitCount = 0;
    CountingHandler handler = new CountingHandler(this);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        resultText = (TextView) findViewById(R.id.result_txt);
        beginBtn = (Button) findViewById(R.id.star_button);
        susliksImg = (ImageView) findViewById(R.id.susliks_img);
        susliksImg.setOnTouchListener(this);
        beginBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        start();
    }
    /**
     * 发送message
     */
    private void start() {
        beginBtn.setText("进行中...");
        beginBtn.setEnabled(false);
        resultText.setText("游戏开始了!");
        next(0);
    }

    /**
     * delayTime为传入的延迟时间
     */
    private void next(int delayTime) {
        int i = new Random().nextInt(mPositions.length);
        Message message = Message.obtain();
        message.what = CODE;
        message.arg1 = i;
        handler.sendMessageDelayed(message, delayTime);
        totalCount ++;
    }

    //打中地鼠响应
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        hitCount ++;
        resultText.setText("您打中了" + hitCount + "只地鼠,一共10只!");
        susliksImg.setVisibility(View.GONE);
        return false;
    }

    public static class CountingHandler extends Handler{

        public final WeakReference<MainActivity> mWeakReference;

        public CountingHandler(MainActivity activity) {
            this.mWeakReference = new WeakReference<>(activity);
        }
        //处理消息,设置地鼠的位置等。
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //得到MainActivity弱引用
            MainActivity activity = mWeakReference.get();
            switch (msg.what){
                case CODE:
                    //判断是否打完地鼠
                    if(activity.totalCount > activity.MAX_COUNT){
                        activity.clear();
                        Toast.makeText(activity, "地鼠打完了!!", Toast.LENGTH_SHORT)
                                .show();
                        return ;
                    }
                    int i = msg.arg1;
                    activity.susliksImg.setX(activity.mPositions[i][0]);
                    activity.susliksImg.setY(activity.mPositions[i][1]);
                    activity.susliksImg.setVisibility(View.VISIBLE);
                    //随机的时间传入为地鼠出现的延迟时间 (0 + 500) =< randomTime < (500 + 500)
                    int randomTime = new Random().nextInt(DELAY_TIME) + DELAY_TIME;
                    activity.next(randomTime);
                }
            }


    }
    //清除数据
    private void clear() {
        totalCount = 0;
        beginBtn.setText(R.string.begin_game);
        beginBtn.setEnabled(true);
        hitCount = 0;
        susliksImg.setVisibility(View.GONE);
    }
}



通过handleMessage方法再次调用弱引用的MainAcitiviity的next方法send message就可以将地鼠出现及相应操作循环起来。同时静态类和弱引用也防止了内存的泄漏。

运行的结果如下图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现打地鼠游戏,需要先了解游戏的基本逻辑和功能,然后选择合适的开发工具和语言进行开发。在这里,我们选择使用Android Studio进行开发,使用Java语言实现。 首先,我们需要创建一个新的Android项目。在项目中,我们需要创建以下几个组件: 1. 地鼠:地鼠出现在屏幕上的随机位置,玩家需要点击地鼠才能得分。 2. 记分板:显示玩家的分数和时间。 3. 倒计时器:计时器用于控制游戏的时间,当时间到达时,游戏结束。 接下来,我们需要实现以下功能: 1. 地鼠的出现和消失:在屏幕上随机生成地鼠,并且在一定时间后消失。 2. 点击地鼠得分:当玩家点击地鼠时,分数增加。 3. 计时器的功能:当时间到达时,游戏结束。 实现以上功能后,我们就可以进行游戏测试,检查游戏是否符合预期。 代码实现: 1. 创建一个新的Android项目,并在布局文件中添加一个ImageView作为地鼠的显示区域。 2. 创建一个地鼠类,用于描述地鼠的属性和行为。 ``` java public class Mole { private int x; // 地鼠的横坐标 private int y; // 地鼠的纵坐标 private int score; // 玩家得分 private boolean isAlive; // 地鼠是否存活 public Mole(int x, int y) { this.x = x; this.y = y; this.score = 0; this.isAlive = false; } // 地鼠出现 public void appear() { this.x = (int) (Math.random() * 1000); this.y = (int) (Math.random() * 1000); this.isAlive = true; } // 地鼠消失 public void disappear() { this.isAlive = false; } // 点击地鼠 public void hit() { this.score++; this.isAlive = false; } // 获取地鼠的横坐标 public int getX() { return x; } // 获取地鼠的纵坐标 public int getY() { return y; } // 获取玩家得分 public int getScore() { return score; } // 判断地鼠是否存活 public boolean isAlive() { return isAlive; } } ``` 3. 在MainActivity中添加以下代码,实现地鼠的出现和消失。 ``` java public class MainActivity extends AppCompatActivity { private ImageView imageView; private Mole mole; private Handler handler; private Runnable runnable; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = findViewById(R.id.imageView); mole = new Mole(0, 0); handler = new Handler(); runnable = new Runnable() { @Override public void run() { if (mole.isAlive()) { mole.disappear(); updateUI(); } else { mole.appear(); updateUI(); handler.postDelayed(runnable, 1000); // 1秒后地鼠消失 } } }; handler.post(runnable); } // 更新UI界面 private void updateUI() { if (mole.isAlive()) { imageView.setImageResource(R.drawable.mole); imageView.setX(mole.getX()); imageView.setY(mole.getY()); } else { imageView.setImageResource(0); } } } ``` 4. 添加点击事件,实现点击地鼠得分的功能。 ``` java public class MainActivity extends AppCompatActivity { private ImageView imageView; private Mole mole; private Handler handler; private Runnable runnable; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = findViewById(R.id.imageView); mole = new Mole(0, 0); imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mole.isAlive()) { mole.hit(); updateUI(); } } }); handler = new Handler(); runnable = new Runnable() { @Override public void run() { if (mole.isAlive()) { mole.disappear(); updateUI(); } else { mole.appear(); updateUI(); handler.postDelayed(runnable, 1000); // 1秒后地鼠消失 } } }; handler.post(runnable); } // 更新UI界面 private void updateUI() { if (mole.isAlive()) { imageView.setImageResource(R.drawable.mole); imageView.setX(mole.getX()); imageView.setY(mole.getY()); } else { imageView.setImageResource(0); } } } ``` 5. 添加计时器,实现游戏的时间控制。 ``` java public class MainActivity extends AppCompatActivity { private ImageView imageView; private TextView scoreTextView; private TextView timeTextView; private Mole mole; private int time; private Handler handler; private Runnable runnable; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = findViewById(R.id.imageView); scoreTextView = findViewById(R.id.scoreTextView); timeTextView = findViewById(R.id.timeTextView); mole = new Mole(0, 0); time = 30; // 游戏时间为30秒 imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mole.isAlive()) { mole.hit(); updateUI(); } } }); handler = new Handler(); runnable = new Runnable() { @Override public void run() { if (time > 0) { time--; timeTextView.setText("时间:" + time + "秒"); if (mole.isAlive()) { mole.disappear(); updateUI(); } else { mole.appear(); updateUI(); handler.postDelayed(runnable, 1000); // 1秒后地鼠消失 } handler.postDelayed(this, 1000); // 1秒后重新执行 } else { gameOver(); } } }; handler.post(runnable); } // 更新UI界面 private void updateUI() { scoreTextView.setText("得分:" + mole.getScore()); if (mole.isAlive()) { imageView.setImageResource(R.drawable.mole); imageView.setX(mole.getX()); imageView.setY(mole.getY()); } else { imageView.setImageResource(0); } } // 游戏结束 private void gameOver() { handler.removeCallbacks(runnable); // 停止计时器 Toast.makeText(this, "游戏结束!得分:" + mole.getScore(), Toast.LENGTH_SHORT).show(); } } ``` 到此,我们就完成了用Android Studio实现打地鼠游戏的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值