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学习笔记十七:古诗学习应用------上

相关推荐
徽京人1 小时前
VS Code 接入Esp 32步骤
vscode·单片机·嵌入式硬件
kkkkkkkkkk_Z2 小时前
学嵌入式和C语言编程数据结构|学习日记Day21:内核链表与队列学习
c语言·数据结构·学习
不正经学生2 小时前
C语言结构体:自定义数据类型,让变量打包出行
java·c语言·开发语言·数据结构·算法
老一岁2 小时前
c问题总结(1)
c语言·开发语言
QH139292318802 小时前
Keysight N5183B N5183B 微波模拟信号发生器
网络·单片机·嵌入式硬件·集成测试·信息与通信
一木 之林2 小时前
三、内存管理、指针与堆栈
c语言·jvm·c++
笨笨饿3 小时前
#110_SCH3000 平台图传系统配置指南:从 DVP 摄像头到 UVC/WiFi 双通道传输
c语言·stm32·单片机·嵌入式硬件·物联网·vim
caimouse3 小时前
ReactOS 窗口系统分析(20):光标与图标 — cursoricon.c
c语言·开发语言
H_oRIZoN_4 小时前
Linux入门DAY23(C语言树形结构)
linux·c语言·数据结构
caimouse4 小时前
ReactOS 窗口系统分析(22):鼠标 — mouse.c
c语言·开发语言·reactos