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"
+ }
+}