带你开发个转盘抽奖小游戏【附源码】

程序IT圈

只提供有用的编程技术,关注即可习得新技能

 

1效果图

小时候有没有玩过老虎机抽奖游戏?今天一起来用代码编程实现个简单抽奖的小游戏!首先,先带大家看看实现的效果图是怎么样的:

2分析如何实现

看了上面的效果图,头脑里有没有立刻想到用什么知识点来自己做一个呢?如果有想到,说明你非常不错,可以对知识点举一反三了!

如果没有任何想法,可以继续看本文详细分析。

1、为什么会看到旋转的效果?

这个其实简单,就是对一张图片,外围包裹一层边框,然后让其先隐藏掉,这样每次轮转到这张图片的时候,就让外边框显示出来,其他的图片隐藏。

代码如下:

//定义一个方法,用来显示指定位置的图片框背景
    //不管怎么变化,最终一定会调用该方法,并传入position参数,这个参数就是中奖结果
    public void showBg(int position) {
        //如果遍历到的ImageView的位置正好是position,就显示选中的背景图片,
        //其他都不显示背景
        valuse = position;
        for (int i = 0; i < imgs.length; i++) {
            if (i == position) {
                imgs[i].setBackgroundResource(R.drawable.img_bg);
            } else {
                //其他的,背景都去掉
                imgs[i].setBackgroundResource(0);
            }
        }
    }

2、怎么让其旋转起来,实现游戏效果?

这个如果你可以想到Android中的Handler,想必要实现这个效果,那不是so easy的一件事。

具体代码如下:

Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 100: {
                    //表示显示下一个图片的背景
                    //取出当前显示背景图片的位置
                    int current = msg.arg1;
                    //++
                    current++;
                    //再创建一个Message,设置其arg1
                    Message msgNew = Message.obtain();
                    //标识
                    msgNew.what = 100;
                    //参数
                    msgNew.arg1 = current;
                    //延时发送
                    handler.sendMessageDelayed(msgNew, current * 10);
                    //切换显示图片背景
                    showBg(current % imgs.length);
                }
                break;
                case 200: {
                    //收到停止的消息
                    //移除msg.what=100的所有消息
                    handler.removeMessages(100);
                    //读取最终结果
                    Toast.makeText(MainActivity.this, "恭喜你,中了:" + valuse, Toast.LENGTH_LONG).show();
                }
                break;
            }
        }
    };

3、如何让每次转到的位置都不一样?

这个就需要我们用一个随机数,来控制Handle的消息的随机发送时间长短。具体的代码如下:

public void start(View view) {
        //查看消息队列
        if (handler.hasMessages(100)) {
            //表示消息队列中含有该消息,也就是说已经启动过
            Toast.makeText(this, "游戏已经启动,请稍候~~~~", Toast.LENGTH_LONG).show();
            return;
        }
        //让Handler玩起来
        Message msg = handler.obtainMessage();
        msg.what = 100;
        msg.arg1 = 0;
        msg.sendToTarget();
        //生成一个随机数:5~10秒之间
        Random rd = new Random();
        int time = rd.nextInt(5) + 5;
        //延时发送停止消失
        Message msg_stop = Message.obtain();
        msg_stop.what = 200;
        handler.sendMessageDelayed(msg_stop, time * 1000);

    }

想明白了以上三点,实现这个小游戏,应该不成问题了!

3本文源码

1. public class MainActivity extends AppCompatActivity {
  2. //八个ImageView数组
  3. ImageView[] imgs = new ImageView[8];
  4. //id数组
  5. int[] ids = {
  6. R.id.iv1, R.id.iv2, R.id.iv3, R.id.iv4, R.id.iv5, R.id.iv6, R.id.iv7, R.id.iv8, };
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. //初始化ImageView
  20. initImgs();
  21. }
  22. /**
  23. * 找到所有的图片控件
  24. */
  25. private void initImgs() {
  26. for (int i = 0; i < imgs.length; i++) {
  27. imgs[i] = (ImageView) findViewById(ids[i]);
  28. }
  29. }
  30. //记录最终中奖位置
  31. int values = 0;
  32. //定义一个方法,用来显示指定位置的图片框背景
  33. public void showBg(int position) {
  34. //如果遍历到的ImageView的位置正好是position,就显示选中的背景图片,
  35. //其他都不显示背景
  36. values = position;
  37. for (int i = 0; i < imgs.length; i++) {
  38. if (i == position) {
  39. imgs[i].setBackgroundResource(R.drawable.img_bg);
  40. } else {
  41. //其他的,背景都去掉
  42. imgs[i].setBackgroundResource(0);
  43. }
  44. }
  45. }
  46. Handler handler = new Handler() {
  47. @Override
  48. public void handleMessage(Message msg) {
  49. super.handleMessage(msg);
  50. switch (msg.what) {
  51. case 100: {
  52. //表示显示下一个图片的背景
  53. //取出当前显示背景图片的位置
  54. int current = msg.arg1;
  55. //++
  56. current++;
  57. //再创建一个Message,设置其arg1
  58. Message msgNew = Message.obtain();
  59. //标识
  60. msgNew.what = 100;
  61. //参数
  62. msgNew.arg1 = current;
  63. //延时发送
  64. handler.sendMessageDelayed(msgNew, current * 10);
  65. //切换显示图片背景
  66. showBg(current % imgs.length);
  67. }
  68. break;
  69. case 200: {
  70. //收到停止的消息
  71. //移除msg.what=100的所有消息
  72. handler.removeMessages(100);
  73. //读取最终结果
  74. Toast.makeText(MainActivity.this, "恭喜你中奖了" + values, Toast.LENGTH_SHORT).show();
  75. }
  76. break;
  77. }
  78. }
  79. };
  80. //点击开始,动起来
  81. //重复点击,多次启动
  82. /*
  83. * 1.点击时,判断消息队列是否有what=100的消息时,如果有,说明已经启动
  84. *
  85. * 2.点击后,设置按钮不可用,当handler收到消息,重新设置可点击
  86. *
  87. * */
  88. public void start(View view) {
  89. if (handler.hasMessages(100)) {
  90. //表示该队列含有该消息,说明已经启动
  91. Toast.makeText(MainActivity.this, "游戏已经启动", Toast.LENGTH_SHORT).show();
  92. return;
  93. }
  94. //让Handler玩起来
  95. Message msg = Message.obtain();
  96. msg.what = 100;
  97. msg.arg1 = 0;
  98. handler.sendMessage(msg);
  99. //生成一个随机数:5~10秒之间
  100. Random rd = new Random();
  101. int time = rd.nextInt(5) + 5;
  102. //延时发送停止消失
  103. Message msg_stop = Message.obtain();
  104. msg_stop.what = 200;
  105. handler.sendMessageDelayed(msg_stop, time * 1000);
  106. }
  107. }

最后,提前祝大家元旦快乐!


推荐阅读:

关注【程序IT圈】,让我们一起成长

合适分享 | 值得留言

©文章声明:如未特殊声明,就是原创,转载需要联系

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小猿666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值