疯狂猜歌实现(10)—— 实现提示、删除按键之事件处理以及金币逻辑

来源:互联网 发布:手机淘宝改好评怎么改 编辑:程序博客网 时间:2024/05/18 01:32

这一节我们将上一节添加的两个按钮:删除一个干扰文字按钮,提示一个正确答案按钮添加上逻辑,并同时处理两个按钮对应的金币逻辑。

首先我们来看删除一个干扰文字按钮需要实现的逻辑,当用户点击此按钮时应该完成的动作分为以下几个部分,

1. 待选框中随机找出一个不是正确答案的按钮,并设置他不可见

2. 减去消耗金币的数量

需求确定后,我们来看第一个逻辑实现的代码,

//当前金币数量    private int mCurrentCoins;    /**     * 处理删除干扰选项事件     */    private void handleDeleteWordEvent() {        ImageButton mButtonDelete = (ImageButton) findViewById(R.id.float_button_delete);        mButtonDelete.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                int needCoins = getDeleteOneWordCoins();                if (consumeCoins(needCoins)) {                    //删除一个文字,1. 金币数量减少,2. 对应的WordButton消失                    mTextCurrentCoins.setText(mCurrentCoins + "");                    setWordButtonInVisible();                } else {                    //TODO: 金币不够减,弹出对话框                }            }        });    }
可以看到此方法中,首先先初始化了删除错误答案的控件,在getDeleteOneWordCoins方法表示,获取删除一个错误所需要的金币数,代码如下,

private int getDeleteOneWordCoins(){        return getResources().getInteger(R.integer.delete_value);    }
方法consumeCoins表示消耗金币的操作,代码如下

 /**     * 减去金币     * @param coins 删除一个字需要金币     * @return     */    private boolean consumeCoins(int coins) {        mCurrentCoins = Integer.valueOf(mTextCurrentCoins.getText() + "");        //金币不够减        if(mCurrentCoins - coins < 0){            return false;        }else{           //金币够减            mCurrentCoins -= coins;            return true;        }    }
方法setWordButtonInvisable表示将待选框中选中的button设置为不可见,代码如下

/**     * 使一个WordButton消失     */    private void setWordButtonInVisible(){        //找出当前文字是否为答案,如果不是答案则将其WordButton隐藏,否则继续需要下一个        WordButton buf = getNoAnswerWordButton();        buf.mVisable = false;        buf.mButton.setVisibility(View.INVISIBLE);    }
这里又有一个getNoAnswerWordButton的方法,表示获取一个不是答案的WordButton

/**     * 获取一个非正确答案的WordButton     * @return     */    private WordButton getNoAnswerWordButton() {        WordButton deleteButton ;        char[] answer =  mCurrentSong.getSongName().toCharArray();        while(true){            for(int i=0;i<mWordButtons.size();i++){                Random random = new Random();                int index = random.nextInt(OPTIONS_WORDS_SIZE);                for(int j=0;j<answer.length;j++){                    //选中的文字依次与歌曲名称比较且当前文字可见                    if(!mCurrentSong.getSongName().contains(mWordButtons.get(index).mWordText)                            && mWordButtons.get(index).mVisable == true){                        deleteButton = mWordButtons.get(index);                        return deleteButton;                    }                }            }        }    }
实现的效果如下,我们可以看到右上角的金币数量在点击了去掉一个错误答案的按钮时,金币数量减少了(此处金币的初始值为2000),并且一个不是答案的随机文字消失。



在实现了删除错误答案的逻辑后,我们接着来实现提示一个正确答案的逻辑,首先来分析下需求,点击提示一个正确答案时需要,

1.  待选框答案文字按照顺序消失一个

2. 已选框中显示一个正确答案(按照当前已选框中的位置)
3. 金币数量减少

我们先来看看第一步的实现,

/**     * 处理提示一个答案事件     */    private void handleTipWordEvent(){        ImageButton mButtonTip = (ImageButton) findViewById(R.id.float_button_tip);        mButtonTip.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                int needCoins = getTipOneWordCoins();                mCurrentCoins = getCurrentCoins();                if(mCurrentCoins-needCoins>0){                    //已选框中是否被占满                    if(!checkSelectionWordsIsFull()){                        //待选框中,答案对应的按钮消失                        WordButton buf = findOneAnswerButton();                        if(buf == null){                            //后面的答案在前面的已选框中,清除已选框,重新提示一个答案                            Toast.makeText(MainActivity.this,"一个答案已被选中",Toast.LENGTH_LONG).show();                            return;                        }                        buf.mVisable = false;                        buf.mButton.setVisibility(View.INVISIBLE);                        //已选框中,答案对应按钮出现                        for(int i=0;i<SELECTED_WORDS_SIZE;i++){                            WordButton answerButton = mSelectButtons.get(i);                            if(answerButton.mVisable == false){                                answerButton.mWordText = buf.mWordText;                                answerButton.mVisable = true;                                answerButton.mIndex = buf.mIndex;                                answerButton.mButton.setText(buf.mWordText);                                answerButton.mButton.setTextColor(Color.WHITE);                                break;                            }                        }                        //减去金币                        consumeCoins(needCoins);                        mTextCurrentCoins.setText(mCurrentCoins + "");                    }                        //已选框被占满,检查答案                        handleTheAnswer();                }else{                    //TODO: 金币不够减,显示提示对话框                }            }        });    }
其中checkSelectionWordIsFull方法,用于检验当前选择框是否已经满了,满了则直接去检测当前选择框中的答案是否正确,否则填入一个正确答案

/**     * 检查已选框是否被占满     * @return     */    private boolean checkSelectionWordsIsFull() {        for(int i=0;i<mSelectButtons.size();i++){            if(mSelectButtons.get(i).mVisable == false){                return false;            }        }        return true;    }
另外一个方法是findOneWordButton,用于找出一个正确答案WordButton并返回,值得注意的是,这里的答案是按照歌曲名的先后进行返回的,比如“征服”,是按照“征”,“服”返回,而不是“”,“征”。

/**     * 从待选框里找出一个正确答案     * @return     */    private WordButton findOneAnswerButton() {        char[] answer = mCurrentSong.getSongName().toCharArray();        String answerWord = "";        for(int i=0;i<mSelectButtons.size();i++){            if(mSelectButtons.get(i).mWordText.length() == 0){                answerWord = String.valueOf(answer[i]);                break;            }        }        for(int j=0;j<OPTIONS_WORDS_SIZE;j++){            if(answerWord.equals(mWordButtons.get(j).mWordText) && mWordButtons.get(j).mVisable == true){                return mWordButtons.get(j);            }        }        return null;    }
实现后,点击提示一个正确答案,可以正确的显示在相应位置,并检测当前是否通关的情况。


源码下载



0 0
原创粉丝点击