Pong คือเกมตู้เกมอาร์เคด 2 มิติธีมปิงปอง ที่ผลิตโดย Atari และเปิดตัวครั้งแรกในปี 1972

คราวนี้พี่จะพาน้องไปดูวิธีทำเกม Pong แบบ 1D บน LED กัน ซึ่งเป็นโปรเจคเจ๋งๆ ที่จำลองเกม Pong บนแถว LED แบบมิติเดียว (1D) นะฮะ ทำได้ง่ายๆ ด้วยบอร์ดไมโครคอนโทรลเลอร์ Arduino การเคลื่อนที่ของลูกบอลจะถูกจำลองด้วยแถว LED ส่วนไม้ตี (paddle) ก็คือปุ่มกดสองปุ่มนั่นเอง เกมนี้เล่น 2 คน โดย "ลูกบอล" จะวิ่งไปมาตลอดความยาวของแถว LED และจะเด้งกลับมาถ้าผู้เล่นกดปุ่มในตอนที่ LED สีเหลืองติดอยู่
ผลลัพธ์จะแสดงบนหน้าจอ LCD การเคลื่อนที่ของลูกบอล การได้คะแนน รวมถึงตอนชนะ จะมีเสียงประกอบที่เหมาะสมด้วย
อุปกรณ์ทำง่ายมาก ประกอบด้วยชิ้นส่วนหลักๆ ดังนี้:
- บอร์ดไมโครคอนโทรลเลอร์ Arduino Nano
- จอแสดงผล LCD 16x2
- LED 10 ดวง
- ตัวต้านทาน (Resistor) 12 ตัว
- ปุ่มกด 2 ปุ่ม
- และบัซเซอร์ (Buzzer)

เกมเริ่มโดยให้ลูกบอลเคลื่อนจากผู้เล่น 1 ไปหาผู้เล่น 2 ถ้าผู้เล่น 2 กดปุ่มไม่ทันตอนที่ LED สีเหลืองติดอยู่ LED สีแดงจะติด และนั่นคือคะแนนของผู้เล่น 1 เกมแต่ละเกมจะเริ่มโดยผู้ชนะจากเกมก่อนหน้า ความเร็วของลูกบอลจะเพิ่มขึ้นทุกครั้งที่ถูกตีกลับ ทำให้การตีลูกให้ทันเวลายากขึ้นเรื่อยๆ แมตช์จะจบเมื่อมีผู้เล่นคนใดคนหนึ่งชนะครบ 10 เกม และในตอนนั้น LED ฝั่งผู้ชนะจะกระพริบ

รายละเอียดเทคนิคแบบจัดเต็ม
Pong แบบมาตรฐานเป็น 2D และต้องใช้หน้าจอ แต่ เกม Pong แบบ 1D นี่ตัดแกน Y ออกไปเลย! มันคือวิดีโอเกมในรูปแบบพื้นฐานสุดๆ ที่น่าจินตนาการได้: ผู้เล่นสองคนนั่งหันหน้าเข้าหากัน คอยกดปุ่ม Arcade Button อย่างรวดเร็วให้ทันกับ "พิกเซล" แสงจาก NeoPixel ที่วิ่งเด้งกลับไปมาอย่างรุนแรงบนแถบ LED ยาว 1 เมตร
การจัดการอาร์เรย์ 1D (FastLED)
"ลูกบอล" ก็แค่ตัวเลขจำนวนเต็มที่เพิ่มหรือลดค่าในอาร์เรย์
- แถบ WS2812B มี LED 60 ดวง
int ballPos = 30; - กฎฟิสิกส์ (Physics):
ballPos += ballDirection;(โดยที่ direction คือ+1หรือ-1) - ถ้าลูกบอลเคลื่อนที่ไปทางซ้าย (ผู้เล่น 1) มันจะวิ่งเข้าหา
ballPos = 0 - ฟังก์ชัน
loop()ใน C++ จะอัปเดตอาร์เรย์อย่างรวดเร็วด้วยFastLED.show() - การคำนวณ Hit-Box:
ผู้เล่น 1 ต้องกดปุ่ม Arcade Button เฉพาะ เมื่อ
ballPosอยู่ระหว่าง0ถึง3(โซนที่ต้องตี)
if (digitalRead(P1_Btn) == LOW && ballPos <= 3) {
ballDirection = 1; // เด้งกลับอย่างรุนแรง! ส่งลูกกลับไปหาผู้เล่น 2!
gameDelay -= 5; // เพิ่มความเร็วลูกบอลแบบน่ากลัว!
} else if (digitalRead(P1_Btn) == LOW && ballPos > 3) {
// ผู้เล่น 1 กดปุ่มเร็วเกินไปและตีพลาด! Game Over!
}
การใส่สี RGB เป็นตัวบอกสถานะ
เพราะว่ากราฟิกของเราเป็นแบบเส้นเดียว สีเลยต้องมาทำหน้าที่แทนรูปทรง
- ลูกบอล (Ball) จะถูกวาดเป็นสี
CRGB::WhiteหรือCRGB::Blue - โซนตีกลับ (Hit Zones) (
LEDs 0-3และLEDs 56-59) จะถูกตั้งสีตายตัวเป็นCRGB::Red - ตอนที่ผู้เล่นตีลูกเอซแบบทำลายล้าง เส้น LED ทั้ง 60 ดวงจะระเบิดตาพร่าด้วยเอฟเฟกต์
Rainbow_Stripe_Animation()พร้อมกับเสียงแฟนฟาเร่อร์ดังสนั่นจาก Piezo Buzzer! จัดไปวัยรุ่น!
อุปกรณ์ที่ต้องมีสำหรับตารางปิงปอง
- Arduino Uno/Nano (ความเร็วมาตรฐานพอดี)
- สาย LED WS2812B NeoPixel (แนะนำ 60 ถึง 144 ดวงต่อเมตร จะได้ยาวพอม้วนรอบโต๊ะ!)
- ปุ่มอาร์เคดขนาดใหญ่ 60mm แบบสปริง 2 ปุ่ม (ต้องกดแล้วสะใจ)
- Adaptor 5V 3A (สำคัญมาก! ถ้าใช้ NeoPixel 144 ดวงเปิดสีขาวพร้อมกันจะกินกระแสถึง 5A ถ้าเอาไฟจาก USB คอมอาจจะพังได้นะตัวนี้ ห้ามช็อต!)
การตั้งค่าเกม
- ความเร็วเริ่มต้นของการเคลื่อนที่ของ LED ตั้งค่าในบรรทัดนี้:
const unsigned long initialMillisecondsPerLED = 400;ยิ่งตัวเลขน้อย ความเร็วก็ยิ่งมาก (เร็วแบบรถไฟลอยนะน้อง)

- ระดับความเร่งหลังจากตีลูกแต่ละครั้ง ตั้งค่าในบรรทัดเหล่านี้:
if (deltaMillisecondsPerLED > 50){deltaMillisecondsPerLED -= 50;ยิ่งตัวเลขนี้มาก ความเร่งก็ยิ่งสูง (เร่งแบบติดเทอร์โบเลย)

เกมนี้เล่นได้ทั้งคนเดียวและสองคน แน่นอนว่าถ้าเล่นสองคนจะมันส์กว่า แนะนำให้ใช้ปุ่มอาร์เคดใหญ่ๆ แข็งแรงๆ ต่อข้างนอก

อย่างของพี่ใช้ปุ่มที่ทำไว้จากโปรเจคเก่า มันใหญ่ กดแล้วมีเสียงคลิกชัดเจน แม่นยำดี
สุดท้ายนี้ ขอสรุปสั้นๆ ว่าโปรเจคนี้เป็นเวอร์ชันหนึ่งมิติที่กะทัดรัดและน่าสนใจมากของเกมคลาสสิค "Pong" ใช้อุปกรณ์น้อยชิ้นแต่เล่นแล้วติดหนึบ เล่นได้เป็นชั่วโมงไม่เบื่อเลยทีเดียว ตัวเครื่องพี่ใส่ไว้ในกล่อง PVC ที่หุ้มด้วยวอลเปเปอร์ติดเอง สำหรับไฟเลี้ยง แนะนำให้ใช้แบตเตอรี่ลิเธียมเพื่อความคล่องตัว จะได้ยกไปท้าปิงปองที่ไหนก็ได้ สู้งานนะน้อง!