{"id":297070,"student_id":10,"content":"// // 設為 true 則顯示蘋果\ngame.displayApple = true;\n\nvar bird = game.bird; //鳥\nvar ground = game.ground; //地板\nvar pipes = game.pipes; //水管們\n\n// 可以在主控台中印出 Q 觀察看看\nvar Q = new Brain; // 鳥的大腦,記錄在不同的狀態下要做什麼反應(跳/不跳)\nQ.display = true;\n\nvar alpha = 0.3; // 學習速率\nvar beta = 0.9; // 獎勵延遲\n\non('click', bird.jump);\non('keydown', 'space', game.restart);\n\n\n// 遊戲迴圈\nfunction gameloop () {\n \n var apple = game.getApple();\n var S1 = getStatus(bird, apple);\n drawText(S1, 100, 10, 'white', 40);\n \n if (Q[S1][0] \u003c Q[S1][1]) {\n var A = 1;\n bird.jump()\n } else {\n var A = 0;\n }\n \n game.update(); // 更新角色位置與畫面\n \n var S2 = getStatus(bird, apple);\n \n \n if (bird.touched(ground) || bird.touched(pipes)) {\n game.restart();\n reward(S1, A, S2, -1000);\n }\n \n if (bird.touched(apple)) {\n apple.hidden = true;\n reward(S1, A, S2, 50);\n }\n \n reward(S1, A, S2, 1);\n \n}\n\n// 根據鳥與蘋果的相對位置來作為「狀態」\nfunction getStatus (bird, apple) {\n var x = Math.floor((apple.x - bird.x) / 20);\n var y = Math.floor((apple.y - bird.y) / 20);\n return x + ':' + y\n}\n\n// 獎勵懲罰來更新 Q 大腦\nfunction reward (S1, A, S2, R) {\n var mr = Math.min(Q[S2][0], Q[S2][1]);\n Q[S1][A] = Q[S1][A] * (1 - alpha) + (R + mr * beta) * alpha;\n}\n\nforever(gameloop); //不斷執行遊戲迴圈\n\n","created_at":"2021-09-10T16:12:40.100+08:00","updated_at":"2024-01-16T20:06:50.094+08:00","name":"AI 學會玩 Flappy Bird(預設版)","language":"javascript","screenshot":{"url":"https://cdn2.koding.school/uploads/project/screenshot/297070/4ca99dcfeb62c52a5e577b5c979905e4.jpg"},"parent_id":296951,"plugin":"const stageWidth = 1200\nconst stageHeight = 900\nconst spaceBetweenPipe = 500\nconst cellWidth = 30\nconst speed = 5\nconst gravity = 0.4\n\nsetBackdrop('bg.png')\nGame.set({ width: 1200, height: 900 })\n\nlet count = 0\n\nfunction myGame () {\n \n let instance = {}\n \n let status = 'playing' // playing, stop\n let score = 0\n \n let bird = createSprite('bird.png')\n bird.vy = 0\n \n let g1 = group(400, 450)\n let g2 = group(800, 450)\n let g3 = group(1200, 450)\n let g4 = group(1600, 450)\n let ground1 = createSprite('ground.png')\n let ground2 = createSprite('ground.png')\n let groups = [g1, g2, g3, g4]\n let pipes = [g1.pipe1, g1.pipe2, g2.pipe1, g2.pipe2, g3.pipe1, g3.pipe2, g4.pipe1, g4.pipe2]\n let apples = [g1.apple, g2.apple, g3.apple,, g4.apple]\n let grounds = [ground1, ground2]\n \n // forever(update)\n\n bird.jump = function () {\n bird.vy = -8\n }\n \n function update () {\n print(score, 10, 10, 'white', 90)\n \n if (bird.touched(pipes) || bird.touched(grounds)) {\n status = 'stop'\n }\n if (status === 'stop') return\n \n \n groups.forEach(g =\u003e {\n g.x -= speed\n if (g.x \u003c 0) {\n g.x += spaceBetweenPipe * 4\n g.y = Math.random() * 400 + 200\n score += 1\n g.apple.hidden = false\n }\n g.update()\n })\n \n apples.forEach(apple =\u003e {\n if (instance.displayApple) {\n apple.opacity = 0.5\n getApple().opacity = 1 \n } else {\n apple.opacity = 0.01\n }\n \n })\n \n bird.vy += gravity\n bird.y += bird.vy\n \n ground1.x -= speed\n ground2.x -= speed\n if (ground1.x \u003c -600) ground1.x += 2400\n if (ground2.x \u003c -600) ground2.x += 2400\n }\n \n function restart () {\n count++;\n console.log('count:' + count)\n ground1.y = 850\n ground2.y = 850\n ground1.x = 0\n ground2.x = 1200\n bird.x = 200\n bird.y = 450\n bird.vy = 0\n g1.x = 200 + spaceBetweenPipe * 1\n g2.x = 200 + spaceBetweenPipe * 2\n g3.x = 200 + spaceBetweenPipe * 3\n g4.x = 200 + spaceBetweenPipe * 4\n g1.y = Math.random() * 400 + 200\n g2.y = Math.random() * 400 + 200\n g3.y = Math.random() * 400 + 200\n g4.y = Math.random() * 400 + 200\n g1.update()\n g2.update()\n g3.update()\n g4.update()\n status = 'playing'\n score = 0\n }\n \n function getApple () {\n return apples.filter(apple =\u003e apple.x \u003e bird.x).sort((a, b) =\u003e a.x - b.x)[0]\n }\n \n instance.restart = restart\n instance.getApple = getApple\n instance.bird = bird\n instance.pipes = pipes\n instance.ground = grounds\n instance.groups = groups\n instance.update = update\n \n return instance\n}\n\n\nfunction group (x, y) {\n let g = { x, y }\n g.apple = createSprite('apple.png')\n g.pipe1 = createSprite('pipe.png')\n g.pipe2 = createSprite('pipe.png')\n g.pipe2.direction += 180\n g.update = function () {\n g.apple.moveTo(g)\n g.pipe1.moveTo(g)\n g.pipe2.moveTo(g)\n g.pipe1.move(-60, -500)\n g.pipe2.move(-60, +500)\n }\n return g\n}\n\n\nvar game = myGame()\ngame.restart()\n\n\n// // Brain\nfunction Brain () {\n var w = 25;\n var h = 30\n var obj = {};\n obj['undefined'] = [0, 0];\n for (var x = -1; x \u003c w + 1; x++) {\n for (var y=-h; y \u003c h; y++) {\n obj[x + ':' + y] = [0, 0];\n }\n }\n \n obj.display = false\n \n forever(() =\u003e {\n if (obj.display === false) return\n game.groups.forEach(g =\u003e {\n var w = 25;\n var h = 30;\n for (var x = 0; x \u003c w; x++) {\n for (var y= -h; y \u003c h; y++) {\n pen.color = 'black'\n let s = Q[x + ':' + y]\n if (s[1] \u003e s[0]) pen.fillColor = '#ff000055'\n else if (s[1] \u003c s[0]) pen.fillColor = '#0000ff55'\n else pen.fillColor = '#00000000'\n pen.size = 0.5\n pen.drawRect(g.x - x*20 - 20, g.y - y*20, 20, 20)\n }\n }\n \n pen.size = 4\n pen.drawLine(g.x, g.y, g.x - 20 * w, g.y)\n pen.drawLine(g.x, g.y - y * 20, g.x, g.y + y * 20)\n pen.size = 1\n })\n })\n \n return obj;\n}\n\n\n\n","description":null,"note":null,"status":"public","like_student_ids":[],"is_featured":false,"views":174,"hashid":"yeysv3vk4","is_content_changed":false,"review_status":"unsubmitted","submitted_at":null,"reviewed_at":null,"advise":null,"is_deleted":false}
[{"id":5976549,"file_name":"apple.png","project_id":297070,"asset_id":415742,"created_at":"2021-09-10T16:12:40.106+08:00","updated_at":"2021-09-10T16:12:40.106+08:00"},{"id":5976550,"file_name":"pipe.png","project_id":297070,"asset_id":415741,"created_at":"2021-09-10T16:12:40.108+08:00","updated_at":"2021-09-10T16:12:40.108+08:00"},{"id":5976551,"file_name":"ground.png","project_id":297070,"asset_id":415740,"created_at":"2021-09-10T16:12:40.109+08:00","updated_at":"2021-09-10T16:12:40.109+08:00"},{"id":5976552,"file_name":"bird.png","project_id":297070,"asset_id":415739,"created_at":"2021-09-10T16:12:40.110+08:00","updated_at":"2021-09-10T16:12:40.110+08:00"},{"id":5976553,"file_name":"bg.png","project_id":297070,"asset_id":415738,"created_at":"2021-09-10T16:12:40.111+08:00","updated_at":"2021-09-10T16:12:40.111+08:00"}]
橘蘋學習平台
橘蘋學習平台
我的作品
檢視專案頁
匯出
複製
匯入
刪除
下載 Android APP (APK)
截圖
1:1:1
1:1
full
幫助
用手機掃描下方 QRCode 進行安裝
或您也可以
下載 APK
到這台電腦
用手機掃描下方 QRCode 進行安裝
或您也可以
下載 APK
到這台電腦