经过前两章的内容,背唐诗的功能基本可以使用了。然而,仅有一种模式未免显得过于单一。因此,在本章中对其进行扩展,增加几种不同的玩法,并且这几种玩法将采用完全不同的判断方式。
玩法一:三分钟限时挑战——在规定的时间内,比拼谁的得分更高。
在这种模式下,需要在 tick 方法中判断时间是否已经结束。
玩法二:五十题竞速挑战——限定为五十题,比较谁的正确率更高。
在这种模式下,需要在每回答完一题后,判断总共已经回答了多少题。
玩法三:零错误闯关挑战——只要出现错误就立即结束,看谁能坚持的时间最长。
在这种模式下,一旦回答错误,就立即结束游戏。
现在我们开始。
1、现在菜单中加入三种模式的选项。
[{"t": "三分钟限时挑战","i": "-","d": 0,"g": {},"s": [{"t": "语文","i": "menu/yuwen.png","d": 0,"g": {},"s": [{"t": "唐诗三百首","i": "-","d": 302,"g": {"w":1, "m":1},"s": []}]},]},{"t": "五十题竞速挑战","i": "-","d": 0,"g": {},"s": [{"t": "语文","i": "menu/yuwen.png","d": 0,"g": {},"s": [{"t": "唐诗三百首","i": "-","d": 302,"g": {"w":2, "m":1},"s": []}]},]},{"t": "零错误闯关挑战","i": "-","d": 0,"g": {},"s": [{"t": "语文","i": "menu/yuwen.png","d": 0,"g": {},"s": [{"t": "唐诗三百首","i": "-","d": 302,"g": {"w":3, "m":1},"s": []}]}]},{"t": "关于","i": "menu/test16.png","d": 102,"g": {},"s": []}
]
通过在g属性中添加w属性,把玩法传递进去。
2、在游戏初始化中,获取玩法。
YuWenTs.cpp
int YuWenTS::scean_init(cJSON* param){
。。。winMode= cJSON_GetObjectItem(param,"w")->valueint;。。。start();return 0;
}
menu.cpp
SceanResult Menu::tick(u32 ticks){
。。。if(KEY_SEL){ //进入cJSON* item = (cJSON*) ctlList->selectItem()->tag;int sceanId = cJSON_GetObjectItem(item,"d")->valueint;if(sceanId!= 0){IScean *scean =createScean(sceanId);if(scean !=NULL){scean->scean_init(cJSON_GetObjectItem(item,"g"));ListPushBack(sceanList, scean);}return SceanResult_Done;}cJSON* sitem = cJSON_GetObjectItem(item,"s");if(cJSON_GetArraySize(sitem) > 0){ListPushBack(menuList, sitem); showMenu();return SceanResult_Done;}return SceanResult_Done;}ctlList->tick(ticks);ran_max(10);return SceanResult_Done;
}
3、在需要进行结束判断的地方,加入判断。
YuWenTs.cpp
SceanResult YuWenTS::tick(u32 ticks){if(KEY_EXIT) {printf("goto top menu from About.\n");return SceanResult_EXIT;}if(isFinished){if(KEY_SEL) {start();return SceanResult_Done;}}else{totalTime+=ticks;showTime();if(checkFinish()){return SceanResult_Done;}。。。 ran_max(10);}return SceanResult_Done;
}void YuWenTS::showTSAnswer(){Display_String(answerX, answerY, &optionMiss, dataLine(answerIdx));for(int i=0;i<4;i++)if(currentQuestion->ans !=i)Display_Fill_Rectangle2(answerLocX, answerLocY[i]-2, SCREEN_WIDTH - answerLocX, 21 ,BLACK);
}void YuWenTS::correct(){correntCount++;showScore();if(checkFinish()==0){createTSQuestion();showTSQuetion();showTangshi();}
}void YuWenTS::wrong(){wrongCount++;showScore();showTSAnswer();errorDelay(3);if(checkFinish()==0){createTSQuestion();showTSQuetion();showTangshi(); }
}
4、实现checkFinish()
u8 checkFinish(){switch (winMode) {case 1:if(totalTime > 180000) {finish();return 1;}break;case 2:if(correntCount+ wrongCount == 50) {finish();return 1;}break;case 3:if(wrongCount>0) {finish();return 1;}break;}return 0;
}
在进行代码设计时,要做好代码复用的考量,扩展几个玩法实际上并不需要太多的代码。这里是第一次进行扩展0,所以重点在于菜单传参的运用。
W801学习笔记十七:古诗学习应用——上
W801学习笔记十八:古诗学习应用——中