# IEH 程式隊 2025第三學季 Workshop003 ## 🎓 程式課程規劃(7堂) ### 📅 上課日期 12/13、12/27、1/3、<span style="color:red; font-weight:bold;">1/10</span>、1/17、1/24、<span style="color:red; font-weight:bold;">1/31</span> ### 🗂️ 課程總覽 | 日期 | 主題 | 任務名稱 | 技能重點 | 小任務成果 | |------|------|-----------|------------|--------------| | **12/13** | 基礎程式複習 | 🔄《程式複習任務》 | 變數、資料型態、事件、DOM 操作、點擊事件 | 做小互動練習,為 AI 專題鋪路 | | **12/27** | 遊戲邏輯進階 | ⏱️《倒數生存挑戰》 | 計時器、遊戲狀態(state)、重來機制、config 設計 | 倒數時間內生存,完成小遊戲 | | **1/3** | AI 聊天入門 | 🤖《我的 AI 角色聊天室》 | Fetch API、prompt 設計、聊天紀錄、UI 顯示 | 可以跟自己設計的 AI 角色聊天 | | <span style="color:red; font-weight:bold;">1/10</span> | 專題企劃 | 🛠️《設計我的 AI / 遊戲專題》 | 專題選題、功能拆解、角色設定、流程圖 | 完成專題企劃表與畫面草圖 | | **1/17** | 專題實作 ① | 🧑‍💻《實作製作日》 | 功能實作、資料結構、事件整合 | 專題核心功能可操作 | | **1/24** | 專題實作 ② | 🧪《發表準備與彩排》 | Debug、UI 優化、例外處理、操作演練 | 專題可完整 Demo,練習介紹作品 | | <span style="color:red; font-weight:bold;">1/31</span> | 專題發表會 | 🌟《我是小小 AI 開發者!》 | 發表、Demo、回饋 | 班級成果發表+獎項 | ## 線上網頁程式編輯器 https://jsfiddle.net/ ## 網頁程式學習資源 https://www.w3schools.com/ ## 🤖《我的 AI 角色聊天室》 讓你設計自己的 AI 角色,並透過網頁即時聊天互動,學習 Fetch API、訊息顯示與錯誤處理。 ![Screenshot 2026-01-03 at 10.54.51 AM](https://hackmd.io/_uploads/HJ5WSZLE-x.png) ## Gemini AI API https://ai.google.dev/gemini-api/docs/pricing https://aistudio.google.com/api-keys ### HTML ```html <div class="chat-container"> <h1>🤖 我的 AI 聊天室</h1> <div id="chatBox" class="chat-box"></div> <div class="input-area"> <input id="userInput" placeholder="輸入你的問題…" /> <button id="sendBtn">送出</button> </div> </div> ``` ### CSS ```css /* ===== Body & Container ===== */ body { font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; background: linear-gradient(135deg, #a1c4fd, #c2e9fb); display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; } .chat-container { width: 90%; max-width: 400px; min-width: 300px; height: 80vh; /* ⭐ 高度自適應畫面 */ min-height: 300px; /* ⭐ 最小高度 */ background: #ffffff; border-radius: 16px; box-shadow: 0 10px 25px rgba(0,0,0,0.15); display: flex; flex-direction: column; overflow: hidden; } /* ===== Title ===== */ h1 { text-align: center; color: #1a73e8; margin: 20px 0; font-size: 24px; } /* ===== Chat Box ===== */ .chat-box { flex: 1; /* 中間訊息區自動填滿剩餘空間 */ padding: 12px; background: #f7f9fc; display: flex; flex-direction: column; gap: 8px; overflow-y: auto; /* 內部 scroll */ border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; } /* ===== Messages ===== */ .message { padding: 10px 14px; border-radius: 12px; max-width: 75%; word-wrap: break-word; } .user { background: #e8f0fe; color: #1a73e8; align-self: flex-end; border-bottom-right-radius: 0; } .ai { background: #e6f4ea; color: #188038; align-self: flex-start; border-bottom-left-radius: 0; } .error { background: #ffe6e6; color: #d93025; align-self: center; font-style: italic; } /* ===== Input Area ===== */ .input-area { display: flex; gap: 8px; padding: 12px; background: #f1f3f4; } input { flex: 1; padding: 10px 14px; border-radius: 12px; border: 1px solid #ccc; font-size: 16px; } button { background: #1a73e8; color: #fff; border: none; border-radius: 12px; padding: 10px 18px; font-size: 16px; cursor: pointer; transition: background 0.2s; } button:hover { background: #1665c1; } /* ===== RWD 微調 ===== */ @media (max-height: 400px) { h1 { font-size: 20px; } input { font-size: 14px; } button { font-size: 14px; padding: 8px 12px; } } ``` ### JS ```javascript // ====== Gemini API Key ====== const GEMINI_API_KEY = "???"; // 替換成你的 Key // ====== DOM ====== const chatBox = document.getElementById("chatBox"); const userInput = document.getElementById("userInput"); const sendBtn = document.getElementById("sendBtn"); // ====== 新增訊息函式 ====== function addMessage(text, className) { const div = document.createElement("div"); div.className = "message " + className; div.textContent = text; chatBox.appendChild(div); // ⭐ 自動捲動到最下面 chatBox.scrollTop = chatBox.scrollHeight; } // ====== 傳訊息給 Gemini AI ====== async function sendMessage() { const message = userInput.value.trim(); if (!message) return; addMessage("你:" + message, "user"); userInput.value = ""; try { const response = await fetch( "https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:generateContent", { method: "POST", headers: { "Content-Type": "application/json", "x-goog-api-key": GEMINI_API_KEY }, body: JSON.stringify({ contents: [ { parts: [ { text: message } ] } ] }) } ); if (!response.ok) { throw new Error("API 連線失敗,請檢查 API Key 或額度"); } const data = await response.json(); if (!data.candidates || !data.candidates[0] || !data.candidates[0].content) { throw new Error("AI 沒有回應內容"); } const reply = data.candidates[0].content.parts[0].text; addMessage("AI:" + reply, "ai"); } catch (err) { addMessage("⚠️ 發生錯誤:" + err.message, "error"); } } // ====== 事件綁定 ====== sendBtn.addEventListener("click", sendMessage); userInput.addEventListener("keydown", e => { if (e.key === "Enter") sendMessage(); }); ``` ## 實作資源 | Code | | |-----|--------------| | Code1 | <div style="filter: blur(5px); color: transparent; text-shadow: 0 0 10px rgba(0,0,0,0.8); letter-spacing: 4px;">AIzaSyBroNNY7vozytmuPMpVSshn6PMu1osI6H0</div> | | Code2 | <div style="filter: blur(5px); color: transparent; text-shadow: 0 0 10px rgba(0,0,0,0.8); letter-spacing: 4px;">AIzaSyAsq5fDEYoUzHk6lQy2zkC1QLO0Oh9Nr44</div> | | Code3 | <div style="filter: blur(5px); color: transparent; text-shadow: 0 0 10px rgba(0,0,0,0.8); letter-spacing: 4px;">AIzaSyAIycrpWvBE5zEwNkrUPQtXk2MeF58MoXU</div> | ## 發想專題項目 🎯 發想原則: ✅ 用得上 HTML/CSS/JS(延續你之前教的基礎) ✅ 與AI相關 ✅ 製作時間約 2–4 堂課可以完成 📆 發表安排提醒: ✅ 每個人都要完成一個自己的專題 ✅ 在 1/10(第四堂課)之前提交你的專題題目 ✅ 在 1/31 分批上台介紹自己的作品 ✅ 完成專題並上台介紹的都有小禮物! ### 報告回報文件夾 - [張加樂](https://docs.google.com/document/d/1JuJ326r3YCWYuonYBTIjUtqJJZO-49G5SvsuKFX2tdE/edit?usp=drive_link) - [李淮恩](https://docs.google.com/document/d/1FSQYL7-ZbGOIwuUTAT0aw1rFDGAgSvsKiR_V8gq11YU/edit?usp=drive_link) - [顏嘉宥](https://docs.google.com/document/d/1JZjLRMGu59kwMly6sgtCCBvHeDbUzXvYNroLphY58PI/edit?usp=drive_link) - [林睿恩](https://docs.google.com/document/d/1ndUOD-FPSk0AQcn9R-NKDecVxpEFWOC7luV0yrjvSUs/edit?usp=drive_link) - [鄧安序](https://docs.google.com/document/d/119AY-bOOyDewm4_Y7Rkrqr65U8q2FhJOfUCiXU7YWPs/edit?usp=drive_link) - [王睿森](https://docs.google.com/document/d/1hYsUMfzCd57XMpWb1qPh08LUhZhYHWtVvXX5ZrlXxcY/edit?usp=drive_link) - [郭芫銘](https://docs.google.com/document/d/14_mefbv4auDdpwzM6mRIprWI_b9CEDy1pZPsvofJ84o/edit?usp=drive_link)