Răsfoiți Sursa

新加入参数组件:当经过标记点组件逻辑

liyanbo 4 luni în urmă
părinte
comite
65d2ab0102
5 a modificat fișierele cu 257 adăugiri și 127 ștergeri
  1. 40 1
      package-lock.json
  2. 1 1
      package.json
  3. 106 55
      src/api/blockly/blockly.js
  4. 27 2
      src/components/blockly/MapGame.vue
  5. 83 68
      src/views/blockly/MapGame.vue

+ 40 - 1
package-lock.json

@@ -15,7 +15,6 @@
         "@vue-office/excel": "^1.7.14",
         "@vue-office/pptx": "^1.0.1",
         "axios": "^1.10.0",
-        "blockly": "^12.3.1",
         "element-plus": "^2.10.2",
         "highlight.js": "^11.11.1",
         "hls.js": "^1.6.7",
@@ -37,6 +36,7 @@
         "@types/markdown-it": "^14.1.2",
         "@types/node": "^24.0.10",
         "@vitejs/plugin-vue": "^6.0.0",
+        "blockly": "^12.3.1",
         "eslint": "^9.32.0",
         "eslint-plugin-vue": "^10.3.0",
         "path": "^0.12.7",
@@ -61,6 +61,7 @@
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz",
       "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@csstools/css-calc": "^2.1.3",
@@ -74,6 +75,7 @@
       "version": "10.4.3",
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
       "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+      "dev": true,
       "license": "ISC"
     },
     "node_modules/@babel/code-frame": {
@@ -1514,6 +1516,7 @@
       "version": "5.1.0",
       "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz",
       "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -1533,6 +1536,7 @@
       "version": "2.1.4",
       "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz",
       "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -1556,6 +1560,7 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz",
       "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -1583,6 +1588,7 @@
       "version": "3.0.5",
       "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz",
       "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -1605,6 +1611,7 @@
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz",
       "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -3317,6 +3324,7 @@
       "version": "7.1.4",
       "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
       "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">= 14"
@@ -3458,6 +3466,7 @@
       "version": "12.3.1",
       "resolved": "https://registry.npmjs.org/blockly/-/blockly-12.3.1.tgz",
       "integrity": "sha512-BbWUcpqroY241XgSxTuAiEMHeIZ6u3+oD2zOATf3Fi+0NMWJ/MdMtuSkOcDCSk6Nc7WR3z5n9GHKqz2L+3kQOQ==",
+      "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
         "jsdom": "26.1.0"
@@ -3738,6 +3747,7 @@
       "version": "4.6.0",
       "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz",
       "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@asamuzakjp/css-color": "^3.2.0",
@@ -3757,6 +3767,7 @@
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
       "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "whatwg-mimetype": "^4.0.0",
@@ -3793,6 +3804,7 @@
       "version": "10.6.0",
       "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
       "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/deep-is": {
@@ -4539,6 +4551,7 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
       "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "whatwg-encoding": "^3.1.1"
@@ -4551,6 +4564,7 @@
       "version": "7.0.2",
       "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
       "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "agent-base": "^7.1.0",
@@ -4564,6 +4578,7 @@
       "version": "7.0.6",
       "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
       "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "agent-base": "^7.1.2",
@@ -4577,6 +4592,7 @@
       "version": "0.6.3",
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
       "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "safer-buffer": ">= 2.1.2 < 3.0.0"
@@ -4699,6 +4715,7 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
       "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/is-promise": {
@@ -4746,6 +4763,7 @@
       "version": "26.1.0",
       "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz",
       "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "cssstyle": "^4.2.1",
@@ -4785,6 +4803,7 @@
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
       "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
+      "dev": true,
       "license": "Apache-2.0",
       "engines": {
         "node": ">=18"
@@ -5179,6 +5198,7 @@
       "version": "2.2.22",
       "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz",
       "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/object-assign": {
@@ -5263,6 +5283,7 @@
       "version": "7.3.0",
       "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
       "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "entities": "^6.0.0"
@@ -5275,6 +5296,7 @@
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
       "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+      "dev": true,
       "license": "BSD-2-Clause",
       "engines": {
         "node": ">=0.12"
@@ -5439,6 +5461,7 @@
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
       "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=6"
@@ -5627,6 +5650,7 @@
       "version": "0.8.0",
       "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz",
       "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/rust-result": {
@@ -5650,6 +5674,7 @@
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/sass": {
@@ -5677,6 +5702,7 @@
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
       "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+      "dev": true,
       "license": "ISC",
       "dependencies": {
         "xmlchars": "^2.2.0"
@@ -5789,6 +5815,7 @@
       "version": "3.2.4",
       "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
       "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/systemjs": {
@@ -5845,6 +5872,7 @@
       "version": "6.1.86",
       "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
       "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "tldts-core": "^6.1.86"
@@ -5857,6 +5885,7 @@
       "version": "6.1.86",
       "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz",
       "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/to-regex-range": {
@@ -5876,6 +5905,7 @@
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
       "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
+      "dev": true,
       "license": "BSD-3-Clause",
       "dependencies": {
         "tldts": "^6.1.32"
@@ -5888,6 +5918,7 @@
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
       "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "punycode": "^2.3.1"
@@ -6504,6 +6535,7 @@
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
       "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "xml-name-validator": "^5.0.0"
@@ -6516,6 +6548,7 @@
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
       "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
+      "dev": true,
       "license": "Apache-2.0",
       "engines": {
         "node": ">=18"
@@ -6531,6 +6564,7 @@
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
       "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+      "dev": true,
       "license": "BSD-2-Clause",
       "engines": {
         "node": ">=12"
@@ -6546,6 +6580,7 @@
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
       "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "iconv-lite": "0.6.3"
@@ -6558,6 +6593,7 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
       "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=18"
@@ -6567,6 +6603,7 @@
       "version": "14.2.0",
       "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
       "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "tr46": "^5.1.0",
@@ -6606,6 +6643,7 @@
       "version": "8.18.3",
       "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
       "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=10.0.0"
@@ -6667,6 +6705,7 @@
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
       "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/xtend": {

+ 1 - 1
package.json

@@ -16,7 +16,6 @@
     "@vue-office/excel": "^1.7.14",
     "@vue-office/pptx": "^1.0.1",
     "axios": "^1.10.0",
-    "blockly": "^12.3.1",
     "element-plus": "^2.10.2",
     "highlight.js": "^11.11.1",
     "hls.js": "^1.6.7",
@@ -38,6 +37,7 @@
     "@types/markdown-it": "^14.1.2",
     "@types/node": "^24.0.10",
     "@vitejs/plugin-vue": "^6.0.0",
+    "blockly": "^12.3.1",
     "eslint": "^9.32.0",
     "eslint-plugin-vue": "^10.3.0",
     "path": "^0.12.7",

+ 106 - 55
src/api/blockly/blockly.js

@@ -226,6 +226,30 @@ const availableBlocks = {
     },
     isGeneral: true
   },
+  // 当经过某个形状的积木(可作为参数使用的value类型)
+  when_passed: {
+    jsonConfig: {
+      "type": "when_passed",
+      "message0": "当经过 %1",
+      "args0": [
+        {
+          "type": "field_dropdown",
+          "name": "SHAPE",
+          "options": [
+            ["正方形", "square"],
+            ["长方形", "rectangle"],
+            ["圆形", "circle"],
+            ["三角形", "triangle"]
+          ]
+        }
+      ],
+      "output": "Boolean",
+      "colour": 30,
+      "tooltip": "检查角色是否经过指定形状,可作为参数使用",
+      "helpUrl": ""
+    },
+    isGeneral: true
+  },
   // 特殊积木 - 可根据配置动态加载
   pause: {
     jsonConfig: {
@@ -334,6 +358,10 @@ const availableGenerators = {
   use_item: function(block) {
     return 'await useItem();\n';
   },
+  when_passed: function(block) {
+    const shape = block.getFieldValue('SHAPE');
+    return [`whenPassed('${shape}')`, javascriptGenerator.ORDER_FUNCTION_CALL];
+  },
   // 特殊生成器 - 可根据配置动态加载
   pause: function(block) {
     const seconds = block.getFieldValue('SECONDS');
@@ -381,6 +409,10 @@ const availablePythonGenerators = {
   use_item: function(block) {
     return 'use_item()\n';
   },
+  when_passed: function(block) {
+    const shape = block.getFieldValue('SHAPE');
+    return [`when_passed('${shape}')`, pythonGenerator.ORDER_FUNCTION_CALL];
+  },
   // 特殊生成器 - 可根据配置动态加载
   pause: function(block) {
     const seconds = block.getFieldValue('SECONDS');
@@ -418,70 +450,89 @@ export function registerCustomBlocks(blocklySpecialBlocks = []) {
  * 设置Blockly中文本地化
  */
 export function setupBlocklyChineseLocale() {
-  // 覆盖默认的英文文本为中文
-  if (!Blockly.Msg) Blockly.Msg = {};
+// 使用扩展方式覆盖默认的英文文本为中文
+  const locale = {
+    // 逻辑积木中文配置
+    CONTROLS_IF_MSG_IF: "如果",
+    CONTROLS_IF_MSG_ELSEIF: "否则如果",
+    CONTROLS_IF_MSG_ELSE: "否则",
+    CONTROLS_IF_MSG_THEN: "执行",
+    CONTROLS_IF_MSG_DO: "执行",
+    CONTROLS_IF_TOOLTIP_1: "如果条件为真,则执行相应的代码。",
+    CONTROLS_IF_TOOLTIP_2: "如果条件为真,则执行相应的代码;否则执行其他代码。",
+    CONTROLS_IF_TOOLTIP_3: "如果条件为真,则执行相应的代码;否则检查其他条件。",
+    CONTROLS_IF_TOOLTIP_4: "如果条件为真,则执行相应的代码;否则检查其他条件,如果都不满足则执行最后代码。",
 
-  // 逻辑积木中文配置
-  Blockly.Msg.CONTROLS_IF_MSG_IF = "如果";
-  Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "否则如果";
-  Blockly.Msg.CONTROLS_IF_MSG_ELSE = "否则";
-  Blockly.Msg.CONTROLS_IF_MSG_DO = "执行"; // 添加这行将'do'转换为中文
-  Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "如果条件为真,则执行相应的代码。";
-  Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "如果条件为真,则执行相应的代码;否则执行其他代码。";
-  Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "如果条件为真,则执行相应的代码;否则检查其他条件。";
+    // 控制块的弹出菜单文本
+    CONTROLS_IF_IF: "如果",
+    CONTROLS_IF_ELSEIF: "否则如果",
+    CONTROLS_IF_ELSE: "否则",
+    CONTROLS_IF_IF_TITLE: "如果",
+    CONTROLS_IF_IF_TITLE_IF: "如果",
+    CONTROLS_IF_ELSEIF_TITLE_ELSEIF: "否则如果",
+    CONTROLS_IF_ELSE_TITLE: "否则",
+    CONTROLS_IF_ELSE_TITLE_ELSE: "否则",
 
-  // 添加设置按钮相关的中文配置
-  Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "否则如果条件为真,则执行相应的代码。";
-  Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "否则执行相应的代码。";
+    // 条件块的提示文本和帮助URL
+    CONTROLS_IF_HELPURL: "条件语句帮助",
+    CONTROLS_IF_TOOLTIP_IF: "添加或删除条件。",
+    CONTROLS_IF_TOOLTIP_ELSE: "添加或删除否则块。",
 
-  // 打开/关闭块的提示文本
-  Blockly.Msg.CONTROLS_IF_TOOLTIP_IF = "添加或删除条件。";
-  Blockly.Msg.CONTROLS_IF_TOOLTIP_ELSE = "添加或删除否则块。";
+    // 添加设置按钮相关的中文配置
+    CONTROLS_IF_ELSEIF_TOOLTIP: "否则如果条件为真,则执行相应的代码。",
+    CONTROLS_IF_ELSE_TOOLTIP: "否则执行相应的代码。",
 
+    // 比较运算符中文配置
+    LOGIC_COMPARE_EQ: "等于",
+    LOGIC_COMPARE_NEQ: "不等于",
+    LOGIC_COMPARE_LT: "小于",
+    LOGIC_COMPARE_LTE: "小于等于",
+    LOGIC_COMPARE_GT: "大于",
+    LOGIC_COMPARE_GTE: "大于等于",
+    LOGIC_COMPARE_TOOLTIP_EQ: "比较两个值是否相等。",
+    LOGIC_COMPARE_TOOLTIP_NEQ: "比较两个值是否不相等。",
+    LOGIC_COMPARE_TOOLTIP_LT: "比较第一个值是否小于第二个值。",
+    LOGIC_COMPARE_TOOLTIP_LTE: "比较第一个值是否小于或等于第二个值。",
+    LOGIC_COMPARE_TOOLTIP_GT: "比较第一个值是否大于第二个值。",
+    LOGIC_COMPARE_TOOLTIP_GTE: "比较第一个值是否大于或等于第二个值。",
 
-  // 比较运算符中文配置 - 添加显示文本
-  Blockly.Msg.LOGIC_COMPARE_EQ = "等于";
-  Blockly.Msg.LOGIC_COMPARE_NEQ = "不等于";
-  Blockly.Msg.LOGIC_COMPARE_LT = "小于";
-  Blockly.Msg.LOGIC_COMPARE_LTE = "小于等于";
-  Blockly.Msg.LOGIC_COMPARE_GT = "大于";
-  Blockly.Msg.LOGIC_COMPARE_GTE = "大于等于";
+    // 逻辑运算中文配置
+    LOGIC_OPERATION_AND: "且",
+    LOGIC_OPERATION_OR: "或",
+    LOGIC_OPERATION_TOOLTIP_AND: "如果两个条件都为真,则结果为真。",
+    LOGIC_OPERATION_TOOLTIP_OR: "如果任一条件为真,则结果为真。",
 
-  // 比较运算符提示文本(已存在)
-  Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "比较两个值是否相等。";
-  Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "比较两个值是否不相等。";
-  Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "比较第一个值是否小于第二个值。";
-  Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "比较第一个值是否小于或等于第二个值。";
-  Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "比较第一个值是否大于第二个值。";
-  Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "比较第一个值是否大于或等于第二个值。";
+    // 布尔值配置
+    LOGIC_BOOLEAN_TRUE: "真",
+    LOGIC_BOOLEAN_FALSE: "假",
+    LOGIC_BOOLEAN_TOOLTIP: "返回一个布尔值:真或假。",
 
-  // 逻辑运算中文配置 - 添加显示文本
-  Blockly.Msg.LOGIC_OPERATION_AND = "且";
-  Blockly.Msg.LOGIC_OPERATION_OR = "或";
+    // 循环积木中文配置
+    CONTROLS_REPEAT_TITLE: "重复%1次",
+    CONTROLS_REPEAT_TOOLTIP: "重复执行内部代码指定次数。",
+    CONTROLS_REPEAT_MSG_DO: "执行",
+    CONTROLS_REPEAT_INPUT_DO: "执行",
+    CONTROLS_WHILEUNTIL_MSG_DO: "执行",
+    CONTROLS_WHILEUNTIL_INPUT_DO: "执行",
+    CONTROLS_FOR_MSG_DO: "执行",
+    CONTROLS_FOR_INPUT_DO: "执行",
+    CONTROLS_FOR_EACH_MSG_DO: "执行",
+    CONTROLS_FOR_EACH_INPUT_DO: "执行",
 
-  // 逻辑运算提示文本(已存在)
-  Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "如果两个条件都为真,则结果为真。";
-  Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "如果任一条件为真,则结果为真。";
-
-  // 布尔值配置
-  Blockly.Msg.LOGIC_BOOLEAN_TRUE = "真";
-  Blockly.Msg.LOGIC_BOOLEAN_FALSE = "假";
-  Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "返回一个布尔值:真或假。";
-
-  // 循环积木中文配置(保持不变)
-  Blockly.Msg.CONTROLS_REPEAT_TITLE = "重复%1次";
-  Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "重复执行内部代码指定次数。";
+    // 数学积木中文配置
+    MATH_NUMBER_TOOLTIP: "一个数字。在编辑器中双击以更改。",
+    MATH_ADDITION_SYMBOL: "加",
+    MATH_SUBTRACTION_SYMBOL: "减",
+    MATH_MULTIPLICATION_SYMBOL: "乘",
+    MATH_DIVISION_SYMBOL: "除",
+    MATH_ARITHMETIC_TOOLTIP_ADD: "返回两个数的和。",
+    MATH_ARITHMETIC_TOOLTIP_SUBTRACT: "返回第一个数减去第二个数的差。",
+    MATH_ARITHMETIC_TOOLTIP_MULTIPLY: "返回两个数的积。",
+    MATH_ARITHMETIC_TOOLTIP_DIVIDE: "返回第一个数除以第二个数的商。"
+  };
 
-  // 数学积木中文配置(保持不变)
-  Blockly.Msg.MATH_NUMBER_TOOLTIP = "一个数字。在编辑器中双击以更改。";
-  Blockly.Msg.MATH_ADDITION_SYMBOL = "加";
-  Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "减";
-  Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "乘";
-  Blockly.Msg.MATH_DIVISION_SYMBOL = "除";
-  Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "返回两个数的和。";
-  Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_SUBTRACT = "返回第一个数减去第二个数的差。";
-  Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "返回两个数的积。";
-  Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "返回第一个数除以第二个数的商。";
+  // 使用Object.assign来合并配置,避免直接修改导入对象
+  Object.assign(Blockly.Msg, locale);
 }
 
 /**

+ 27 - 2
src/components/blockly/MapGame.vue

@@ -86,7 +86,7 @@
 
       <div class="workspace-section">
         <div class="controls">
-          <button id="runCode" @click="runCode" :disabled="isRunning">运行代码</button>
+          <button id="runCode" @click="resetPlayer();runCode();" :disabled="isRunning">运行代码</button>
             <!-- <button @click="generatePythonCode">生成Python代码</button>-->
           <button @click="resetPlayer" >重置玩家</button>
           <button @click="clearWorkspace">清空工作区</button>
@@ -550,6 +550,7 @@ function generateToolboxXml() {
     <category name="功能" colour="120">
       <block type="pickup_item"></block>
       <block type="use_item"></block>
+      <block type="when_passed"></block>
   `;
 
   // 确保blocklySpecialBlocks是数组
@@ -782,7 +783,6 @@ function getCarriedItemStyle(index, item) {
 //================操作按钮=====================
 // 运行代码
 const runCode = async () => {
-  await resetPlayer();
   isRunning.value = true;
   try {
     await new Promise(resolve => setTimeout(resolve, CONFIG.DELAY.RESET_DELAY));
@@ -919,6 +919,14 @@ const resetPlayer = async () => {
   gameState.player.hasReachedEnd = false;
   gameState.player.isSliding = false; // 重置滑行状态
   showOverlay.value = false; // 隐藏遮罩层
+
+  // 处理多路线情况:重置回初始的第一条路线并清空路线过关标识
+  if (parsedRouteList.value.length > 1) {
+    // 重置路线通过状态:只有第一条路线可用
+    routePassedStatus.value = parsedRouteList.value.map((_, index) => index === 0);
+    // 切换回第一条路线
+    switchRoute(0);
+  }
 };
 
 // 清空工作区
@@ -1354,6 +1362,23 @@ window.construct = async function() {
   processingSpecialTasksDisappearing()
 };
 
+// 当经过指定形状时执行的函数(返回布尔值,可作为参数使用)
+window.whenPassed = function(shape) {
+  if (shouldStopExecution || isColliding.value || isSliding.value) {
+    return false;
+  }
+
+  // 取人物当前位置
+  let x = playerPosition.value.x;
+  let y = playerPosition.value.y;
+  let tileMap = walkablePointsMap.get(`${x},${y}`);
+
+  // 检查当前位置的瓦片是否匹配指定形状
+  const isMatch = tileMap && tileMap.mark && tileMap.mark.toLowerCase() === shape;
+  
+  return isMatch;
+};
+
 //校验是否到达终点
 window.isFinish = async function() {
   // 如果已经发生过碰撞,不再执行任何检查

+ 83 - 68
src/views/blockly/MapGame.vue

@@ -635,74 +635,89 @@ function registerJavaScriptGenerators() {
 }
 
 const setupBlocklyChineseLocale = () => {
-  // 覆盖默认的英文文本为中文
-  if (!Blockly.Msg) Blockly.Msg = {};
-
-  // 逻辑积木中文配置
-  Blockly.Msg.CONTROLS_IF_MSG_IF = "如果";
-  Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "否则如果";
-  Blockly.Msg.CONTROLS_IF_MSG_ELSE = "否则";
-  Blockly.Msg.CONTROLS_IF_MSG_DO = "执行"; // 添加这行将'do'转换为中文
-  Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = "如果条件为真,则执行相应的代码。";
-  Blockly.Msg.CONTROLS_IF_TOOLTIP_2 = "如果条件为真,则执行相应的代码;否则执行其他代码。";
-  Blockly.Msg.CONTROLS_IF_TOOLTIP_3 = "如果条件为真,则执行相应的代码;否则检查其他条件。";
-
-  // 添加设置按钮相关的中文配置
-  Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "否则如果条件为真,则执行相应的代码。";
-  Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "否则执行相应的代码。";
-
-  // 打开/关闭块的提示文本
-  Blockly.Msg.CONTROLS_IF_TOOLTIP_IF = "添加或删除条件。";
-  Blockly.Msg.CONTROLS_IF_TOOLTIP_ELSE = "添加或删除否则块。";
-
-
-  // 比较运算符中文配置 - 添加显示文本
-  Blockly.Msg.LOGIC_COMPARE_EQ = "等于";
-  Blockly.Msg.LOGIC_COMPARE_NEQ = "不等于";
-  Blockly.Msg.LOGIC_COMPARE_LT = "小于";
-  Blockly.Msg.LOGIC_COMPARE_LTE = "小于等于";
-  Blockly.Msg.LOGIC_COMPARE_GT = "大于";
-  Blockly.Msg.LOGIC_COMPARE_GTE = "大于等于";
-
-  // 比较运算符提示文本(已存在)
-  Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = "比较两个值是否相等。";
-  Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = "比较两个值是否不相等。";
-  Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = "比较第一个值是否小于第二个值。";
-  Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = "比较第一个值是否小于或等于第二个值。";
-  Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = "比较第一个值是否大于第二个值。";
-  Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = "比较第一个值是否大于或等于第二个值。";
-
-  // 逻辑运算中文配置 - 添加显示文本
-  Blockly.Msg.LOGIC_OPERATION_AND = "且";
-  Blockly.Msg.LOGIC_OPERATION_OR = "或";
-
-  // 逻辑运算提示文本(已存在)
-  Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND = "如果两个条件都为真,则结果为真。";
-  Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR = "如果任一条件为真,则结果为真。";
-
-  // 布尔值配置
-  Blockly.Msg.LOGIC_BOOLEAN_TRUE = "真";
-  Blockly.Msg.LOGIC_BOOLEAN_FALSE = "假";
-  Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP = "返回一个布尔值:真或假。";
-
-  // 循环积木中文配置(保持不变)
-  Blockly.Msg.CONTROLS_REPEAT_TITLE = "重复%1次";
-  Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = "重复执行内部代码指定次数。";
-  // Blockly.Msg.CONTROLS_WHILEUNTIL_TITLE_WHILE = "当%1时重复";
-  // Blockly.Msg.CONTROLS_WHILEUNTIL_TITLE_UNTIL = "重复直到%1";
-  // Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = "只要条件为真,就重复执行内部代码。";
-  // Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = "重复执行内部代码,直到条件变为真。";
-
-  // 数学积木中文配置(保持不变)
-  Blockly.Msg.MATH_NUMBER_TOOLTIP = "一个数字。在编辑器中双击以更改。";
-  Blockly.Msg.MATH_ADDITION_SYMBOL = "加";
-  Blockly.Msg.MATH_SUBTRACTION_SYMBOL = "减";
-  Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = "乘";
-  Blockly.Msg.MATH_DIVISION_SYMBOL = "除";
-  Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = "返回两个数的和。";
-  Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_SUBTRACT = "返回第一个数减去第二个数的差。";
-  Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = "返回两个数的积。";
-  Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = "返回第一个数除以第二个数的商。";
+  // 使用扩展方式覆盖默认的英文文本为中文
+  const locale = {
+    // 逻辑积木中文配置
+    CONTROLS_IF_MSG_IF: "如果",
+    CONTROLS_IF_MSG_ELSEIF: "否则如果",
+    CONTROLS_IF_MSG_ELSE: "否则",
+    CONTROLS_IF_MSG_THEN: "执行",
+    CONTROLS_IF_MSG_DO: "执行",
+    CONTROLS_IF_TOOLTIP_1: "如果条件为真,则执行相应的代码。",
+    CONTROLS_IF_TOOLTIP_2: "如果条件为真,则执行相应的代码;否则执行其他代码。",
+    CONTROLS_IF_TOOLTIP_3: "如果条件为真,则执行相应的代码;否则检查其他条件。",
+    CONTROLS_IF_TOOLTIP_4: "如果条件为真,则执行相应的代码;否则检查其他条件,如果都不满足则执行最后代码。",
+
+    // 控制块的弹出菜单文本
+    CONTROLS_IF_IF: "如果",
+    CONTROLS_IF_ELSEIF: "否则如果",
+    CONTROLS_IF_ELSE: "否则",
+    CONTROLS_IF_IF_TITLE: "如果",
+    CONTROLS_IF_IF_TITLE_IF: "如果",
+    CONTROLS_IF_ELSEIF_TITLE_ELSEIF: "否则如果",
+    CONTROLS_IF_ELSE_TITLE: "否则",
+    CONTROLS_IF_ELSE_TITLE_ELSE: "否则",
+
+    // 条件块的提示文本和帮助URL
+    CONTROLS_IF_HELPURL: "条件语句帮助",
+    CONTROLS_IF_TOOLTIP_IF: "添加或删除条件。",
+    CONTROLS_IF_TOOLTIP_ELSE: "添加或删除否则块。",
+
+    // 添加设置按钮相关的中文配置
+    CONTROLS_IF_ELSEIF_TOOLTIP: "否则如果条件为真,则执行相应的代码。",
+    CONTROLS_IF_ELSE_TOOLTIP: "否则执行相应的代码。",
+
+    // 比较运算符中文配置
+    LOGIC_COMPARE_EQ: "等于",
+    LOGIC_COMPARE_NEQ: "不等于",
+    LOGIC_COMPARE_LT: "小于",
+    LOGIC_COMPARE_LTE: "小于等于",
+    LOGIC_COMPARE_GT: "大于",
+    LOGIC_COMPARE_GTE: "大于等于",
+    LOGIC_COMPARE_TOOLTIP_EQ: "比较两个值是否相等。",
+    LOGIC_COMPARE_TOOLTIP_NEQ: "比较两个值是否不相等。",
+    LOGIC_COMPARE_TOOLTIP_LT: "比较第一个值是否小于第二个值。",
+    LOGIC_COMPARE_TOOLTIP_LTE: "比较第一个值是否小于或等于第二个值。",
+    LOGIC_COMPARE_TOOLTIP_GT: "比较第一个值是否大于第二个值。",
+    LOGIC_COMPARE_TOOLTIP_GTE: "比较第一个值是否大于或等于第二个值。",
+
+    // 逻辑运算中文配置
+    LOGIC_OPERATION_AND: "且",
+    LOGIC_OPERATION_OR: "或",
+    LOGIC_OPERATION_TOOLTIP_AND: "如果两个条件都为真,则结果为真。",
+    LOGIC_OPERATION_TOOLTIP_OR: "如果任一条件为真,则结果为真。",
+
+    // 布尔值配置
+    LOGIC_BOOLEAN_TRUE: "真",
+    LOGIC_BOOLEAN_FALSE: "假",
+    LOGIC_BOOLEAN_TOOLTIP: "返回一个布尔值:真或假。",
+
+    // 循环积木中文配置
+    CONTROLS_REPEAT_TITLE: "重复%1次",
+    CONTROLS_REPEAT_TOOLTIP: "重复执行内部代码指定次数。",
+    CONTROLS_REPEAT_MSG_DO: "执行",
+    CONTROLS_REPEAT_INPUT_DO: "执行",
+    CONTROLS_WHILEUNTIL_MSG_DO: "执行",
+    CONTROLS_WHILEUNTIL_INPUT_DO: "执行",
+    CONTROLS_FOR_MSG_DO: "执行",
+    CONTROLS_FOR_INPUT_DO: "执行",
+    CONTROLS_FOR_EACH_MSG_DO: "执行",
+    CONTROLS_FOR_EACH_INPUT_DO: "执行"
+
+    // 数学积木中文配置
+    MATH_NUMBER_TOOLTIP: "一个数字。在编辑器中双击以更改。",
+    MATH_ADDITION_SYMBOL: "加",
+    MATH_SUBTRACTION_SYMBOL: "减",
+    MATH_MULTIPLICATION_SYMBOL: "乘",
+    MATH_DIVISION_SYMBOL: "除",
+    MATH_ARITHMETIC_TOOLTIP_ADD: "返回两个数的和。",
+    MATH_ARITHMETIC_TOOLTIP_SUBTRACT: "返回第一个数减去第二个数的差。",
+    MATH_ARITHMETIC_TOOLTIP_MULTIPLY: "返回两个数的积。",
+    MATH_ARITHMETIC_TOOLTIP_DIVIDE: "返回第一个数除以第二个数的商。"
+  };
+
+  // 使用Object.assign来合并配置,避免直接修改导入对象
+  Object.assign(Blockly.Msg, locale);
 }