W801学习笔记二十一:英语背单词学习应用——上

英语背单词是比较常见的学习APP,参考唐诗宋词应用,本章做一个类似的应用。

一、单词数据清洗及格式转换

        诗词数据的获取渠道很多,一般可以按照年级来分文件。如一到九年级,四六级,雅思等等。

       1、先从网上某某地方下载单词数据。包含英文,中文,音标。

       2、相对唐诗数据,这回我们做复杂一点。包含一个文件头:

文件描述用ENGDC表示 

3、同样方法,也可以整理短语数据。

短语不需要音标,且英文部分比较长,所以直接把英语部分扩为32字节

 

 文件描述用ENGCZ表示

 

4、这样,可以通过宏定位数据位置了

#define dataDC(idx) ((const char*)DataBuff+((idx) * 128) + 64)
#define dataZY(idx) ((const char*)DataBuff+((idx) * 128) + 96)
#define dataCN(idx) ((const char*)DataBuff+((idx) * 128) + 128)

二、增加菜单项

[
	{
		"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": 302,
						"g": {"w":1, "m":2},
						"s": []
					}
				]
			},
			{
				"t": "英语",
				"i": "menu/eng.png",
				"d": 0,
				"g": {},
				"s": [
					{
						"t": "根据拼写猜词意",
						"i": "-",
						"d": 301,
						"g": {"w":1, "m":1, "f":"project/english8danci.txt"},
						"s": []
					},
					{
						"t": "根据词义猜拼写",
						"i": "-",
						"d": 301,
						"g": {"w":1, "m":2, "f":"project/english8danci.txt"},
						"s": []
					},
					{
						"t": "猜拼写完全正确",
						"i": "-",
						"d": 301,
						"g": {"w":1, "m":3, "f":"project/english8danci.txt"},
						"s": []
					},
					{
						"t": "猜短语意思",
						"i": "-",
						"d": 301,
						"g": {"w":1, "m":4, "f":"project/english8cizu.txt"},
						"s": []
					},
					{
						"t": "猜短语拼写",
						"i": "-",
						"d": 301,
						"g": {"w":1, "m":5, "f":"project/english8cizu.txt"},
						"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": 302,
						"g": {"w":2, "m":2},
						"s": []
					}
				]
			},
			{
				"t": "英语",
				"i": "menu/eng.png",
				"d": 0,
				"g": {},
				"s": [
					{
						"t": "根据拼写猜词意",
						"i": "-",
						"d": 301,
						"g": {"w":2, "m":1, "f":"project/english8danci.txt"},
						"s": []
					},
					{
						"t": "根据词义猜拼写",
						"i": "-",
						"d": 301,
						"g": {"w":2, "m":2, "f":"project/english8danci.txt"},
						"s": []
					},
					{
						"t": "猜拼写完全正确",
						"i": "-",
						"d": 301,
						"g": {"w":2, "m":3, "f":"project/english8danci.txt"},
						"s": []
					},
					{
						"t": "猜短语意思",
						"i": "-",
						"d": 301,
						"g": {"w":2, "m":4, "f":"project/english8cizu.txt"},
						"s": []
					},
					{
						"t": "猜短语拼写",
						"i": "-",
						"d": 301,
						"g": {"w":2, "m":5, "f":"project/english8cizu.txt"},
						"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": "-",
						"d": 302,
						"g": {"w":3, "m":2},
						"s": []
					}
				]
			},
			{
				"t": "英语",
				"i": "menu/eng.png",
				"d": 0,
				"g": {},
				"s": [
					{
						"t": "根据拼写猜词意",
						"i": "-",
						"d": 301,
						"g": {"w":3, "m":1, "f":"project/english8danci.txt"},
						"s": []
					},
					{
						"t": "根据词义猜拼写",
						"i": "-",
						"d": 301,
						"g": {"w":3, "m":2, "f":"project/english8danci.txt"},
						"s": []
					},
					{
						"t": "猜拼写完全正确",
						"i": "-",
						"d": 301,
						"g": {"w":3, "m":3, "f":"project/english8danci.txt"},
						"s": []
					},
					{
						"t": "猜短语意思",
						"i": "-",
						"d": 301,
						"g": {"w":3, "m":4, "f":"project/english8cizu.txt"},
						"s": []
					},
					{
						"t": "猜短语拼写",
						"i": "-",
						"d": 301,
						"g": {"w":3, "m":5, "f":"project/english8cizu.txt"},
						"s": []
					}
				]
			}
		]
	},
	{
		"t": "关于",
		"i": "menu/test16.png",
		"d": 102,
		"g": {},
		"s": []
	}
]

直接在g属性下面添加一个f属性,表示对应的数据文件。

这里没有分年级,如果分的话,需要再添加一级菜单。

三、生成问题选项

通过菜单,可以看到计划做5种答题模式

        1、根据拼写猜词意

        2、根据词义猜拼写

        3、猜拼写完全正确

        4、猜短语意思

        5、猜短语拼写

其中第3种模式比较特殊。方法为:

        i。挑出两个字母,如 a b

        ii。四个选项分别为 ab Ab aB AB

上代码:

void YingYu::createQuestion()
{

	currentQuestion->question = ran_max(YingYuCount);
	currentQuestion->ans = ran_max(4);
	
	for(u8 i=0;i<4;i++){
		if(i == currentQuestion->ans){
			currentQuestion->answer[i] = currentQuestion->question;
		}else{
			currentQuestion->answer[i] = ran_max(YingYuCount);
		}
	}
	if(gameMode == 3){
		createQuestionMode3();
	}

}

void YingYu::createQuestionMode3()
{
	uint8_t i,e1,e2;
	char ne1,ne2;
	u8 len = strlen(dataDC(currentQuestion->question));
	for(i=0; i<4; i++) {
		memset(errEngWord[i], 0, 40);
		memcpy(errEngWord[i],  dataDC(currentQuestion->question), len);
	}
	e1 = ran_max(len);
	while(errEngWord[0][e1] < 97 || errEngWord[0][e1] > 122) {
		e1 = ran_max(len);
	}
	e2 = e1;
	while(e2 == e1 || errEngWord[0][e2] < 97 || errEngWord[0][e2] > 122) {
		e2 = ran_max(len);
	}
	ne1 = errEngWord[0][e1] - ran_max(25) -1;
	if(ne1 < 97) {
		ne1 =ne1 + 26;
	}
	ne2 = errEngWord[0][e2] - ran_max(25) -1;
	if(ne2 < 97) {
		ne2 =ne2 + 26;
	}

	errEngWord[(currentQuestion->ans + 1) % 4][e1] = ne1;
	errEngWord[(currentQuestion->ans + 2) % 4][e1] = ne1;
	errEngWord[(currentQuestion->ans + 2) % 4][e2] = ne2;
	errEngWord[(currentQuestion->ans + 3) % 4][e2] = ne2;

}

四、显示问题选项

几种模式的显示内容是不一样的。需要分别处理

void YingYu::showQuetion()
{
	u8 i;
	for(i=0;i<4;i++)
		Display_Fill_Rectangle2(Eng_Answer_LOC_X, Eng_Answer_LOC_Y[i]-2, 440, 21 ,answerBGColor[i]);
		
		Display_Fill_Rectangle2(0,100, 480, 80, BLACK);
	
	printf("q=%d, a=%d, a1=%d, a2=%d, a3=%d, a4=%d\n",currentQuestion->question,currentQuestion->ans,currentQuestion->answer[0]
,currentQuestion->answer[1]
,currentQuestion->answer[2]
,currentQuestion->answer[3] );
	
	switch (gameMode) {
		case 1:
			Display_String(Eng_Quetion_LOC_A, &optionQuetion, dataDC(currentQuestion->question));
			Display_String2(Eng_Quetion_LOC_B, &optionZY, "[%s]", dataZY(currentQuestion->question));
			for(i=0;i<4;i++)
				Display_String2(Eng_Answer_LOC_X, Eng_Answer_LOC_Y[i], &optionAnswer[i], (const char *)answerTitle[i], dataCN(currentQuestion->answer[i]));
			break;
		case 2:
			Display_String(Eng_Quetion_LOC_A, &optionQuetion, dataCN(currentQuestion->question));
			Display_String2(Eng_Quetion_LOC_B, &optionZY, "[%s]", dataZY(currentQuestion->question));
			for(i=0;i<4;i++)
				Display_String2(Eng_Answer_LOC_X, Eng_Answer_LOC_Y[i], &optionAnswer[i], (const char *)answerTitle[i], dataDC(currentQuestion->answer[i]));
			break;
		case 3:
			Display_String(Eng_Quetion_LOC_A, &optionQuetion, dataCN(currentQuestion->question));
			Display_String2(Eng_Quetion_LOC_B, &optionZY, "[%s]", dataZY(currentQuestion->question));
			for(i=0;i<4;i++)
				Display_String2(Eng_Answer_LOC_X, Eng_Answer_LOC_Y[i], &optionAnswer[i], (const char *)answerTitle[i], errEngWord[i]);
			break;
		case 4:
			Display_String(Eng_Quetion_LOC_A, &optionQuetion, dataDC(currentQuestion->question));
			for(i=0;i<4;i++)
				Display_String2(Eng_Answer_LOC_X, Eng_Answer_LOC_Y[i], &optionAnswer[i], (const char *)answerTitle[i], dataCN(currentQuestion->answer[i]));
			break;
		case 5:
			Display_String(Eng_Quetion_LOC_A, &optionQuetion, dataCN(currentQuestion->question));
			for(i=0;i<4;i++)
				Display_String2(Eng_Answer_LOC_X, Eng_Answer_LOC_Y[i], &optionAnswer[i], (const char *)answerTitle[i], dataDC(currentQuestion->answer[i]));
			break;
		
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/600021.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

硬件设计细节1-缓冲驱动器使用注意事项

目录 一、缓冲驱动器二、实例分析1.硬件结构2.问题描述3.原因分析4.原因定位 三、结论 一、缓冲驱动器 缓冲驱动器通常用于隔离、电平转换等应用场景。在使用时&#xff0c;需要关注的点较多&#xff0c;如电平范围、频率范围、延时、控制方式、方向以及输入输出状态。通常&am…

JavaScript异步编程——03-Ajax传输json和XML

Ajax 传输 JSON JSON 的语法 JSON(JavaScript Object Notation)&#xff1a;是 ECMAScript 的子集。作用是进行数据的交换。语法更为简洁&#xff0c;网络传输、机器解析都更为迅速。 语法规则&#xff1a; 数据在键值对中 数据由逗号分隔 花括号保存对象 方括号保存数组…

弹性云服务器是什么,为何如此受欢迎

云计算作为当下炙手可热的技术领域&#xff0c;已然成为现代企业不可或缺的核心能力。云服务器作为云计算的基石之一&#xff0c;在这个数字化时代发挥着至关重要的作用。而弹性云服务器&#xff0c;作为云服务器的一种演进形式&#xff0c;更是备受瞩目。 弹性云服务器&#…

使用 GPT-4-turbo+Streamlit+wiki+calculator构建Math Agents应用【Step by Step】

&#x1f496; Brief&#xff1a;大家好&#xff0c;我是Zeeland。Tags: 大模型创业、LangChain Top Contributor、算法工程师、Promptulate founder、Python开发者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 个人说明书&#xff1a;Zeeland&…

自动化运维管理工具 Ansible-----【inventory 主机清单和playbook剧本】

目录 一、inventory 主机清单 1.1inventory 中的变量 1.1.1主机变量 1.1.2组变量 1.1.3组嵌套 二、Ansible 的脚本 ------ playbook&#xff08;剧本&#xff09; 2.1 playbook介绍 2.2playbook格式 2.3playbooks 的组成 2.4playbook编写 2.5运行playbook 2.5.1ans…

学习笔记:【QC】Android Q qmi扩展nvReadItem/nvWriteItem

一、qmi初始化 流程图 初始化流程: 1、主入口&#xff1a; vendor/qcom/proprietary/qcril-hal/qcrild/qcrild/rild.c int main(int argc, char **argv) { const RIL_RadioFunctions *(*rilInit)(const struct RIL_Env *, int, char **); rilInit RIL_Init; funcs rilInit…

【Linux】Linux线程

一、Linux线程的概念 1.什么是线程 1.一个进程的一个执行线路叫做线程&#xff0c;线程的一个进程内部的控制序列。 2.一个进程至少有一个执行线程 3.线程在进程内部&#xff0c;本质是在进程地址空间内运行 4.操作系统将进程虚拟地址空间的资源分配给每个执行流&#xff0…

基于51单片机的闭环反馈直流电机PWM控制电机转速测量( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机的闭环反馈直流电机PWM控制转速测量( proteus仿真程序设计报告原理图讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0086 1. 主要功能&#xff1a; 基于51单片机的闭环…

js宏任务微任务输出解析

第一种情况 setTimeout(function () {console.log(setTimeout 1) //11 宏任务new Promise(function (resolve) {console.log(promise 1) //12 同步函数resolve()}).then(function () {console.log(promise then) //13 微任务})})async function async1() {console.log(async1 s…

语音识别--使用YAMNet识别环境音

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

2024.5.7

//头文件#ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include <QPushButton> #include <QLineEdit> #include <QLabel> #include <QTextToSpeech> #include <QString> #include <QtDebug> #include <QIcon> #i…

js浏览器请求,post请求中的参数形式和form-data提交数据时数据格式问题(2024-05-06)

浏览器几种常见的post请求方式 Content-Type 属性规定在发送到服务器之前应该如何对表单数据进行编码。 默认表单数据会编码为 "application/x-www-form-urlencoded" post请求的参数一般放在Body里。 Content-Type&#xff08;内容类型&#xff09;&#xff0c;一般…

截图工具Snipaste:不仅仅是截图,更是效率的提升

在数字时代&#xff0c;截图工具已成为我们日常工作和生活中不可或缺的一部分。无论是用于工作汇报、学习笔记&#xff0c;还是日常沟通&#xff0c;一款好用的截图工具都能大大提升我们的效率。今天&#xff0c;我要向大家推荐一款功能强大且易于使用的截图软件——Snipaste。…

CRC校验原理及步骤

文章目录 CRC定义&#xff1a;CRC校验原理&#xff1a;CRC校验步骤&#xff1a; CRC定义&#xff1a; CRC即循环冗余校验码&#xff0c;是数据通信领域中最常用的一种查错校验码&#xff0c;其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查&#xff08;CRC&#…

JUC-synchronized练习-交替打印ABC

今天来练习一下synchronized 简单来利用synchronized实现一个字符串的交替打印 主要的实现设置一个全局的变量state&#xff0c;线程执行通过不断累加state&#xff0c;根据state对三取余的结果来判断该线程是否继续执行还是进入等待。并通过synchronized锁住一个共享变量loc…

设计模式之模板模式TemplatePattern(五)

一、模板模式介绍 模板方法模式&#xff08;Template Method Pattern&#xff09;&#xff0c;又叫模板模式&#xff08;Template Pattern&#xff09;&#xff0c; 在一个抽象类公开定义了执行它的方法的模板。它的子类可以更需要重写方法实现&#xff0c;但可以成为典型类中…

学习R语言第五天

文章目录 语法学习创建数据的方式绘制图形的方式图形添加颜色如何操作数据的方式数据进行验算的判断加付值的方式修改变量名称的方式判断是否存在缺失值在计算的方式忽略缺失值通过函数的方式忽略缺失值日期处理的方式字符串转化成日期的方式格式化数据框中数据返回当前的日期的…

保研面试408复习 1——操作系统、计网、计组

文章目录 1、操作系统一、操作系统的特点和功能二、中断和系统调用的区别 2、计算机组成原理一、冯诺依曼的三个要点二、MIPS&#xff08;每秒百万条指令&#xff09;三、CPU执行时间和CPI 3、计算机网络一、各个层常用协议二、网络协议实验——数据链路层a.网络速率表示b.数据…

《十八》QThread多线程组件

本章将重点介绍如何运用QThread组件实现多线程功能。 多线程技术在程序开发中尤为常用&#xff0c;Qt框架中提供了QThread库来实现多线程功能。当你需要使用QThread时&#xff0c;需包含QThread模块&#xff0c;以下是QThread类的一些主要成员函数和槽函数。 成员函数/槽函数 …

Linux内核之获取文件系统超级块:sget用法实例(六十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…