鸿蒙数字华容道小项目
中原工学院软件学院
项你而去(菜鸡勿喷)。
华容道是三国演义中一个非常有名的桥段,曹操赤壁大败后率残兵败将,想回到许昌以图东山再起,然而却被诸葛亮派遣的关羽在华容道截住,关羽义薄云天,因曹操曾有恩于他,不忍杀之,遂让兵士让出道路放走曹操。
如今,铁马金戈已逝,关羽、曹操皆已不在。然而华容道却被很人改编成了游戏。这个游戏相对简单,而如今,我们就用代码来浅浅回顾这一段史事。
卸下包袱,直入主题。
建项目直接略过,咱直接从页面布局入手
这边修饰之后,最后的样子是这样(按钮做的小了点)咱就是说,这双大眼睛咱也不舍得用东西压住。觉得按钮较小可以修改,见Button中ohos:height与weight,可以改成大点的按钮,这里的属性可以选择。图片在文件夹media中。图片当然可以换成自己喜欢的图片,也可以换成与华容道有关的图片。
布局较为简单。用的原件也比较基础,一个Button,一个Image。
首页ability代码如下。
其中主要包括一个button原件,用来切换页面。使用的是find,转换到第二个ability上面
public class MainAbilitySlice extends AbilitySlice { public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); Button button1 = (Button) findComponentById(ResourceTable.Id_button_game); button1.setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { present(new SecondAbilitySlice(),new Intent()); } }); } @Override public void onActive() { super.onActive(); } @Override public void onForeground(Intent intent) { super.onForeground(intent); }}
点击开始游戏,即可进入游戏部分,这一部分图像如下图
技术有限,我也想过用图片来代替数字,奈何我天资愚钝,只得以简单方法来完成这部分的内容,button,layout。配色这方面我随便配的,大家可以用自己喜欢的颜色,黑色边框也可以修改的。
这一部分的内容全在secondability中
代码如下
public class SecondAbilitySlice extends AbilitySlice { private float starX, starY, distanceX, distanceY; private DirectionalLayout layout; private int[][] grids; public void onStart(Intent intent) { super.onStart(intent); initialize(); } public void initialize(){ layout = new DirectionalLayout(this); grids = new int[][]{{1, 2, 3, 4}, {5, 6, 7, 8,}, {9, 10, 11, 12}, {13, 14, 15, 0}}; createGrids(grids); slideGrids(); drawButton(); drawGrids(grids); } public void createGrids(int[][] grids){ int[] array = {-1,-2,1,2}; for(int i = 0; i Math.abs(distanceY)) { if (distanceX > 200) {changeGrids(grids,1); } else if (distanceX < -200) {changeGrids(grids,-1); } } else if (Math.abs(distanceX) 200) {changeGrids(grids,-2); } else if (distanceY < -200) {changeGrids(grids,2); } } } drawGrids(grids); if(gameover()){ drawText(); } return false; } }); } public void drawGrids(int[][] grids){ layout.setLayoutConfig((new ComponentContainer.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT,ComponentContainer.LayoutConfig.MATCH_PARENT))); Component.DrawTask task=new Component.DrawTask() { public void onDraw(Component component, Canvas canvas) { Paint mPaint = new Paint(); mPaint.setColor(Color.BLACK); RectFloat rect=new RectFloat(2,230,1078,1306); canvas.drawRect(rect,mPaint); for(int row = 0; row < 4; row++){ for(int column = 0; column < 4; column++){ mPaint.setColor(new Color(Color.rgb(0,100,100))); RectFloat rectFloat=new RectFloat(22+column*262,250+row*262,272+column*262,500+row*262); canvas.drawRect(rectFloat,mPaint); mPaint.setColor(new Color(Color.rgb(100,100,100))); mPaint.setTextSize(125); if(grids[row][column]!=0){if(grids[row][column]<10){ canvas.drawText(mPaint, String.valueOf(grids[row][column]),105+column*262,425+row*262);}else{ canvas.drawText(mPaint, String.valueOf(grids[row][column]),65+column*262,425+row*262);} } } } } }; layout.addDrawTask(task); setUIContent(layout); } public void drawButton(){ Button button=new Button(this); button.setText("重新开始"); button.setTextSize(80); button.setTextAlignment(TextAlignment.CENTER); button.setTextColor(Color.WHITE); button.setMarginTop(1400); button.setMarginLeft(80); button.setPadding(20,20,20,20); ShapeElement background = new ShapeElement(); background.setRgbColor(new RgbColor(0, 191, 255)); background.setCornerRadius(80); button.setBackground(background); button.setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { initialize(); } }); layout.addComponent(button); Button button0=new Button(this); button0.setText("返回"); button0.setTextSize(80); button0.setTextAlignment(TextAlignment.CENTER); button0.setTextColor(Color.WHITE); button0.setMarginTop(-170); button0.setMarginLeft(680); button0.setPadding(20,20,20,20); button0.setBackground(background); button0.setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { present(new SecondAbilitySlice(),new Intent()); } }); layout.addComponent(button0); ShapeElement background0 = new ShapeElement(); background0.setRgbColor(new RgbColor(0, 191, 255)); background0.setCornerRadius(100); Button button1=new Button(this); button1.setText("↑"); button1.setTextAlignment(TextAlignment.CENTER); button1.setTextColor(Color.BLACK); button1.setTextSize(100); button1.setMarginLeft(500); button1.setMarginTop(70); button1.setPadding(10,0,10,0); button1.setBackground(background0); button1.setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { if (gameover() == false){ changeGrids(grids,2); } } }); layout.addComponent(button1); Button button2=new Button(this); button2.setText("←"); button2.setTextAlignment(TextAlignment.CENTER); button2.setTextColor(Color.BLACK); button2.setTextSize(100); button2.setMarginTop(10); button2.setMarginLeft(400); button2.setPadding(10,0,10,0); button2.setBackground(background0); button2.setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { if (gameover() == false){ changeGrids(grids,-1); } } }); layout.addComponent(button2); Button button3=new Button(this); button3.setText("→"); button3.setTextAlignment(TextAlignment.CENTER); button3.setTextColor(Color.BLACK); button3.setTextSize(100); button3.setMarginLeft(600); button3.setMarginTop(-130); button3.setPadding(10,0,10,0); button3.setBackground(background0); button3.setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { if (gameover() == false){ changeGrids(grids,1); } } }); layout.addComponent(button3); Button button4=new Button(this); button4.setText("↓"); button4.setTextAlignment(TextAlignment.CENTER); button4.setTextColor(Color.BLACK); button4.setTextSize(100); button4.setMarginLeft(500); button4.setMarginTop(10); button4.setPadding(10,0,10,0); button4.setBackground(background0); button4.setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { if (gameover() == false){ changeGrids(grids,-2); } } }); layout.addComponent(button4); drawGrids(grids); if(gameover()){ drawText(); } } public void changeGrids(int[][] grids,int direction){ int row_0 = 3; int column_0 = 3; int temp; for(int row = 0; row < 4; row++) { for (int column = 0; column < 4; column++) { if(grids[row][column] == 0){ row_0 = row; column_0 = column; } } } if(direction == -1 && (column_0 + 1) = 0) { temp = grids[row_0][column_0 - 1]; grids[row_0][column_0 - 1] = grids[row_0][column_0]; grids[row_0][column_0] = temp; } else if (direction == 2 && (row_0 + 1) = 0) { temp = grids[row_0 - 1][column_0]; grids[row_0 - 1][column_0] = grids[row_0][column_0]; grids[row_0][column_0] = temp; } } public boolean gameover() { int[][] gameoverGrids = {{1, 2, 3, 4}, {5, 6, 7, 8,}, {9, 10, 11, 12}, {13, 14, 15, 0}}; for (int row = 0; row < 4; row++) { for (int column = 0; column < 4; column++) { if (grids[row][column] != gameoverGrids[row][column]) { return false; } } } return true; } public void drawText(){ Text text=new Text(this); text.setText("游戏成功"); text.setTextSize(100); text.setTextColor(Color.RED); text.setTextAlignment(TextAlignment.CENTER); text.setMarginsTopAndBottom(-2000,0); text.setMarginsLeftAndRight(350,0); layout.addComponent(text); setUIContent(layout); } @Override public void onActive() { super.onActive(); } @Override public void onForeground(Intent intent) { super.onForeground(intent); }}
这部分代码中,编辑了按钮样式,以及颜色配置还有所有的活动形式。其中数组部分采用的是二维数组的形式。
上下左右四个箭头分别代表的是空格子上下左右的四个方格,以下箭头按钮为例,当点击上的时候,空格子下面的一个方格平移到空格子的位置,这样空格就下移了一个格子,当空格子在边缘时,点击按钮时会进行一个判断,看数组是否越界。当完成游戏后,会出现红色字样,提示你游戏成功。
ps:我还没赢过,就不展示结束的图啦。代码中有这一部分内容,见drawText().
配置及其他代码如下。
"string": [ { "name": "app_name", "value": "MyPnone2" }, { "name": "mainability_description", "value": "Java_Phone_Empty Feature Ability" } ]}
{ "app": { "bundleName": "com.example.mypnone2", "vendor": "example", "version": { "code": 1, "name": "1.0" }, "apiVersion": { "compatible": 3, "target": 4, "releaseType": "Beta1" } }, "deviceConfig": {}, "module": { "package": "com.example.mypnone2", "name": ".MyApplication", "deviceType": [ "phone" ], "distro": { "deliveryWithInstall": true, "moduleName": "entry", "moduleType": "entry" }, "abilities": [ { "skills": [ { "entities": ["entity.system.home" ], "actions": ["action.system.home" ] } ], "orientation": "unspecified", "name": "com.example.mypnone2.MainAbility", "icon": "$media:icon", "description": "$string:mainability_description", "label": "$string:app_name", "type": "page", "launchType": "standard", "metaData": { "customizeData": [ {"name": "hwc-theme","value": "androidhwext:style/Theme.Emui.Light.NoTitleBar","extra": "" } ] } } ] }}