【Android学习】使用RxJava完成益智翻牌游戏

没接触RxJava之前,初学Android之时,用原生控件ImageView写了个翻牌的小游戏。


但是有bug就是如果迅速点击相同的牌两下后将会计入错误中。


当时还不太了解怎么防止控件多次点击,当时的解决方案是第二次点击时对比一下上次点击控件的ID,如果一致则不计数。


现在有了RxJava,可以更简洁的实现这个功能。


看效果图:





防止多次代码:(两秒内只能点击该控件一次)

RxView.clicks(PictureBoxs[i])
        .throttleFirst(2, TimeUnit.SECONDS)
        .subscribeOn(AndroidSchedulers.mainThread())
        .subscribe(new Action1<Void>() {
            @Override
            public void call(Void avoid) {DoSomething();});


后台计时:


Observable.interval(1, TimeUnit.SECONDS)
        .compose(this.<Long>bindToLifecycle())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeOn(Schedulers.newThread())
        .subscribe(new Action1<Long>() {
                       @Override
                       public void call(Long aLong) {
                           tvShow.setText("" + Integer.toString(alltime++));};



游戏逻辑很简单。


随机出6各不同的数字,赋值给数组num[0]-----num[5],

然后让num[0]---num[5]顺序打乱后的值赋给num[6]---num[11]。

这样 0---11 中就有6对相同的,且顺序是乱的。

然后呢。控件ImageView[12]  它们背后隐藏的值就是数组num中的值。

每2次点击后看看点击的控件对应的num[x]值是否相等。

相等就隐藏控件,不等就再把牌统一显示成背面并且错误次数+1.

很简单对吧~~~

控件消除的粒子效果是在Github上的,忘记地址了,很抱歉,但十分感谢作者。


关于随机数如何不同有很多方法,由于数组不大,可以直接两个for循环,也可以递归实现


static int GetNumber(int[] a, int index, int minValue, int maxValue, int temp, Random r)
{
    for (int i = 0; i < index; i++)
    {
        if (a[i] == temp)
        {
            int newTemp = r.nextInt(maxValue)+minValue;
            a[index] = newTemp;
            return GetNumber(a, index, minValue, maxValue, newTemp, r);
        }
    }
    return temp;
}






github地址:https://github.com/VongVia1209/MemoryCard

你可能感兴趣的:(rxjava)