{"id":61687,"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 rockets.push(rocket);\n rocket.fire();\n rocket.gens = randomGens();\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++) {\n gens.push(Math.floor(Math.random()*4));\n }\n return gens;\n}\n\n// 產生下一個世代\nfunction nextGeneration () {\n // 火箭的數值 = 落地時與平台間水平x距離 + 火箭垂直下降的速度\n rockets.forEach((rocket) =\u003e {\n rocket.score = Math.abs(rocket.vy) + Math.abs(rocket.x - platform.x);\n });\n // 依據分數排序,越小的排在越前面\n rockets.sort(function (a, b) {\n return a.score - b.score;\n })\n rockets[0].opacity = 1;\n rockets[1].opacity = 1;\n // 火箭數值越小代表表現越好\n var parentA = rockets[0].gens;\n var parentB = rockets[1].gens;\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\u003cDNA_LENGTH; i++) {\n gens[i] = Math.random() \u003e 0.5 ? a[i] : b[i];\n if (Math.random() \u003c 0.02) gens[i] = Math.floor(Math.random()*4);\n }\n return gens;\n}\n","created_at":"2019-04-05T23:40:35.442+08:00","updated_at":"2019-11-01T21:32:29.380+08:00","name":"火箭降落 AI","language":"javascript","screenshot":{"url":"/uploads/project/screenshot/61687/ca96e1a46299c78cfe715dab40dbe970.jpg"},"parent_id":2,"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":467,"hashid":"5j3srdqe","is_content_changed":false,"review_status":"unsubmitted","submitted_at":null,"reviewed_at":null,"advise":null,"is_deleted":false}
[{"id":1085797,"file_name":"bg.png","project_id":61687,"asset_id":114013,"created_at":"2019-04-12T11:11:35.201+08:00","updated_at":"2019-04-12T11:11:35.201+08:00"},{"id":1085799,"file_name":"platform.png","project_id":61687,"asset_id":114015,"created_at":"2019-04-12T11:11:58.704+08:00","updated_at":"2019-04-12T11:11:58.704+08:00"},{"id":1085801,"file_name":"rocket.png","project_id":61687,"asset_id":114016,"created_at":"2019-04-12T11:13:23.010+08:00","updated_at":"2019-04-12T11:13:23.010+08:00"},{"id":1085802,"file_name":"fire.png","project_id":61687,"asset_id":114017,"created_at":"2019-04-12T11:17:07.609+08:00","updated_at":"2019-04-12T11:17:07.609+08:00"}]
Orange Apple Learning Platform
My Projects
View Project Page
Export
Remix
Import
Delete
Download Android APP (APK)
Screenshot
繁中
简中
English
日本語
1:1:1
1:1
Full Width
Scan the QRCode below with your phone to install
Or you can
download APK
to this computer
Scan the QRCode below with your phone to install
Or you can
download APK
to this computer