{"id":69121,"student_id":10,"content":"var DNA_LENGTH = 500; // 每個火箭的基因長度\nvar SIZE = 30; // 每一個世代的火箭個數\nvar rockets = []; // 存放所有的火箭\n\n// 初始化所有的火箭\nfor (var i = 0; i \u003c SIZE; i++) {\n var rocket = new Rocket();\n rocket.gens = randomGens();\n rockets.push(rocket);\n rocket.fire();\n}\n\nforever(function () {\n if (key.up) rockets[0].vy -= 0.3;\n if (key.right) rockets[0].vx += 0.1;\n if (key.left) rockets[0].vx -= 0.1;\n});\n\n// 當所有的火箭都停止,執行nextGeneration 產生下一代火箭\nforever(function(){\n for (var i=0; i \u003c rockets.length; i++) {\n if (rockets[i].active) return;\n }\n nextGeneration();\n});\n\n// 產生隨機的初始化基因\nfunction randomGens () {\n var gens = [];\n for (var i=0; i\u003cDNA_LENGTH; i++) { // 執行 500 次\n var rand = Math.floor(Math.random()*4);\n gens.push(rand);\n }\n return gens;\n}\n\n// 產生下一個世代\nfunction nextGeneration () {\n // 為所有火箭打上分數score,分數score越低代表表現越好\n for (var i=0; i\u003cSIZE; i++) {\n var rocket = rockets[i];\n rocket.score = rocket.vy + Math.abs(platform.x - rocket.x);\n }\n // 依據火箭的分數來排序\n rockets.sort(function (a, b) {\n return a.score - b.score;\n });\n //選出父、母\n var parentA = rockets[0].gens;\n var parentB = rockets[1].gens;\n \n for (var i=0; i\u003cSIZE; i++) {\n rockets[i].gens = crossover(parentA, parentB);\n rockets[i].fire();\n }\n}\n\n// 交配產生下一代基因\n// 每個基因有 2% 的機率突變,若不突變則各有 50% 的機率來自父親和母親\nfunction crossover (a, b) {\n var gens = [];\n for (var i=0; i\u003c500; i++) {\n gens[i] = Math.random() \u003e 0.5 ? a[i] : b[i];\n \n // 0.02 機率會隨機變化\n if (Math.random() \u003c 0.02) {\n gens[i] = Math.floor(Math.random()*4);\n }\n }\n return gens;\n}\n","created_at":"2019-05-25T00:12:01.257+08:00","updated_at":"2019-11-09T12:09:36.964+08:00","name":"火箭降落 AI 副本","language":"javascript","screenshot":{"url":"https://cdn7.koding.school/uploads/project/screenshot/69121/97beb8c4c6ce186673cb4c97317e6b1d.jpg"},"parent_id":61788,"plugin":"var gravity = 0.08;\n\ncreateSprite('bg.png');\nvar platformA = createSprite('platform.png');\nvar platformB = createSprite('platform.png');\nplatformA.scale = 0.6;\nplatformB.scale = 0.6;\nplatformA.y = 430;\nplatformA.x = 90;\nplatformB.y = 430;\nplatformB.x = 550;\n\n// alias\nvar platform = platformB;\n\nvar fires = [];\n\nforever(function () {\n fires = fires.filter(function (obj) {\n if (obj.scale \u003c= 0) {\n obj.destroy();\n return false;\n }\n return true;\n });\n});\n\nfunction createFire (x, y, direction) {\n var fire = createSprite('fire.png');\n fire.moveTo(x, y);\n fire.direction = direction + Math.random()*30 - 15;\n fire.stepForward(30);\n fires.push(fire);\n fire.forever(function () {\n fire.stepForward(2);\n fire.scale -= 0.02;\n fire.opacity -= 0.02;\n })\n}\n\nfunction Rocket () {\n var rocket = createSprite('rocket.png');\n\n rocket.moveTo(platformA);\n rocket.y -= 50;\n rocket.gens = [];\n rocket.direction = 0;\n rocket.scale = 0.3;\n rocket.vx = 0;\n rocket.vy = 0;\n rocket.clock = 0;\n rocket.active = false;\n rocket.cache = {};\n rocket.layer = 1;\n\n rocket.fire = function () {\n rocket.moveTo(platformA);\n rocket.y -= 50;\n this.direction = 0;\n this.scale = 0.3;\n this.vx = 0;\n this.vy = 0;\n this.clock = 0;\n this.active = true;\n this.opacity = 1;\n }\n\n rocket.forever(function() {\n\n if (!rocket.active) return;\n\n rocket.direction = rocket.vx*10;\n rocket.isFire = (\n Math.abs(rocket.vx - rocket.cache.vx) \u003e 0.02 ||\n rocket.vy - gravity - rocket.cache.vy != 0\n )\n rocket.cache.vx = rocket.vx;\n rocket.cache.vy = rocket.vy;\n \n if (rocket.clock % 3 == 0 \u0026\u0026 rocket.isFire) {\n rocket.isFire = false;\n createFire(rocket.x, rocket.y, rocket.direction + 180);\n }\n\n var g = rocket.gens[rocket.clock];\n rocket.clock++;\n if (g == 0) rocket.vy -= 0.3;\n else if (g == 1) rocket.vx += 0.1;\n else if (g == 2) rocket.vx -= 0.1;\n\n if (Math.abs(rocket.vx) \u003c 0.01) {\n rocket.vx = 0;\n } else {\n rocket.vx += rocket.vx \u003e 0 ? -0.01 : 0.01;\n }\n\n rocket.vy += gravity;\n rocket.x += rocket.vx;\n rocket.y += rocket.vy;\n\n if (rocket.touched([platformA, platformB]) || rocket.y \u003e= 440) {\n rocket.active = false;\n var score = Math.abs(rocket.vy) + Math.abs(rocket.x - platformB.x);\n rocket.opacity = score \u003e 8 ? 0.1: 1;\n }\n })\n\n return rocket;\n}","description":null,"note":null,"status":"public","like_student_ids":[],"is_featured":false,"views":301,"hashid":"6rps3ygz","is_content_changed":false,"review_status":"unsubmitted","submitted_at":null,"reviewed_at":null,"advise":null,"is_deleted":false}
[{"id":1209808,"file_name":"bg.png","project_id":69121,"asset_id":114042,"created_at":"2019-05-25T00:12:01.263+08:00","updated_at":"2019-05-25T00:12:01.263+08:00"},{"id":1209809,"file_name":"platform.png","project_id":69121,"asset_id":114041,"created_at":"2019-05-25T00:12:01.265+08:00","updated_at":"2019-05-25T00:12:01.265+08:00"},{"id":1209810,"file_name":"rocket.png","project_id":69121,"asset_id":114040,"created_at":"2019-05-25T00:12:01.266+08:00","updated_at":"2019-05-25T00:12:01.266+08:00"},{"id":1209811,"file_name":"fire.png","project_id":69121,"asset_id":114039,"created_at":"2019-05-25T00:12:01.266+08:00","updated_at":"2019-05-25T00:12:01.266+08:00"}]
橘蘋學習平台
橘蘋學習平台
我的作品
檢視專案頁
匯出
複製
匯入
刪除
下載 Android APP (APK)
截圖
1:1:1
1:1
full
幫助
用手機掃描下方 QRCode 進行安裝
或您也可以
下載 APK
到這台電腦
用手機掃描下方 QRCode 進行安裝
或您也可以
下載 APK
到這台電腦