diff --git a/drumming/figs/evolution.png b/drumming/figs/evolution.png index 4ad4eae..4552ee7 100644 Binary files a/drumming/figs/evolution.png and b/drumming/figs/evolution.png differ diff --git a/gbanging/README.md b/gbanging/README.md new file mode 100644 index 0000000..c0d9fe8 --- /dev/null +++ b/gbanging/README.md @@ -0,0 +1,21 @@ +# pointgaming +### 1、项目说明 +总体思路:TSP求解仿真仿真项目开发的总体思路如图1.1示意,旅行商问题求解仿真项目拟实现一个仿真系统。具体功能描述:(1)能够让读者产生一个问题规模为n的TSP,可以手工添加节点、边及权值来产生,也可以由程序自动产生,并在屏幕上显示;(2)能够以遍历算法和贪心算法自动求解该TSP,并将问题的解以可视化的方式显示;(3)能够支持用户手动标记一条路径,然后系统判断该路径是否是贪心算法路径;(4)能够获取地图中的城市相关数据,构造TSP并进行求解。 + 图1.1 项目开发的总体思路图 + + + +### 2、开发环境说明 +(1)系统版本:OpenHarmony 4.0 Release +(2)SDK版本:API 10 +(3)Model类型:Stage +(4)DevEco Studio版本:Deveco Studio 4.0 release +(5)硬件环境:Unionpi Whale、RK3566开发板 +(6)预览器参数:(1)DeviceType:default;(2)Resolution:560-1280;(3)DPI:240;其余参数自定。 +### 3、项目主要函数调用关系图与项目输出界面演进图 + 图3.1 项目主要函数调用关系图 + + + + 图3.2 项目输出界面演进图 + \ No newline at end of file diff --git a/gbanging/figs/evolution.png b/gbanging/figs/evolution.png new file mode 100644 index 0000000..4ad4eae Binary files /dev/null and b/gbanging/figs/evolution.png differ diff --git a/gbanging/figs/overall.png b/gbanging/figs/overall.png new file mode 100644 index 0000000..0ec423e Binary files /dev/null and b/gbanging/figs/overall.png differ diff --git a/gbanging/figs/relation.png b/gbanging/figs/relation.png new file mode 100644 index 0000000..64c5039 Binary files /dev/null and b/gbanging/figs/relation.png differ diff --git a/gbanging/gbang/.gitignore b/gbanging/gbang/.gitignore new file mode 100644 index 0000000..d2ff201 --- /dev/null +++ b/gbanging/gbang/.gitignore @@ -0,0 +1,12 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test +/.appanalyzer \ No newline at end of file diff --git a/gbanging/gbang/AppScope/app.json5 b/gbanging/gbang/AppScope/app.json5 new file mode 100644 index 0000000..7d58dc5 --- /dev/null +++ b/gbanging/gbang/AppScope/app.json5 @@ -0,0 +1,10 @@ +{ + "app": { + "bundleName": "ets.text.book.relational.GBang", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:layered_image", + "label": "$string:app_name" + } +} diff --git a/gbanging/gbang/AppScope/resources/base/element/string.json b/gbanging/gbang/AppScope/resources/base/element/string.json new file mode 100644 index 0000000..7c582a9 --- /dev/null +++ b/gbanging/gbang/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "GBang" + } + ] +} diff --git a/gbanging/gbang/AppScope/resources/base/media/background.png b/gbanging/gbang/AppScope/resources/base/media/background.png new file mode 100644 index 0000000..7af92c3 Binary files /dev/null and b/gbanging/gbang/AppScope/resources/base/media/background.png differ diff --git a/gbanging/gbang/AppScope/resources/base/media/foreground.png b/gbanging/gbang/AppScope/resources/base/media/foreground.png new file mode 100644 index 0000000..97014d3 Binary files /dev/null and b/gbanging/gbang/AppScope/resources/base/media/foreground.png differ diff --git a/gbanging/gbang/AppScope/resources/base/media/layered_image.json b/gbanging/gbang/AppScope/resources/base/media/layered_image.json new file mode 100644 index 0000000..fb49920 --- /dev/null +++ b/gbanging/gbang/AppScope/resources/base/media/layered_image.json @@ -0,0 +1,7 @@ +{ + "layered-image": + { + "background" : "$media:background", + "foreground" : "$media:foreground" + } +} \ No newline at end of file diff --git a/gbanging/gbang/build-profile.json5 b/gbanging/gbang/build-profile.json5 new file mode 100644 index 0000000..cda5138 --- /dev/null +++ b/gbanging/gbang/build-profile.json5 @@ -0,0 +1,49 @@ +{ + "app": { + "signingConfigs": [ + { + "name": "default", + "material": { + "certpath": "C:/Users/Lee/.ohos/config/openharmony/default_GBang12_ywcc4wKsHX3KtIUfRy1nhL3K1JasWo-jsUoNCbLix08=.cer", + "keyAlias": "debugKey", + "keyPassword": "0000001A289116FFCB07EEBD1C5D4E5B0A6272248114C05A617BCBF5823BAD5B75CE453C4A386555ADB7", + "profile": "C:/Users/Lee/.ohos/config/openharmony/default_GBang12_ywcc4wKsHX3KtIUfRy1nhL3K1JasWo-jsUoNCbLix08=.p7b", + "signAlg": "SHA256withECDSA", + "storeFile": "C:/Users/Lee/.ohos/config/openharmony/default_GBang12_ywcc4wKsHX3KtIUfRy1nhL3K1JasWo-jsUoNCbLix08=.p12", + "storePassword": "0000001A66C2EAC9556A0F4ADB4EA098E038D8AA4C5468BB2584E4EC05D8FF72E1BF8BB2C137A6B84B74" + } + } + ], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compileSdkVersion": 12, + "compatibleSdkVersion": 12, + "runtimeOS": "OpenHarmony" + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/gbanging/gbang/code-linter.json5 b/gbanging/gbang/code-linter.json5 new file mode 100644 index 0000000..073990f --- /dev/null +++ b/gbanging/gbang/code-linter.json5 @@ -0,0 +1,32 @@ +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "@security/no-unsafe-aes": "error", + "@security/no-unsafe-hash": "error", + "@security/no-unsafe-mac": "warn", + "@security/no-unsafe-dh": "error", + "@security/no-unsafe-dsa": "error", + "@security/no-unsafe-ecdsa": "error", + "@security/no-unsafe-rsa-encrypt": "error", + "@security/no-unsafe-rsa-sign": "error", + "@security/no-unsafe-rsa-key": "error", + "@security/no-unsafe-dsa-key": "error", + "@security/no-unsafe-dh-key": "error", + "@security/no-unsafe-3des": "error" + } +} \ No newline at end of file diff --git a/gbanging/gbang/entry/.gitignore b/gbanging/gbang/entry/.gitignore new file mode 100644 index 0000000..e2713a2 --- /dev/null +++ b/gbanging/gbang/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/gbanging/gbang/entry/build-profile.json5 b/gbanging/gbang/entry/build-profile.json5 new file mode 100644 index 0000000..4d61187 --- /dev/null +++ b/gbanging/gbang/entry/build-profile.json5 @@ -0,0 +1,28 @@ +{ + "apiType": "stageMode", + "buildOption": { + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/gbanging/gbang/entry/hvigorfile.ts b/gbanging/gbang/entry/hvigorfile.ts new file mode 100644 index 0000000..b0e3a1a --- /dev/null +++ b/gbanging/gbang/entry/hvigorfile.ts @@ -0,0 +1,6 @@ +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins: [] /* Custom plugin to extend the functionality of Hvigor. */ +} \ No newline at end of file diff --git a/gbanging/gbang/entry/obfuscation-rules.txt b/gbanging/gbang/entry/obfuscation-rules.txt new file mode 100644 index 0000000..272efb6 --- /dev/null +++ b/gbanging/gbang/entry/obfuscation-rules.txt @@ -0,0 +1,23 @@ +# Define project specific obfuscation rules here. +# You can include the obfuscation configuration files in the current module's build-profile.json5. +# +# For more details, see +# https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/source-obfuscation-V5 + +# Obfuscation options: +# -disable-obfuscation: disable all obfuscations +# -enable-property-obfuscation: obfuscate the property names +# -enable-toplevel-obfuscation: obfuscate the names in the global scope +# -compact: remove unnecessary blank spaces and all line feeds +# -remove-log: remove all console.* statements +# -print-namecache: print the name cache that contains the mapping from the old names to new names +# -apply-namecache: reuse the given cache file + +# Keep options: +# -keep-property-name: specifies property names that you want to keep +# -keep-global-name: specifies names that you want to keep in the global scope + +-enable-property-obfuscation +-enable-toplevel-obfuscation +-enable-filename-obfuscation +-enable-export-obfuscation \ No newline at end of file diff --git a/gbanging/gbang/entry/oh-package.json5 b/gbanging/gbang/entry/oh-package.json5 new file mode 100644 index 0000000..248c3b7 --- /dev/null +++ b/gbanging/gbang/entry/oh-package.json5 @@ -0,0 +1,10 @@ +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": {} +} + diff --git a/gbanging/gbang/entry/src/main/ets/classes/Chess.ets b/gbanging/gbang/entry/src/main/ets/classes/Chess.ets new file mode 100644 index 0000000..e84198d --- /dev/null +++ b/gbanging/gbang/entry/src/main/ets/classes/Chess.ets @@ -0,0 +1,835 @@ +interface ChessPiece { + Cstep: number; + Cstate: number; +} + +interface Regret_xy { + x: number; + y: number; +} + +const TAG='funcitons' +export class Chess { + length: number // 棋盘的长 + breadth: number // 棋盘的宽 + ChessData: ChessPiece[][]//存储棋子数据 + Currently_step: number // 棋子当前进行的步数 + Chessimg: number[][] + regretFlAG: Regret_xy[]//悔棋的标签 + Relabel: number[][] // 复盘的标签 + ifReview: number//是否复盘 + Score: number[][] // 计分数组 + Max_Score: number//最大分数 + Counts: number + New_count: number + Ovalone: number // 代表棋子 + WinFLAG: number // 判断是否取得胜利 + Gameover: number // 判断游戏是否结束 + Depth: number // 搜索的深度 + player: number // 轮到下棋的标志,1=下,0=不下 + player2: number // 轮到下棋的标志,1=下,0=不下 + computer: number // 轮到下棋的标志,1=下,0=不下 + Current_Player:boolean//表示当前落子方 + myColor: number // 玩家选择的棋子颜色 + player2color: number//玩家2的棋子颜色 + computercolor: number // 电脑的棋子颜色 + Chess_Mode: number // 对弈方式 (=0:人-人;=1:人【黑】-机【白】;=2:人【白】-机【黑】) + ifRandomChess:boolean//表示是否为随机棋局 + ifRefresh:boolean//判断是否重新开始 + ifSuggest:boolean//判断是否使用了落子建议 + SuggestChessData: ChessPiece[][]//建议落子位置存储(多次点击落子建议时) + message:string | undefined//提示信息 + ifSaveChess:boolean//是否保存了棋局 + ifResetChess:boolean;//是否还原棋局 + writenLen:number;//写入棋局步数数据的长度 + + chessDataState: number[][] = [ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ] // 提前写好的棋盘 + + chessDataStep: number[][] = [ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 22, 5, 21, 17, 23, 10, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 12, 1, 11, 9, 13, 14, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 3, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 18, 4, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ] // 提前写好的棋盘的棋子对应的步数 + + constructor(len: number, bre: number) { + this.length = len + this.breadth = bre + this.Currently_step = 0 + this.ifReview = 0 + this.Max_Score = 0 + this.Counts = 0 + this.New_count = 0 + this.Ovalone = 0 + this.WinFLAG = 0 + this.Gameover = 0 + this.Depth = 0 + this.player = 0 + this.player2 = 0 + this.computer = 0 + this.Current_Player = false + this.myColor = 0 + this.player2color = 0 + this.computercolor = 0 + this.Chess_Mode = 3 + this.writenLen = 0 + + this.ifRandomChess=false + this.ifRefresh=false + this.ifSuggest=false + this.message='' + this.ifSaveChess=false + this.ifResetChess=false + + // 初始化ChessData + this.ChessData = new Array(len) + this.Chessimg = new Array(len) + this.regretFlAG = new Array(this.length * this.breadth) + this.SuggestChessData=new Array(len) + for (let i = 0; i < this.length * this.breadth; i++) { + this.regretFlAG[i] = {x: 0, y: 0} + } + this.Relabel = new Array(len) + this.Score = new Array(len) + for (let i = 0; i < len; i++) { + this.ChessData[i] = new Array(bre) + this.Chessimg[i] = new Array(bre) + this.Relabel[i] = new Array(bre) + this.Score[i] = new Array(bre) + this.SuggestChessData[i]=new Array(bre) + for (let j = 0; j < bre; j++) { + this.ChessData[i][j] = { Cstate: 0, Cstep: 0 } // Cstate=0无棋子,1有黑棋子,2有白棋子;Cstep为该棋子落子的步骤 + this.Chessimg[i][j] = 0 + this.Relabel[i][j] = 0 + this.Score[i][j] = 0 + this.SuggestChessData[i][j] = { Cstate: 0, Cstep: 0 } + } + } + } + //估值函數 + count_Score(x: number, y: number, computerColor: number) { + let sum = 0 + let value = [0, 0, 0, 0] + let upcount = [0, 0, 0, 0]// 左、上、左斜上、左斜下 棋子数 + let downcount = [0, 0, 0, 0]// 右、下、右斜向下、右斜向上 棋子数 + let upflag = [0, 0, 0, 0]// 左、上、左斜上、左斜下 空格数 + let downflag = [0, 0, 0, 0]// 右、下、右斜向下、右斜向上 空格数 + for (let color = 1; color < 3; color++) { + this.ChessData[x][y].Cstate = color + for (let i = x - 1; i > -1; i--) {// 计算左边棋子数量 + if (this.ChessData[i][y].Cstate == color) {//左侧有自己的棋子 + upcount[0] += 1 + } else if (this.ChessData[i][y].Cstate != 0 && this.ChessData[i][y].Cstate != color) {//左侧有对方的棋子 + upflag[0] = -1 + break + } else if (this.ChessData[i][y].Cstate == 0) {//左侧没有棋子 + upflag[0] = 1 + if (i - 1 >= 0 && this.ChessData[i - 1][y].Cstate == 0) { + upflag[0] = 2 //表示有两个空格 + } else { + break + } + if (i - 2 >= 0 && this.ChessData[i - 2][y].Cstate == 0) { + upflag[0] = 3 //表示有三个空格 + } else { + break + } + break + } + } + for (let i = x + 1; i < this.breadth; i++) {// 计算右边棋子数量 + if (this.ChessData[i][y].Cstate == color) {//右侧有自己棋子 + downcount[0] += 1 + } else if (this.ChessData[i][y].Cstate != 0 && this.ChessData[i][y].Cstate != color) {// 右侧有对方棋子 + downflag[0] = -1 + break + } else if (this.ChessData[i][y].Cstate == 0) {//右侧没有棋子 + downflag[0] = 1 + if (i + 1 < this.breadth && this.ChessData[i + 1][y].Cstate == 0) { + downflag[0] = 2//表示有两个空格 + } else { + break + } + if (i + 2 < this.breadth && this.ChessData[i + 2][y].Cstate == 0) { + downflag[0] = 3//表示有三个空格 + } else { + break + } + break + } + } + for (let i = y - 1; i > -1; i--) {//计算方向向上 + if (this.ChessData[x][i].Cstate == color) {//上有自己棋子 + upcount[1] += 1 + } else if (this.ChessData[x][i].Cstate != 0 && this.ChessData[x][i].Cstate != color) {//上有对方棋子 + upflag[1] = -1 + break + } else if (this.ChessData[x][i].Cstate == 0) {//上没有棋子 + upflag[1] = 1 + if (i - 1 >= 0 && this.ChessData[x][i - 1].Cstate == 0) { + upflag[1] = 2//表示上有两个空格 + } else { + break + } + if (i - 2 >= 0 && this.ChessData[x][i - 2].Cstate == 0) { + upflag[1] = 3//表示上有三个空格 + } else { + break + } + break + } + } + for (let i = y + 1; i < this.length; i++) {//计算方向向下 + if (this.ChessData[x][i].Cstate == color) {//下有自己棋子 + downcount[1] += 1 + } else if (this.ChessData[x][i].Cstate != 0 && this.ChessData[x][i].Cstate != color) {//下有对方棋子 + downflag[1] = -1 + break + } else if (this.ChessData[x][i].Cstate == 0) {//下没有棋子 + downflag[1] = 1 + if (i + 1 < this.length && this.ChessData[x][i + 1].Cstate == 0) { + downflag[1] = 2//表示下有两个空格 + } else { + break + } + if (i + 2 < this.length && this.ChessData[x][i + 2].Cstate == 0) { + downflag[1] = 3//表示下有三个空格 + } else { + break + } + break + } + } + let j = 1 + for (let i = x - 1; i > -1; i--) {//计算左斜向上 + if (y - j >= 0 && this.ChessData[i][y - j].Cstate == color) {//左斜向上有自己棋子 + upcount[2] += 1 + j += 1 + } else if (y - j >= 0 && this.ChessData[i][y - j].Cstate != 0 && this.ChessData[i][y - j].Cstate != color) {//左斜向上有对方棋子 + upflag[2] = -1 + j += 1 + break + } else if (y - j >= 0 && this.ChessData[i][y - j].Cstate == 0) {//左斜向上没有棋子 + upflag[2] = 1 + if (i - 1 >= 0 && y - j - 1 >= 0 && this.ChessData[i - 1][y - j - 1].Cstate == 0) { + upflag[2] = 2 //表示有两个空格 + j += 1 + } else { + j += 1 + break + } + if (i - 2 >= 0 && y - j - 2 >= 0 && this.ChessData[i - 2][y - j - 2].Cstate == 0) { + upflag[2] = 3 //表示有三个空格 + j += 1 + } else { + j += 1 + break + } + j += 1 + break + } + } + j = 1 + for (let i = x + 1; i < this.breadth; i++) {//计算右斜向下 + if (y + j < this.length && this.ChessData[i][y + j].Cstate == color) {//右斜向下有自己棋子 + downcount[2] += 1 + j += 1 + } else if (y + j < this.length && this.ChessData[i][y + j].Cstate != 0 && this.ChessData[i][y + j].Cstate != color) {//右斜向下有对方棋子 + downflag[2] = -1 + j += 1 + break + } else if (y + j < this.length && this.ChessData[i][y + j].Cstate == 0) {//右斜向下没有棋子 + downflag[2] = 1 + if (i + 1 < this.breadth && y + j + 1 < this.length && this.ChessData[i + 1][y + j + 1].Cstate == 0) { + downflag[2] = 2//表示有两个空格 + j += 1 + } else { + j += 1 + break + } + if (i + 2 < this.breadth && y + j + 2 < this.length && this.ChessData[i + 2][y + j + 2].Cstate == 0) { + downflag[2] = 3//表示有三个空格 + j += 1 + } else { + j += 1 + break + } + j += 1 + break + } + } + j = 1 + for (let i = x + 1; i < this.breadth; i++) {//计算右斜向上 + if (y - j >= 0 && this.ChessData[i][y - j].Cstate == color) {//右斜向上有自己棋子 + downcount[3] += 1 + j += 1 + } else if (y - j >= 0 && this.ChessData[i][y - j].Cstate != 0 && this.ChessData[i][y - j].Cstate != color) {//右斜向上有对方棋子 + downflag[3] = -1 + j += 1 + break + } else if (y - j >= 0 && this.ChessData[i][y - j].Cstate == 0) {//右斜向上没有棋子 + downflag[3] = 1 + if (i + 1 < this.breadth && y - j - 1 >= 0 && this.ChessData[i + 1][y - j - 1].Cstate == 0) { + downflag[3] = 2//表示有两个空格 + j += 1 + } else { + j += 1 + break + } + if (i + 2 < this.breadth && y - j - 2 >= 0 && this.ChessData[i + 2][y - j - 2].Cstate == 0) { + downflag[3] = 3//表示有三个空格 + j += 1 + } else { + j += 1 + break + } + j += 1 + break + } + } + j = 1 + for (let i = x - 1; i > -1; i--) {//计算左斜向下 + if (y + j < this.length && this.ChessData[i][y + j].Cstate == color) {//左斜向下有自己棋子 + upcount[3] += 1 + j += 1 + } else if (y + j < this.length && this.ChessData[i][y + j].Cstate != 0 && this.ChessData[i][y + j].Cstate != color) {//左斜向下有对方棋子 + upflag[3] = -1 + j += 1 + break + } else if (y + j < this.length && this.ChessData[i][y + j].Cstate == 0) {//左斜向下没有棋子 + upflag[3] = 1 + if (i - 1 >= 0 && y + j + 1 < this.length && this.ChessData[i - 1][y + j + 1].Cstate == 0) { + upflag[3] = 2//表示有两个空格 + j += 1 + } else { + j += 1 + break + } + if (i - 2 >= 0 && y + j + 2 < this.length && this.ChessData[i - 2][y + j + 2].Cstate == 0) { + upflag[3] = 3//表示有三个空格 + j += 1 + } else { + j += 1 + break + } + j += 1 + break + } + } + + //评分计算,如果是电脑方的话分数要高一点 + if (computerColor == this.ChessData[x][y].Cstate) {//人机对战 + for (let i = 0; i < 4; i++) { + let count = upcount[i] + downcount[i] + 1 + if (count == 5) {//成五 + value[i] = 40000 + } else if (count == 4) { + if (upflag[i] >= 1 && downflag[i] >= 1) {//活四 + value[i] = 19000 + } + if ((upflag[i] >= 1 && downflag[i] == -1) || (upflag[i] == -1 && downflag[i] >= 1)) {//眠四 + value[i] = 3000 + } + if (upflag[i] == -1 && downflag[i] == -1) {//死四 + value[i] = -50 + } + } else if (count == 3) {//活三 + if ((upflag[i] >= 2 && downflag[i] >= 1) || (upflag[i] >= 1 && downflag[i] >= 2)) {//活三 + value[i] = 4000 + } + if ((upflag[i] >= 2 && downflag[i] == -1) || (upflag[i] == -1 && downflag[i] >= 2) || (upflag[i] == 1 && downflag[i] == 1)) {//眠三 + value[i] = 800 + } + if (upflag[i] == -1 && downflag[i] == -1) {//死三 + value[i] = -50 + } + } else if (count == 2) { + if ((upflag[i] >= 3 && downflag[i] >= 1) || (upflag[i] >= 1 && downflag[i] >= 3) || (upflag[i] >= 2 && downflag[i] >= 2)) {//活二 + value[i] = 1050 + } + if ((upflag[i] >= 3 && downflag[i] == -1) || (upflag[i] == -1 && downflag[i] >= 3) || (upflag[i] == 2 && downflag[i] == 1) || (upflag[i] == 1 && downflag[i] == 2)) {//眠二 + value[i] = 350 + } + if ((upflag[i] == -1 && downflag[i] == -1) || (upflag[i] == 1 && downflag[i] == 1) || (upflag[i] == -1 && downflag[i] == 2) || (upflag[i] == 2 && downflag[i] == -1)) {//死二 + value[i] = -50 + } + } else { + if ((upflag[i] >= 3 && downflag[i] >= 2) || (upflag[i] >= 2 && downflag[i] >= 3)) {//活一 + value[i] = 80 + } + if ((upflag[i] == 2 && downflag[i] == 2) || (upflag[i] == 1 && downflag[i] == 3) || (upflag[i] == 3 && downflag[i] == 1) || (upflag[i] == 1 && downflag[i] == 2)) {//眠一 + value[i] = 20 + } + if ((upflag[i] <= 1 && downflag[i] <= 2) || (upflag[i] <= 2 && downflag[i] <= 1) || (upflag[i] <= 3 && downflag[i] == -1) || (upflag[i] == -1 && downflag[i] <= 3)) {//死一 + value[i] = -50 + } + } + } + } else {//双人对战 + for (let i = 0; i < 4; i++) { + let count = upcount[i] + downcount[i] + 1 + if (count == 5) {//成五 + value[i] = 30000 + } else if (count == 4) { + if (upflag[i] >= 1 && downflag[i] >= 1) {//活四 + value[i] = 15000 + } + if ((upflag[i] >= 1 && downflag[i] == -1) || (upflag[i] == -1 && downflag[i] >= 1)) {//眠四 + value[i] = 2500 + } + if (upflag[i] == -1 && downflag[i] == -1) {//死四 + value[i] = -50 + } + } else if (count == 3) { + if ((upflag[i] >= 2 && downflag[i] >= 1) || (upflag[i] >= 1 && downflag[i] >= 2)) {//活三 + value[i] = 3000 + } + if ((upflag[i] >= 2 && downflag[i] == -1) || (upflag[i] == -1 && downflag[i] >= 2) || (upflag[i] == 1 && downflag[i] == 1)) {//眠三 + value[i] = 500 + } + if (upflag[i] == -1 && downflag[i] == -1) {//死三 + value[i] = -50 + } + } else if (count == 2) { + if ((upflag[i] >= 3 && downflag[i] >= 1) || (upflag[i] >= 1 && downflag[i] >= 3) || (upflag[i] >= 2 && downflag[i] >= 2)) {//活二 + value[i] = 650 + } + if ((upflag[i] >= 3 && downflag[i] == -1) || (upflag[i] == -1 && downflag[i] >= 3) || (upflag[i] == 2 && downflag[i] == 1) || (upflag[i] == 1 && downflag[i] == 2)) {//眠二 + value[i] = 150 + } + if ((upflag[i] == -1 && downflag[i] == -1) || (upflag[i] == 1 && downflag[i] == 1) || (upflag[i] == -1 && downflag[i] == 2) || (upflag[i] == 2 && downflag[i] == -1)) {//死二 + value[i] = -50 + } + } else { + if ((upflag[i] >= 3 && downflag[i] >= 2) || (upflag[i] >= 2 && downflag[i] >= 3)) {//活一 + value[i] = 50 + } + if ((upflag[i] == 2 && downflag[i] == 2) || (upflag[i] == 1 && downflag[i] == 3) || (upflag[i] == 3 && downflag[i] == 1) || (upflag[i] == 1 && downflag[i] == 2)) {//眠一 + value[i] = 10 + } + if ((upflag[i] <= 1 && downflag[i] <= 2) || (upflag[i] <= 2 && downflag[i] <= 1) || (upflag[i] <= 3 && downflag[i] == -1) || (upflag[i] == -1 && downflag[i] <= 3)) {//死一 + value[i] = -50 + } + } + } + } + + for (let i = 0; i < 4; i++) { + sum += value[i] + value[i] = 0 + upcount[i] = 0 + downcount[i] = 0 + upflag[i] = 0 + downflag[i] = 0 + } + } + this.ChessData[x][y].Cstate = 0 + return sum + } + + // 定义一个函数实现AI策略:可以根据分数随机选择一个分数最大的位置返回 + return_chess(Depth: number, computercolor: number) { + this.New_count = 0 + this.Max_Score = 0 + this.Counts = 0 + let pos: number[][] = new Array(10) + for (let i = 0; i < 10; i++) { + pos[i] = new Array(2) + for (let j = 0; j < 2; j++) { + pos[i][j] = 0 + } + } + let evaFLAG = 0 + let position = [0, 0] //初始化位置坐标数组 + for (let i = 8 - Depth; i < 11 + Depth; i++) { + for (let j = 8 - Depth; j < 11 + Depth; j++) { + if (0 <= i && i < this.breadth && 0 <= j && j < this.length) { + if (this.ChessData[i][j].Cstate == 0) { + this.Score[i][j] = this.count_Score(i, j, computercolor) + this.New_count += 1 + if (this.Score[i][j] > 0) { + this.Counts += 1 + } + if (this.Max_Score < this.Score[i][j]) { + this.Max_Score = this.Score[i][j] + } + } + } + } + } + for (let i = 8 - Depth; i < 11 + Depth; i++) { + for (let j = 8 - Depth; j < 11 + Depth; j++) { + if (0<= i && i < this.breadth && 0 <= j && j < this.length && this.Score[i][j] == this.Max_Score && this.ChessData[i][j].Cstate == 0) { + pos[evaFLAG][0] = i + pos[evaFLAG][1] = j + evaFLAG += 1 + } + } + } + let m = Math.floor(Math.random()*evaFLAG) // 生成0-evaFLAG的随机整数 + position[0] = pos[m][0] + position[1] = pos[m][1] + return position + } + // 定义一个落子函数,如果用户点击位置合理,则落子 + make_move(pointi: number, pointj: number) { + if (this.ChessData[pointi][pointj].Cstate == 0 && this.myColor == 1 && this.Currently_step % 2 == 0) {//人黑机白 + this.ChessData[pointi][pointj].Cstate = 1 + this.regretFlAG[this.Currently_step].x = pointi + this.regretFlAG[this.Currently_step].y = pointj + this.player = 0 + this.player2 = 1 + this.computer = 1 + this.Currently_step+=1 + console.info(TAG,'make_move的Currently_step+=1执行了,Currently_step= '+this.Currently_step) + this.ChessData[pointi][pointj].Cstep = this.Currently_step + let a = Math.max(Math.abs(pointi - Math.floor((this.breadth - 1) / 2)), Math.abs(pointj - Math.floor((this.length - 1) / 2))) + this.Depth = Math.max(this.Depth, a) + return true + } else if (this.ChessData[pointi][pointj].Cstate == 0 && this.myColor == 2 && this.Currently_step % 2 != 0) {//人白机黑 + this.ChessData[pointi][pointj].Cstate = 2 + this.regretFlAG[this.Currently_step].x = pointi + this.regretFlAG[this.Currently_step].y = pointj + this.player = 0 + this.computer = 1 + this.Currently_step += 1 + this.ChessData[pointi][pointj].Cstep = this.Currently_step + let a = Math.max(Math.abs(pointi - Math.floor((this.breadth - 1) / 2)), Math.abs(pointj - Math.floor((this.length - 1) / 2))) + this.Depth = Math.max(this.Depth, a) + return true + } else if (this.ChessData[pointi][pointj].Cstate == 0 && this.player2color == 2 && this.Currently_step % 2 != 0) {//双人对战 + this.ChessData[pointi][pointj].Cstate = 2 + this.regretFlAG[this.Currently_step].x = pointi + this.regretFlAG[this.Currently_step].y = pointj + this.player = 1 + this.player2 = 0 + this.Currently_step += 1 + this.ChessData[pointi][pointj].Cstep = this.Currently_step + let a = Math.max(Math.abs(pointi - Math.floor((this.breadth - 1) / 2)), Math.abs(pointj - Math.floor((this.length - 1) / 2))) + this.Depth = Math.max(this.Depth, a) + return true + } else { + return false + } + } + + // 定义一个评估某一方向上的棋型函数,辅助进行下一步的落子决策 + get_direction_Score(y:number,x:number,y_offset:number,x_offset:number){ + let nowcount = 0 //落子处我方连续子数 + let _nowcount = 0 //落子处对方连续子数 + let space:boolean|null = null // 我方连续子中有无空格 + let _space:boolean|null = null // 对方连续子中有无空格 + let both = 0 // 我方连续子两端有无阻挡 + let _both = 0 // 对方连续子两端有无阻挡 + let tmp_x = x + let tmp_y = y + + if(0<=(y+y_offset)&&(y+y_offset)<=18&&0<=(x+x_offset)&&(x+x_offset)<=18){ + let Cflag=this.ChessData[y+y_offset][x+x_offset].Cstate + if(Cflag!=0){ + for(let i=1;i<6;i++){ + x+=x_offset + y+=y_offset + if(0<=y&&y<18&&0<=x&&x<18){ + if(Cflag==2){ + if(this.ChessData[y][x].Cstate==2&&this.myColor==2){ + nowcount+=1 + if (space==false){ + space=true + } + }else if(this.ChessData[y][x].Cstate==1&&this.myColor==2){ + _both+=1 + break + }else { + if (space==null){ + space=false + }else{ + break//遇到第二个空格退出 + } + } + } + else if(Cflag==1){ + if(this.ChessData[y][x].Cstate==2&&this.myColor==1){ + _both+=1 + break + }else if(this.ChessData[y][x].Cstate==1&&this.myColor==1){ + _nowcount+=1 + if (_space==false){ + _space=true + } + }else{ + if (_space==null){ + _space=false + }else{ + break + } + } + } + }else{ + //遇到边也就是阻挡 + if(Cflag==2){ + both+=1 + }else if(Cflag==1){ + _both+=1 + } + } + } + } + + if (space==false){ + space=null + } + if (_space==false){ + _space=null + } + } + + x=tmp_x + y=tmp_y + + if(0<=(y-y_offset)&&(y-y_offset)<=18&&0<=(x-x_offset)&&(x-x_offset)<=18){ + let _flag=this.ChessData[y-y_offset][x-x_offset].Cstate + if (_flag!=0){ + for(let i=1;i<6;i++){ + x-=x_offset + y-=y_offset + if(0<=y&&y<18&&0<=x&&x<18){ + if (_flag==2){ + if(this.ChessData[y][x].Cstate==2&&this.myColor==2){ + nowcount+=1 + if (space==false){ + space=true + } + }else if(this.ChessData[y][x].Cstate==1&&this.myColor==2){ + _both+=1 + break + }else { + if (space==null){ + space=false + }else{ + break//遇到第二个空格退出 + } + } + } + else if(_flag==1){ + if(this.ChessData[y][x].Cstate==2&&this.myColor==1){ + _both+=1 + break + }else if(this.ChessData[y][x].Cstate==1&&this.myColor==1){ + _nowcount+=1 + if (_space==false){ + _space=true + } + }else{ + if (_space==null){ + _space=false + }else{ + break + } + } + } + } + else { + //遇到边也就是阻挡 + if(_flag==1){ + both+=1 + }else if(_flag==2){ + _both+=1 + } + } + } + } + } + + let Score=0 + if (nowcount==4){ + Score=10000 + }else if(_nowcount==4){ + Score=9000 + }else if(nowcount==3){ + if (both==0){ + Score=1000 + }else if(both==1){ + Score=100 + }else { + Score=0 + } + }else if(_nowcount==3){ + if (_both==0){ + Score=900 + }else if(_both==1){ + Score=90 + }else { + Score=0 + } + }else if(nowcount==2){ + if(both==0){ + Score=100 + }else if(both==1){ + Score=10 + }else Score=0 + }else if(_nowcount==2){ + if (_both==0){ + Score=90 + }else if(_both==1){ + Score=9 + }else { + Score=0 + } + }else if(nowcount==1){ + Score=10 + }else if(_nowcount==1){ + Score=9 + }else { + Score=0 + } + + if (space||_space){ + Score/=2 + } + return Score + } + + // 定义一个函数获取当前点对各个方向上的评估结果 + get_point_Score(y:number,x:number){ + let Score=0 + // let offset=[[1,0],[0,1],[1,1],[1,-1]] + Score+=this.get_direction_Score(y,x,1,0) + Score+=this.get_direction_Score(y,x,0,1) + Score+=this.get_direction_Score(y,x,1,1) + Score+=this.get_direction_Score(y,x,1,-1) + return Score + } + + // 定义一个函数实现简单的自动落子策略,根据评估函数计算每个位置的得分,并选择得分最高的位置作为下一步的落子位置 + autoactive(){ + let _Score=0 + let position=[-1,-1] + for(let i=0;i<18;i++){ + for(let j=0;j<18;j++){ + if (this.ChessData[i][j].Cstate==0){ + let Score=this.get_point_Score(i,j) + if(Score>_Score){ + position[0]=i + position[1]=j + }else if (Score==_Score){ + let r=Math.floor(Math.random()*101) + if (r%2==0){ + position[0]=i + position[1]=j + } + } + } + } + } + return position + } + + //胜负判定函数 + ChessCheck(): number { + //垂直方向判定 + for (let x = 0; x < this.breadth - 4; x++) { + for (let y = 0; y < this.length; y++) { + if (this.ChessData[x][y].Cstate == 1 && this.ChessData[x + 1][y].Cstate == 1 && this.ChessData[x + 2][y].Cstate == 1 && this.ChessData[x + 3][y].Cstate == 1 && this.ChessData[x + 4][y].Cstate == 1) { + this.Gameover = 1 + return 1 + } + if (this.ChessData[x][y].Cstate == 2 && this.ChessData[x + 1][y].Cstate == 2 && this.ChessData[x + 2][y].Cstate == 2 && this.ChessData[x + 3][y].Cstate == 2 && this.ChessData[x + 4][y].Cstate == 2) { + this.Gameover = 1 + return 2 + } + } + } + //水平方向判定 + for (let x = 0; x < this.breadth; x++) { + for (let y = 0; y < this.length - 4; y++) { + if (this.ChessData[x][y].Cstate == 1 && this.ChessData[x][y + 1].Cstate == 1 && this.ChessData[x][y + 2].Cstate == 1 && this.ChessData[x][y + 3].Cstate == 1 && this.ChessData[x][y + 4].Cstate == 1) { + this.Gameover = 1 + return 1 + } + if (this.ChessData[x][y].Cstate == 2 && this.ChessData[x][y + 1].Cstate == 2 && this.ChessData[x][y + 2].Cstate == 2 && this.ChessData[x][y + 3].Cstate == 2 && this.ChessData[x][y + 4].Cstate == 2) { + this.Gameover = 1 + return 2 + } + } + } + //斜向右判定 + for (let x = 0; x < this.breadth - 4; x++) { + for (let y = 4; y < this.length; y++) { + if (this.ChessData[x][y].Cstate == 1 && this.ChessData[x + 1][y - 1].Cstate == 1 && this.ChessData[x + 2][y - 2].Cstate == 1 && this.ChessData[x + 3][y - 3].Cstate == 1 && this.ChessData[x + 4][y - 4].Cstate == 1) { + this.Gameover = 1 + return 1 + } + if (this.ChessData[x][y].Cstate == 2 && this.ChessData[x + 1][y - 1].Cstate == 2 && this.ChessData[x + 2][y - 2].Cstate == 2 && this.ChessData[x + 3][y - 3].Cstate == 2 && this.ChessData[x + 4][y - 4].Cstate == 2) { + this.Gameover = 1 + return 2 + } + } + } + //斜向左判定 + for (let x = 0; x < this.breadth - 4; x++) { + for (let y = 0; y < this.length - 4; y++) { + if (this.ChessData[x][y].Cstate == 1 && this.ChessData[x + 1][y + 1].Cstate == 1 && this.ChessData[x + 2][y + 2].Cstate == 1 && this.ChessData[x + 3][y + 3].Cstate == 1 && this.ChessData[x + 4][y + 4].Cstate == 1) { + this.Gameover = 1 + return 1 + } + if (this.ChessData[x][y].Cstate == 2 && this.ChessData[x + 1][y + 1].Cstate == 2 && this.ChessData[x + 2][y + 2].Cstate == 2 && this.ChessData[x + 3][y + 3].Cstate == 2 && this.ChessData[x + 4][y + 4].Cstate == 2) { + this.Gameover= 1 + return 2 + } + } + } + let avanum = 0 + for (let x = 0; x < this.breadth; x++) { + for (let y = 0; y < this.length; y++) { + if (this.ChessData[x][y].Cstate == 0) { + break + } else if (this.ChessData[x][y].Cstate != 0) { + avanum += 1 + } + } + } + //平局 + if (avanum == this.length * this.breadth) { + return 3 + } + return 0 + } +} + + diff --git a/gbanging/gbang/entry/src/main/ets/common/constants/CommonConstants.ets b/gbanging/gbang/entry/src/main/ets/common/constants/CommonConstants.ets new file mode 100644 index 0000000..48fd656 --- /dev/null +++ b/gbanging/gbang/entry/src/main/ets/common/constants/CommonConstants.ets @@ -0,0 +1,26 @@ +//公共常量 +export const boardNum: number = 19; //行列数 +export const gridSize: number = 17; //格子大小 + +//8个点 +export const startPoints = [[4, 4], [4, 9], [4, 14], [9, 4], [9, 14], [14, 4], [14, 9], [14, 14]]; +//中心点 +export const centerPoint = [9, 9]; + +//绘制棋盘背景 +export const settings: RenderingContextSettings = new RenderingContextSettings(true); +export const context: CanvasRenderingContext2D = new CanvasRenderingContext2D(settings); + +//绘制棋子 +export const settings2: RenderingContextSettings = new RenderingContextSettings(true); +export const context2: CanvasRenderingContext2D = new CanvasRenderingContext2D(settings2); + +//绘制复盘棋子 +export const settings3: RenderingContextSettings = new RenderingContextSettings(true); +export const context3: CanvasRenderingContext2D = new CanvasRenderingContext2D(settings3); + +export const img1:ImageBitmap = new ImageBitmap("common/pictures/black.png");//黑棋 +export const img2:ImageBitmap = new ImageBitmap("common/pictures/white.png");//白棋 +export const img3:ImageBitmap = new ImageBitmap("common/pictures/sug_black.png");//建议黑棋 +export const img4:ImageBitmap = new ImageBitmap("common/pictures/sug_white.png");//建议白棋 + diff --git a/gbanging/gbang/entry/src/main/ets/common/pictures/black.png b/gbanging/gbang/entry/src/main/ets/common/pictures/black.png new file mode 100644 index 0000000..8090f84 Binary files /dev/null and b/gbanging/gbang/entry/src/main/ets/common/pictures/black.png differ diff --git a/gbanging/gbang/entry/src/main/ets/common/pictures/sug_black.png b/gbanging/gbang/entry/src/main/ets/common/pictures/sug_black.png new file mode 100644 index 0000000..2709b10 Binary files /dev/null and b/gbanging/gbang/entry/src/main/ets/common/pictures/sug_black.png differ diff --git a/gbanging/gbang/entry/src/main/ets/common/pictures/sug_white.png b/gbanging/gbang/entry/src/main/ets/common/pictures/sug_white.png new file mode 100644 index 0000000..3145d3c Binary files /dev/null and b/gbanging/gbang/entry/src/main/ets/common/pictures/sug_white.png differ diff --git a/gbanging/gbang/entry/src/main/ets/common/pictures/white.png b/gbanging/gbang/entry/src/main/ets/common/pictures/white.png new file mode 100644 index 0000000..205eaf0 Binary files /dev/null and b/gbanging/gbang/entry/src/main/ets/common/pictures/white.png differ diff --git a/gbanging/gbang/entry/src/main/ets/components/ChessBoard.ets b/gbanging/gbang/entry/src/main/ets/components/ChessBoard.ets new file mode 100644 index 0000000..42c6640 --- /dev/null +++ b/gbanging/gbang/entry/src/main/ets/components/ChessBoard.ets @@ -0,0 +1,116 @@ +//棋盘 +import {Chess} from '../classes/Chess'; +import {drawChessboard,drawPoints,drawChess,drawReviewChess, deleteChess,playgame_white, playgame_black,doublePeopleGame} from '../utils/functions' +import * as CommonConstant from '../common/constants/CommonConstants' + +@Component +export struct ChessBoard { + @Link myChess:Chess + Chessimgx: number = 0 //玩家落子的横坐标 + Chessimgy: number = 0 //玩家落子的纵坐标 + private playX: number=0; //下棋位置的横坐标 + private playY: number=0; //下棋位置的纵坐标 + + + build() { + Column() { + Stack() { + //绘制棋盘 + Canvas(CommonConstant.context) + // .width('100%') + // .height('100%') + // .margin({ left: 10, top: 5 }) + .width(340) + .height(340) + .onReady(() => { + //绘制五子棋棋盘 + drawChessboard(); + //绘制特殊点 + drawPoints(); + }) + + //实时绘制棋局 + Canvas(CommonConstant.context2) + // .width('100%') + // .height('100%') + // .margin({ left: 10, top: 5 }) + .width(340) + .height(340) + .onTouch((event)=> { + //判断对局是否结束 + if (this.myChess.WinFLAG == 0) { + //计算落子的横纵坐标 + this.playX = event.touches[0].x - CommonConstant.gridSize / 2 + this.playY = event.touches[0].y - CommonConstant.gridSize / 2 + //计算行列数 横纵坐标/格子大小 + let row: number = Math.round(this.playX / CommonConstant.gridSize) + let col: number = Math.round(this.playY / CommonConstant.gridSize) + if (row >= 0 && row <= 19 && col >= 0 && col <= 19) { + //是否开启了落子建议 + if (this.myChess.ifSuggest) { + for (let x = 0; x < this.myChess.breadth; x++) { + for (let y = 0; y < this.myChess.length; y++) { + //存储了建议落子位置数据的棋子删除 + if (this.myChess.SuggestChessData[x][y].Cstate != 0) { + deleteChess(x, y) + //删除后需要清空数据以便后续建议 + this.myChess.SuggestChessData[x][y].Cstate = 0 + } + } + } + this.myChess.ifSuggest = false + } + //判断落子位置是否合法 + if (this.myChess.ChessData[row][col].Cstate == 0) { + drawChess(row, col, this.myChess) + this.myChess.make_move(row, col) + if (this.myChess.Chess_Mode == 0) { + doublePeopleGame(this.myChess) + } else if (this.myChess.Chess_Mode == 1) { + playgame_black(this.myChess) + } else if (this.myChess.Chess_Mode == 2) { + playgame_white(this.myChess) + } + } + } + } + }) + + //判断是否复盘 + if (this.myChess.ifReview == 1) { + //复盘 + Canvas(CommonConstant.context3) + // .width('100%') + // .height('100%') + // .margin({ left: 10, top: 5 }) + .width(340) + .height(340) + .onReady(()=>{ + for (let x = 0; x < this.myChess.breadth; x++) { + for (let y = 0; y < this.myChess.length; y++) { + drawReviewChess(x,y,this.myChess) + } + } + }) + } + } + // .width('100%') + // .height('100%') + .width(350) + .height(350) + .backgroundImage($r('app.media.blankChessBoard')) + .backgroundImageSize({height:350,width:350})//开发板 + // .backgroundImageSize({height:1050,width:1000})//模拟器 + //.backgroundImageSize({width:CommonConstant.gridSize*20,height:CommonConstant.gridSize*21}) + // .backgroundImagePosition(Alignment.Center) + } + .alignItems(HorizontalAlign.Center) + .justifyContent(FlexAlign.Center) + .height('100%') + .width('100%') + } +} + + + + diff --git a/gbanging/gbang/entry/src/main/ets/components/GameDialog.ets b/gbanging/gbang/entry/src/main/ets/components/GameDialog.ets new file mode 100644 index 0000000..30927ec --- /dev/null +++ b/gbanging/gbang/entry/src/main/ets/components/GameDialog.ets @@ -0,0 +1,107 @@ +//游戏弹窗 +import { Chess } from '../classes/Chess'; +import { doublepeople, peocomblack, peocomwhite, resetLast, saveCurrent,playgame_black,playgame_white} from '../utils/functions'; + +@CustomDialog +export default struct GameDialog { + controller: CustomDialogController + + @State ifSetMode:boolean=false + @Link myChess:Chess + + build(){ + Column(){ + if(this.ifSetMode){ + Column({space:10}){ + Text('人机模式(机白)') + .fontColor(Color.White) + .fontWeight(500) + .fontSize(18) + .onClick(()=>{ + this.controller.close() + setTimeout(()=>{ + this.myChess.Current_Player=true + this.myChess.ifRandomChess=false + peocomblack(this.myChess) + this.ifSetMode=false + },200) + }) + + Text('人机模式(机黑)') + .fontColor(Color.White) + .fontWeight(500) + .fontSize(18) + .onClick(()=>{ + this.controller.close() + setTimeout(()=>{ + this.myChess.Current_Player=false + this.myChess.ifRandomChess=false + peocomwhite(this.myChess) + this.ifSetMode=false + },200) + }) + + Text('双人模式') + .fontColor(Color.White) + .fontWeight(500) + .fontSize(18) + .onClick(()=>{ + this.controller.close() + setTimeout(()=>{ + this.myChess.Current_Player=true + this.myChess.ifRandomChess=false + doublepeople(this.myChess) + this.ifSetMode=false + },200) + }) + } + }else{ + Column({space:10}){ + Text('开始游戏') + .fontColor(Color.White) + .fontWeight(FontWeight.Normal) + .fontSize(18) + .onClick(()=>{ + this.ifSetMode=true + }) + + Text('保存当前局面') + .fontColor(Color.White) + .fontWeight(FontWeight.Normal) + .fontSize(18) + .onClick(()=>{ + saveCurrent(this.myChess) + this.controller.close() + }) + + Text('重装以前局面') + .fontColor(Color.White) + .fontWeight(FontWeight.Normal) + .fontSize(18) + .onClick(()=>{ + resetLast(this.myChess) + this.controller.close() + }) + + // Text('随机棋局') + // .fontColor(Color.White) + // .fontWeight(FontWeight.Normal) + // .fontSize(18) + // .onClick(()=>{ + // this.myChess.ifRandomChess=true + // this.controller.close() + // }) + // + // Text('测试模式') + // .fontColor(Color.White) + // .fontWeight(FontWeight.Normal) + // .fontSize(18) + } + } + } + .backgroundColor(Color.Brown) + .justifyContent(FlexAlign.Center) + .width(500) + .height(150) + } +} diff --git a/gbanging/gbang/entry/src/main/ets/components/MenuBar.ets b/gbanging/gbang/entry/src/main/ets/components/MenuBar.ets new file mode 100644 index 0000000..68aba34 --- /dev/null +++ b/gbanging/gbang/entry/src/main/ets/components/MenuBar.ets @@ -0,0 +1,57 @@ +//菜单栏 +import GameDialog from './GameDialog' +import { Chess } from '../classes/Chess'; + +@Component +export struct MenuBar { + @Link myChess:Chess + + //弹窗控制器 + dialogController: CustomDialogController = new CustomDialogController({ + builder: GameDialog({ + myChess:$myChess + }) + }) + + build() { + //游戏和帮助按钮 + Column({space: 50}) { + Text('游戏') + .width(75) + .height(35) + .borderRadius(20) + .textAlign(TextAlign.Center) + .backgroundColor(Color.Brown) + .fontColor(Color.White) + .fontWeight(600) + .onClick(() => { + this.dialogController.open() + }) + + Text('帮助') + .width(75) + .height(35) + .borderRadius(20) + .textAlign(TextAlign.Center) + .backgroundColor(Color.Brown) + .fontColor(Color.White) + .fontWeight(600) + .onClick((event: ClickEvent) => { + AlertDialog.show({ + title: '游戏规则', + message: '1、对局双方各执一色棋子。\n2、空棋盘开局。\n3、黑棋虽先行,但有禁手:黑方不能在一步之内形成两个“活三”“活四”或一步之内形成“长连”(指一步形成超过五子连珠)。白方自由,无禁手。\n4、棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。\n5、黑方的第一枚棋子可下在棋盘任意交叉点上。', + //取消 + confirm: { + value: '确定', + action: () => { + } + }, + cancel: () => {} + }) + }) + } + .justifyContent(FlexAlign.Center) + .width('100%') + .height('100%') + } +} \ No newline at end of file diff --git a/gbanging/gbang/entry/src/main/ets/components/Message.ets b/gbanging/gbang/entry/src/main/ets/components/Message.ets new file mode 100644 index 0000000..4406c4f --- /dev/null +++ b/gbanging/gbang/entry/src/main/ets/components/Message.ets @@ -0,0 +1,335 @@ +//功能按钮 +import { Chess } from '../classes/Chess'; +import {review,cancelreview , regret,start_game ,refresh,suggestion,curnow} from '../utils/functions' +import MessageDialog from './MessageDialog' + +@Component +export struct Message { + @Link myChess:Chess + //弹窗控制器 + MessageDialogController: CustomDialogController = new CustomDialogController({ + builder: MessageDialog({ + myChess:$myChess + }) + }) + + + build() { + Row() { + Column({space: 6}) { + //当前落子方 + Text('当前落子方') + .fontSize(15) + .fontColor(Color.White) + .margin({left:-85}) + + //当前落子方框 + Row() { + if(this.myChess.Chess_Mode==3){//未设置游戏模式 + Blank() + .height(30) + .width(90) + .borderWidth(1) + .borderColor(Color.White) + .margin({left:-12, right:10 }) + + Blank() + .height(30) + .width(90) + .borderWidth(1) + .borderColor(Color.White) + }else if(this.myChess.Chess_Mode==1){//人黑机白 + Row() { + Image($r('app.media.black')) + .width(20) + .margin({left:5, right:5}) + + Text('玩家') + .fontSize(15) + .fontColor(Color.White) + } + .height(30) + .width(90) + .borderWidth(2) + .borderColor(this.myChess.Current_Player?Color.Red:Color.White) + .margin({left:-12, right:10 }) + + Row() { + Image($r('app.media.white')) + .width(20) + .margin({left:5,right:5}) + + Text('电脑') + .fontSize(15) + .fontColor(Color.White) + } + .height(30) + .width(90) + .borderWidth(2) + .borderColor(this.myChess.Current_Player?Color.White:Color.Red) + }else if(this.myChess.Chess_Mode==2) {//人白机黑模式 + Row() { + Image($r('app.media.white')) + .width(20) + .margin({left:5, right:5}) + + Text('玩家') + .fontSize(15) + .fontColor(Color.White) + } + .height(30) + .width(90) + .borderWidth(2) + .borderColor(this.myChess.Current_Player?Color.White:Color.Red) + .margin({left:-12, right:10 }) + + Row() { + Image($r('app.media.black')) + .width(20) + .margin({left:5,right:5}) + + Text('电脑') + .fontSize(15) + .fontColor(Color.White) + } + .height(30) + .width(90) + .borderWidth(2) + .borderColor(this.myChess.Current_Player?Color.Red:Color.White) + + } else if(this.myChess.Chess_Mode==0) {//双人对战模式 + Row() { + Image($r('app.media.black')) + .width(20) + .margin({left:5, right:5}) + + Text('玩家1') + .fontSize(15) + .fontColor(Color.White) + } + .height(30) + .width(90) + .borderWidth(2) + .borderColor(this.myChess.Current_Player?Color.Red:Color.White) + .margin({left:-12, right:10 }) + + Row() { + Image($r('app.media.white')) + .width(20) + .margin({left:5,right:5}) + + Text('玩家2') + .fontSize(15) + .fontColor(Color.White) + } + .height(30) + .width(90) + .borderWidth(2) + .borderColor(this.myChess.Current_Player?Color.White:Color.Red) + } + } + + //胜负判定 + Text('胜负判定') + .fontSize(15) + .margin({left:-85}) + .fontColor(Color.White) + + //胜负判定框 + Row() { + if(this.myChess.Gameover==1){ + if(this.myChess.WinFLAG==1){ + Image($r('app.media.black')) + .width(20) + .margin({right:10}) + + if(this.myChess.Chess_Mode==0){ + Text('玩家1 胜利') + .fontSize(15) + .fontColor('#b53c59') + }else if(this.myChess.Chess_Mode==1){ + Text('玩家 胜利') + .fontSize(15) + .fontColor('#b53c59') + }else if(this.myChess.Chess_Mode==2){ + Text('电脑 胜利') + .fontSize(15) + .fontColor('#b53c59') + } + }else if(this.myChess.WinFLAG==2) { + Image($r('app.media.white')) + .width(20) + .margin({ right: 10 }) + + if(this.myChess.Chess_Mode==0){ + Text('玩家2 胜利') + .fontSize(15) + .fontColor('#b53c59') + }else if(this.myChess.Chess_Mode==2){ + Text('玩家 胜利') + .fontSize(15) + .fontColor('#b53c59') + }else if(this.myChess.Chess_Mode==1){ + Text('电脑 胜利') + .fontSize(15) + .fontColor('#b53c59') + } + }else if(this.myChess.WinFLAG==3){ + Text('平局') + .fontSize(15) + .fontColor('#b53c59') + } + }else{//初始化 + Text('') + .fontSize(14) + .fontColor('#b53c59') + + } + } + .height(60) + .width(200) + .padding({left:40}) + .backgroundImage($r("app.media.noticeboard")) + .backgroundImageSize(ImageSize.Cover) + .backgroundImagePosition({x: -10}) + + //复盘和悔棋 + Row() { + Row() { + // 复盘 + Image($r('app.media.review')) + .width(81) + .height(42) + } + .height(42) + .width(81) + .margin({ right: 10 }) + .onClick(()=>{ + review(this.myChess) + if (this.myChess.WinFLAG == 0) { + this.myChess.message='对局结束后才可进行复盘哦!' + this.MessageDialogController.open() + } + }) + + Row() { + // 悔棋 + Image($r('app.media.regret')) + .width(81) + .height(42) + } + .height(42) + .width(81) + .margin({ right: 10 }) + .onClick(()=>{ + //对局进行并且未分出胜负时落子框才会跳动 + if(this.myChess.WinFLAG==0&&this.myChess.Currently_step>0){ + this.myChess.Current_Player=!this.myChess.Current_Player + } + //棋盘上有棋子才能悔棋 + if(this.myChess.Currently_step>0){ + regret(this.myChess) + } + if (this.myChess.WinFLAG == 1||this.myChess.WinFLAG == 2||this.myChess.WinFLAG==3) { + this.myChess.message='对局已经结束了!' + this.MessageDialogController.open() + } + + }) + } + + //撤销复盘和落子建议 + Row() { + Row() { + // 撤销复盘 + Image($r('app.media.cancel')) + .width(81) + .height(42) + } + .height(42) + .width(81) + .margin({ right: 10 }) + .onClick(()=>{ + if (this.myChess.ifReview == 0) { + this.myChess.message="请在对局结束并点击复盘后使用!" + this.MessageDialogController.open() + } + cancelreview(this.myChess) + }) + + Row() { + // 落子建议 + Image($r('app.media.suggestion')) + .width(81) + .height(42) + } + .height(42) + .width(81) + .margin({ right: 10 }) + .onClick(()=>{ + suggestion(this.myChess) + this.myChess.ifSuggest=true + if(this.myChess.WinFLAG!=0){ + this.myChess.message="请在对局中使用" + this.MessageDialogController.open() + } + }) + } + + //局面评估和重新开始 + Row() { + Row() { + // 局面评估 + Image($r('app.media.prediction')) + .width(81) + .height(42) + + } + .height(42) + .width(81) + .margin({ right: 10 }) + .onClick(()=>{ + this.myChess.message=curnow(this.myChess) + console.log('this.myChess.message='+this.myChess.message) + if(this.myChess.message!=undefined) { + this.MessageDialogController.open() + } + }) + + //重新开始 + Row() { + Image($r('app.media.again')) + .width(81) + .height(42) + } + .height(42) + .width(81) + .margin({ right: 10 }) + .onClick(()=>{ + refresh(this.myChess) + this.myChess.ifRandomChess=false + }) + } + + // 开始游戏 + Row() { + // 开始游戏 + Image($r('app.media.start')) + .width(95) + .height(30) + } + .height(30) + .width(95) + .margin({ right: 10 }) + .onClick(() => { + this.myChess.Current_Player=true + this.myChess.ifRandomChess=false + start_game(this.myChess) + }) + } + .height('100%') + .width('100%') + .justifyContent(FlexAlign.Center) + } + } +} \ No newline at end of file diff --git a/gbanging/gbang/entry/src/main/ets/components/MessageDialog.ets b/gbanging/gbang/entry/src/main/ets/components/MessageDialog.ets new file mode 100644 index 0000000..c6b3e7d --- /dev/null +++ b/gbanging/gbang/entry/src/main/ets/components/MessageDialog.ets @@ -0,0 +1,31 @@ +//信息提示弹窗 +import { Chess } from '../classes/Chess'; + +@CustomDialog +export default struct MessageDialog { + controller: CustomDialogController + @Link myChess:Chess + build(){ + Column({space:5}){ + Text(this.myChess.message) + .fontSize(20) + .height(90) + .textAlign(TextAlign.Center) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + + Text('确定') + .fontSize(20) + .textAlign(TextAlign.Center) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + .onClick(()=>{ + this.controller.close() + }) + } + .backgroundColor(Color.Brown) + .justifyContent(FlexAlign.Center) + .width(500) + .height(150) + } +} diff --git a/gbanging/gbang/entry/src/main/ets/components/ShowChessBoard.ets b/gbanging/gbang/entry/src/main/ets/components/ShowChessBoard.ets new file mode 100644 index 0000000..fbc4b09 --- /dev/null +++ b/gbanging/gbang/entry/src/main/ets/components/ShowChessBoard.ets @@ -0,0 +1,60 @@ +//棋局呈现 +import *as CommonConstant from '../common/constants/CommonConstants' +import {drawChessboard,drawPoints} from '../utils/functions' +import {Chess} from '../classes/Chess' + +@Entry +@Component +export struct ShowChessBoard { + myChess:Chess=new Chess(19, 19) + + build() { + Stack() { + Canvas(CommonConstant.context) //画棋盘 + // .width('100%') + // .height('100%') + // .margin({ left: 10, top: 5 }) + .width(340) + .height(340) + .onReady(() => { + //五子棋棋盘 + drawChessboard(); + //特殊点 + drawPoints(); + }) + + Canvas(CommonConstant.context2) // 画棋子 + // .width('100%') + // .height('100%') + // .margin({ left: 10, top: 5 }) + .width(340) + .height(340) + .onReady(() => { + for (let i = 0; i < 19; i++) { + for (let j = 0; j < 19; j++) { + if (this.myChess.chessDataState[i][j] == 1) { + CommonConstant.context2.drawImage(CommonConstant.img1,j*17,i*17,8*2,8*2) + CommonConstant.context2.fillStyle = '#ffffff' + CommonConstant.context2.font = '25px sans-serif' + CommonConstant.context2.fillText(`${this.myChess.chessDataStep[i][j]}`, j*17 + CommonConstant.gridSize/5, i*17 + CommonConstant.gridSize/1.6) + }else if(this.myChess.chessDataState[i][j] == 2){ + CommonConstant.context2.drawImage(CommonConstant.img2,j*17,i*17,8*2,8*2) + CommonConstant.context2.fillStyle = '#000000' + CommonConstant.context2.font = '25px sans-serif' + CommonConstant.context2.fillText(`${this.myChess.chessDataStep[i][j]}`, j*17 + CommonConstant.gridSize/5, i*17 + CommonConstant.gridSize/1.6) + } + } + } + }) + } + // .height('100%') + // .width('100%') + .width(350) + .height(350) + .backgroundImageSize({height:350}) + .backgroundImage($r('app.media.blankChessBoard')) + // .backgroundImageSize(ImageSize.Contain) + } +} + + diff --git a/gbanging/gbang/entry/src/main/ets/entryability/EntryAbility.ets b/gbanging/gbang/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000..508880a --- /dev/null +++ b/gbanging/gbang/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,44 @@ +import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +const DOMAIN = 0x0000; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err)); + return; + } + hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onBackground'); + } +} \ No newline at end of file diff --git a/gbanging/gbang/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/gbanging/gbang/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 0000000..8e4de99 --- /dev/null +++ b/gbanging/gbang/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,16 @@ +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +const DOMAIN = 0x0000; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(DOMAIN, 'testTag', 'onBackup ok'); + await Promise.resolve(); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(DOMAIN, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + await Promise.resolve(); + } +} \ No newline at end of file diff --git a/gbanging/gbang/entry/src/main/ets/pages/Index.ets b/gbanging/gbang/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..60906cf --- /dev/null +++ b/gbanging/gbang/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,62 @@ +import { Chess } from '../classes/Chess'; +import { ChessBoard } from '../components/ChessBoard'; +import { MenuBar } from '../components/MenuBar'; +import { Message } from '../components/Message'; +import { ShowChessBoard} from '../components/ShowChessBoard'; + +import common from '@ohos.app.ability.common'; +import Window from '@ohos.window' +import { BusinessError } from '@kit.BasicServicesKit'; + +@Entry +@Component +struct Index { + //设置开发板横屏显示 + private changeOrientation() { + // 获取上下文,使用common模块 + let context = getContext(this) as common.UIAbilityContext; + let promise = Window.getLastWindow(context); + promise.then((data) => { + let windowClass = data; + //切换成横屏 + let orientation = Window.Orientation.LANDSCAPE; + windowClass.setPreferredOrientation(orientation, (err) => { + }); + console.info('Succeeded in obtaining the top window. Data: ' + JSON.stringify(data)); + }).catch((err:BusinessError) => { + console.error('Failed to obtain the top window. Cause: ' + JSON.stringify(err)); + }); + } + + aboutToAppear(){ + this.changeOrientation() + } + + @State myChess:Chess=new Chess(19, 19) + build() { + Row() { + //菜单栏 + MenuBar({ myChess:$myChess }) + .width('20%') + + if(this.myChess.ifRandomChess){ + // 展示一个棋局对弈结果 + ShowChessBoard() + .margin({ bottom: 5}) + .width('45%') + }else { + ChessBoard({ myChess: $myChess }) + .margin({ bottom: 5 }) + .width('45%') + } + + // 相关功能按键 + Message({ myChess:$myChess }) + .width('35%') + } + .height('100%') + .width('100%') + .backgroundImage($r('app.media.background')) + .backgroundImageSize({width:'100%', height:'100%'}) + } +} \ No newline at end of file diff --git a/gbanging/gbang/entry/src/main/ets/utils/functions.ets b/gbanging/gbang/entry/src/main/ets/utils/functions.ets new file mode 100644 index 0000000..26ef0af --- /dev/null +++ b/gbanging/gbang/entry/src/main/ets/utils/functions.ets @@ -0,0 +1,789 @@ +//功能函数 +import {Chess} from "../classes/Chess"; +import * as CommonConstant from '../common/constants/CommonConstants' +import fs from '@ohos.file.fs'; +import common from '@ohos.app.ability.common'; +const TAG='functions' + + +//人白机黑模式 +export function peocomwhite(chess:Chess) { + if (chess.Chess_Mode == 3) { + chess.Chess_Mode = 2 + playing(chess) + } else { + chess.Chess_Mode = 2 + refresh(chess) + } +} +//人黑机白模式 +export function peocomblack(chess:Chess) { + if (chess.Chess_Mode == 3) { + chess.Chess_Mode = 1 + playing(chess) + } else { + chess.Chess_Mode = 1 + refresh(chess) + } +} +//双人对战模式 +export function doublepeople(chess:Chess) { + if (chess.Chess_Mode == 3) { + chess.Chess_Mode = 0 + playing(chess) + } else { + chess.Chess_Mode = 0 + refresh(chess) + } +} +//复盘函数 +export function review(chess:Chess) { + if (chess.WinFLAG == 1 || chess.WinFLAG == 2 || chess.WinFLAG==3) { + if(chess.ifReview == 0){ + chess.ifReview = 1 + } + } +} + +//取消复盘 +export function cancelreview(chess:Chess) { + if (chess.ifReview == 1) { + chess.ifReview = 0 + } +} + +//悔棋 +export function regret(chess:Chess) { + if (chess.WinFLAG == 0) { + let regretnum = 1 + if (chess.Currently_step == 1 && chess.Chess_Mode == 2) { //人白机黑 第一步 默认无法悔棋 + // let re_x = chess.regretFlAG[chess.Currently_step - regretnum].x + // let re_y = chess.regretFlAG[chess.Currently_step - regretnum].y + // // 删除(re_x, re_y)位置上的棋子 + // deleteChess(re_x, re_y) + // chess.ChessData[re_x][re_y].Cstate = 0 + // chess.ChessData[re_x][re_y].Cstep = 0 + // chess.Currently_step -= 1 + // chess.Chess_Mode=2 + // playing(chess) + + chess.Current_Player = false + } + else if ((chess.Chess_Mode == 1 || chess.Chess_Mode == 2) && chess.Currently_step > 0) { //人机模式 + for (let i = 0; i < 2; i++) { + let re_x = chess.regretFlAG[chess.Currently_step - regretnum].x + let re_y = chess.regretFlAG[chess.Currently_step - regretnum].y + deleteChess(re_x, re_y) + chess.ChessData[re_x][re_y].Cstate = 0 + chess.ChessData[re_x][re_y].Cstep = 0 + chess.Currently_step -= 1 + console.info(TAG,"chess.Currently_step="+chess.Currently_step) + } + if (chess.Chess_Mode == 1) { + chess.Current_Player =true//保证人黑机白时,悔棋后落子框为玩家 + } else { + chess.Current_Player = false//保证人白机黑时,悔棋后落子框为玩家 + } + } + else if (chess.Chess_Mode == 0 && chess.Currently_step > 0) { //双人对战模式 + let re_x = chess.regretFlAG[chess.Currently_step - regretnum].x + let re_y = chess.regretFlAG[chess.Currently_step - regretnum].y + deleteChess(re_x, re_y) + chess.ChessData[re_x][re_y].Cstate = 0 + chess.ChessData[re_x][re_y].Cstep = 0 + chess.Currently_step -= 1 + if (chess.Currently_step % 2 == 0) { //玩家1 下棋 + chess.player = 1 + chess.player2 = 0 + } else if (chess.Currently_step % 2 != 0) { //玩家2 下棋 + chess.player = 0 + chess.player2 = 1 + } + } + } + //点击落子建议再悔棋需要清除 + if(chess.ifSuggest){ + for (let x = 0; x < chess.breadth; x++) { + for (let y = 0; y < chess.length; y++) { + //存储了建议落子位置数据的棋子删除 + if (chess.SuggestChessData[x][y].Cstate != 0) { + deleteChess(x, y) + //删除后需要清空数据以便后续建议 + chess.SuggestChessData[x][y].Cstate=0 + } + } + } + chess.ifSuggest=false + } +} +//开始游戏函数 默认为人黑机白模式 +export function start_game(chess:Chess) { + if (chess.Chess_Mode == 3) { + chess.Chess_Mode = 1 + playing(chess) + } else { + chess.Chess_Mode = 1 + refresh(chess) + } +} + +//刷新函数 +export function refresh(chess:Chess) { + // 清除画布上的棋子 + for (let x = 0; x < chess.breadth; x++) { + for (let y = 0; y < chess.length; y++) { + if(chess.ChessData[x][y].Cstate !=0){ + deleteChess(x,y) + } + if(chess.SuggestChessData[x][y].Cstate !=0){ + deleteChess(x,y) + } + chess.ChessData[x][y].Cstate = 0 + chess.ChessData[x][y].Cstep = 0 + chess.Chessimg[x][y] = 0 + chess.Relabel[x][y] = 0 + } + } + + chess.Currently_step = 0 + chess.ifReview = 0 + chess.Gameover = 0 + chess.Depth = 0 + chess.player = 0 + chess.player2 = 0 + chess.computer = 0 + chess.myColor = 0 + chess.player2color = 0 + chess.computercolor = 0 + chess.WinFLAG = 0 + + if (chess.Chess_Mode == 1) {//人黑机白 + playing(chess) + chess.Current_Player=true + } else if (chess.Chess_Mode == 2) {//人白机黑 + playing(chess) + chess.Current_Player=false + //如果还原上次棋局,需要再删除一次中心的黑棋 + if(chess.ifResetChess){ + deleteChess(9,9) + chess.ifResetChess=false + } + } else if (chess.Chess_Mode == 0) {//双人对战 + playing(chess) + chess.Current_Player=true + } +} + +//绘制棋盘 +export function drawChessboard() { + // 绘制棋盘线条 + CommonConstant.context.strokeStyle = '#c89265'; //线条颜色 + CommonConstant.context.lineWidth = 1.5; //线条宽 + + for (let i = 0; i < CommonConstant.boardNum; i++) { + // 横线 + CommonConstant.context.beginPath(); + CommonConstant.context.moveTo(CommonConstant.gridSize / 2, i * CommonConstant.gridSize + CommonConstant.gridSize / 2); + CommonConstant.context.lineTo(CommonConstant.gridSize * (CommonConstant.boardNum - 1) + CommonConstant.gridSize / 2, i * CommonConstant.gridSize + CommonConstant.gridSize / 2); + CommonConstant.context.stroke(); + + // 竖线 + CommonConstant.context.beginPath(); + CommonConstant.context.moveTo(i * CommonConstant.gridSize + CommonConstant.gridSize / 2, CommonConstant.gridSize / 2); + CommonConstant.context.lineTo(i * CommonConstant.gridSize + CommonConstant.gridSize / 2, CommonConstant.gridSize * (CommonConstant.boardNum - 1) + CommonConstant.gridSize / 2); + CommonConstant.context.stroke(); + } +} + +//绘制特殊点 +export function drawPoints() { + // 设置填充样式 + CommonConstant.context.fillStyle = '#c89265'; + + // 找到这8个点的横纵坐标,并且定义它的半径 + for (const point of CommonConstant.startPoints) { + const centerX = point[0] * CommonConstant.gridSize + CommonConstant.gridSize / 2; + const centerY = point[1] * CommonConstant.gridSize + CommonConstant.gridSize / 2; + const radius = 2.5; + + //画圆 + CommonConstant.context.beginPath(); + CommonConstant.context.arc(centerX, centerY, radius, 0, 2 * Math.PI); + CommonConstant.context.fill(); + } + + // 中心点 + { + const centerX = CommonConstant.centerPoint[0] * CommonConstant.gridSize + CommonConstant.gridSize / 2; + const centerY = CommonConstant.centerPoint[0] * CommonConstant.gridSize + CommonConstant.gridSize / 2; + const radius = 3.5; + + CommonConstant.context.beginPath(); + CommonConstant.context.arc(centerX, centerY, radius, 0, 2 * Math.PI); + CommonConstant.context.fill(); + } +} + + +//绘制棋子 +export function drawChess(row:number, col:number,chess:Chess) { + // 坐标 + const X = row * CommonConstant.gridSize; + const Y = col * CommonConstant.gridSize; + + // 半径 + const radius = 8; + + if(chess.Chess_Mode==0){//双人对战 + if (chess.ChessData[row][col].Cstate == 0 && chess.myColor == 1 && chess.Currently_step % 2 == 0) { + CommonConstant.context2.drawImage(CommonConstant.img1, X, Y, radius * 2, radius * 2); + } else if (chess.ChessData[row][col].Cstate == 0 && chess.player2color == 2 && chess.Currently_step % 2 != 0) { + CommonConstant.context2.drawImage(CommonConstant.img2, X, Y, radius * 2, radius * 2); + } + }else if(chess.Chess_Mode==1){//人黑机白 + if (chess.ChessData[row][col].Cstate == 0 && chess.myColor == 1 && chess.Currently_step % 2 == 0) { + CommonConstant.context2.drawImage(CommonConstant.img1, X, Y, radius * 2, radius * 2); + } + }else if(chess.Chess_Mode==2){//人白机黑 + if (chess.ChessData[row][col].Cstate == 0 && chess.myColor == 2 && chess.Currently_step % 2 != 0) { + CommonConstant.context2.drawImage(CommonConstant.img2, X, Y, radius * 2, radius * 2); + } + } + chess.Current_Player=!chess.Current_Player +} + +//绘制复盘棋子 +export function drawReviewChess(row:number, col:number,chess:Chess){ + // 坐标 + const X = row * CommonConstant.gridSize; + const Y = col * CommonConstant.gridSize; + + if(chess.ChessData[row][col].Cstep>=0&&chess.ChessData[row][col].Cstep<10){ + // CommonConstant.context3.font = '33fp sans-serif'//fp适配 跑开发板使用 + CommonConstant.context3.font = '33px sans-serif'//预览器时使用 + if (chess.ChessData[row][col].Cstate == 1) { + CommonConstant.context3.fillStyle = '#ffffff' + CommonConstant.context3.fillText(chess.ChessData[row][col].Cstep.toString(), X+5, Y+10) + } else if (chess.ChessData[row][col].Cstate == 2) { + CommonConstant.context3.fillStyle = '#000000' + CommonConstant.context3.fillText(chess.ChessData[row][col].Cstep.toString(), X+5, Y+10) + } + }else if(chess.ChessData[row][col].Cstep>=10&&chess.ChessData[row][col].Cstep<100){ + // CommonConstant.context3.font = '30fp sans-serif'//fp适配 跑开发板使用 + CommonConstant.context3.font = '30px sans-serif'//预览器时使用 + if (chess.ChessData[row][col].Cstate == 1) { + CommonConstant.context3.fillStyle = '#ffffff' + CommonConstant.context3.fillText(chess.ChessData[row][col].Cstep.toString(), X+2, Y+10) + } else if (chess.ChessData[row][col].Cstate == 2) { + CommonConstant.context3.fillStyle = '#000000' + CommonConstant.context3.fillText(chess.ChessData[row][col].Cstep.toString(), X+2, Y+10) + } + }else{ + // CommonConstant.context3.font = '27fp sans-serif'//fp适配 跑开发板使用 + CommonConstant.context3.font = '27px sans-serif'//预览器时使用 + if (chess.ChessData[row][col].Cstate == 1) { + CommonConstant.context3.fillStyle = '#ffffff' + CommonConstant.context3.fillText(chess.ChessData[row][col].Cstep.toString(), X, Y+10) + } else if (chess.ChessData[row][col].Cstate == 2) { + CommonConstant.context3.fillStyle = '#000000' + CommonConstant.context3.fillText(chess.ChessData[row][col].Cstep.toString(), X, Y+10) + } + } +} + +//删除棋子 +export function deleteChess(row:number, col:number) { + const X = row * CommonConstant.gridSize + const Y = col * CommonConstant.gridSize + + const radius = 8 + CommonConstant.context2.clearRect(X, Y, radius * 2, radius * 2) +} + +// 落子建议 +export function suggestion(chess:Chess){ + let color:number=0 + if(chess.WinFLAG==0){ + if(chess.Depth>=9){ + chess.Depth=8 + } + if(chess.Chess_Mode==1){//人黑机白模式 + color=2 + }else if(chess.Chess_Mode==2){//人白机黑模式 + color=1 + }else if(chess.Chess_Mode==0){//双人模式 + if(chess.player==1&&chess.player2==0){//玩家1下棋 + color=2 + }else if(chess.player==0&&chess.player2==1){//玩家2下棋 + color=1 + } + } + let pos=chess.return_chess(chess.Depth,color)//调用估值函数 + if(chess.ChessData[pos[0]][pos[1]].Cstate==0){ + drawSuggestionChess(pos[0],pos[1],chess) + } + } +} + +// 绘制建议棋子 +export function drawSuggestionChess(row:number, col:number,chess:Chess) { + // 坐标 + const X = row * CommonConstant.gridSize; + const Y = col * CommonConstant.gridSize; + + // 半径 + const radius = 8; + + if(chess.Chess_Mode==0){//双人对战 + if (chess.ChessData[row][col].Cstate == 0 && chess.myColor == 1 && chess.Currently_step % 2 == 0) { + CommonConstant.context2.drawImage(CommonConstant.img3, X, Y, radius * 2, radius * 2); + } else if (chess.ChessData[row][col].Cstate == 0 && chess.player2color == 2 && chess.Currently_step % 2 != 0) { + CommonConstant.context2.drawImage(CommonConstant.img4, X, Y, radius * 2, radius * 2); + } + }else if(chess.Chess_Mode==1){//人黑机白 + if (chess.ChessData[row][col].Cstate == 0 && chess.myColor == 1 && chess.Currently_step % 2 == 0) { + CommonConstant.context2.drawImage(CommonConstant.img3, X, Y, radius * 2, radius * 2); + } + }else if(chess.Chess_Mode==2){//人白机黑 + if (chess.ChessData[row][col].Cstate == 0 && chess.myColor == 2 && chess.Currently_step % 2 != 0) { + CommonConstant.context2.drawImage(CommonConstant.img4, X, Y, radius * 2, radius * 2); + } + } + chess.SuggestChessData[row][col].Cstate=1 +} + +//局面评估(貌似本身有bug) +export function curnow(chess:Chess){ + let color:number=0 + if(chess.Depth>=9){ + chess.Depth=8 + } + if(chess.Chess_Mode==1){//人黑机白 + color=2 + }else if(chess.Chess_Mode==2){//人白机黑 + chess.return_chess(chess.Depth,color)//调用估值函数 + color=1 + }else { + if(chess.player==1&&chess.player2==0){//玩家1下棋 + color=2 + }else if(chess.player==0&&chess.player2==1){//玩家2下棋 + color=1 + } + } + chess.return_chess(chess.Depth,color)//调用估值函数 + let OwnCounter:number + if(chess.Counts/chess.New_count==1){ + OwnCounter=getRandomNumber(0.8,0.85) + }else{ + OwnCounter=chess.Counts/chess.New_count + } + + if(color==1){ + //1.判断x-轴是否连续四子 + for(let x=0;x<15;x++){ + for(let y=0;y<19;y++){ + if(chess.ChessData[x][y].Cstate==2&&chess.ChessData[x+1][y].Cstate==2&&chess.ChessData[x+2][y].Cstate==2&&chess.ChessData[x+3][y].Cstate==2 + &&chess.ChessData[x+4][y].Cstate==0&&chess.ChessData[x-1][y].Cstate==0){ + OwnCounter -= 0.5 + } + } + } + + //2.判断y-轴是否连续四子 + for(let x=0;x<19;x++){ + for(let y=0;y<15;y++){ + if(chess.ChessData[x][y].Cstate==2&&chess.ChessData[x][y+1].Cstate==2&&chess.ChessData[x][y+2].Cstate==2&&chess.ChessData[x][y+3].Cstate==2 + &&chess.ChessData[x][y+4].Cstate==0&&chess.ChessData[x][y-1].Cstate==0){ + OwnCounter -= 0.5 + } + } + } + + //3.判断右上-左下是否连续四子 + for(let x=0;x<15;x++){ + for(let y=4;y<19;y++){ + if(chess.ChessData[x][y].Cstate==2&&chess.ChessData[x+1][y-1].Cstate==2&&chess.ChessData[x+2][y-2].Cstate==2&&chess.ChessData[x+3][y-3].Cstate==2 + &&chess.ChessData[x+4][y-4].Cstate==0&&chess.ChessData[x-1][y+1].Cstate==0){ + OwnCounter -= 0.5 + } + } + } + + + //4.判断左上-右下是否连续四子 + for(let x=0;x<15;x++){ + for(let y=0;y<15;y++){ + if(chess.ChessData[x][y].Cstate==2&&chess.ChessData[x+1][y+1].Cstate==2&&chess.ChessData[x+2][y+2].Cstate==2&&chess.ChessData[x+3][y+3].Cstate==2 + &&chess.ChessData[x+4][y+4].Cstate==0&&chess.ChessData[x-1][y-1].Cstate==0){ + OwnCounter -= 0.5 + } + } + } + }else if(color==2){ + //1.判断x-轴是否连续四子 + for(let x=0;x<15;x++){ + for(let y=4;y<19;y++){ + if(chess.ChessData[x][y].Cstate==1&&chess.ChessData[x+1][y].Cstate==1&&chess.ChessData[x+2][y].Cstate==1&&chess.ChessData[x+3][y].Cstate==1 + &&chess.ChessData[x+4][y].Cstate==0&&chess.ChessData[x-1][y].Cstate==0){ + OwnCounter -= 0.5 + } + } + } + + //2.判断y-轴是否连续四子 + for(let x=0;x<19;x++){ + for(let y=0;y<15;y++){ + if(chess.ChessData[x][y].Cstate==1&&chess.ChessData[x][y+1].Cstate==1&&chess.ChessData[x][y+2].Cstate==1&&chess.ChessData[x][y+3].Cstate==1 + &&chess.ChessData[x][y+4].Cstate==0&&chess.ChessData[x][y-1].Cstate==0){ + OwnCounter -= 0.5 + } + } + } + + //3.判断右上-左下是否连续四子 + for(let x=0;x<15;x++){ + for(let y=4;y<19;y++){ + if(chess.ChessData[x][y].Cstate==1&&chess.ChessData[x+1][y-1].Cstate==1&&chess.ChessData[x+2][y-2].Cstate==1&&chess.ChessData[x+3][y-3].Cstate==1 + &&chess.ChessData[x+4][y-4].Cstate==0&&chess.ChessData[x-1][y+1].Cstate==0){ + OwnCounter -= 0.5 + } + } + } + + //4.判断左上-右下是否连续四子 + for(let x=0;x<15;x++){ + for(let y=0;y<15;y++){ + if(chess.ChessData[x][y].Cstate==1&&chess.ChessData[x+1][y+1].Cstate==1&&chess.ChessData[x+2][y+2].Cstate==1&&chess.ChessData[x+3][y+3].Cstate==1 + &&chess.ChessData[x+4][y+4].Cstate==0&&chess.ChessData[x-1][y-1].Cstate==0){ + OwnCounter -= 0.5 + } + } + } + } + let OtherCouter=1-OwnCounter + //(Math.round(OwnCounter*10000)/10000) 四舍五入到第四位小数 + let msg = '当前落子方的胜率为'+(Math.round(OwnCounter*10000)/10000)+'%!\n当前对方的胜率为'+ (Math.round(OtherCouter*10000)/10000) + '%!' + return msg +} + +//获取[m,n]区间内的随机数 +export function getRandomNumber(n:number,m:number) { + let result:number = Math.random()*(m+1-n)+n; + while(result>m) { + result = Math.random()*(m+1-n)+n; + } + return result; +} + +// 定义函数实现ai落子 +export function ai_location(chess:Chess){ + if (chess.Depth >= 9){ + chess.Depth = 8 + } + let position=chess.return_chess(chess.Depth,chess.computercolor) + // let position=chess.autoactive() + let X=position[0]*CommonConstant.gridSize + let Y=position[1]*CommonConstant.gridSize + let radius=8 + if(chess.ChessData[position[0]][position[1]].Cstate==0){ + if (chess.computercolor==2 && chess.Currently_step%2!=0){//人黑机白模式 + //绘制棋子 + CommonConstant.context2.drawImage(CommonConstant.img2,X,Y,radius*2,radius*2) + chess.ChessData[position[0]][position[1]].Cstate=2 + chess.ChessData[position[0]][position[1]].Cstep= chess.Currently_step + chess.Current_Player=!chess.Current_Player + }else if(chess.computercolor==1 && chess.Currently_step%2==0){//人白机黑模式 + //绘制棋子 + CommonConstant.context2.drawImage(CommonConstant.img1,X,Y,radius*2,radius*2) + chess.ChessData[position[0]][position[1]].Cstate=1 + chess.ChessData[position[0]][position[1]].Cstep= chess.Currently_step + chess.Current_Player=!chess.Current_Player + } + chess.regretFlAG[chess.Currently_step].x = position[0] + chess.regretFlAG[chess.Currently_step].y = position[1] + chess.player = 1 // 玩家下棋标志置0 + chess.computer = 0 // 电脑下棋标志置1 + chess.Currently_step += 1 + console.info(TAG,'ai_location的Currently_step+=1执行了,Currently_step= '+chess.Currently_step) + chess.ChessData[position[0]][position[1]].Cstep= chess.Currently_step + let a = Math.max(Math.abs(position[0] - 9), Math.abs(position[1] - 9)) //计算该点到中心的最大的距离 + chess.Depth = Math.max(chess.Depth, a) //不断更新Depth的值 + }else { + console.log('该位置已有棋子') + } +} + +//人黑机白 +export function playgame_black(chess:Chess){ + if(chess.WinFLAG==0&&chess.player==1&&chess.computer==0){ + chess.WinFLAG=chess.ChessCheck() + }else if (chess.WinFLAG==0&&chess.player==0&&chess.computer==1){ + ai_location(chess) + chess.WinFLAG=chess.ChessCheck() + }else if(chess.WinFLAG==1){ + console.log('胜负已分') + } +} +//人白机黑 +export function playgame_white(chess:Chess){ + // console.log('chess.player='+chess.player+'chess.computer='+chess.computer) + if(chess.WinFLAG==0&&chess.player==1&&chess.computer==0){ + chess.WinFLAG=chess.ChessCheck() + }else if (chess.WinFLAG==0&&chess.player==0&&chess.computer==1){//电脑下棋 + ai_location(chess) + chess.WinFLAG=chess.ChessCheck() + }else if(chess.WinFLAG==1){ + console.log('胜负已分') + } +} + +//双人对战 +export function doublePeopleGame(chess:Chess) { + if (chess.player == 1 && chess.player2 == 0 && chess.Currently_step % 2 == 0) { + chess.WinFLAG = chess.ChessCheck() + } else if (chess.player2 == 1 && chess.player == 0 && chess.Currently_step % 2 != 0) { + chess.WinFLAG = chess.ChessCheck() + } +} + +//设置对弈模式 +export function playing(chess: Chess) { + if (chess.Chess_Mode == 0) {//双人对战 + chess.myColor = 1//玩家1棋子颜色 + chess.player2color = 2//玩家2棋子颜色 + chess.player = 1//玩家1先手 + chess.player2 = 0//玩家2后手 + chess.WinFLAG = 0 + // 调用函数更新当前画布 + }else if (chess.Chess_Mode == 1) {//人黑机白 + chess.myColor = 1//玩家棋子颜色 + chess.computercolor = 2//电脑棋子颜色 + chess.player = 1//玩家先手 + chess.computer = 0//电脑后手 + chess.WinFLAG = 0 + // 调用函数更新当前画布 + } else if (chess.Chess_Mode == 2) {//人白机黑 + chess.myColor = 2//玩家棋子颜色 + chess.computercolor = 1//电脑棋子颜色 + chess.ChessData[Math.floor((chess.breadth - 1) / 2)][Math.floor((chess.length - 1) / 2)].Cstate = 1 + //绘制棋子 + let X = 9 * CommonConstant.gridSize + let Y = 9 * CommonConstant.gridSize + let radius = 8 + CommonConstant.context2.drawImage(CommonConstant.img1, X, Y, radius * 2, radius * 2); + chess.regretFlAG[chess.Currently_step].x = Math.floor((chess.breadth - 1) / 2) + chess.regretFlAG[chess.Currently_step].y = Math.floor((chess.length - 1) / 2) + chess.player = 1 + chess.computer = 0 + chess.Currently_step += 1 + chess.ChessData[Math.floor((chess.breadth - 1) / 2)][Math + .floor((chess.length - 1) / 2)] + .Cstep = chess.Currently_step + chess.WinFLAG = 0 + let a = Math.max(Math.abs(Math.floor((chess.breadth - 1) / 2) - Math.floor((chess.breadth - 1) / 2)), Math.abs(Math.floor((chess.length - 1) / 2) - Math.floor((chess.length - 1) / 2))) + chess.Depth = Math.max(chess.Depth, a) + } +} + +//保存当前棋局 +export function saveCurrent(chess:Chess){ + let context = getContext() as common.UIAbilityContext; + let fileDir = context.filesDir; + let filePath =fileDir+"/data.txt"; + let res = fs.access(filePath) + if (!res) { + console.info(TAG,"文件不存在,开始创建") + } + //读写模式打开文件,若不存在则创建文件 + let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); + + let b='' + for(let i=0;i<19;i++){ + for(let j=0;j<19;j++){ + chess.chessDataState[i][j]=chess.ChessData[j][i].Cstate + b+=chess.chessDataState[i][j].toString()+'\t' + } + b+='\t' + b+='\n' + } + //写入文件 + let writeLen = fs.writeSync(file.fd, b); + console.info(TAG,'chessDataState的大小为: '+b.length) + b='' + for(let i=0;i<19;i++){ + for(let j=0;j<19;j++){ + chess.chessDataStep[i][j]=chess.ChessData[j][i].Cstep + b+=chess.chessDataStep[i][j].toString()+'\t' + } + b+='\t' + b+='\n' + } + //写入文件 + writeLen = fs.writeSync(file.fd, b); + console.info(TAG,'chessDataStep的大小为: '+b.length) + chess.writenLen=b.length+760 + + let saveChess_Mode=chess.Chess_Mode.toString()+'\t' + writeLen = fs.writeSync(file.fd, saveChess_Mode); + + let saveWinFLAG=chess.WinFLAG.toString()+'\t' + writeLen = fs.writeSync(file.fd, saveWinFLAG); + + let saveGameOver=chess.Gameover.toString()+'\t' + writeLen = fs.writeSync(file.fd, saveGameOver); + + let saveCurrently_step=chess.Currently_step.toString()+'\t' + writeLen = fs.writeSync(file.fd, saveCurrently_step); + + fs.closeSync(file.fd) + + alertDialog('棋局已保存') +} + +//还原上次局面 +export function resetLast(chess:Chess){ + chess.ifResetChess=true + refresh(chess) + chess.ifResetChess=false + let context = getContext() as common.UIAbilityContext; + let fileDir = context.filesDir; + let filePath =fileDir+"/data.txt"; + let res = fs.access(filePath) + if (!res) { + console.info(TAG,"棋局不存在") + } + let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE);//读写模式打开文件 + + class Option{ + public offset:number=0 + public length:number=0 + public encoding:string='utf-8' + } + let option = new Option(); + option.length=40//一行数据的长度 + let MaxStep=0 + let stateData='' + let stepData:string[]=[] + let stepDataItem:string[]=[] + let m=0 + for(let i=0;i<19;i++){ + option.offset=40*i + stateData= fs.readTextSync(filePath, option)//一次只读取一行数据 + for(let j=0;j<19;j++) { + chess.ChessData[j][i].Cstate = Number(stateData[m])//还原上次棋局状态 + m+=2 + } + m=0 + } + for(let i=0;i<19;i++){ + option.length=chess.writenLen + option.offset=760 + stepData = fs.readTextSync(filePath, option).split('\n')//按换行符切割字符串 + stepDataItem=stepData[i].split('\t')//按空格切割字符串 + for(let j=0;j<19;j++) { + chess.ChessData[j][i].Cstep = Number(stepDataItem[j])//还原上次棋局状态 + if(chess.ChessData[j][i].Cstep>MaxStep) { + MaxStep=chess.ChessData[j][i].Cstep + } + } + } + + option.length=1 + option.offset=chess.writenLen + chess.Chess_Mode=Number(fs.readTextSync(filePath,option)) + option.offset=chess.writenLen+2 + chess.WinFLAG=Number(fs.readTextSync(filePath,option)) + option.offset=chess.writenLen+4 + chess.Gameover=Number(fs.readTextSync(filePath,option)) + if(MaxStep<10){//0<=Currently_step<10 + option.length=1 + }else if(MaxStep>=10){//10<=Currently_step<100 + option.length=2 + }else if(MaxStep>=100){//100<=Currently_step + option.length=3 + } + option.offset=chess.writenLen+6 + chess.Currently_step=Number(fs.readTextSync(filePath,option)) + fs.closeSync(file.fd) + console.info(TAG,"chess.Chess_Mode="+chess.Chess_Mode+" chess.WinFLAG="+chess.WinFLAG) + console.info(TAG,"chess.Gameover="+chess.Gameover+" chess.Currently_step="+chess.Currently_step) + + + //还原棋局 + for(let i=0;i<19;i++){ + for(let j=0;j<19;j++){ + if(chess.ChessData[i][j].Cstate==1){ + CommonConstant.context2.drawImage(CommonConstant.img1, CommonConstant.gridSize*i, CommonConstant.gridSize*j, 8 * 2, 8 * 2); + } else if(chess.ChessData[i][j].Cstate==2){ + CommonConstant.context2.drawImage(CommonConstant.img2, CommonConstant.gridSize*i, CommonConstant.gridSize*j, 8 * 2, 8 * 2); + } + } + } + + if(chess.WinFLAG!=0){ + //弹窗信息提示 msg='对局已经结束了' + chess.message='对局已经结束了' + alertDialog(chess.message) + }else if(chess.Chess_Mode==1&&chess.WinFLAG==0){//人黑机白模式 + chess.myColor=1 + chess.computercolor=2 + if (chess.Currently_step%2==0){//轮到玩家下棋 + chess.player=1 + chess.computer=0 + chess.Current_Player=true + //弹窗信息提示 msg='轮到玩家下棋了' + alertDialog('轮到玩家下棋了') + }else if(chess.Currently_step%2!=0){//轮到电脑下棋 + chess.player=0 + chess.computer=1 + chess.Current_Player=false + playgame_black(chess) + } + }else if(chess.Chess_Mode==2&&chess.WinFLAG==0){//人白机黑模式 + chess.myColor=2 + chess.computercolor=1 + if (chess.Currently_step%2==0){//轮到电脑下棋 + chess.player=0 + chess.computer=1 + chess.Current_Player=true + playgame_white(chess) + }else if(chess.Currently_step%2!=0){//轮到玩家下棋 + chess.player=1 + chess.computer=0 + chess.Current_Player=false + //弹窗信息提示 msg='轮到玩家下棋了' + alertDialog('轮到玩家下棋了') + } + } else if(chess.Chess_Mode==0&&chess.WinFLAG==0) { //双人对战 + chess.myColor=1 + chess.player2color=2 + if(chess.Currently_step%2==0){//玩家1下棋 + chess.player=1 + chess.player2=0 + chess.Current_Player=true + //弹窗信息提示 msg='轮到玩家1下棋了' + alertDialog('轮到玩家1下棋了') + }else if(chess.Currently_step!=0){//玩家2下棋 + chess.player=0 + chess.player2=1 + chess.Current_Player=false + //弹窗信息提示 msg='轮到玩家2下棋了' + alertDialog('轮到玩家2下棋了') + } + } +} +//定义弹窗函数 +export function alertDialog(msg:string){ + AlertDialog.show({ + title: '信息提示!', + message: msg, + gridCount: 3, + //取消 + confirm: { + value: 'OK', + action: () => { + } + }, + cancel: () => {} + }) +} \ No newline at end of file diff --git a/gbanging/gbang/entry/src/main/module.json5 b/gbanging/gbang/entry/src/main/module.json5 new file mode 100644 index 0000000..633ddb1 --- /dev/null +++ b/gbanging/gbang/entry/src/main/module.json5 @@ -0,0 +1,51 @@ +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:icon", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/gbanging/gbang/entry/src/main/resources/base/element/color.json b/gbanging/gbang/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/gbanging/gbang/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/gbanging/gbang/entry/src/main/resources/base/element/float.json b/gbanging/gbang/entry/src/main/resources/base/element/float.json new file mode 100644 index 0000000..33ea223 --- /dev/null +++ b/gbanging/gbang/entry/src/main/resources/base/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "page_text_font_size", + "value": "50fp" + } + ] +} diff --git a/gbanging/gbang/entry/src/main/resources/base/element/string.json b/gbanging/gbang/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..f945955 --- /dev/null +++ b/gbanging/gbang/entry/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "label" + } + ] +} \ No newline at end of file diff --git a/gbanging/gbang/entry/src/main/resources/base/media/again.png b/gbanging/gbang/entry/src/main/resources/base/media/again.png new file mode 100644 index 0000000..b334062 Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/again.png differ diff --git a/gbanging/gbang/entry/src/main/resources/base/media/background.png b/gbanging/gbang/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000..7af92c3 Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/background.png differ diff --git a/gbanging/gbang/entry/src/main/resources/base/media/bg.png b/gbanging/gbang/entry/src/main/resources/base/media/bg.png new file mode 100644 index 0000000..47dce17 Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/bg.png differ diff --git a/gbanging/gbang/entry/src/main/resources/base/media/black.png b/gbanging/gbang/entry/src/main/resources/base/media/black.png new file mode 100644 index 0000000..8090f84 Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/black.png differ diff --git a/gbanging/gbang/entry/src/main/resources/base/media/blankChessBoard.png b/gbanging/gbang/entry/src/main/resources/base/media/blankChessBoard.png new file mode 100644 index 0000000..8c5843c Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/blankChessBoard.png differ diff --git a/gbanging/gbang/entry/src/main/resources/base/media/buttoonbg.png b/gbanging/gbang/entry/src/main/resources/base/media/buttoonbg.png new file mode 100644 index 0000000..415c9e4 Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/buttoonbg.png differ diff --git a/gbanging/gbang/entry/src/main/resources/base/media/cancel.png b/gbanging/gbang/entry/src/main/resources/base/media/cancel.png new file mode 100644 index 0000000..05860a6 Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/cancel.png differ diff --git a/gbanging/gbang/entry/src/main/resources/base/media/foreground.png b/gbanging/gbang/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000..97014d3 Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/foreground.png differ diff --git a/gbanging/gbang/entry/src/main/resources/base/media/icon.png b/gbanging/gbang/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000..ce307a8 Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/icon.png differ diff --git a/gbanging/gbang/entry/src/main/resources/base/media/juan.png b/gbanging/gbang/entry/src/main/resources/base/media/juan.png new file mode 100644 index 0000000..0b6240c Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/juan.png differ diff --git a/gbanging/gbang/entry/src/main/resources/base/media/layered_image.json b/gbanging/gbang/entry/src/main/resources/base/media/layered_image.json new file mode 100644 index 0000000..fb49920 --- /dev/null +++ b/gbanging/gbang/entry/src/main/resources/base/media/layered_image.json @@ -0,0 +1,7 @@ +{ + "layered-image": + { + "background" : "$media:background", + "foreground" : "$media:foreground" + } +} \ No newline at end of file diff --git a/gbanging/gbang/entry/src/main/resources/base/media/noticeboard.png b/gbanging/gbang/entry/src/main/resources/base/media/noticeboard.png new file mode 100644 index 0000000..d12cb7f Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/noticeboard.png differ diff --git a/gbanging/gbang/entry/src/main/resources/base/media/prediction.png b/gbanging/gbang/entry/src/main/resources/base/media/prediction.png new file mode 100644 index 0000000..5ebd68d Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/prediction.png differ diff --git a/gbanging/gbang/entry/src/main/resources/base/media/regret.png b/gbanging/gbang/entry/src/main/resources/base/media/regret.png new file mode 100644 index 0000000..493a1ef Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/regret.png differ diff --git a/gbanging/gbang/entry/src/main/resources/base/media/review.png b/gbanging/gbang/entry/src/main/resources/base/media/review.png new file mode 100644 index 0000000..c10c591 Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/review.png differ diff --git a/gbanging/gbang/entry/src/main/resources/base/media/start.jpg b/gbanging/gbang/entry/src/main/resources/base/media/start.jpg new file mode 100644 index 0000000..d8e1e41 Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/start.jpg differ diff --git a/gbanging/gbang/entry/src/main/resources/base/media/startIcon.png b/gbanging/gbang/entry/src/main/resources/base/media/startIcon.png new file mode 100644 index 0000000..205ad8b Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/startIcon.png differ diff --git a/gbanging/gbang/entry/src/main/resources/base/media/suggestion.png b/gbanging/gbang/entry/src/main/resources/base/media/suggestion.png new file mode 100644 index 0000000..336fcee Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/suggestion.png differ diff --git a/gbanging/gbang/entry/src/main/resources/base/media/white.png b/gbanging/gbang/entry/src/main/resources/base/media/white.png new file mode 100644 index 0000000..205eaf0 Binary files /dev/null and b/gbanging/gbang/entry/src/main/resources/base/media/white.png differ diff --git a/gbanging/gbang/entry/src/main/resources/base/profile/backup_config.json b/gbanging/gbang/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 0000000..78f40ae --- /dev/null +++ b/gbanging/gbang/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/gbanging/gbang/entry/src/main/resources/base/profile/main_pages.json b/gbanging/gbang/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000..1898d94 --- /dev/null +++ b/gbanging/gbang/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/Index" + ] +} diff --git a/gbanging/gbang/entry/src/main/resources/dark/element/color.json b/gbanging/gbang/entry/src/main/resources/dark/element/color.json new file mode 100644 index 0000000..79b11c2 --- /dev/null +++ b/gbanging/gbang/entry/src/main/resources/dark/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/gbanging/gbang/entry/src/mock/mock-config.json5 b/gbanging/gbang/entry/src/mock/mock-config.json5 new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/gbanging/gbang/entry/src/mock/mock-config.json5 @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/gbanging/gbang/entry/src/ohosTest/ets/test/Ability.test.ets b/gbanging/gbang/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000..85c78f6 --- /dev/null +++ b/gbanging/gbang/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,35 @@ +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/gbanging/gbang/entry/src/ohosTest/ets/test/List.test.ets b/gbanging/gbang/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000..794c7dc --- /dev/null +++ b/gbanging/gbang/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,5 @@ +import abilityTest from './Ability.test'; + +export default function testsuite() { + abilityTest(); +} \ No newline at end of file diff --git a/gbanging/gbang/entry/src/ohosTest/module.json5 b/gbanging/gbang/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000..6902687 --- /dev/null +++ b/gbanging/gbang/entry/src/ohosTest/module.json5 @@ -0,0 +1,12 @@ +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/gbanging/gbang/entry/src/test/List.test.ets b/gbanging/gbang/entry/src/test/List.test.ets new file mode 100644 index 0000000..bb5b5c3 --- /dev/null +++ b/gbanging/gbang/entry/src/test/List.test.ets @@ -0,0 +1,5 @@ +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/gbanging/gbang/entry/src/test/LocalUnit.test.ets b/gbanging/gbang/entry/src/test/LocalUnit.test.ets new file mode 100644 index 0000000..165fc16 --- /dev/null +++ b/gbanging/gbang/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,33 @@ +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/gbanging/gbang/hvigor/hvigor-config.json5 b/gbanging/gbang/hvigor/hvigor-config.json5 new file mode 100644 index 0000000..5bebc97 --- /dev/null +++ b/gbanging/gbang/hvigor/hvigor-config.json5 @@ -0,0 +1,22 @@ +{ + "modelVersion": "5.0.5", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/gbanging/gbang/hvigorfile.ts b/gbanging/gbang/hvigorfile.ts new file mode 100644 index 0000000..47113e2 --- /dev/null +++ b/gbanging/gbang/hvigorfile.ts @@ -0,0 +1,6 @@ +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins: [] /* Custom plugin to extend the functionality of Hvigor. */ +} \ No newline at end of file diff --git a/gbanging/gbang/oh-package-lock.json5 b/gbanging/gbang/oh-package-lock.json5 new file mode 100644 index 0000000..c2f6d1b --- /dev/null +++ b/gbanging/gbang/oh-package-lock.json5 @@ -0,0 +1,28 @@ +{ + "meta": { + "stableOrder": true, + "enableUnifiedLockfile": false + }, + "lockfileVersion": 3, + "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", + "specifiers": { + "@ohos/hamock@1.0.0": "@ohos/hamock@1.0.0", + "@ohos/hypium@1.0.21": "@ohos/hypium@1.0.21" + }, + "packages": { + "@ohos/hamock@1.0.0": { + "name": "@ohos/hamock", + "version": "1.0.0", + "integrity": "sha512-K6lDPYc6VkKe6ZBNQa9aoG+ZZMiwqfcR/7yAVFSUGIuOAhPvCJAo9+t1fZnpe0dBRBPxj2bxPPbKh69VuyAtDg==", + "resolved": "https://ohpm.openharmony.cn/ohpm/@ohos/hamock/-/hamock-1.0.0.har", + "registryType": "ohpm" + }, + "@ohos/hypium@1.0.21": { + "name": "@ohos/hypium", + "version": "1.0.21", + "integrity": "sha512-iyKGMXxE+9PpCkqEwu0VykN/7hNpb+QOeIuHwkmZnxOpI+dFZt6yhPB7k89EgV1MiSK/ieV/hMjr5Z2mWwRfMQ==", + "resolved": "https://ohpm.openharmony.cn/ohpm/@ohos/hypium/-/hypium-1.0.21.har", + "registryType": "ohpm" + } + } +} \ No newline at end of file diff --git a/gbanging/gbang/oh-package.json5 b/gbanging/gbang/oh-package.json5 new file mode 100644 index 0000000..a8aff0c --- /dev/null +++ b/gbanging/gbang/oh-package.json5 @@ -0,0 +1,10 @@ +{ + "modelVersion": "5.0.5", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.21", + "@ohos/hamock": "1.0.0" + } +}