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

2024-05-08 03:36

本文主要是介绍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;}
}

这篇关于W801学习笔记二十一:英语背单词学习应用——上的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/969196

相关文章

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi