赞
踩
经过前两章的内容,背唐诗的功能基本可以使用了。然而,仅有一种模式未免显得过于单一。因此,在本章中对其进行扩展,增加几种不同的玩法,并且这几种玩法将采用完全不同的判断方式。
玩法一:三分钟限时挑战——在规定的时间内,比拼谁的得分更高。
在这种模式下,需要在 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学习笔记十八:古诗学习应用——中
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。