当前位置:   article > 正文

【鸿蒙万能卡片-Codelabs挑战赛】舒尔特方格游戏万能卡片_舒尔特方格游戏python代码

舒尔特方格游戏python代码

前言

     舒尔特方格游戏,是注意力训练方法之一,可以帮助孩子纠正上课分心走神、回家做作业拖拉毛病,但不能贪玩哦,玩多了,对眼睛,视力不好。

  1. 消息通知栏,通知用户当前最优成绩,也就是当前最快时间。
  2. 元服务卡片,在桌面上添加2x2或2x4或2x4规格元服务卡片,能看到不同布局随机数字,根据左上角红色字提示,快速完成点击,用时最少为最优成绩,1x2规格元服务卡片,只显示当前最优成绩,点击可以查看2x2或2x4或2x4规格元服务卡片最快用时游戏记录。
  3. 关系型数据库,用于查询,添加,更新,删除元服务卡片信息和各卡片游戏用时成绩数据。

    B站高清演示视频

知识点

  • 消息通知:提供通知管理的能力,包括发布、取消发布通知,创建、获取、移除通知通道,订阅、取消订阅通知,获取通知的使能状态、角标使能状态,获取通知的相关信息等。
  • 关系型数据库:关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。
  • 元服务卡片开发:卡片是一种界面展示形式,可以将应用的重要信息或操作前置到卡片,以达到服务直达、减少体验层级的目的。
    • 卡片提供方:显示卡片内容,控制卡片布局以及控件点击事件。
    • 卡片使用方:显示卡片内容的宿主应用,控制卡片在宿主中展示的位置。
    • 卡片管理服务:用于管理系统中所添加卡片的常驻代理服务,包括卡片对象的管理与使用,以及卡片周期性刷新等。
  • 软件要求
  • 硬件要求
    • 设备类型:华为手机3.1系统或运行在DevEco Studio上的远程模拟器API9。
    • HarmonyOS系统:3.1.0 Developer Release及以上版本。

卡片讲解

1. 1x2卡片主要显示所有卡片最优成绩,也就是用时最少的,同时点击卡片,跳转到主界面,查看卡片游戏记录。

2. 2x2卡片显示的是3x3布局随机生成1~9数字,正上方标题显示挑战成功或失败提示,左上角红色字提示下一个要点击的数字按钮,右上角显示当次完成后用时和此卡片用时最少成绩,当此次的用时少于最好用时,挑战成功,并更新数据库此卡片记录,如果此次用时大于最好用时,提示挑战失败,不用更新数据库。

3. 2x4卡片显示的是7x2布局随机生成1~14数字,显示内容和游戏规则与2x2卡片一样。

4. 4x4卡片显示的是6x6布局随机生成1~36数字,显示内容和游戏规则与2x2卡片一样。

5. 首次启动或点击1x2卡片进入到主界面,主界面显示各卡片游戏成绩记录。

6. 通知显示效果

代码讲解

1. 数据库操作后端项目结构图

FormData.ets实体类代码如下:

  1. export default class FormData {
  2. // 卡片ID
  3. formId: string;
  4. // 距阵数 3x3
  5. matrixNum: string;
  6. // 最优成绩
  7. bestScore: number;
  8. // 总最优成绩
  9. totalBestScore: number;
  10. }
复制

Form.ets数据库卡片表如下:

  1. export default class Form {
  2. // 卡片ID
  3. formId: string;
  4. // 卡片名称
  5. formName: string;
  6. // 卡片描述
  7. dimension: number;
  8. /**
  9. * 封装卡片数据
  10. * @returns
  11. */
  12. toValuesBucket() {
  13. return {
  14. 'formId': this.formId,
  15. 'formName': this.formName,
  16. 'dimension': this.dimension
  17. };
  18. }
  19. }
复制

ScoreData.ets游戏记录成绩表如下:

  1. export default class ScoreData {
  2. // 卡片
  3. formId: string;
  4. // 距阵数 3x3
  5. matrixNum: string;
  6. // 最优成绩
  7. bestScore: number;
  8. /**
  9. * 获取插入成绩记录数
  10. * @returns
  11. */
  12. toValuesBucket() {
  13. return {
  14. 'formId': this.formId,
  15. 'matrixNum': this.matrixNum,
  16. 'bestScore': this.bestScore
  17. };
  18. }
  19. }
复制

DatabaseUtils.ets数据库操作类部分代码如下:

  1. export class DatabaseUtils {
  2. /**
  3. * 创建RDB数据库
  4. *
  5. * @param{context}上下文
  6. * @return{globalThis.rdbStore}return rdbStore RDB数据库
  7. */
  8. async createRdbStore(context: Context) {
  9. console.info(CommonConstants.DATABASE_TAG, 'xx DatabaseUtils-createRdbStore 开始...')
  10. // 如果全局变量rdbStore不存在,创建
  11. if (!globalThis.rdbStore) {
  12. console.info(CommonConstants.DATABASE_TAG, 'xx DatabaseUtils-createRdbStore 新创建!')
  13. await DataRdb.getRdbStore(context, CommonConstants.RDB_STORE_CONFIG).then((rdbStore) => {
  14. console.info(CommonConstants.DATABASE_TAG, 'xx RDB Store回调')
  15. if (rdbStore) {
  16. // 创建卡片表
  17. rdbStore.executeSql(CommonConstants.CREATE_TABLE_FORM).catch((error) => {
  18. console.error(CommonConstants.DATABASE_TAG, 'xx 创建卡片表失败:' + JSON.stringify(error))
  19. Logger.error(CommonConstants.DATABASE_TAG, 'executeSql Form error ' + JSON.stringify(error));
  20. });
  21. // 创建成绩表
  22. rdbStore.executeSql(CommonConstants.CREATE_TABLE_SCORE_DATA).catch((error) => {
  23. console.error(CommonConstants.DATABASE_TAG, 'xx DatabaseUtils 创建成绩表失败:' + JSON.stringify(error))
  24. Logger.error(CommonConstants.DATABASE_TAG, 'executeSql Sensor error ' + JSON.stringify(error));
  25. });
  26. // 存储RDBStore到全局变量
  27. globalThis.rdbStore = rdbStore;
  28. console.info(CommonConstants.DATABASE_TAG, 'xx DatabaseUtils-createRdbStore 创建成功!')
  29. }
  30. }).catch((error) => {
  31. console.error(CommonConstants.DATABASE_TAG, 'xx DatabaseUtils 创建RDB数据库失败:' + JSON.stringify(error))
  32. Logger.error(CommonConstants.DATABASE_TAG, 'createRdbStore error ' + JSON.stringify(error));
  33. });
  34. }else {
  35. console.info(CommonConstants.DATABASE_TAG, 'xx DatabaseUtils-createRdbStore 已经存在!')
  36. }
  37. console.info(CommonConstants.DATABASE_TAG, 'xx DatabaseUtils-createRdbStore 结束...')
  38. return globalThis.rdbStore;
  39. }
  40. /**
  41. * 插入卡片数据。
  42. *
  43. * @param{Form}Form表单实体。
  44. * @param{DataRdb.RdbStore}RDB存储RDB数据库。
  45. * @return返回操作信息。
  46. */
  47. insertForm(form: Form, rdbStore: DataRdb.RdbStore) {
  48. rdbStore.insert(CommonConstants.TABLE_FORM, form.toValuesBucket()).catch((error) => {
  49. Logger.error(CommonConstants.DATABASE_TAG, 'insertForm error ' + JSON.stringify(error));
  50. });
  51. }
  52. /**
  53. * 将成绩插入数据库。
  54. *
  55. * @param{ScoreData}scoreData。
  56. * @param{DataRdb.RdbStore}RDB存储RDB数据库。
  57. */
  58. insertValues(scoreData: ScoreData, rdbStore: DataRdb.RdbStore) {
  59. rdbStore.insert(CommonConstants.TABLE_SCORE, scoreData.toValuesBucket()).catch((error) => {
  60. Logger.error(CommonConstants.DATABASE_TAG, 'insertValues error ' + JSON.stringify(error));
  61. });
  62. }
  63. /**
  64. * 更新成绩到数据库
  65. * @param scoreData
  66. * @param rdbStore
  67. */
  68. updateValues(scoreData: ScoreData, rdbStore: DataRdb.RdbStore) {}
  69. /**
  70. * 删除卡片数据。
  71. *
  72. * @param{string}formId表单ID。
  73. * @param{DataRdb.RdbStore}RDB存储RDB数据库。
  74. */
  75. deleteFormData(formId: string, rdbStore: DataRdb.RdbStore) {}
  76. /**
  77. * 更新卡片
  78. *
  79. * @param{DataRdb.RdbStore}RDB存储RDB数据库。
  80. */
  81. updateForms(rdbStore: DataRdb.RdbStore) {}
  82. /**
  83. * 发送通知
  84. *
  85. * @param{string}Steps显示的值步数。
  86. */
  87. async sendNotifications(score: number) {}
  88. }
复制

2. 卡片前端项目结构图

EntryAbility.ets 程序入口初始化数据库代码如下:

  1. onCreate(want, launchParam) {
  2. // 数据库初始化
  3. globalThis.abilityWant = want;
  4. globalThis.abilityParam = launchParam;
  5. console.info(CommonConstants.ENTRY_ABILITY_TAG, 'xx onCreate 创建RDB数据库')
  6. // 创建RDB数据库
  7. DatabaseUtils.createRdbStore(this.context).then((rdbStore) => {
  8. console.info(CommonConstants.ENTRY_ABILITY_TAG, 'xx onCreate RDB成功')
  9. }).catch((error) => {
  10. console.error(CommonConstants.ENTRY_ABILITY_TAG, 'xx onCreate 创建数据库失败:' + JSON.stringify(error))
  11. Logger.error(CommonConstants.ENTRY_ABILITY_TAG, 'onCreate rdb error ' + JSON.stringify(error));
  12. });
  13. }
复制

EntryFormAbility.ets卡片生命周期代码如下:

  1. onAddForm(want) {
  2. // 获取卡片ID:ohos.extra.param.key.form_identity
  3. let formId: string = want.parameters[CommonConstants.FORM_PARAM_IDENTITY_KEY] as string;
  4. // 获取卡片名称:ohos.extra.param.key.form_name
  5. let formName: string = want.parameters[CommonConstants.FORM_PARAM_NAME_KEY] as string;
  6. // 获取卡片规格:ohos.extra.param.key.form_dimension
  7. let dimensionFlag: number = want.parameters[CommonConstants.FORM_PARAM_DIMENSION_KEY] as number;
  8. console.info(CommonConstants.ENTRY_FORM_ABILITY_TAG, `xx 添加卡片是:${formId} ${dimensionFlag} ${dimensionFlag}`)
  9. DatabaseUtils.createRdbStore(this.context).then((rdbStore) => {
  10. // 卡片信息
  11. let form: Form = new Form();
  12. form.formId = formId;
  13. form.formName = formName;
  14. form.dimension = dimensionFlag;
  15. console.info(CommonConstants.ENTRY_FORM_ABILITY_TAG, 'xx onAddForm 新增卡片信息:' + JSON.stringify(form))
  16. // 保存卡片信息到数据库
  17. DatabaseUtils.insertForm(form, rdbStore);
  18. // 获取最优成绩
  19. getBestScore(rdbStore, dimensionFlag, formId);
  20. }).catch((error) => {
  21. console.error(CommonConstants.ENTRY_FORM_ABILITY_TAG, 'xx onAddForm 添加卡片失败:' + JSON.stringify(error))
  22. Logger.error(CommonConstants.ENTRY_FORM_ABILITY_TAG, 'onAddForm rdb error ' + JSON.stringify(error));
  23. });
  24. // 每五分钟刷新一次
  25. formProvider.setFormNextRefreshTime(formId, CommonConstants.FORM_NEXT_REFRESH_TIME, (error, data) => {
  26. if (error) {
  27. console.error(CommonConstants.ENTRY_FORM_ABILITY_TAG, 'xx onAddForm 更新卡片失败:' + JSON.stringify(error))
  28. Logger.error(CommonConstants.ENTRY_FORM_ABILITY_TAG, 'refreshTime, error:' + JSON.stringify(error));
  29. } else {
  30. console.info(CommonConstants.ENTRY_FORM_ABILITY_TAG, 'xx onAddForm 更新卡片成功')
  31. Logger.info(CommonConstants.ENTRY_FORM_ABILITY_TAG, 'refreshTime success ' + JSON.stringify(data));
  32. }
  33. });
  34. // 返回初始化卡片数据
  35. let formData: FormData = new FormData();
  36. formData.formId = formId;
  37. formData.bestScore = 0;
  38. formData.matrixNum = '1x1';
  39. formData.totalBestScore = 0;
  40. return formBindingData.createFormBindingData(formData);
  41. }
复制

卡片页面部分代码,这里就显示2x2卡片代码如下:

  1. build() {
  2. Column(){
  3. Text(this.message)
  4. .width('100%').fontSize(12).textAlign(TextAlign.Center)
  5. .fontWeight(700).margin({top: 6, bottom: 6})
  6. Row(){
  7. Text(`下一个:${this.flagNum == 0 ? 1 : this.flagNum}`)
  8. .fontSize(10).fontWeight(400).fontColor(Color.Red)
  9. Row(){
  10. Text(`此次:${this.currentScore}`).fontSize(10).fontWeight(400)
  11. Text(`最好:${this.bestScore}`).fontSize(10).fontWeight(400)
  12. }
  13. }
  14. .width('100%').padding({left: 10, right: 10})
  15. .alignItems(VerticalAlign.Center)
  16. .justifyContent(FlexAlign.SpaceBetween)
  17. Flex({justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center, wrap: FlexWrap.Wrap}){
  18. // 循环显示数字按钮
  19. ForEach(this.numArray, (day: string) => {
  20. Button(day, { type: ButtonType.Circle, stateEffect: true })
  21. .width(40).height(40).padding(1).margin(4)
  22. .fontSize(12)
  23. .backgroundColor(Color.Gray)
  24. .stateStyles({
  25. normal: this.normalStyles,
  26. pressed: this.pressedStyles
  27. })
  28. .onClick(() => { this.startGame(Number(day)) })
  29. }, day => day)
  30. }
  31. .width('100%').height('100%')
  32. .padding({ top: 2, left: 5, right: 5 })
  33. }
  34. .width('100%').height('100%')
  35. }
复制

总结

       通过开发这个小游戏元服务,学习到不少知识,其实我有尝试过把数据库操作类写到动态共享包里,这样元服务打包后不就更小了,然而启动后白屏了,进步问题,等华为相关技术人员回复,想学习动态共享包的,可以参考关系型数据库-动态共享包开发, 总结这个项目用到以下知识点:

  1. 使用notification发布通知。
  2. 使用关系型数据库插入、更新、删除卡片数据。
  3. 使用FormExtensionAbility创建、更新、删除元服务卡片。

 

进入华为专区,解锁更多内容 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/282199
推荐阅读
相关标签
  

闽ICP备14008679号