精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

原子化服務(wù)卡片還原經(jīng)典小游戲—數(shù)字華容道

開發(fā) 前端
服務(wù)卡片也能玩游戲了,今天就來還原經(jīng)典小游戲——數(shù)字華容道。詳細講述了數(shù)字華容道在服務(wù)卡片上的開發(fā)思路,內(nèi)含詳細注釋。趕緊動手來開發(fā)一張服務(wù)卡片,休閑時刻來一局!

[[419330]]

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

前言

服務(wù)卡片也能玩游戲了,今天就來還原經(jīng)典小游戲——數(shù)字華容道。詳細講述了數(shù)字華容道在服務(wù)卡片上的開發(fā)思路,內(nèi)含詳細注釋。趕緊動手來開發(fā)一張服務(wù)卡片,休閑時刻來一局!

概述

老規(guī)矩,先上效果圖。

分別調(diào)出兩種類型的服務(wù)卡片,效果如下:

【木棉花】原子化服務(wù)卡片還原經(jīng)典小游戲——數(shù)字華容道-鴻蒙HarmonyOS技術(shù)社區(qū)

點擊開始按鈕,游戲頁面服務(wù)卡片的文本會隨機打亂,開始進行計時。點擊上下左右四個按鈕,文本會向?qū)?yīng)的方向移動一格。

【木棉花】原子化服務(wù)卡片還原經(jīng)典小游戲——數(shù)字華容道-鴻蒙HarmonyOS技術(shù)社區(qū)

當(dāng)游戲結(jié)束時或者游戲頁面服務(wù)卡片被刪除時,控制頁面服務(wù)卡片會停止計時。

【木棉花】原子化服務(wù)卡片還原經(jīng)典小游戲——數(shù)字華容道-鴻蒙HarmonyOS技術(shù)社區(qū)

正文

一、創(chuàng)建一個空白的工程

1. 安裝和配置DevEco Studio 2.1 Release

DevEco Studio 2.1 Release下載DevEco Studio 2.1 Release安裝

2. 創(chuàng)建一個Empty JS Phone應(yīng)用

DevEco Studio下載安裝成功后,打開DevEco Studio,點擊左上角的File,點擊New,再選擇New Project,選擇Empty Ability(JS)選項,點擊Next按鈕。

【木棉花】原子化服務(wù)卡片還原經(jīng)典小游戲——數(shù)字華容道-鴻蒙HarmonyOS技術(shù)社區(qū)

將文件命名為MyCardGame(文件名不能出現(xiàn)中文或者特殊字符,否則將無法成功創(chuàng)建項目文件),選擇保存路徑,選擇API5,設(shè)備勾選Phone,最后點擊Finish按鈕。

【木棉花】原子化服務(wù)卡片還原經(jīng)典小游戲——數(shù)字華容道-鴻蒙HarmonyOS技術(shù)社區(qū)

3. 創(chuàng)建兩個空白的服務(wù)卡片

在MyCarGame->entry->src->main->js中點擊右鍵,在彈出的菜單項中選擇New,再在彈出的子菜單項中選擇Service Widget。

【木棉花】原子化服務(wù)卡片還原經(jīng)典小游戲——數(shù)字華容道-鴻蒙HarmonyOS技術(shù)社區(qū)

選擇Image With Information。

【木棉花】原子化服務(wù)卡片還原經(jīng)典小游戲——數(shù)字華容道-鴻蒙HarmonyOS技術(shù)社區(qū)

1)在配置列表中,Service Widget Name中命名為ControlPage,Description中命名為This is a control widget,Type選擇JS,JS Component Name中命名為ControlPage,Support Dimensions勾選2 * 4。

2)再重復(fù)上述操作創(chuàng)建第二個新的服務(wù)卡片,在配置列表中,Service Widget Name中命名為GamePage,Description中命名為This is a game widget,Type選擇JS,JS Component Name中命名為GamePage,Support Dimensions勾選2 * 4。

【木棉花】原子化服務(wù)卡片還原經(jīng)典小游戲——數(shù)字華容道-鴻蒙HarmonyOS技術(shù)社區(qū)
【木棉花】原子化服務(wù)卡片還原經(jīng)典小游戲——數(shù)字華容道-鴻蒙HarmonyOS技術(shù)社區(qū)

4. 設(shè)置首卡片尺寸

在MyCarGame->entry->src->main->config.json中,將服務(wù)卡片ControlPage中defaultDimension的屬性值修改為2 * 4,將服務(wù)卡片GamePage中defaultDimension的屬性值修改為2 * 4。

  1. "forms": [ 
  2.           { 
  3.             "jsComponentName""ControlPage"
  4.             "isDefault"true
  5.             "scheduledUpdateTime""10:30"
  6.             "defaultDimension""2*4"
  7.             ...... 
  8.           }, 
  9.           { 
  10.             "jsComponentName""GamePage"
  11.             "isDefault"false
  12.             "scheduledUpdateTime""10:30"
  13.             "defaultDimension""2*4"
  14.             ...... 
  15.           } 
  16.         ] 

二、完善兩個服務(wù)卡片頁面布局

1. 完善控制服務(wù)卡片頁面布局

在MyCarGame->entry->src->main->js->ControlPage->pages->index->index.hml中將原有的容器代碼全部刪除。

添加一個基礎(chǔ)容器div,增加類選擇器為class。添加一個基礎(chǔ)容器div,類選擇器為class_text,內(nèi)部添加兩個text組件,類選擇器均為text,第一個text組件的文本為“時間:”,第二個text組件的文本為{{time}},即動態(tài)綁定變量time,以顯示游戲的時間。

最后依次添加五個按鈕,按鈕上的文本分別為“上”、“左”、“右”、“開始”和“下”,類選擇器分別為btn_up、btn_left、btn_right、btn_start和btn_down,分別添加一個點擊事件click_up、click_left、click_right、start和click_down。其中“左”和“右”兩個按鈕置于類選擇器為class_button的基礎(chǔ)容器div中,“開始”和“下”兩個按鈕置于類選擇器為class_button的基礎(chǔ)容器div中。

  1. <div class="class"
  2.     <div class="class_text"
  3.         <text class="text">時間:</text> 
  4.         <text class="text">{{time}}</text> 
  5.     </div> 
  6.     <button class="btn_up" onclick="click_up">上</button> 
  7.     <div class="class_button"
  8.         <button class="btn_left" onclick="click_left">左</button> 
  9.         <button class="btn_right" onclick="click_right">右</button> 
  10.     </div> 
  11.     <div class="class_button"
  12.         <button class="btn_start" onclick="btn_start">開始</button> 
  13.         <button class="btn_down" onclick="click_down">下</button> 
  14.     </div> 
  15. </div> 

在MyCarGame->entry->src->main->js->ControlPage->pages->index->index.css中將原有的類選擇器全部刪除。

各個類選擇器配置如下:

  1. .class{ 
  2.     width: 100%; 
  3.     height: 100%; 
  4.     flex-direction: column
  5.     align-items: flex-start; 
  6.     background-color: antiquewhite; 
  7.  
  8. .class_text{ 
  9.     flex-direction: row; 
  10.  
  11. .text{ 
  12.     font-size: 30px; 
  13.     margin-top:3%; 
  14.     text-align: center; 
  15.  
  16. .btn_up{ 
  17.     width: 20%; 
  18.     height: 20%; 
  19.     margin-top: 3%; 
  20.     margin-left: 40%; 
  21.     align-items: center; 
  22.  
  23. .class_button{ 
  24.     flex-direction: row; 
  25.  
  26. .btn_left{ 
  27.     width: 20%; 
  28.     height: 20%; 
  29.     margin-top: 3%; 
  30.     margin-left: 20%; 
  31.     align-items: center; 
  32.  
  33. .btn_right{ 
  34.     width: 20%; 
  35.     height: 20%; 
  36.     margin-top: 3%; 
  37.     margin-left: 20%; 
  38.     align-items: center; 
  39.  
  40. .btn_start{ 
  41.     width: 20%; 
  42.     height: 20%; 
  43.     margin-top: 3%; 
  44.     margin-left: 10%; 
  45.     align-items: center; 
  46.  
  47. .btn_down{ 
  48.     width: 20%; 
  49.     height: 20%; 
  50.     margin-top: 3%; 
  51.     margin-left: 10%; 
  52.     align-items: center; 

在MyCarGame->entry->src->main->js->ControlPage->pages->index->index.json中將data原有的數(shù)據(jù)全部刪除,在data中將time初始化為“00:00:00”。

添加actions數(shù)組,actions數(shù)組是所有事件的集合,數(shù)組的每個屬性包括每個事件的名稱,名稱里面又含有事件的類型“action”和攜帶的參數(shù)“params”。現(xiàn)在為上述五個點擊事件分別配置屬性:

  1.   "data": { 
  2.     "time""00:00:00" 
  3.   }, 
  4.   "actions": { 
  5.     "click_up": { 
  6.       "action""message"
  7.       "params": { 
  8.         "message""click_up" 
  9.       } 
  10.     }, 
  11.     "click_left": { 
  12.       "action""message"
  13.       "params": { 
  14.         "message""click_left" 
  15.       } 
  16.     }, 
  17.     "click_right": { 
  18.       "action""message"
  19.       "params": { 
  20.         "message""click_right" 
  21.       } 
  22.     }, 
  23.     "click_down": { 
  24.       "action""message"
  25.       "params": { 
  26.         "message""click_down" 
  27.       } 
  28.     }, 
  29.     "click_start": { 
  30.       "action""message"
  31.       "params": { 
  32.         "message""click_start" 
  33.       } 
  34.     } 
  35.   } 

2. 完善控制服務(wù)卡片頁面布局

在MyCarGame->entry->src->main->js->GamePage->pages->index->index.hml中將原有的容器代碼全部刪除。

添加一個基礎(chǔ)容器div,增加類選擇器為class。依次添加16個text組件,類選擇器均為text,文本分別為{{text1}}、{{text2}}、……、{{text16}},即分別動態(tài)綁定一個變量。其中,每四個text組件置于類選擇器為class_text的基礎(chǔ)容器div中。

  1. <div class="class"
  2.     <div class="class_text"
  3.         <text class="text">{{text1}}</text> 
  4.         <text class="text">{{text2}}</text> 
  5.         <text class="text">{{text3}}</text> 
  6.         <text class="text">{{text4}}</text> 
  7.     </div> 
  8.     <div class="class_text"
  9.         <text class="text">{{text5}}</text> 
  10.         <text class="text">{{text6}}</text> 
  11.         <text class="text">{{text7}}</text> 
  12.         <text class="text">{{text8}}</text> 
  13.     </div> 
  14.     <div class="class_text"
  15.         <text class="text">{{text9}}</text> 
  16.         <text class="text">{{text10}}</text> 
  17.         <text class="text">{{text11}}</text> 
  18.         <text class="text">{{text12}}</text> 
  19.     </div> 
  20.     <div class="class_text"
  21.         <text class="text">{{text13}}</text> 
  22.         <text class="text">{{text14}}</text> 
  23.         <text class="text">{{text15}}</text> 
  24.         <text class="text">{{text16}}</text> 
  25.     </div> 
  26. </div> 

在MyCarGame->entry->src->main->js->GamePage->pages->index->index.css中將原有的類選擇器全部刪除。

各個類選擇器配置如下:

  1. .class{ 
  2.     width: 100%; 
  3.     height: 100%; 
  4.     flex-direction: column
  5.     align-items: flex-start; 
  6.  
  7. .class_text{ 
  8.     flex-direction: row; 
  9.  
  10. .text{ 
  11.     width: 25%; 
  12.     height: 25%; 
  13.     text-color: black; 
  14.     font-size: 30px; 
  15.     background-color: aquamarine; 
  16.     text-align: center; 

在MyCarGame->entry->src->main->js->GamePage->pages->index->index.json中將data原有的數(shù)據(jù)全部刪除,在data中將text1、text2、……、text16初始化為“1”、“2”、……、“15”、“”。

  1.   "data": { 
  2.     "text1""1"
  3.     "text2""2"
  4.     "text3""3"
  5.     "text4""4"
  6.     "text5""5"
  7.     "text6""6"
  8.     "text7""7"
  9.     "text8""8"
  10.     "text9""9"
  11.     "text10""10"
  12.     "text11""11"
  13.     "text12""12"
  14.     "text13""13"
  15.     "text14""14"
  16.     "text15""15"
  17.     "text16""" 
  18.   } 

三、響應(yīng)點擊事件

在MyCarGame->entry->src->main->java->com->test->mycargame->MainAbility.java中修改以下代碼。

1. 修改onCreateForm()方法

onCreateForm()方法在兩種情況被調(diào)用。第一種情況是上滑呼出卡片的時候,這時候上滑卡片的動作就會調(diào)用一次onCreateForm()方法生成一張卡片;

第二種情形是長按應(yīng)用,然后點擊"服務(wù)卡片",此時會顯示該應(yīng)用的所有卡片,每一張卡片都會回調(diào)一次onCreateForm()方法并生成一張對應(yīng)的卡片。當(dāng)選擇了其中一張卡片添加到桌面后,其他卡片回調(diào)onDeleteForm()方法來刪除該卡片。

為了保證控制頁面服務(wù)卡片和游戲頁面服務(wù)卡片只對對應(yīng)類型卡片的第一張起作用,分別定義兩個long類型的全局變量ControlPanelFormId和GamePanelFormId,并初始化為0。在onCreateForm()方法中,根據(jù)服務(wù)卡片的名字formName來判斷是哪種類型的服務(wù)卡片,如果對應(yīng)的變量為0,即表示該種類型的卡片還沒有生成,則使該卡片的id賦值給對應(yīng)的變量。

  1. public static long ControlPanelFormId = 0; 
  2.  public static long GamePanelFormId = 0; 
  3.  
  4.  protected ProviderFormInfo onCreateForm(Intent intent) { 
  5.      ...... 
  6.  
  7.      if(formName.equals("ControlPage")) { 
  8.          if(ControlPanelFormId == 0) { 
  9.              ControlPanelFormId = formId; 
  10.          } 
  11.      } 
  12.      if(formName.equals("GamePage")) { 
  13.          if(GamePanelFormId == 0) { 
  14.              GamePanelFormId = formId; 
  15.          } 
  16.      } 
  17.  
  18.      return formController.bindFormData(); 
  19.  } 

2. 修改onDeleteForm()方法

為了使卡片刪除后再生成卡片時,游戲仍然能夠繼續(xù)進行,我們需要對onDeleteForm()方法進行修改。刪除卡片時,判斷卡片的id和ControlPanelFormId、GamePanelFormId是否相同。如果相同,則說明刪除的是響應(yīng)游戲功能的卡片,需要將對應(yīng)的變量賦值為0,等待下一次生成該種類型的卡片。

  1. protected void onDeleteForm(long formId) { 
  2.      ..... 
  3.  
  4.      if(ControlPanelFormId == formId){ 
  5.          ControlPanelFormId = 0; 
  6.      } 
  7.      if(GamePanelFormId == formId){ 
  8.          GamePanelFormId = 0; 
  9.      } 
  10.  } 

3. 添加文本更新方法

為了響應(yīng)控制頁面服務(wù)卡片的上、下、左、右的點擊事件,從而使游戲頁面服務(wù)卡片的文本進行更新操作,因此在響應(yīng)點擊事件前,先增加文本更新方法。

添加兩個int類型的全局變量row_0和column_0,并初始化為4,以記錄空文本的位置。添加一個int[][]類型的變量grids,并初始化為{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}},以記錄游戲頁面服務(wù)卡片各位置上的文本。

添加一個名為upText的函數(shù),形參為(String direction)。根據(jù)傳入的參數(shù)的值(click_up、click_left、click_right和click_down),通過zsonObject.put(key, value)和updateForm(formId, formBindingData)對游戲頁面服務(wù)卡片的文本進行更新。并且對變量grids也進行同步更新。

  1. private static int row_0 = 4; 
  2.  private static int column_0 = 4; 
  3.  private static int[][] grids = {{1, 2, 3, 4}, 
  4.                                  {5, 6, 7, 8}, 
  5.                                  {9, 10, 11, 12}, 
  6.                                  {13, 14, 15, 0}}; 
  7.  
  8.  public void upText(String direction){ 
  9.      if(direction == "click_up"){ 
  10.          if(row_0 != 4){ 
  11.              try{ 
  12.                  ZSONObject zsonObject = new ZSONObject(); 
  13.                  zsonObject.put("text" + ((row_0 - 1) * 4 + column_0), Integer.toString(grids[row_0][column_0 - 1])); 
  14.                  zsonObject.put("text" + ((row_0) * 4 + column_0), ""); 
  15.                  FormBindingData formBindingData = new FormBindingData(zsonObject); 
  16.                  updateForm(GamePanelFormId, formBindingData); 
  17.                   
  18.                  int temp = grids[row_0][column_0 - 1]; 
  19.                  grids[row_0][column_0 - 1] = 0; 
  20.                  grids[row_0 - 1][column_0 - 1] = temp
  21.                  row_0++; 
  22.              } catch (Exception e){ 
  23.  
  24.              } 
  25.          } 
  26.      }else if(direction == "click_left"){ 
  27.          if(column_0 != 4){ 
  28.              try{ 
  29.                  ZSONObject zsonObject = new ZSONObject(); 
  30.                  zsonObject.put("text" + ((row_0 - 1) * 4 + column_0), Integer.toString(grids[row_0 - 1][column_0])); 
  31.                  zsonObject.put("text" + ((row_0 - 1) * 4 + column_0 + 1), ""); 
  32.                  FormBindingData formBindingData = new FormBindingData(zsonObject); 
  33.                  updateForm(GamePanelFormId, formBindingData); 
  34.                   
  35.                  int temp = grids[row_0 - 1][column_0]; 
  36.                  grids[row_0 - 1][column_0] = 0; 
  37.                  grids[row_0 - 1][column_0 - 1] = temp
  38.                  column_0++; 
  39.              }catch (Exception e){ 
  40.  
  41.              } 
  42.          } 
  43.      }else if(direction == "click_right"){ 
  44.          if(column_0 != 1){ 
  45.              try{ 
  46.                  ZSONObject zsonObject = new ZSONObject(); 
  47.                  zsonObject.put("text" + ((row_0 - 1) * 4 + column_0), Integer.toString(grids[row_0 - 1][column_0 - 2])); 
  48.                  zsonObject.put("text" + ((row_0 - 1) * 4 + column_0 - 1), ""); 
  49.                  FormBindingData formBindingData = new FormBindingData(zsonObject); 
  50.                  updateForm(GamePanelFormId, formBindingData); 
  51.  
  52.                  int temp = grids[row_0 - 1][column_0 - 2]; 
  53.                  grids[row_0 - 1][column_0 - 2] = 0; 
  54.                  grids[row_0 - 1][column_0 - 1] = temp
  55.                  column_0--; 
  56.              }catch (Exception e){ 
  57.  
  58.              } 
  59.          } 
  60.      }else if(direction == "click_down"){ 
  61.          if(row_0 != 1){ 
  62.              try{ 
  63.                  ZSONObject zsonObject = new ZSONObject(); 
  64.                  zsonObject.put("text" + ((row_0 - 1) * 4 + column_0), Integer.toString(grids[row_0 - 2][column_0 - 1])); 
  65.                  zsonObject.put("text" + ((row_0 - 2) * 4 + column_0), ""); 
  66.                  FormBindingData formBindingData = new FormBindingData(zsonObject); 
  67.                  updateForm(GamePanelFormId, formBindingData); 
  68.  
  69.                  int temp = grids[row_0 - 2][column_0 - 1]; 
  70.                  grids[row_0 - 2][column_0 - 1] = 0; 
  71.                  grids[row_0 - 1][column_0 - 1] = temp
  72.                  row_0--; 
  73.              }catch (Exception e){ 
  74.                   
  75.              } 
  76.          } 
  77.      } 
  78.  } 

4. 響應(yīng)上下左右四個按鈕的點擊事件

點擊事件的回調(diào)方法為onTriggerFormEvent()。在onTriggerFormEvent()方法中,通過zsonObject.getString接受事件的參數(shù),先判斷GamePanelFormId不等于0,即已經(jīng)生成游戲頁面服務(wù)卡片,再根據(jù)參數(shù)的不同來調(diào)用函數(shù)upText。

  1. protected void onTriggerFormEvent(long formId, String message) { 
  2.      ...... 
  3.  
  4.      ZSONObject zsonObject = ZSONObject.stringToZSON(message); 
  5.      String direction = zsonObject.getString("message"); 
  6.  
  7.      if(GamePanelFormId != 0){ 
  8.          if (direction.equals("click_up")) { 
  9.              upText("click_up"); 
  10.          }else if(direction.equals("click_left")){ 
  11.              upText("click_left"); 
  12.          }else if(direction.equals("click_right")){ 
  13.              upText("click_right"); 
  14.          }else if(direction.equals("click_down")){ 
  15.              upText("click_down"); 
  16.          } 
  17.      } 
  18.  } 

5. 添加時間更新方法和文本打亂方法

為了響應(yīng)控制頁面服務(wù)卡片的開始的點擊事件,從而使游戲頁面服務(wù)卡片的文本進行打亂操作和控制頁面服務(wù)卡片的時間進行更新操作,因此在響應(yīng)點擊事件前,先增加時間更新方法和文本打亂方法。

添加一個Timer類型的全局變量timer,以進行時間疊加更新。添加一個int類型的全局變量time,以記錄當(dāng)前時間進度。添加一個boolean類型的全局變量k并初始化為false,以記錄當(dāng)前時間是否開始累加。

添加一個名為run的函數(shù)。在函數(shù)體內(nèi)對變量time賦值為0,對變量k賦值為true。初始化變量timer,并添加字線程,使時間累加量time每隔一秒加1,并通過zsonObject.put(key, value)和updateForm(formId, formBindingData)對控制頁面服務(wù)卡片的時間進行更新。

添加一個名為initialize的函數(shù)。對變量row_0和column_0賦值為0,grids賦值為{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}},定義一個String[]類型的變量array,并初始化為{“click_up”,“click_left”,“click_right”,“click_down”}。重復(fù)50次隨機抽取一個字符串,并調(diào)用函數(shù)upText對游戲頁面服務(wù)卡片的文本進行打亂操作。然后判斷k為true時,則取消時間任務(wù)timer。最后調(diào)用函數(shù)run。

  1. private static Timer timer; 
  2.  private static int time
  3.  private static boolean k = false
  4.  
  5.  private void initialize(){ 
  6.      row_0 = 4; 
  7.      column_0 = 4; 
  8.      grids = new int[][]{{1, 2, 3, 4}, 
  9.                          {5, 6, 7, 8}, 
  10.                          {9, 10, 11, 12}, 
  11.                          {13, 14, 15, 0}}; 
  12.      String[] array = {"click_up","click_left","click_right","click_down"}; 
  13.  
  14.      for(int i = 0; i < 50; i++){ 
  15.          double random = Math.floor(Math.random() * 4); 
  16.          String direction = array[(int) random]; 
  17.          upText(direction); 
  18.      } 
  19.       
  20.      if(k){ 
  21.          timer.cancel(); 
  22.      } 
  23.      run(); 
  24.  } 
  25.  
  26.  private void run(){ 
  27.      time = 0; 
  28.      k = true
  29.      timer = new Timer(); 
  30.      timer.schedule(new TimerTask() { 
  31.          @Override 
  32.          public void run() { 
  33.              getUITaskDispatcher().asyncDispatch(()->{ 
  34.                  time++; 
  35.                  int hou = time / 3600; 
  36.                  int min = (time % 3600) / 60; 
  37.                  int sec = (time % 3600) % 60; 
  38.                  String str_hour = ""
  39.                  String str_min = ""
  40.                  String str_sec = ""
  41.                  if(hou < 10){ 
  42.                      str_hour = "0" + hou; 
  43.                  }else
  44.                      str_hour = Integer.toString(hou); 
  45.                  } 
  46.                  if(min < 10){ 
  47.                      str_min = "0" + min
  48.                  }else
  49.                      str_min = Integer.toString(min); 
  50.                  } 
  51.                  if(sec < 10){ 
  52.                      str_sec = "0" + sec; 
  53.                  }else
  54.                      str_sec = Integer.toString(sec); 
  55.                  } 
  56.  
  57.                  try{ 
  58.                      ZSONObject zsonObject = new ZSONObject(); 
  59.                      zsonObject.put("time", str_hour + ":" + str_min + ":" + str_sec); 
  60.                      FormBindingData formBindingData = new FormBindingData(zsonObject); 
  61.                      updateForm(ControlPanelFormId, formBindingData); 
  62.                  } catch (Exception e){ 
  63.  
  64.                  } 
  65.              }); 
  66.          } 
  67.      }, 0, 1000); 
  68.  } 

6. 響應(yīng)開始按鈕的點擊事件

點擊事件的回調(diào)方法為onTriggerFormEvent()。在onTriggerFormEvent()方法中,通過zsonObject.getString接受事件的參數(shù),在判斷GamePanelFormId不等于0的里面,根據(jù)參數(shù)為click_start來調(diào)用函數(shù)initialize。

  1. protected void onTriggerFormEvent(long formId, String message) { 
  2.        ...... 
  3.  
  4.        if(GamePanelFormId != 0){ 
  5.            if (direction.equals("click_up")) { 
  6.                upText("click_up"); 
  7.            }else if(direction.equals("click_left")){ 
  8.                upText("click_left"); 
  9.            }else if(direction.equals("click_right")){ 
  10.                upText("click_right"); 
  11.            }else if(direction.equals("click_down")){ 
  12.                upText("click_down"); 
  13.            }else if(direction.equals("click_start")) { 
  14.                initialize(); 
  15.            } 
  16.        } 
  17.    } 

四、完善其他功能

1. 當(dāng)游戲頁面服務(wù)卡片被刪除時停止計時

在onDeleteForm()方法中的判斷GamePanelFormId==formId中添加一個判斷,如果k為true時,通過canel()方法停止計時,并且將k賦值為false。

  1. protected void onDeleteForm(long formId) { 
  2.     ...... 
  3.     if(ControlPanelFormId == formId){ 
  4.         ControlPanelFormId = 0; 
  5.     } 
  6.     if(GamePanelFormId == formId){ 
  7.         GamePanelFormId = 0; 
  8.         if(k){ 
  9.             timer.cancel(); 
  10.             k = false
  11.         } 
  12.     } 

2. 游戲結(jié)束時停止計時

添加一個名為gameover的函數(shù),判斷girds的值是否為游戲成功的數(shù)值,若有一個不符合則返回false,否則返回true。

在函數(shù)upText中判斷函數(shù)gameover的返回值和k的值,如果均為真,則通過cancel()方法停止計時,并將k賦值為false。

  1. public void upText(String direction){ 
  2.       ...... 
  3.  
  4.       if(gameover()){ 
  5.           timer.cancel(); 
  6.           k = false
  7.       } 
  8.   } 
  9.  
  10.   private boolean gameover(){ 
  11.       int[][] Grids = new int[][]{{1, 2, 3, 4}, 
  12.                                   {5, 6, 7, 8}, 
  13.                                   {9, 10, 11, 12}, 
  14.                                   {13, 14, 15, 0}}; 
  15.  
  16.       for(int row = 0; row < 4; row++){ 
  17.           for(int column = 0; column < 4; column++){ 
  18.               if(grids[row][column] != Grids[row][column]){ 
  19.                   return false
  20.               } 
  21.           } 
  22.       } 
  23.  
  24.       return true
  25.   } 

寫在最后

至此,整個項目就完成了,使用模擬器Mate 30運行即可。

文章相關(guān)附件可以點擊下面的原文鏈接前往下載

MyCarGame.zip

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-10-22 19:41:01

鴻蒙HarmonyOS應(yīng)用

2021-11-02 14:55:42

鴻蒙HarmonyOS應(yīng)用

2020-12-11 12:27:35

鴻蒙HarmonyOS

2021-10-09 14:49:50

鴻蒙HarmonyOS應(yīng)用

2012-11-04 14:54:24

2020-12-22 11:20:36

鴻蒙HarmonyOS游戲

2013-10-15 09:48:03

C++Lambda函數(shù)式編程

2021-08-23 11:03:54

鴻蒙HarmonyOS應(yīng)用

2017-09-25 16:55:35

2022-07-08 14:53:46

掃雷小游戲鴻蒙

2021-01-12 12:16:55

鴻蒙HarmonyOS游戲

2022-08-25 21:41:43

ArkUI鴻蒙

2022-10-28 16:20:10

JS鴻蒙小游戲

2011-03-15 13:19:11

jQuery

2023-10-17 10:20:53

VueReact

2022-08-04 13:55:08

拼數(shù)字小游戲鴻蒙

2020-12-09 11:42:18

WiFi IoT鴻蒙開發(fā)

2021-08-31 15:00:26

鴻蒙HarmonyOS應(yīng)用

2021-09-15 10:19:15

鴻蒙HarmonyOS應(yīng)用

2022-03-07 16:46:03

HarmonyOS鴻蒙操作系統(tǒng)
點贊
收藏

51CTO技術(shù)棧公眾號

国产成人涩涩涩视频在线观看| 欧美大片在线观看一区| 日韩三级电影网站| 97人妻精品一区二区三区动漫| 99久久夜色精品国产亚洲96| 精品国产自在久精品国产| 亚洲熟女乱色一区二区三区| 欧美尤物美女在线| 成人福利电影精品一区二区在线观看| 日韩av电影中文字幕| 欧美做爰啪啪xxxⅹ性| 日本成人精品| 色欧美乱欧美15图片| 懂色av一区二区三区四区五区| 午夜性色福利影院| 国产乱子轮精品视频| 日本国产精品视频| 青娱乐国产精品| 成人直播大秀| 日韩精品在线免费播放| 午夜一区二区视频| 3d欧美精品动漫xxxx无尽| 亚洲在线中文字幕| 在线电影看在线一区二区三区| 视频二区在线| 成人网男人的天堂| 亚洲综合最新在线| 最近中文字幕免费观看| 国产午夜久久| 欧美激情视频一区| 久久国产美女视频| 久久精品国产大片免费观看| 日韩精品在线观看一区| 香港三日本8a三级少妇三级99| 国产精一区二区| 欧美午夜在线观看| 粗暴91大变态调教| 亚洲精品永久免费视频| 午夜电影网一区| 18禁裸男晨勃露j毛免费观看 | 国产一区欧美日韩| 国产精品旅馆在线| 中文字幕精品无| 乱码第一页成人| 97在线视频免费看| 国产精久久久久久| 中文一区在线| 2021久久精品国产99国产精品| 国产无遮挡免费视频| 韩日成人在线| 97在线精品视频| 国产情侣在线视频| 亚洲一区日韩| 国产精品扒开腿做爽爽爽视频| 日韩三级一区二区| 男男成人高潮片免费网站| 国产精品免费久久久久影院| 亚洲视屏在线观看| 久久精品久久99精品久久| 国产精品视频一| 91av久久久| 国产一区二区在线观看免费| 亚洲一区二区在线| 国产丰满果冻videossex| 国产成人在线网站| 国产精品9999久久久久仙踪林| 黄色av一区二区三区| 成年人国产精品| 久久综合九色综合网站| 国产69久久| 国产精品不卡视频| 99er在线视频| 涩涩av在线| 欧美日韩在线播放三区四区| 色男人天堂av| 精品欠久久久中文字幕加勒比| 日韩av综合网站| jizz中文字幕| 亚洲精品888| 97视频色精品| 伊人网中文字幕| 国产电影精品久久禁18| 久久综合九色综合网站| 91高清在线视频| 一个色综合av| 日本三区在线观看| 日韩免费一级| 亚洲网址你懂得| 中文字幕av免费在线观看| 99伊人成综合| 91免费版网站入口| 日韩在线免费播放| 1024精品合集| 六月婷婷在线视频| 日韩免费大片| 亚洲精品久久久久中文字幕欢迎你 | 亚洲av综合色区| 黄色视屏在线免费观看| 欧美日韩国产高清一区二区 | 欧美五码在线| 日韩一级裸体免费视频| 日本高清www免费视频| 久久 天天综合| 久久草视频在线看| av网站在线免费| 日本韩国欧美一区| 91精品又粗又猛又爽| 久久国产影院| 国产suv精品一区二区| www.国产.com| 国产精品久久毛片| 欧美黄色免费影院| www.爱久久| 久久视频国产精品免费视频在线| 在线观看日本视频| 不卡视频在线观看| av久久久久久| 97精品资源在线观看| 亚洲欧美日韩在线一区| 精品午夜福利在线观看| 韩国v欧美v日本v亚洲v| 色婷婷精品国产一区二区三区| 男人av在线播放| 精品久久久久久亚洲综合网| 国产第一页浮力| 免费观看在线综合色| 久久99精品久久久久久秒播放器 | 日本黄色网址大全| 伊人天天综合| 国产精品一区二区三区不卡| av在线免费播放| 51精品国自产在线| av资源在线免费观看| 日韩激情中文字幕| 欧美视频观看一区| 欧洲一区二区三区精品| 亚洲精品日韩在线| 欧美在线观看不卡| 99国产精品一区| 无码人妻丰满熟妇区96| 久久悠悠精品综合网| 欧美精品久久一区二区| 亚洲精品久久久久久无码色欲四季 | 影音先锋男人资源在线观看| 秋霞电影一区二区| 亚洲日本无吗高清不卡| 欧美videos粗暴| 少妇激情综合网| 国产伦精品一区二区三区视频痴汉 | 日本一区二区不卡高清更新| 蜜桃视频成人m3u8| 少妇高潮 亚洲精品| 91丨九色丨丰满| 亚洲女人小视频在线观看| 91精品视频国产| 韩日成人av| 精品一区二区久久久久久久网站| 国产调教在线| 亚洲美女性生活视频| 成人一级免费视频| 亚洲欧洲日韩av| gogo亚洲国模私拍人体| 激情久久久久| 久久av免费观看| 粉嫩一区二区三区| 日韩一区二区av| 丰满少妇被猛烈进入| 偷拍亚洲欧洲综合| 99在线视频免费| 国产一二三精品| 国产精品无码人妻一区二区在线 | 亚洲人午夜精品| 在线播放一级片| 一区二区三区成人在线视频| 一级欧美一级日韩片| 日韩极品在线观看| japanese在线播放| 婷婷成人影院| 国产在线精品播放| 99爱在线视频| 中文字幕欧美日韩精品| 亚洲AV无码一区二区三区性| 日韩欧美a级成人黄色| 国产精品av久久久久久无| 国产一二精品视频| 免费观看精品视频| 天天射综合网视频| 久久99精品久久久久子伦 | 欧美二区在线观看| 国产无码精品一区二区| 国产精品乱码一区二区三区软件| 免费观看污网站| 日本在线不卡一区| 亚洲一区二区三区av无码| 精品久久成人| 国产精品theporn88| 另类一区二区| 69av成年福利视频| 黄色成年人视频在线观看| 日韩国产欧美精品一区二区三区| 一区二区三区午夜| 色香蕉久久蜜桃| 久久亚洲av午夜福利精品一区| 久久精品夜色噜噜亚洲a∨| 无套白嫩进入乌克兰美女| 久久久久在线| 日本a在线免费观看| 午夜av一区| 日韩久久久久久久| 欧美人妖视频| 不卡视频一区二区三区| 欧洲精品久久久久毛片完整版| 91产国在线观看动作片喷水| 污污影院在线观看| 中文字幕亚洲第一| 欧美人体大胆444www| 精品久久久久久最新网址| 91久久精品国产91性色69| 色综合久久88色综合天天| 国产乡下妇女做爰视频| 一区二区三区在线观看视频| 五月天色婷婷丁香| 中文字幕精品一区| 欧美日韩高清丝袜| 久久亚洲精华国产精华液| 亚洲天堂av网站| 国产激情91久久精品导航| 91亚洲精品久久久蜜桃借种| 秋霞影院一区二区| 美女黄色片视频| 首页综合国产亚洲丝袜| 免费av观看网址| 亚洲二区在线| 韩日视频在线观看| 国产主播一区| 毛片av在线播放| 欧美视频在线观看| 4444亚洲人成无码网在线观看| 国产精品久久天天影视| 亚洲一区二区三区加勒比| 日韩欧美精品| 亚洲制服欧美久久| 五月久久久综合一区二区小说| 亚洲午夜久久久影院伊人| blacked蜜桃精品一区| 日韩中文字幕一区| 久久影院100000精品| 一区二区国产日产| 亚欧美无遮挡hd高清在线视频| 正在播放一区二区三区| 亚洲中无吗在线| www.xxx麻豆| 亚洲永久在线| 日韩有码免费视频| 麻豆国产欧美一区二区三区| 国产精品区在线| 国产一区二区女| 国产女人18毛片水真多18| 99久久国产综合精品女不卡| 精品无码一区二区三区| 亚洲国产精品成人综合| 日韩精品一区二区亚洲av性色| 一区二区三区在线观看欧美| 日韩精品成人在线| 色吊一区二区三区| 在线免费观看一区二区| 日韩欧美一区二区免费| 手机福利小视频在线播放| 国产亚洲精品综合一区91| 黄网站免费在线播放| 欧美极品美女视频网站在线观看免费| 国产网站在线| 久久日一线二线三线suv| 国产成人综合av| 成人国产激情在线| av一区二区在线看| 亚洲图片久久| 亚洲最新免费视频| 国产伊人精品| 蜜臀av午夜一区二区三区| 狠狠久久亚洲欧美| 亚洲av网址在线| 中文字幕一区二区三区在线播放| 久久精品欧美一区二区| 91久久精品一区二区三区| 99久久亚洲精品日本无码| 日韩国产欧美区| 69成人在线| 国产精品福利网站| 国产精品白丝一区二区三区| 日韩高清国产一区在线观看| 亚洲中无吗在线| 国产一二三四在线视频| 成人永久aaa| 国产福利在线导航| 欧美性xxxxx极品娇小| 国产美女主播在线观看| 亚洲天堂成人在线视频| 黄网站在线观| 国产精品一区二区三区成人| 韩国女主播一区二区三区| 亚洲制服中文| 久久一日本道色综合久久| 日本精品一二三| 国产精品黄色在线观看| 欧美激情黑白配| 日韩欧美中文一区| 男人天堂手机在线| 国产97免费视| 欧美电影免费网站| 99视频精品全部免费看| 理论电影国产精品| 欧美老熟妇乱大交xxxxx| 亚洲成人av免费| 国产jzjzjz丝袜老师水多| 丝袜美腿亚洲一区二区| 粉嫩一区二区| 国产精品一区免费观看| 五月婷婷亚洲| 污视频网址在线观看| 久久精品欧美一区二区三区不卡| 精品深夜av无码一区二区老年| 在线电影国产精品| av男人的天堂在线| 国产成人一区三区| 台湾佬综合网| 高清在线观看免费| 成人激情免费网站| 久久国产免费观看| 日韩欧美高清dvd碟片| 黄色片网站在线观看| 91精品久久久久久久久| 日韩在线观看| 欧美婷婷精品激情| 欧美激情一二三区| 高潮无码精品色欲av午夜福利| 亚洲欧美精品suv| 欧美黑人疯狂性受xxxxx野外| 精品在线视频一区二区| 一区二区三区高清视频在线观看| 精品熟女一区二区三区| 五月综合激情日本mⅴ| 色窝窝无码一区二区三区| 午夜精品一区二区三区在线视| 国产伦精品一区二区三区在线播放 | 小处雏高清一区二区三区| 国产精欧美一区二区三区白种人| 中文字幕一区二区三区在线不卡 | 色婷婷777777仙踪林| 国产一区二区三区观看| 久久久一二三区| 亚洲国产高潮在线观看| 丝袜诱惑一区二区| 欧美亚洲另类在线一区二区三区| 久久午夜精品一区二区| 欧美福利第一页| 欧美电影一区二区| 毛片在线导航| 免费成人看片网址| 青草国产精品久久久久久| 91n在线视频| 精品美女在线播放| 中文在线аv在线| 日韩欧美激情一区二区| 激情偷乱视频一区二区三区| 黄色一级视频在线观看| 亚洲成年人在线| 91精品论坛| 一区二区在线高清视频| 国产大陆a不卡| 九九热在线视频播放| 尤物yw午夜国产精品视频| 另类视频一区二区三区| 日韩五码在线观看| 国产午夜亚洲精品不卡| 国产毛片在线视频| 91国产美女在线观看| 日韩1区2区| 性色av蜜臀av浪潮av老女人| 在线观看亚洲专区| 最新av在线播放| 欧美一二三区| 国产精品夜夜嗨| 激情视频网站在线观看| 欧美成人手机在线| 九九久久成人| 日本泡妞xxxx免费视频软件| 日韩欧美极品在线观看| 成人黄色网址| 欧美日韩免费精品| 国产精品一区二区x88av| 九九精品免费视频| 欧美成aaa人片免费看| 最新亚洲精品| 国内自拍偷拍视频| 精品视频资源站| 白浆在线视频| 日本一区二区免费高清视频| 久久奇米777| 丁香花免费高清完整在线播放|