diff --git a/src/main/config.json b/src/main/config.json
new file mode 100644
index 0000000..7c6daca
--- /dev/null
+++ b/src/main/config.json
@@ -0,0 +1,42 @@
+{
+ "app": {
+ "apiVersion": {
+ "compatible": 3,
+ "target": 4,
+ "releaseType": "Release"
+ },
+ "bundleName": "my.game20481.myapplication",
+ "vendor": "game20481",
+ "version": {
+ "code": 1000000,
+ "name": "1.0.0"
+ }
+ },
+ "deviceConfig": {},
+ "module": {
+ "deviceType": [
+ "liteWearable"
+ ],
+ "distro": {
+ "deliveryWithInstall": true,
+ "moduleName": "entry",
+ "moduleType": "entry"
+ },
+ "abilities": [
+ {
+ "name": "default",
+ "icon": "$media:icon",
+ "label": "$string:entry_MainAbility",
+ "type": "page"
+ }
+ ],
+ "js": [
+ {
+ "pages": [
+ "pages/index/index"
+ ],
+ "name": "default"
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/src/main/js/default/app.js b/src/main/js/default/app.js
new file mode 100644
index 0000000..6d060ff
--- /dev/null
+++ b/src/main/js/default/app.js
@@ -0,0 +1,8 @@
+export default {
+ onCreate() {
+ console.info("Application onCreate");
+ },
+ onDestroy() {
+ console.info("Application onDestroy");
+ }
+};
diff --git a/src/main/js/default/pages/index/index.css b/src/main/js/default/pages/index/index.css
new file mode 100644
index 0000000..5cf9016
--- /dev/null
+++ b/src/main/js/default/pages/index/index.css
@@ -0,0 +1,62 @@
+.container{
+ width: 454px;
+ height: 454px;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+}
+.score{
+ text-align: center;
+ width: 234px;
+ height: 30px;
+ letter-spacing: 0px;
+ margin-top: 4px;
+ margin-bottom:6px;
+}
+.best{
+ text-align: center;
+ width: 234px;
+ height: 30px;
+ letter-spacing: 0px;
+ margin-top: 19px;
+}
+.tile-wrap{
+ width: 300px;
+ height: 300px;
+ flex-wrap: wrap;
+ background-color: #FFFFFF;
+}
+.tile{
+ width: 70px;
+ height: 70px;
+ margin-top: 4px;
+ margin-left: 4px;
+ justify-content: center;
+ align-items: center;
+}
+.btn{
+ width: 135px;
+ height: 45px;
+ background-color: #1F71FF;
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+.text{
+ font-size: 30px;
+ color: #000000;
+}
+.stack{
+ width: 300px;
+ height: 300px;
+}
+.subcontainer{
+ width: 300px;
+ height: 300px;
+ justify-content: center;
+ align-items: center;
+ background-color: transparent;
+}
+.gameover{
+ font-size: 40px;
+ color: #FF7500;
+}
\ No newline at end of file
diff --git a/src/main/js/default/pages/index/index.hml b/src/main/js/default/pages/index/index.hml
new file mode 100644
index 0000000..72e7631
--- /dev/null
+++ b/src/main/js/default/pages/index/index.hml
@@ -0,0 +1,23 @@
+
+
+ Best:{{best}}
+
+
+ Score:{{score}}
+
+
+
+
+
+ {{$item.text}}
+
+
+
+
+
+ Gameover!
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/js/default/pages/index/index.js b/src/main/js/default/pages/index/index.js
new file mode 100644
index 0000000..813d0fc
--- /dev/null
+++ b/src/main/js/default/pages/index/index.js
@@ -0,0 +1,127 @@
+import brightness from '@system.brightness';
+let numbers,newNumbers;
+export default{
+ data:{
+ score:0,
+ best:0,
+ tiles:[],
+ isShow:false,
+ },
+ onInit() {
+ this.isShow=false;
+ this.score=0;
+ this.tiles=[{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""}];
+ numbers=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
+ newNumbers=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
+ this.supplyNumber();
+ this.supplyNumber();
+ this.updateView();
+ brightness.setKeepScreenOn({keepScreenOn: true,});
+ brightness.setMode({mode: 1,});
+ },
+ supplyNumber(){
+ let positions=[];
+ for(let i=0;i<=15;i++){
+ if(!newNumbers[i]) positions.push(i);
+ }
+ let h=Math.floor(Math.random()*positions.length);
+ if (Math.random()<=0.8){
+ newNumbers[positions[h]]=2;
+ }else{
+ newNumbers[positions[h]]=4;
+ }
+ },
+ onSwipe(e) {
+ newNumbers=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
+ let start=0,differ=0,step=0;
+ switch(e.direction){
+ case 'left':
+ start=0;
+ differ=1;
+ step=4;
+ break;
+ case 'right':
+ start=3;
+ differ=-1;
+ step=4;
+ break;
+ case 'up':
+ start=0;
+ differ=4;
+ step=1;
+ break;
+ case 'down':
+ start=12;
+ differ=-4;
+ step=1;
+ break;
+ }
+ let ids;
+ for (let j=0;j<=3;j++){
+ ids=this.getIds(start, differ);
+ let before=null;
+ let noZeros=0;
+ for(let k=0;k<=3;k++){
+ let id=ids[k];
+ let number=numbers[id];
+ if (number!=0){
+ if(number==before){
+ this.score+=number*2;
+ newNumbers[ids[noZeros-1]]*=2;
+ before=null;
+ }else{
+ newNumbers[ids[noZeros]]=number;
+ before=number;
+ noZeros+=1;
+ }
+ }
+ }
+ start+=step;
+ }
+ if(this.best>=this.score){
+ this.best=this.best;
+ }else{
+ this.best=this.score;}
+ if(numbers.toString()!=newNumbers.toString()){
+ this.supplyNumber();
+ this.updateView();
+ newNumbers=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
+ if(this.isGameOver()==true){this.isShow=true;}
+ }
+ },
+ getIds(start, differ){
+ let ids=[];
+ for (let z=4;z>=1;z--){
+ ids.push(start);
+ start+=differ;
+ }
+ return ids;
+ },
+ updateView() {
+ for (let x=0;x<=15;x++) {
+ if (newNumbers[x]!=0){
+ this.tiles[x].text=newNumbers[x].toString();
+ }else{
+ this.tiles[x].text="";
+ }
+ }
+ numbers=newNumbers;
+ },
+ isGameOver(){
+ if(this.isGridsFull()==true && this.isGridsNotMergeable()==true) return true;
+ },
+ isGridsFull(){
+ if(numbers.indexOf(0)==-1){return true;}
+ },
+ isGridsNotMergeable(){
+ for(let l=0;l<=15;l++){
+ if(l<=14){
+ if(numbers[l]==numbers[l+1]&&(l+1)%4!=0) return false;
+ }
+ if(l<=11){
+ if(numbers[l]==numbers[l+4]) return false;
+ }
+ }
+ return true;
+ },
+}
\ No newline at end of file
diff --git a/src/main/resources/base/element/string.json b/src/main/resources/base/element/string.json
new file mode 100644
index 0000000..2be18c1
--- /dev/null
+++ b/src/main/resources/base/element/string.json
@@ -0,0 +1,8 @@
+{
+ "string": [
+ {
+ "name": "entry_MainAbility",
+ "value": "entry_MainAbility"
+ }
+ ]
+}
diff --git a/src/main/resources/base/media/icon.png b/src/main/resources/base/media/icon.png
new file mode 100644
index 0000000..7bd96fb
Binary files /dev/null and b/src/main/resources/base/media/icon.png differ
diff --git a/src/main/resources/base/media/icon_small.png b/src/main/resources/base/media/icon_small.png
new file mode 100644
index 0000000..2a63a6b
Binary files /dev/null and b/src/main/resources/base/media/icon_small.png differ