成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HarmonyOS小游戲項目—數獨Sudoku(六)

系統 OpenHarmony
本期筆者將在游戲內導入更多題目,并實現游戲處于關卡選擇頁面時進入不同關卡的頁面跳轉邏輯。

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

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

前言

本期筆者將在游戲內導入更多題目,并實現游戲處于關卡選擇頁面時進入不同關卡的頁面跳轉邏輯。

正文

利用xml布局創建UI

打開entry>src>main>resouce>base>graphic,并在graphic目錄下新創建一個xml文件(可以通過復制粘貼graphic目錄下的其他xml文件來實現),將其命名為select_text.xml,最后在文件內將代碼修改為如下:

<?xml version="1.0" encoding="UTF-8" ?>
<state-container xmlns:ohos="http://schemas.huawei.com/res/ohos" >
<item ohos:state="component_state_pressed" ohos:element="#007CFD"/>
<item ohos:state="component_state_empty" ohos:element="white"/>
</state-container>

接著,在graphic目錄下再次新創建一個xml文件,將其命名為select_text_exit.xml,并在文件內添加如下代碼:

<?xml version="1.0" encoding="UTF-8" ?>
<state-container xmlns:ohos="http://schemas.huawei.com/res/ohos" >

<item ohos:state="component_state_pressed" ohos:element="red"/>
<item ohos:state="component_state_empty" ohos:element="white"/>
</state-container>

這樣以后,我們就完成了兩類組件背景元素的創建,而這兩類組件背景元素所實現的UI效果是:當組件處于被點擊的狀態時,組件改變顏色;當組件未處于被點擊的·狀態時,組件保持初始的顏色。

之后,打開entry>src>main>resouce>base>layout,并在layout目錄下新創建一個xml文件(可以通過復制粘貼layout目錄下的其他xml文件來實現),將其命名為select.xml。

最后在文件內將代碼修改為如下:

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical">
<Text
ohos:id="$+id:btn1"
ohos:background_element="$graphic:select_text" //引用先前創建的背景元素
ohos:height="match_content"
ohos:width="match_parent"
ohos:text_size="30vp"
ohos:text="第一關 入門"
ohos:text_alignment="horizontal_center"
ohos:bottom_margin="15vp"/>
<Text
ohos:id="$+id:btn2"
ohos:background_element="$graphic:select_text"
ohos:height="match_content"
ohos:width="match_parent"
ohos:text_size="30vp"
ohos:text="第二關 初級"
ohos:text_alignment="horizontal_center"
ohos:bottom_margin="15vp"
/>
<Text
ohos:id="$+id:btn3"
ohos:background_element="$graphic:select_text"
ohos:height="match_content"
ohos:width="match_parent"
ohos:text_size="30vp"
ohos:text="第三關 中級"
ohos:text_alignment="horizontal_center"
ohos:bottom_margin="15vp"
/>
<Text
ohos:id="$+id:btn4"
ohos:background_element="$graphic:select_text"
ohos:height="match_content"
ohos:width="match_parent"
ohos:text_size="30vp"
ohos:text="第四關 中級"
ohos:text_alignment="horizontal_center"
ohos:bottom_margin="15vp"
/>
<Text
ohos:id="$+id:btn5"
ohos:background_element="$graphic:select_text"
ohos:height="match_content"
ohos:width="match_parent"
ohos:text_size="30vp"
ohos:text="第五關 高級"
ohos:text_alignment="horizontal_center"
ohos:bottom_margin="15vp"
/>
<Text
ohos:id="$+id:Aa"
ohos:background_element="$graphic:select_text"
ohos:height="match_content"
ohos:width="match_parent"
ohos:text_size="30vp"
ohos:text_alignment="horizontal_center"
ohos:bottom_margin="15vp"
/>
<Text
ohos:id="$+id:btn6"
ohos:background_element="$graphic:select_text_exit"
ohos:height="match_content"
ohos:width="match_parent"
ohos:text_size="30vp"
ohos:text="退出"
ohos:text_alignment="horizontal_center"
ohos:top_margin="55vp"
/>
</DirectionalLayout>

這樣以后,我們就完成了基本的組件布局,當然,此xml文件在后文是要與關卡選擇界面相綁定的。此時可以打開previewer預覽UI效果。

【木棉花】#打卡不停更#HarmonyOS小游戲項目——數獨Sudoku(6)-開源基礎軟件社區

在SelectAbilitySlice內完善交互邏輯

打開先前創建的SelectAbilitySlice(目錄路徑:entry\src\main\java\com.example.project\slice\SelectAbilitySlice),將代碼修改為如下:

package ...
import ......
public class SelectAbilitySlice extends AbilitySlice { //繼承AbilitySlice類
private String level; //定義字符串level,
@Override
protected void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_select);//綁定先前創建的layout類xml文件
}
@Override
protected void onActive() {
super.onActive();
//將select.xml文件中的6個text組件在AbilitySlice中聲明
Text text1=(Text) findComponentById(ResourceTable.Id_btn1);
Text text2=(Text) findComponentById(ResourceTable.Id_btn2);
Text text3=(Text) findComponentById(ResourceTable.Id_btn3);
Text text4=(Text) findComponentById(ResourceTable.Id_btn4);
Text text5=(Text) findComponentById(ResourceTable.Id_btn5);
Text text6=(Text) findComponentById(ResourceTable.Id_btn6);
Intent intent_go=new Intent();//創建一個intent對象
text1.setClickedListener((Component component)->{
intent_go.setParam("level","0");
present(new GameAbilitySlice(),intent_go);
});
text2.setClickedListener((Component component)->{
intent_go.setParam("level","1");
present(new GameAbilitySlice(),intent_go);
});
text3.setClickedListener((Component component)->{
intent_go.setParam("level","2");
presen(new GameAbilitySlice(),intent_go);
});
text4.setClickedListener((Component component)->{
intent_go.setParam("level","3");
present(new GameAbilitySlice(),intent_go);
});
text5.setClickedListener((Component component)->{
intent_go.setParam("level","4");
present(new GameAbilitySlice(),intent_go);
});
text6.setClickedListener((Component component)->{
terminate();
});
}
@Override
protected void onResult(int request_code,Intent intent_back){
super.onResult(request_code,intent_back);
}
@Override
protected void onForeground(Intent intent) {
super.onForeground(intent);
}
@Override
protected void onBackground() {
super.onBackground();
}
}

在此次的代碼添加中,筆者先是擴展了SelectAbilitySlice的框架,并將SelectAbilitySlice與select.xml綁定,這樣以后SelectAbilitySlice就可以顯示select.xml內設定的布局元素;接著,我們在onActive()函數內聲明了已在select.xml設定的6個text組件,并為每個text組件都設定了點擊監聽器;最后,我們創建了一個intent對象,并在每個text對象的點擊監聽器內加入指令:將需要傳遞的數字信息以字符串的形式儲存在inent中,并調用present()函數執行頁面跳轉(從SelectAbilitySlice跳轉至新創建的GameAbilitySlice)。由于intent是兩個AbilitySlice的信息傳遞媒介,故當頁面導航至新生成的GameAbilitySlice時,GameAbilitySlice可以接收到來自SelectAbilitySlice的intent,而這個intent也是攜帶重要的數字信息的(點擊不同的text組件,intent所攜帶的數字信息也不同)。關于intent的接收,筆者將在后文闡述。

完成上述操作后,我們打開MainAbilitySlice,設置其頁面導航路由,使得我們在主界面點擊“開始游戲”后,系統界面可以從主界面跳轉至關卡選擇界面:

public class MainAbilitySlice extends AbilitySlice {
@Override
...
@Override
public void onActive() {
super.onActive();
//通過id號獲取xml文件中的button組件
Button button1=(Button) findComponentById(ResourceTable.Id_Game);
button1.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
present(new SelectAbilitySlice(),new Intent());//點擊此組件后,頁面將從MainAbilitySlice跳轉至SelectAbilitySlice
}
});
}

@Override
...

再打開MainAbility,將PageAbility默認展示界面改為InitialAbilitySlice:

......
public class MainAbility extends Ability {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setMainRoute(InitialAbilitySlice.class.getName()); //將參數改為改為InitialAbilitySlice
}
}

完成以上操作后,我們可以打開模擬機查看效果:當界面跳轉至游戲的主界面時,我們點擊“開始游戲”,游戲則會跳轉到關卡選擇的畫面。

【木棉花】#打卡不停更#HarmonyOS小游戲項目——數獨Sudoku(6)-開源基礎軟件社區

點擊:

【木棉花】#打卡不停更#HarmonyOS小游戲項目——數獨Sudoku(6)-開源基礎軟件社區

導入更多的數獨題目

在GameAbilitySlice合適的位置加入如下八個數組(局部變量),其中,前四個數組用做數獨題答案,后四個數組則將用于題目的初始化、與用戶交互。

...
@Override
protected void onStart(Intent intent) {
super.onStart(intent);
....
//答案
int[][] grid_v1=new int[6][];
grid_v1[0]=new int[]{5,4,3,1,2,6};
grid_v1[1]=new int[]{6,3,4,2,5,1};
grid_v1[2]=new int[]{2,1,6,5,3,4};
grid_v1[3]=new int[]{3,5,1,6,4,2};
grid_v1[4]=new int[]{4,6,2,3,1,5};
grid_v1[5]=new int[]{1,2,5,4,6,3};
int[][] grid_v2=new int[6][];
grid_v2[0]=new int[]{5,6,1,2,3,4};
grid_v2[1]=new int[]{1,3,5,4,2,6};
grid_v2[2]=new int[]{2,4,6,3,5,1};
grid_v2[3]=new int[]{6,5,2,1,4,3};
grid_v2[4]=new int[]{3,1,4,5,6,2};
grid_v2[5]=new int[]{4,2,3,6,1,5};
int[][] grid_v3=new int[6][];
grid_v3[0]=new int[]{2,1,3,6,4,5};
grid_v3[1]=new int[]{5,4,1,2,3,6};
grid_v3[2]=new int[]{6,3,5,4,2,1};
grid_v3[3]=new int[]{1,6,4,3,5,2};
grid_v3[4]=new int[]{4,2,6,5,1,3};
grid_v3[5]=new int[]{3,5,2,1,6,4};
int[][] grid_v4=new int[6][];
grid_v4[0]=new int[]{5,2,3,4,1,6};
grid_v4[1]=new int[]{6,4,2,1,5,3};
grid_v4[2]=new int[]{3,1,5,6,2,4};
grid_v4[3]=new int[]{1,3,4,2,6,5};
grid_v4[4]=new int[]{2,5,6,3,4,1};
grid_v4[5]=new int[]{4,6,1,5,3,2};
//題目
int[][] grid_c1=new int[6][];
grid_c1[0]=new int[]{5,0,3,0,2,0};
grid_c1[1]=new int[]{0,0,4,2,0,1};
grid_c1[2]=new int[]{2,1,0,0,3,0};
grid_c1[3]=new int[]{0,5,0,0,4,2};
grid_c1[4]=new int[]{4,0,2,3,0,0};
grid_c1[5]=new int[]{0,2,0,4,0,3};
int[][] grid_c2=new int[6][];
grid_c2[0]=new int[]{0,0,1,2,0,0};
grid_c2[1]=new int[]{0,0,0,0,0,0};
grid_c2[2]=new int[]{0,0,0,3,0,1};
grid_c2[3]=new int[]{0,5,2,0,0,3};
grid_c2[4]=new int[]{0,1,4,5,0,2};
grid_c2[5]=new int[]{4,0,0,0,0,0};
int[][] grid_c3=new int[6][];
grid_c3[0]=new int[]{2,0,3,0,4,5};
grid_c3[1]=new int[]{0,0,0,0,0,0};
grid_c3[2]=new int[]{0,0,0,0,2,1};
grid_c3[3]=new int[]{1,6,0,0,0,0};
grid_c3[4]=new int[]{0,0,0,0,0,0};
grid_c3[5]=new int[]{3,5,0,1,0,4};
int[][] grid_c4=new int[6][];
grid_c4[0]=new int[]{5,0,0,0,1,6};
grid_c4[1]=new int[]{0,0,2,0,0,0};
grid_c4[2]=new int[]{0,1,0,0,0,0};
grid_c4[3]=new int[]{0,0,0,0,6,0};
grid_c4[4]=new int[]{0,0,0,3,0,0};
grid_c4[5]=new int[]{4,6,0,0,0,2};
...

之后,定義一個新的二維數組grids_initial(可以是局部變量也可以是局部變量):

int[][] grids_initial=new  int[6][];

先找到之前用于創建網格區域的二重for循環:

for (y=0;y<6;y++){
for (x=0;x < 6; x++) {
Button button = new Button(this);
button.setTouchFocusable(true);
number=grid_c0[x][y];
string0=String.valueOf(number);
....

然后進行如下修改(即將數組grid_c0改為數組grids_initial):

for (y=0;y<6;y++){
for (x=0;x < 6; x++) {
Button button = new Button(this);
button.setTouchFocusable(true);
number=grids_initial[x][y];//將數組grid_c0改為數組grids_initial
string0=String.valueOf(number);
...

這樣以后,grids_initial就作為唯一用于生成游戲題目的數組變量了。

最后,刪除之前在onStart()函數內添加的以下賦值代碼:

grids_input=grid_c0;
grids_win=grid_v0;

獲取intent

終于來到最后一個環節了。在前文的內容中,我們已經實現了一個功能:系統從SelectAbilitySlice導航至GameAbilitySlice時,GameAbilitySlice可以接收到包含數字信息的intent。

那么如何獲取intent中的信息呢?如下列代碼所示,我們通過getStringParam方法接收從SelectAbilitySlice傳入的intent,并提取其攜帶的字符串信息(其所對應的鍵是"level"),再將此字符串轉化為整形數據,最后存儲在一個新聲明的整型變量L中。因為intent中存儲的字符串代表用戶想要進入的關卡,所以在得到L以后,我們通過switch來判斷用戶點擊的是第幾關,并將對應關卡的題目與答案分別賦給三個數組變量:grids_win,grids_input與grids_initial。

......
@Override
protected void onStart(Intent intent) {
super.onStart(intent);
grid_c0[0]=new int[]{0,0,0,0,1,0};
.......
//獲取intent
int L=Integer.parseInt(intent.getStringParam("level"));
//判斷
switch (L){
case 0: grids_win=grid_v0;grids_input=grid_c0;grids_initial=grid_c0;break;
case 1: grids_win=grid_v1;grids_input=grid_c1;grids_initial=grid_c1;break;
case 2: grids_win=grid_v2;grids_input=grid_c2;grids_initial=grid_c2;break;
case 3: grids_win=grid_v3;grids_input=grid_c3;grids_initial=grid_c3;break;
case 4: grids_win=grid_v4;grids_input=grid_c4;grids_initial=grid_c4;break;
}

這樣以后,當用戶進入不同關卡時,GameAbilitySlice的題目會根據grids_initial初始化,判斷游戲成功與否的Gamesuccess()函數也會獲取對應的信息與成功條件,我們也就實現了游戲處于關卡選擇頁面時進入不同關卡的頁面跳轉邏輯與功能。

此時我們可以打開模擬器查看交互效果:

點擊“第二關”:

【木棉花】#打卡不停更#HarmonyOS小游戲項目——數獨Sudoku(6)-開源基礎軟件社區

進入第二關:

【木棉花】#打卡不停更#HarmonyOS小游戲項目——數獨Sudoku(6)-開源基礎軟件社區

結語

本期的內容就先分享到這里,更多關于數獨小游戲項目精彩的內容我將在下期繼續為大家揭曉。

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

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??。

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

2022-07-29 14:47:34

數獨Sudoku鴻蒙

2022-10-19 15:27:36

數獨Sudoku鴻蒙

2022-10-18 15:45:17

數獨Sudoku鴻蒙

2013-06-17 12:44:38

WP7開發Windows Pho數獨游戲

2023-08-07 15:18:29

游戲開發鴻蒙Arkts

2024-07-31 09:46:13

2011-09-16 10:35:13

Android應用數獨經典游戲

2021-01-15 12:15:36

鴻蒙HarmonyOS游戲

2022-03-24 08:33:58

小游戲項目cmdvue3

2022-08-25 21:41:43

ArkUI鴻蒙

2022-11-01 15:17:48

JS鴻蒙小游戲

2021-09-06 08:26:08

JavaScript數獨 LeetCode

2023-11-06 11:33:15

C++數獨

2021-01-12 12:16:55

鴻蒙HarmonyOS游戲

2012-01-10 12:48:52

Java

2022-02-11 14:39:11

游戲JS鴻蒙

2022-02-11 14:02:09

游戲JS鴻蒙

2022-10-28 16:20:10

JS鴻蒙小游戲

2015-09-29 09:38:50

Java程序猜大小

2022-07-08 14:53:46

掃雷小游戲鴻蒙
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久三级av| 91网在线播放 | www.日韩免费 | 精品国产区 | 久久精品色欧美aⅴ一区二区 | 精品久久久久久久久久久久 | 成人亚洲综合 | 精品久| av国产精品 | 人人鲁人人莫人人爱精品 | 欧区一欧区二欧区三免费 | 久久黄网 | 1000部精品久久久久久久久 | 午夜一区二区三区视频 | 欧美日韩理论 | 黄色综合 | 精品国产高清一区二区三区 | 午夜a区| 欧洲尺码日本国产精品 | 日韩一区二区三区在线观看 | 久久手机在线视频 | 99精品视频一区二区三区 | 成年免费视频 | 成人妇女免费播放久久久 | 粉嫩一区二区三区四区公司1 | 国产一区91精品张津瑜 | 操操日| 一级毛片在线播放 | 天天干夜夜拍 | 欧洲视频一区二区 | 永久精品 | 中文字幕第一页在线 | 欧美激情a∨在线视频播放 成人免费共享视频 | 激情国产 | 91精品国产综合久久精品图片 | 欧美日产国产成人免费图片 | 久草资源在线 | 国产精品免费高清 | 国产成人福利 | 国产一区二区三区高清 | 黄色片视频网站 |