国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

游戲萬能卡片—舒爾特方格游戲

數據庫 其他數據庫
通過開發(fā)這個小游戲元服務,學習到不少知識,其實我有嘗試過把數據庫操作類寫到動態(tài)共享包里,這樣元服務打包后不就更小了。

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區(qū)

https://ost.51cto.com

前言

舒爾特方格游戲,是注意力訓練方法之一,可以幫助孩子糾正上課分心走神、回家做作業(yè)拖拉毛病,但不能貪玩哦,玩多了,對眼睛,視力不好。

1. 消息通知欄,通知用戶當前最優(yōu)成績,也就是當前最快時間。2. 元服務卡片,在桌面上添加2x2或2x4或2x4規(guī)格元服務卡片,能看到不同布局隨機數字,根據左上角紅色字提示,快速完成點擊,用時最少為最優(yōu)成績,1x2規(guī)格元服務卡片,只顯示當前最優(yōu)成績,點擊可以3. 關系型數據庫,用于查詢,添加,更新,刪除元服務卡片信息和各卡片游戲用時成績數據。

B站高清演示視頻

游戲萬能卡片-舒爾特方格游戲-開源基礎軟件社區(qū)

知識點

  • 消息通知:提供通知管理的能力,包括發(fā)布、取消發(fā)布通知,創(chuàng)建、獲取、移除通知通道,訂閱、取消訂閱通知,獲取通知的使能狀態(tài)、角標使能狀態(tài),獲取通知的相關信息等。
  • 關系型數據庫:關系型數據庫基于SQLite組件提供了一套完整的對本地數據庫進行管理的機制,對外提供了一系列的增、刪、改、查等接口,也可以直接運行用戶輸入的SQL語句來滿足復雜的場景需要。
  • 元服務卡片開發(fā):卡片是一種界面展示形式,可以將應用的重要信息或操作前置到卡片,以達到服務直達、減少體驗層級的目的。
  • 卡片提供方:顯示卡片內容,控制卡片布局以及控件點擊事件。
  • 卡片使用方:顯示卡片內容的宿主應用,控制卡片在宿主中展示的位置。
  • 卡片管理服務:用于管理系統(tǒng)中所添加卡片的常駐代理服務,包括卡片對象的管理與使用,以及卡片周期性刷新等。
  • 軟件要求
  • DevEco Studio版本:DevEco Studio 3.1 Release及以上版本。
  • HarmonyOS SDK版本:API version 9及以上版本。
  • 硬件要求
  • 設備類型:華為手機3.1系統(tǒng)或運行在DevEco Studio上的遠程模擬器API9。
  • HarmonyOS系統(tǒng):3.1.0 Developer Release及以上版本。

卡片講解

 1. 1x2卡片主要顯示所有卡片最優(yōu)成績,也就是用時最少的,同時點擊卡片,跳轉到主界面,查看卡片游戲記錄。

游戲萬能卡片-舒爾特方格游戲-開源基礎軟件社區(qū)

2. 2x2卡片顯示的是3x3布局隨機生成1~9數字,正上方標題顯示挑戰(zhàn)成功或失敗提示,左上角紅色字提示下一個要點擊的數字按鈕,右上角顯示當次完成后用時和此卡片用時最少成績,當此次的用時少于最好用時,挑戰(zhàn)成功,并更新數據庫此卡片記錄,如果此次用時大于最好用時,提示挑戰(zhàn)失敗,不用更新數據庫。

游戲萬能卡片-舒爾特方格游戲-開源基礎軟件社區(qū)

3. 2x4卡片顯示的是7x2布局隨機生成1~14數字,顯示內容和游戲規(guī)則與2x2卡片一樣。

游戲萬能卡片-舒爾特方格游戲-開源基礎軟件社區(qū)

4. 4x4卡片顯示的是6x6布局隨機生成1~36數字,顯示內容和游戲規(guī)則與2x2卡片一樣。

游戲萬能卡片-舒爾特方格游戲-開源基礎軟件社區(qū)

5. 首次啟動或點擊1x2卡片進入到主界面,主界面顯示各卡片游戲成績記錄。

游戲萬能卡片-舒爾特方格游戲-開源基礎軟件社區(qū)

6. 通知顯示效果。

游戲萬能卡片-舒爾特方格游戲-開源基礎軟件社區(qū)

代碼講解

1. 數據庫操作后端項目結構圖。

游戲萬能卡片-舒爾特方格游戲-開源基礎軟件社區(qū)

FormData.ets實體類代碼如下:

export default class FormData {
  // 卡片ID
  formId: string;
  // 距陣數 3x3
  matrixNum: string;
  // 最優(yōu)成績
  bestScore: number;
  // 總最優(yōu)成績
  totalBestScore: number;
}

Form.ets數據庫卡片表如下:

export default class Form {
  // 卡片ID
  formId: string;
  // 卡片名稱
  formName: string;
  // 卡片描述
  dimension: number;
  /**
   * 封裝卡片數據
   * @returns
   */
  toValuesBucket() {
    return {
      'formId': this.formId,
      'formName': this.formName,
      'dimension': this.dimension
    };
  }
}

ScoreData.ets游戲記錄成績表如下:

export default class ScoreData {
  // 卡片
  formId: string;
  // 距陣數 3x3
  matrixNum: string;
  // 最優(yōu)成績
  bestScore: number;
  /**
   * 獲取插入成績記錄數
   * @returns
   */
  toValuesBucket() {
    return {
      'formId': this.formId,
      'matrixNum': this.matrixNum,
      'bestScore': this.bestScore
    };
  }
}

DatabaseUtils.ets數據庫操作類部分代碼如下:

export class DatabaseUtils {

  /**
   * 創(chuàng)建RDB數據庫
   *
   * @param{context}上下文
   * @return{globalThis.rdbStore}return rdbStore RDB數據庫
   */
  async createRdbStore(context: Context) {
    console.info(CommonConstants.DATABASE_TAG, 'xx DatabaseUtils-createRdbStore 開始...')
    // 如果全局變量rdbStore不存在,創(chuàng)建
    if (!globalThis.rdbStore) {
      console.info(CommonConstants.DATABASE_TAG, 'xx DatabaseUtils-createRdbStore 新創(chuàng)建!')

      await DataRdb.getRdbStore(context, CommonConstants.RDB_STORE_CONFIG)
        .then((rdbStore) => {
          console.info(CommonConstants.DATABASE_TAG, 'xx RDB Store回調')
          if (rdbStore) {
            // 創(chuàng)建卡片表
            rdbStore.executeSql(CommonConstants.CREATE_TABLE_FORM).catch((error) => {
              console.error(CommonConstants.DATABASE_TAG, 'xx DatabaseUtils 創(chuàng)建卡片表失敗:' + JSON.stringify(error))
              Logger.error(CommonConstants.DATABASE_TAG, 'executeSql Form error ' + JSON.stringify(error));
            });
            // 創(chuàng)建成績表
            rdbStore.executeSql(CommonConstants.CREATE_TABLE_SCORE_DATA).catch((error) => {
              console.error(CommonConstants.DATABASE_TAG, 'xx DatabaseUtils 創(chuàng)建成績表失敗:' + JSON.stringify(error))
              Logger.error(CommonConstants.DATABASE_TAG, 'executeSql Sensor error ' + JSON.stringify(error));
            });
            // 存儲RDBStore到全局變量
            globalThis.rdbStore = rdbStore;
            console.info(CommonConstants.DATABASE_TAG, 'xx DatabaseUtils-createRdbStore 創(chuàng)建成功!')
          }
        }).catch((error) => {
          console.error(CommonConstants.DATABASE_TAG, 'xx DatabaseUtils 創(chuàng)建RDB數據庫失敗:' + JSON.stringify(error))
          Logger.error(CommonConstants.DATABASE_TAG, 'createRdbStore error ' + JSON.stringify(error));
        });
    }else {
      console.info(CommonConstants.DATABASE_TAG, 'xx DatabaseUtils-createRdbStore 已經存在!')
    }

    console.info(CommonConstants.DATABASE_TAG, 'xx DatabaseUtils-createRdbStore 結束...')
    return globalThis.rdbStore;
  }

  /**
   * 插入卡片數據。
   *
   * @param{Form}Form表單實體。
   * @param{DataRdb.RdbStore}RDB存儲RDB數據庫。
   * @return返回操作信息。
   */
  insertForm(form: Form, rdbStore: DataRdb.RdbStore) {
    rdbStore.insert(CommonConstants.TABLE_FORM, form.toValuesBucket()).catch((error) => {
      Logger.error(CommonConstants.DATABASE_TAG, 'insertForm error ' + JSON.stringify(error));
    });
  }
  
    /**
   * 將成績插入數據庫。
   *
   * @param{ScoreData}scoreData。
   * @param{DataRdb.RdbStore}RDB存儲RDB數據庫。
   */
  insertValues(scoreData: ScoreData, rdbStore: DataRdb.RdbStore) {
    rdbStore.insert(CommonConstants.TABLE_SCORE, scoreData.toValuesBucket()).catch((error) => {
      Logger.error(CommonConstants.DATABASE_TAG, 'insertValues error ' + JSON.stringify(error));
    });
  }
  
    /**
   *  更新成績到數據庫
   * @param scoreData
   * @param rdbStore
   */
  updateValues(scoreData: ScoreData, rdbStore: DataRdb.RdbStore) {}
  
  /**
   * 刪除卡片數據。
   *
   * @param{string}formId表單ID。
   * @param{DataRdb.RdbStore}RDB存儲RDB數據庫。
   */
  deleteFormData(formId: string, rdbStore: DataRdb.RdbStore) {}
  
  /**
   * 更新卡片
   *
   * @param{DataRdb.RdbStore}RDB存儲RDB數據庫。
   */
  updateForms(rdbStore: DataRdb.RdbStore) {}
  
  /**
   * 發(fā)送通知
   *
   * @param{string}Steps顯示的值步數。
   */
  async sendNotifications(score: number) {}

}

2. 卡片前端項目結構圖。

游戲萬能卡片-舒爾特方格游戲-開源基礎軟件社區(qū)

EntryAbility.ets 程序入口初始化數據庫代碼如下:

onCreate(want, launchParam) {
    // 數據庫初始化
    globalThis.abilityWant = want;
    globalThis.abilityParam = launchParam;
    console.info(CommonConstants.ENTRY_ABILITY_TAG, 'xx onCreate 創(chuàng)建RDB數據庫')
    // 創(chuàng)建RDB數據庫
    DatabaseUtils.createRdbStore(this.context).then((rdbStore) => {
    	console.info(CommonConstants.ENTRY_ABILITY_TAG, 'xx onCreate RDB成功')
    }).catch((error) => {
    	console.error(CommonConstants.ENTRY_ABILITY_TAG, 'xx onCreate 創(chuàng)建數據庫失敗:' + JSON.stringify(error))
    	Logger.error(CommonConstants.ENTRY_ABILITY_TAG, 'onCreate rdb error ' + JSON.stringify(error));
    });
}

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

onAddForm(want) {
    // 獲取卡片ID:ohos.extra.param.key.form_identity
    let formId: string = want.parameters[CommonConstants.FORM_PARAM_IDENTITY_KEY] as string;
    // 獲取卡片名稱:ohos.extra.param.key.form_name
    let formName: string = want.parameters[CommonConstants.FORM_PARAM_NAME_KEY] as string;
    // 獲取卡片規(guī)格:ohos.extra.param.key.form_dimension
    let dimensionFlag: number = want.parameters[CommonConstants.FORM_PARAM_DIMENSION_KEY] as number;

    console.info(CommonConstants.ENTRY_FORM_ABILITY_TAG, `xx 添加卡片是:${formId} ${dimensionFlag} ${dimensionFlag}`)
    DatabaseUtils.createRdbStore(this.context).then((rdbStore) => {
      // 卡片信息
      let form: Form = new Form();
      form.formId = formId;
      form.formName = formName;
      form.dimension = dimensionFlag;
      console.info(CommonConstants.ENTRY_FORM_ABILITY_TAG, 'xx onAddForm 新增卡片信息:' + JSON.stringify(form))
      // 保存卡片信息到數據庫
      DatabaseUtils.insertForm(form, rdbStore);
      // 獲取最優(yōu)成績
      getBestScore(rdbStore, dimensionFlag, formId);
    }).catch((error) => {
      console.error(CommonConstants.ENTRY_FORM_ABILITY_TAG, 'xx onAddForm 添加卡片失敗:' + JSON.stringify(error))
      Logger.error(CommonConstants.ENTRY_FORM_ABILITY_TAG, 'onAddForm rdb error ' + JSON.stringify(error));
    });

    // 每五分鐘刷新一次
    formProvider.setFormNextRefreshTime(formId, CommonConstants.FORM_NEXT_REFRESH_TIME, (error, data) => {
      if (error) {
        console.error(CommonConstants.ENTRY_FORM_ABILITY_TAG, 'xx onAddForm 更新卡片失敗:' + JSON.stringify(error))
        Logger.error(CommonConstants.ENTRY_FORM_ABILITY_TAG, 'refreshTime, error:' + JSON.stringify(error));
      } else {
        console.info(CommonConstants.ENTRY_FORM_ABILITY_TAG, 'xx onAddForm 更新卡片成功')
        Logger.info(CommonConstants.ENTRY_FORM_ABILITY_TAG, 'refreshTime success ' + JSON.stringify(data));
      }
    });

    // 返回初始化卡片數據
    let formData: FormData = new FormData();
    formData.formId = formId;
    formData.bestScore = 0;
    formData.matrixNum = '1x1';
    formData.totalBestScore = 0;
    return formBindingData.createFormBindingData(formData);
  }

卡片頁面部分代碼,這里就顯示2x2卡片代碼如下:

build() {
    Column(){
      Text(this.message)
        .width('100%')
        .fontSize(12)
        .textAlign(TextAlign.Center)
        .fontWeight(700)
        .margin({top: 6, bottom: 6})
      Row(){
        Text(`下一個:${this.flagNum == 0 ? 1 : this.flagNum}`)
          .fontSize(10).fontWeight(400)
          .fontColor(Color.Red)
        Row(){
          Text(`此次:${this.currentScore}`)
            .fontSize(10).fontWeight(400)
          Text(`最好:${this.bestScore}`)
            .fontSize(10).fontWeight(400)
        }
      }
      .width('100%')
      .padding({left: 10, right: 10})
      .alignItems(VerticalAlign.Center)
      .justifyContent(FlexAlign.SpaceBetween)

      Flex({justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center, wrap: FlexWrap.Wrap}){
        // 循環(huán)顯示數字按鈕
        ForEach(this.numArray, (day: string) => {
          Button(day, { type: ButtonType.Circle, stateEffect: true })
            .width(40)
            .height(40)
            .padding(1)
            .margin(4)
            .fontSize(12)
            .backgroundColor(Color.Gray)
            .stateStyles({
              normal: this.normalStyles,
              pressed: this.pressedStyles
            })
            .onClick(() => { this.startGame(Number(day)) })
        }, day => day)
      }
      .width('100%')
      .height('100%')
      .padding({ top: 2, left: 5, right: 5 })
    }
    .width('100%')
    .height('100%')
  }

總結

通過開發(fā)這個小游戲元服務,學習到不少知識,其實我有嘗試過把數據庫操作類寫到動態(tài)共享包里,這樣元服務打包后不就更小了,然而啟動后白屏了,進步問題,等華為相關技術人員回復,想學習動態(tài)共享包的,可以參考關系型數據庫-動態(tài)共享包開發(fā), 總結這個項目用到以下知識點:

  1. 使用notification發(fā)布通知。
  2. 使用關系型數據庫插入、更新、刪除卡片數據。
  3. 使用FormExtensionAbility創(chuàng)建、更新、刪除元服務卡片。

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區(qū)

https://ost.51cto.com

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區(qū)
相關推薦

2021-12-27 15:10:55

鴻蒙HarmonyOS應用

2023-08-07 14:09:58

數據庫開發(fā)

2023-06-14 15:10:36

鴻蒙游戲開發(fā)

2022-07-06 20:40:27

舒爾特方格鴻蒙

2023-03-22 09:00:38

2016-11-24 12:07:42

Android萬能圓角ImageView

2020-06-16 08:32:00

人工智能技術機器學習

2022-11-21 09:57:18

網關系統(tǒng)

2022-06-23 18:10:15

多云

2009-02-27 13:48:00

Mdaemon郵件服務器

2012-01-10 11:36:17

Autodesk歐特克傳媒娛樂

2011-06-16 15:57:25

Android

2021-08-17 14:25:11

人臉識別人工智能身份識別

2022-06-27 08:36:08

PythonLambda

2014-02-17 10:56:21

Hadoop

2021-11-11 10:41:25

代碼開發(fā)工具

2022-11-30 13:13:41

節(jié)能減碳PUE
點贊
收藏

51CTO技術棧公眾號

视频一区中文字幕国产| 国产亚洲欧美日韩在线观看一区二区 | 欧美午夜欧美| 欧美电影在线观看网站| 亚洲一二三区视频在线观看| 又大又硬又爽免费视频| 亚洲午夜久久久久久尤物| 国内精品久久久久久久久| 超碰97免费在线| 一本大道久久a久久精二百| 免费黄色一级网站| 国产在线视频不卡二| 国产欧美在线一区二区| 日韩国产欧美一区二区| 91极品女神在线| 亚洲狼人在线| 国产小视频91| 天堂av中文在线观看| 欧美日韩中文国产| 欧美中文在线| 欧美性少妇18aaaa视频| 视频免费裸体网站| 久久综合久久鬼色中文字| 爱爱爱视频网站| 日韩影院精彩在线| 欧美精品一区三区在线观看| 91成人精品| 国产日韩中文字幕在线| av亚洲在线观看| 国产成人精品优优av| 亚洲婷婷丁香| 国产精品久久久久久亚洲影视 | 韩国v欧美v日本v亚洲| 日本精品另类| 精品偷拍一区二区三区在线看| 国产黄色在线观看| 欧美高清www午色夜在线视频| 美女毛片在线看| 欧美午夜精品一区二区蜜桃 | 超碰91人人草人人干| 麻豆网站免费在线观看| 欧美xxxx老人做受| 51漫画成人app入口| 精品亚洲男同gayvideo网站| 51精品视频| 国产亚洲成精品久久| 欧美大片高清| 久久亚洲综合国产精品99麻豆精品福利| 一区二区电影免费观看| 亚洲人免费视频| 欧美韩国日本| 九九热这里只有精品免费看| 日本免费一区二区视频| 欧美激情在线狂野欧美精品| 婷婷五月色综合香五月| 国产精品一区二区久久| 91超碰成人| 日韩精品久久久| 国产在线精品一区二区三区不卡| 国产亚洲精品久久久久久久| 97精品国产97久久久久久久久久久久| 国产麻花豆剧传媒精品mv在线| 国产欧美综合在线| 国产呻吟对白刺激无套视频在线| 岛国精品视频在线播放| 国产一二三区在线观看| 亚洲国产三级网| 9999精品视频| 国产91色在线|免| 亚洲视频一二| 亚洲一区二区在线免费观看| 9人人澡人人爽人人精品| 成人午夜剧场免费观看完整版| 亚洲国产日韩在线一区模特| 最新97超碰在线| 亚洲免费小视频| 啪啪国产精品| 99久久99久久精品国产片| 视频一区二区三区入口| 国产一区二区三区小说| 亚洲男人的天堂一区二区| 色大18成网站www在线观看| 影音先锋欧美精品| 久久99免费视频| 日韩高清在线播放| 中文一区在线播放| 黄色免费网站在线观看| 久久亚洲国产精品成人av秋霞| 欧美理论视频| 中文字幕中文字幕99| 亚洲精品水蜜桃| 免费在线观看av电影| 欧美多人乱p欧美4p久久| 狠狠爱综合网| 免费在线观看的毛片| 欧美色成人综合| 97青娱国产盛宴精品视频| 国产精选在线观看91| 91在线视频网址| av电影在线播放高清免费观看| 最近2019年好看中文字幕视频| 久久蜜桃av| 男人添女荫道口女人有什么感觉| 好吊成人免视频| 99久久999| 九9re精品视频在线观看re6 | 玖玖国产精品视频| 久久婷婷国产91天堂综合精品| 91久久精品一区二区三| 激情欧美一区二区三区黑长吊| 91热精品视频| 99久久综合精品| 午夜在线视频| 97在线免费观看| 国产精品综合一区二区三区| 日本一二三区在线视频| 欧美理论电影在线播放| 香蕉久久夜色精品国产| 国产日本视频| 在线视频欧美性高潮| 一区免费在线| 一本色道久久加勒比88综合| www.欧美三级电影.com| 日日夜夜免费精品| 亚洲精品视频区| 91成人国产在线观看| 成人免费福利片| 激情图片在线观看高清国产| 成人黄色网免费| 国产精品视频在线看| 成人国产精选| 正在播放一区二区三区| 欧美视频在线一区二区三区| 国产一区二区区别| 天天视频天天爽| 色天天综合狠狠色| 国内精品国产三级国产a久久| 在线激情免费视频| 国产原创欧美精品| 国产精品久久久久一区 | 日韩久久不卡| 日韩欧亚中文在线| 国产欧美日韩影院| av最新网址| 91国在线精品国内播放| 久久综合久久综合久久| 88xx成人网| 僵尸世界大战2 在线播放| 国产婷婷97碰碰久久人人蜜臀 | 91精品国产日韩91久久久久久| 精品日产免费二区日产免费二区| 欧美牲交a欧美牲交aⅴ免费真| 国产亚洲精品久久久久久777| 日本麻豆一区二区三区视频| 91在线中文| 欧美一进一出视频| 欧美一二三区在线观看| 国产日韩欧美三区| 免费看美女视频在线网站| 国产欧美一区二区视频| 欧美高清精品3d| 日韩高清一区在线| 日韩电影免费观看| 中文字幕中文字幕在线中心一区| 精品国产一区二区三区久久影院| 狂野欧美一区| 国产福利电影在线播放| 成人黄色片免费| 日韩有码在线播放| 国产日韩欧美麻豆| 你懂的一区二区三区| 中文字幕免费在线| 99九九电视剧免费观看| 欧美一级在线免费| 国产精品自拍一区| 色悠久久久久综合先锋影音下载| 猫咪成人官网| 91免费国产网站| 欧美日韩精品高清| 久久97超碰色| 国产一区二区久久久久| 日本不卡一区在线| 国产成人精品免费久久久久| 狠狠色狠狠色综合日日小说 | 2019中文字幕在线免费观看| 亚洲人123区| 激情久久久久久| h片在线观看下载| 白嫩少妇丰满一区二区| 国产精品69精品一区二区三区| 色噜噜狠狠色综合中国| 蜜臀久久99精品久久久画质超高清| 欧美二三四区| 99re在线视频播放| 国产欧美亚洲日本| 国产午夜精品一区理论片飘花 | 成人免费淫片95视频观看网站| 91精品久久久久| 日韩精品一区二区三区在线观看| 国产成人精品免费在线|