คาบ 14 — โปรเจกต์ปลายภาค

เกมของน้องเอง หรือหน้าจอควบคุมที่ยืมเทคนิคจากเกม

3 สัปดาห์ · ประเมินรายคนเสมอ · บอร์ด Eva Kit

12 คาบที่ผ่านมา น้อง ๆ เก็บเทคนิคไว้ครบแล้ว ตั้งแต่ไฟ LED ปุ่ม จอ จอย ฟิสิกส์ เสียง จนถึงชุดหมุนเวียนและการชน ต่อจากนี้คือการเอามาประกอบเป็นงานของน้องเอง

ปฏิทิน 3 สัปดาห์ — ดูตรงนี้ก่อน

วัน สิ่งที่ต้องเสร็จ
7 ต.ค. (วันนี้) รูปแบบงาน (รายคน หรือ คู่) รออาจารย์ประกาศในคาบ · เริ่มคิดไอเดียของตัวเอง 2 เรื่อง
7–13 ต.ค. ลงชื่อไอเดียใน Google Classroom · ร่างหน้าจอ · ทำ pitch deck + โปสเตอร์ร่าง · ส่งใน Google Classroom ก่อน 13 ต.ค. 23:59
14 ต.ค. เสนอหัวข้อ (เวลาต่อคน/คู่ รออาจารย์ประกาศ) · เริ่มพัฒนาในคาบ
21 ต.ค. ความก้าวหน้า 1/2: รุ่นแรกที่เล่นได้ รันบนบอร์ด · เพื่อนลองเล่น · อาจารย์ถามรายคน คนละ 1 นาที
28 ต.ค. ความก้าวหน้า 2/2 และผลงานสุดท้าย + โปสเตอร์ฉบับจริง · สอบรายคน 30 นาที

รายละเอียดทั้งหมดอยู่ในเอกสาร โจทย์โปรเจกต์ปลายภาค ใน Google Classroom สไลด์นี้คือฉบับย่อ

โจทย์ในประโยคเดียว

สร้าง เกมหนึ่งเกม หรือ หน้าจอควบคุมเคลื่อนไหวหนึ่งจอ ให้เล่นหรือใช้งานได้จริงบน Eva Kit โดยหยิบเทคนิคจากคาบ 1–12 มาประกอบกัน

เริ่มจากสิ่งที่ผู้ใช้ทำทุก 5 วินาที ไม่ใช่จากรายการฟีเจอร์

จุดเริ่มที่ผิด จุดเริ่มที่ถูก
"อยากทำเกมที่มีครบทุกอย่าง" "ผู้เล่นหลบหินที่ตกลงมา แล้วเก็บดาวเพื่อเพิ่มคะแนน"
"ทำระบบโรงงานอัจฉริยะ" "พนักงานกดสลับประตูคัดแยก ให้กล่องลงช่องที่ถูกสี"

ถ้าพูดได้ในประโยคเดียวว่าผู้ใช้ทำอะไร น้องจะรู้เองว่าต้องเขียนโค้ดส่วนไหนก่อน

เกมกับหน้าจอควบคุม ใช้หัวใจเดียวกัน

สิ่งที่เปลี่ยนคือคนที่อยู่หน้าจอ — ผู้เล่น หรือ พนักงาน

ในเกม ในหน้าจอควบคุม เทคนิคเดียวกัน (คาบ)
คะแนน จำนวนชิ้นงานที่ผลิตได้ ป้าย HUD อัปเดตเมื่อเปลี่ยน (4, 12)
ชีวิตที่เหลือ ของในคลังที่เหลือ · ระยะปลอดภัย ตัวนับ + เงื่อนไขจบ (12)
กระสุนชุดหมุนเวียน กล่องพัสดุบนสายพาน · รถในลานจอด ชุดหมุนเวียน (11)
ยิงโดนศัตรู กล่องผ่านประตูคัดแยก · รถข้ามเส้นหยุด ชนแบบกล่อง (4, 12)
GAME OVER สัญญาณเตือน หรือหยุดเครื่อง เครื่องสถานะ (2, 7)
ยานมีน้ำหนัก เร่งแล้วไหลต่อ สายพานเร่งความเร็ว แล้วค่อย ๆ หยุด ความเร่ง + แรงเสียดทาน (6, 10)
ลูกบอลเคลื่อนทีละเฟรม ระดับน้ำ = เดิม + น้ำเข้า − น้ำออก สะสมค่าทีละเฟรม (5)
ไม้ AI ขึ้น หยุด หรือลง มีช่องว่างกันสั่น วาล์วเปิด หยุด หรือปิด มีช่องว่างกันสั่น ตัวควบคุมสามระดับ + ช่องว่าง (7)

สี่เสาที่ทุกงานต้องมี

เสา ขั้นต่ำ ไฟล์ตัวอย่าง
1 · การเคลื่อนที่ ของอย่างน้อย 1 ชิ้นเคลื่อนที่ด้วยความเร็ว (ตำแหน่ง += ความเร็ว ทุกเฟรม) มีเร่ง/หน่วง หรือการสะท้อน · ไม่หลุดขอบจอ · ถ้าผู้ใช้บังคับชิ้นนั้น ปุ่มเปลี่ยน ความเร็ว ไม่ใช่ตำแหน่ง pong_step1↗ pong_step2↗ shooter_step2↗
2 · ของหลายชิ้น หรือ สถานะ ชุดหมุนเวียน + ชนแบบกล่อง หรือ เครื่องสถานะ ≥ 3 สถานะ shooter_step3↗ shooter_step4↗ s02_button_fsm↗ pong_step5↗
3 · HUD ค่าบนจอ ≥ 2 ค่า อัปเดต เฉพาะตอนเปลี่ยน อ่านออกจาก 1 เมตร s04_catch↗ shooter_step4↗
4 · เสียง ≥ 2 เสียงต่างกันตามเหตุการณ์ ดังเฉพาะตอนเกิดเหตุ s08_sound↗

และต้องมี เริ่ม → เล่น → จบ → เล่นใหม่ — หน้าเริ่ม · เงื่อนไขจบที่ชัด (GAME OVER · ชนะ · เตือนจนหยุดเครื่อง · หมดกะ) · เริ่มรอบใหม่ได้โดยไม่ต้องกดรันใหม่ (ดูโครงใน full_games/pong_full.py↗)

ข้อบังคับ 6 ข้อ

  1. ตัดสินผลงานบนบอร์ด Eva Kit เท่านั้น — พัฒนาใน Emulator ได้ แต่ Emulator มีวิดเจ็ตมากกว่าบอร์ด ใช้เฉพาะของในหน้าถัดไป และลองบนบอร์ดทุกสัปดาห์
  2. วิดเจ็ตรวมไม่เกิน 26 ชิ้น — กล่อง ข้อความ ภาพ นับชิ้นละหนึ่ง บอร์ดรับ 32 แต่ game.run() ใช้ 1 และ game.game_over() ใช้อีก 4 เหลือ 27 เผื่อไว้ 1 · game.net() ใช้ 14 และ game.starfield() ใช้ 12 · เขียนงบไว้ในหัวไฟล์
  3. การเอียงบอร์ดใช้ได้ แต่ต้องเล่นด้วยจอยได้ด้วย — ยังไม่ได้ยืนยันบนบอร์ดทุกตัว
  4. ยืมโค้ดจากคอร์สได้เต็มที่ — เขียนในหัวไฟล์ว่า "ต่อยอดจาก shooter_step4.py↗" และอธิบายได้ทุกบรรทัด
  5. ใช้ AI ช่วยเขียนได้ แต่บอกในหัวไฟล์ว่าช่วยส่วนไหน — คะแนนรายคนวัดจากสิ่งที่น้องทำได้เองในวันสอบ
  6. หน้าจอควบคุมเป็นต้นแบบเพื่อการเรียน — ตัวเลขทั้งหมดเป็นค่าจำลอง ไม่ใช่ระบบความปลอดภัยจริง

ของบนบอร์ดที่หยิบมาใช้ได้

ชิ้นส่วน เรียกใน Python เจอครั้งแรก
กล่อง · ข้อความ game.Box(x, y, w, h, สี) · game.Text("…", x, y, สี) .set() · ui.Label(...) (ไทยได้) คาบ 3–4
จอยและปุ่ม k = game.keys() → k.left k.right k.up k.down k.a k.b · game.pressed_once(...) · Start/Back ใช้โดย game.run() คาบ 3, 12
ลูปเกม · ชน game.run(update, fps=30) · game.hit(a, b) คาบ 3–4
เสียง game.sfx("hit") 21 เสียง · game.tone(โน้ต, ms=150) คาบ 8
LED · ปุ่ม USER gpio.led(1).on() · gpio.button(0) คาบ 1–2

ของใหม่ที่หยิบได้จากเกมตัวเต็ม (full_games/)

ของ เรียกใน Python
ภาพสำเร็จรูป 20 แบบ game.Sprite("ship", x, y) · .frame("boom1") · game.pool("enemy", 5) — รายชื่อภาพทั้ง 20 แบบอยู่ในสไลด์คาบ 13
ฉาก · เมนู · จบเกม game.background() game.starfield() · game.menu(...) · game.game_over(score)

ไอเดียเกม (จำนวนต่อไอเดีย รออาจารย์ประกาศ)

# ไอเดีย ทุก 5 วินาทีผู้เล่นทำอะไร เทคนิค (คาบ) ต่อยอดจาก ขนาด
G1 ทุบอิฐ (Breakout) บังคับไม้รับลูกให้เด้งไปทุบอิฐ สะท้อน 5 · ไม้มีน้ำหนัก 6 · มุมกระทบ 7 · ชนหลายชิ้น 12 · อิฐ ≤ 16 ก้อน pong_step3↗ shooter_step4↗ กลาง
G2 Shooter ภาคบอส หลบกระสุนบอส ยิงจนแถบพลังหมด 10–12 · แถบพลัง = กล่องเล็ก ซ่อนทีละก้อน shooter_step5↗ กลาง
G3 หลบอุกกาบาต หลบหินที่เร็วขึ้นทุกด่าน เก็บดาว ชุดหมุนเวียน 11 · ตัวจับเวลาปล่อยของ 12 · ชีวิต 12 shooter_step4↗ เล็ก
G4 ตีตัวตุ่น กดให้ทันตอนตัวตุ่นโผล่ เครื่องสถานะ 2 · ตัวจับเวลา 4 · สุ่ม 12 s02_button_fsm↗ s04_catch↗ เล็ก
G5 Catch ภาคพิเศษ รับของดี หลบของเสีย 3 ชนิด 4 · ชุดหมุนเวียน 11 s04_catch↗ เล็ก
G6 Pong โหมดใหม่ ลูก 2 ลูกพร้อมกัน หรือ AI ที่ปรับระดับเองตามคะแนน 5–7 pong_step5↗ กลาง

เล็ก = ทำเสร็จสบายใน 3 สัปดาห์ · กลาง = ต้องวางแผนดี

ไอเดียหน้าจอควบคุม — ยืมเทคนิคจากเกม

# ไอเดีย ทุก 5 วินาทีผู้ใช้ทำอะไร เทคนิค (คาบ) ต่อยอดจาก ขนาด
H1 สายพานคัดแยกพัสดุ กดสลับประตูคัดแยกให้กล่องลงช่องที่ถูกสี กล่อง = ชุดหมุนเวียน 11 · ประตู = ชนแบบกล่อง 12 · นับถูก/ผิด 4 · เสียงถูก/ผิด 8 shooter_step4↗ กลาง
H2 สี่แยกไฟจราจร ตั้งจังหวะไฟให้รถไม่ติด เครื่องสถานะ 2 · รถ ≤ 8 คัน 11 · ชนเส้นหยุด 12 s02_traffic_v2↗ shooter_step4↗ กลาง
H3 จอเฝ้าโซนอันตราย ระบบเตือนเมื่อรถเข้าโซนอันตราย กดปลดล็อกเมื่อปลอดภัย สถานะเตือนหลายระดับจนหยุดเครื่อง · ชน · เสียงแยกระดับ โจทย์กลางภาคชุดที่น้องสอบ (คลังสินค้า หรือ ท่าเรือ) กลาง
H4 ถังน้ำโรงเรือนอัตโนมัติ ดูระดับน้ำ ระบบเปิด/หยุด/ปิดวาล์วเอง เตือนเมื่อน้ำต่ำ สะสมค่า 5 · ไม่เกินขอบ 3 · วาล์วสามระดับ 7 · แถบระดับ = กล่อง 10 ก้อน pong_step2↗ pong_step5↗ กลาง
H5 ลานจอดรถนับช่องว่าง ดูรถเข้า-ออก ป้ายบอกช่องว่าง LED ติดเมื่อเต็ม ชุดหมุนเวียน 11 · HUD 4 · LED 1 s01_led_blink↗ shooter_step3↗ เล็ก

อยากทำเรื่องอื่น? ได้ แต่คุยกับอาจารย์ก่อน 14 ต.ค. — เรื่องที่ต้องใช้ของที่ยังไม่ได้เรียน (แรงโน้มถ่วงและการกระโดด · เกมจังหวะดนตรี · กราฟเส้น) หรือใช้การเอียงบอร์ด (คาบ 9) เป็นตัวควบคุมหลักโดยไม่มีจอยสำรอง นับเป็น ขนาดใหญ่

ตัวอย่าง: Shooter (คาบ 12) กลายเป็นสายพานคัดแยก

โค้ดเดิมส่วนใหญ่ใช้ต่อได้ สิ่งที่เปลี่ยนคือ ความหมาย ของแต่ละชิ้น

ใน shooter_step4.py↗ ในสายพานคัดแยก เปลี่ยนอะไรในโค้ด
ศัตรู 6 ตัวตกลงมา ตำแหน่ง x สุ่ม กล่องพัสดุ 4 ใบไหลลงมากลางสายพาน มี 2 สี x คงที่กลางสายพาน · สุ่มสีจาก 2 สี แล้ว จำสีไว้ในลิสต์ box_color[index] (กล่องไม่จำสีตัวเอง)
ยานเลื่อนซ้าย-ขวาด้วยความเร่ง ประตูคัดแยก มี 2 ตำแหน่ง: ช่อง A หรือช่อง B ความเร็วกล่องทุกใบ = speed ตัวเดียว (กด A ค้าง = เร่ง · ปล่อย = speed *= FRICTION) · ซ้าย = ช่อง A · ขวา = ช่อง B
กระสุน 6 นัด ไม่ใช้ ลบออก ได้วิดเจ็ตคืน 6 ชิ้น
ยิงโดน → Score +1 กล่องถึงประตู ช่องตรงสี → ถูก +1 · ไม่ตรง → ผิด game.hit(กล่อง, ประตู) แล้วเทียบ box_color[index] กับช่อง
หลุดพื้น → Lives −1 คัดผิด → โควตาของเสีย −1 ตัวแปรเดิม เปลี่ยนชื่อเป็น rejects_left
GAME OVER หยุดสายพาน: คัดผิดครบ 3 ครั้ง ข้อความเดิม เปลี่ยนคำ

ลองทำแบบนี้กับไอเดียของน้อง: เขียนตาราง 3 ช่องนี้ก่อนเปิดโค้ด แล้วจะเห็นว่าต้องเขียนใหม่จริง ๆ แค่ส่วนไหน

14 ต.ค. — Pitch deck ไม่เกิน 6 หน้า

เวลาพูดและถาม-ตอบ รออาจารย์ประกาศ · เปิดจากไฟล์ที่ส่งใน Google Classroom · ถ้าทำเป็นคู่ ทั้งสองคนต้องได้พูด

หน้า เนื้อหา
1 ชื่อ + ประโยคเดียว: "[ชื่อเกม/ระบบ] ให้ [ผู้เล่น/พนักงาน] ได้ ___ เพื่อ ___"
2 ทุก 5 วินาทีผู้ใช้ทำอะไร (เกม) · หรือปัญหาที่หน้าจอนี้แก้ ใครเสียอะไรถ้าไม่มี (HMI)
3 ร่างหน้าจอ 792 × 398: อะไรอยู่ตรงไหน HUD อยู่มุมไหน ปุ่มไหนทำอะไร
4 แผนที่เทคนิค: ฟีเจอร์ → เทคนิค → คาบ → หยิบจากไฟล์ไหน (ถ้าทำเป็นคู่ เพิ่ม ใครเขียน)
5 ขอบเขต: รุ่นแรกที่เล่นได้ (21 ต.ค.) · ฉบับสุดท้าย (28 ต.ค.) · ถ้ามีเวลา · งบวิดเจ็ต ≤ 26
6 ความเสี่ยง 2 ข้อ + แผนสำรองถ้าทำไม่ทัน

คำถามที่อาจารย์จะถามแน่นอน: "ส่วนไหนยากที่สุด และใครเป็นคนทำ"

โปสเตอร์หนึ่งหน้า (A3 แนวนอน)

หัว · ชื่อ + ประโยคเดียวจาก pitch หน้า 1
ซ้าย · วิธีเล่น
ภาพจอย/ปุ่ม พร้อมป้ายว่าปุ่มไหนทำอะไร
กลาง · ใหญ่ที่สุด · หน้าจอ
14 ต.ค. = ร่าง · 28 ต.ค. = ภาพจริงจากบอร์ด
ขวา · วงจรหลัก
รับปุ่ม → อัปเดต → วาด (เกม)
วัด → ตัดสิน → ทำ → โชว์ (HMI)
ล่างซ้าย · สมการ
2–3 สมการที่ใช้ พร้อมบรรทัดโค้ดจริง
ล่างขวา · เทคนิคที่ใช้พร้อมเลขคาบ · เจ้าของงาน (และใครทำส่วนไหน ถ้าทำเป็นคู่) · รุ่นแรก → ฉบับสุดท้าย

โปสเตอร์คือสิ่งที่คนอ่านใน 30 วินาทีตอนเดินชมวันที่ 28 — หน้าจอต้องใหญ่ที่สุด ตัวหนังสือน้อยที่สุด

21 ต.ค. รุ่นแรกที่เล่นได้ · 28 ต.ค. ผลงานสุดท้าย

รุ่นแรกที่เล่นได้ ต้องรันบนบอร์ด Eva Kit

  • ตัวหลักเคลื่อนที่ตามเสา 1 · กลไกหลัก 1 อย่าง (ชน หรือ สถานะ) ทำงานจริง
  • HUD ≥ 1 ค่าที่เปลี่ยนตามการเล่น · เล่นต่อเนื่อง 60 วินาทีไม่ค้าง
  • หัวไฟล์มีงบวิดเจ็ต และ "ต่อยอดจาก ..."
  • ในคาบ: ครึ่งห้องเปิดเครื่อง อีกครึ่งเดินลองเล่นแล้วกรอกการ์ด 3 ช่อง (อะไรชัด · อะไรงง · บั๊ก 1 ข้อ) แล้วสลับ

ผลงานสุดท้าย

  • ครบสี่เสา · เริ่ม → เล่น → จบ → เล่นใหม่ · รันบนบอร์ด · โปสเตอร์ฉบับจริง
  • ส่งใน Google Classroom: ไฟล์โค้ดของงาน (ตั้งชื่อตามที่อาจารย์ประกาศ) · ภาพหน้าจอ 2 ภาพ · คลิปสำรอง 30–60 วินาที · โปสเตอร์
  • ในคาบ: เดินชมผลงาน ครึ่งห้องเปิดเครื่อง อีกครึ่งเดินลองและลงคะแนนนิยม แล้วสลับ

คะแนน — ส่วนประกอบ (สัดส่วนรออาจารย์ประกาศ)

ส่วนของคะแนน เมื่อไร
เสนอหัวข้อ + โปสเตอร์ร่าง 14 ต.ค.
รุ่นแรกที่เล่นได้ 21 ต.ค.
ผลงานสุดท้าย + โปสเตอร์ฉบับจริง 28 ต.ค.
รายคน · อาจารย์ถาม 1 นาที เรื่องโค้ดที่น้องเขียนเอง 21 ต.ค.
รายคน · สอบไฟล์ตั้งต้นเดียวกัน 30 นาที 28 ต.ค.

สอบรายคนเป็นอย่างไร: ทุกคนได้ไฟล์ตั้งต้นเดียวกัน (ชุดหมุนเวียน · ชนแบบกล่อง · เครื่องสถานะ · HUD) พร้อมโจทย์ให้แก้ 2–3 ข้อ ตัวเลขต่างกันตามรหัสนิสิต ทำคนเดียวใน Emulator

เตรียมตัวดีที่สุด = เข้าใจทุกบรรทัดของ shooter_step4.py↗ และ s02_button_fsm.py↗

กับดักที่เจอบ่อย

  • ภาพ Sprite ไม่รู้ขนาดตัวเอง → ตั้ง s.w s.h ก่อนเรียก game.hit()
  • ลำดับการวาด = ลำดับการสร้าง → สร้างพื้นหลังก่อนเสมอ
  • ห้ามสร้างวัตถุใหม่ในลูป → ใช้ชุดหมุนเวียน (คาบ 11)
  • อย่าย่อ-ขยายกล่องทุกเฟรม จอจะเป็นรอย → แถบพลังใช้กล่องเล็กหลายก้อน ซ่อนทีละก้อน
  • game.tone() ไม่ต่อคิว → ใส่ sleep ในลูปเกม เกมจะค้างตาม
  • เจอ MemoryError ตอนโหลด → ลดข้อความยาว ๆ ในไฟล์ เพิ่มโค้ดทีละนิด
  • ขนาดตัวอักษรตั้งด้วย ui.Label(..., value=28) (14 · 16 · 20 · 24 · 28) · game.Text มีขนาดเดียว

ก่อนกลับบ้านวันนี้

  1. ฟังอาจารย์ประกาศ — ทำรายคนหรือเป็นคู่ เวลานำเสนอ และสัดส่วนคะแนน
  2. คิดไอเดียของตัวเอง 2 เรื่อง — เขียนประโยคเดียวตามใบงานคาบ 13 แล้วลงชื่อไอเดียใน Google Classroom
  3. ทำใบงานคาบ 13 ให้ครบ — ลองแก้ทุกตัวอย่าง เพราะคือวัตถุดิบของการเสนอหัวข้อ

14 ต.ค. เริ่มด้วยการเสนอหัวข้อ · ไม่ว่าทำรายคนหรือเป็นคู่ อาจารย์ประเมินรายคนเสมอ

fit-css

core

core

core

core

core

core

core

core

core

core

core

core

core

core

core

core

← Roadmap (TOC)