W801学习笔记十八:古诗学习应用——中

现在我们加入交互逻辑------对用户选择的判断。

1、定义游戏的相关变量,如记录正确和错误的数量,运行时间等等。这些都可以作为游戏应用的私有属性。

cpp 复制代码
		u8 isFinished=0;
		u16 correntCount =0;
		u16 wrongCount = 0;
		u32 totalTime=0;

2、处理交互。

根据前边定义过的框架,主线程会不断执行页面的tick方法,并且传递两次执行的间隔。

于是,我们来定义各个按键的逻辑:

i。退出按钮,最先进行判断。按下时退出。

ii。选择按钮,只有当游戏已经结束时有效,按下时重新开始游戏。

iii。ABCD按钮,判断是否选择正确。

iv。up/down 诗词可能很长,通过上下按钮进行滚动。

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;
			}
		
		if(KEY_A | KEY_B | KEY_C | KEY_D){
			if(KEY_A && currentQuestion->ans == 0){
				correct();
				return SceanResult_Done;
			}
			if(KEY_B && currentQuestion->ans == 1){
				correct();
				return SceanResult_Done;
			}
			if(KEY_C && currentQuestion->ans == 2){
				correct();
				return SceanResult_Done;
			}
			if(KEY_D && currentQuestion->ans == 3){
				correct();
				return SceanResult_Done;
			}
			wrong();
		}

		if(KEY_UP && boxHeight> TangshiBoxHeight){
			int oy = offsetY;
			if(offsetY<0 ){
				offsetY +=TangshiBoxLineHeight;
			}else{
				offsetY =0;
			}
			if(oy !=offsetY )
			showTangshi();
		}
		
		if(KEY_DOWN && boxHeight> TangshiBoxHeight){
			int oy = offsetY;
			if(offsetY > TangshiBoxHeight - boxHeight)	{
				offsetY -=TangshiBoxLineHeight;
			}else{
				offsetY = TangshiBoxHeight - boxHeight;
			}
			if(oy !=offsetY )
			showTangshi();
			
		}
		
		ran_max(10);
	}
	return SceanResult_Done;
}

3、对游戏结束的判断。我们设定3分钟结束游戏。

cpp 复制代码
u8 checkFinish(){
		if(totalTime > 180000) {
			finish();
			return 1;
		}

	return 0;
}

4、回答正确时,计数器++,进入下一题。

cpp 复制代码
void YuWenTS::correct(){
	correntCount++;
	showScore();

		createTSQuestion();
		showTSQuetion();
		showTangshi();

}

5、回答错误时,计数器++,显示正确答案,延时,然后进入下一题

cpp 复制代码
void YuWenTS::wrong(){
	wrongCount++;
	showScore();
	showTSAnswer();
	errorDelay(3);

		createTSQuestion();
		showTSQuetion();
		showTangshi();	

}
cpp 复制代码
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);	
}

6、显示得分。

这里,我们设定答对一题得60分,答错扣20分。这样,如果随便乱选,最终趋于0分。

cpp 复制代码
void finish(){
	isFinished = 1;
	show_status_info(controlInfo);
	optionDeCount.backColor = DBLUE;
	Display_String(Prepare_LOC, &optionDeCount, "   挑 战 结 束   ");
}


void showScore()
{
	int score = correntCount* 60 - wrongCount * 20;
	if(score<0 ) score =0;
	Display_String2(10, 5, &optionScore, "得分: %06d ", score);
	Display_String2(150, 5, &optionCorrentCount, "正确: %04d ", correntCount);
	Display_String2(270, 5, &optionWrongCount, "错误: %04d ", wrongCount);
}

void showTime()
{
	if(lastTotalTime == totalTime/1000){
		return;
	}
	lastTotalTime = totalTime/1000;
		
	if(winMode == 2)
		Display_String2(400, 5, &optionTime, "%02d:%02d", ((180000- totalTime) / 1000) / 60, ((180000- totalTime) / 1000) % 60);
	else
		Display_String2(400, 5, &optionTime, "%02d:%02d", (totalTime / 1000) / 60, (totalTime / 1000) % 60);	
}

现在来看看效果:

W801学习笔记十八:古诗学习应用------中

W801学习笔记十七:古诗学习应用------上

相关推荐
我不是程序猿儿10 分钟前
【嵌入式】面向 STM32 的 ADC 与 DMA 学习路线
linux·stm32·单片机·嵌入式硬件·学习
一支闲人20 分钟前
研究STM32库函数 如何操作寄存器
stm32·单片机
爱编码的小八嘎30 分钟前
C语言完美演绎7-15
c语言
孬甭_36 分钟前
揭开指针的面纱(下)
c语言
计算机安禾37 分钟前
【数据结构与算法】第43篇:Trie树(前缀树/字典树)
c语言·开发语言·矩阵·排序算法·深度优先·图论·宽度优先
yashuk43 分钟前
C语言入门教程:程序结构与算法举例
c语言·算法·教程·程序设计·开发过程
代码地平线1 小时前
C语言实现堆与堆排序详解:从零手写到TopK算法及时间复杂度证明
c语言·开发语言·算法
天狼IoT1 小时前
STM32-keil+CubeMX快速开发:GPIO功能
stm32·单片机·嵌入式硬件
芯岭技术1 小时前
PY32C673单片机特性,应用场景介绍,最高主频可达 72 MHz
单片机·嵌入式硬件
ytttr8731 小时前
STM32 独立看门狗(IWDG)程序设计与实现
stm32·单片机·嵌入式硬件