neizod's speculation

insufficient data for meaningful answer

เกมเรียงลูกแก้ว

Monday, February 6, 2017, 08:49 AM

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

ตัวอย่างการเลื่อนลูกแก้วในเกมดังกล่าว

โอเค จริงๆ เราคิดว่าเกมนี้ไม่น่าจะยากมากเท่าไหร่ แต่จังหวะที่เล่นชนะตอนนั้นมันเหมือนกำลังหมุนมั่วๆ แล้วฟลุ๊คไปโดนคำตอบยังไงก็ไม่รู้ชอบกล ที่เศร้าคือตัวเกมนั้นพอเห็นว่าเราชนะแล้วก็ไม่ยอมให้เราเล่นต่อ เลยอดศึกษามันเพิ่มว่าถ้าเจอปัญหาแบบนี้ในอนาคตจะใช้เทคนิคอะไรช่วยแก้ได้

ถ้าเป็นเกมลับสมองเกมอื่นๆ อาจจะไม่ค่อยติดใจเท่าไหร่ แต่พอเป็นเกมนี้แล้วทำไมไม่รู้ถึงอยากหาวิธีเล่นอีก ครั้นจะไปเปิดเกมต้นฉบับเล่นก็ไม่ได้แล้วด้วย เพราะมันจะสุ่มเกมลับสมองเกมใหม่มาให้เล่นเรื่อยๆ ไม่ซ้ำเดิม … เศร้าเพิ่มไปอีก 555

เลยตัดสินใจว่าเอาหวะ! เขียนเกม (เลียนแบบ) เองเลยแม่ง ดูจากกฎของเกมแล้วก็ไม่มีอะไรซับซ้อน ไม่น่ายากเกินความสามารถ

แต่ขณะที่กำลังฝันกลางวันอยู่นั้น ก็มาสำเหนียกตัวเองได้ว่าสไตล์การเขียน prototype ที่ถนัดคือ Python บน command line หมดเลยนี่หว่า แต่เกมที่เราต้องการนี้ถ้าไปวาดบน command line ไม่น่าจะได้ ผลลัพธ์ที่ดีเท่าไหร่ (เอาจริงๆ เกมทุกเกมที่อยู่บน command line นั้นเข้าขั้นเล่นไม่ได้กันหมด) … เลยต้องโบกมือบ๊ายบาย พับโปรเจคไปภายในชั่วพริบตา

จนพอตกดึกเริ่มใจเย็นลงมาบ้าง ก็พอจำได้ว่าใช้ canvas บน HTML5 น่าจะช่วยเรื่องกราฟิกและ UI ได้เยอะโขอยู่ ขอแค่ต้องตั้งสติกับ JavaScript ให้ดีก็พอ 555

คิดได้เช่นนั้นก็ลงมือ … และนี่คือผลลัพธ์ใน 3 ชั่วโมงถัดมา https://neizod.github.io/marbles

เรื่องเศร้าระหว่างเขียนคือลืมประกาศตัวแปรในฟังก์ชันบางตัว ซึ่งถ้ามองแค่การใช้งานบนหน้านี้คงไม่มีปัญหาอะไร (เพราะฟังก์ชันน้อย แทบไม่ได้ใช้ตัวแปรข้ามไปมาเลย) แต่ก็รู้สึกไม่ค่อยดีเท่าไหร่ที่เป็นโปรแกรมเมอร์สะเพร่า เลยเอาโค้ดไปตรวจบน jslint แล้วโดนด่ายับประหนึ่งว่าเราเพิ่งไปเผาบ้าน Douglas Crogford มา คือรู้สึกว่าพี่แกเริ่มเยอะไปนะ นี่ก็อยากจะเขียนสวยๆ ให้คนอ่านด้วย ไม่ใช่เขียนแข็งๆ ให้คอมอ่านอย่างเดียว

ตัวเกมยังเป็นแค่ prototype จุดที่สามารถปรับปรุงได้มีอยู่เยอะแยะ เช่น

  • ตัวเช็คการเล่นเกมชนะ
  • animation การเลื่อนลูกแก้ว
  • การควบคุมการเลื่อนลูกแก้วด้วยการจับหมุนตรงๆ
  • การตั้งค่าจำนวนลูกแก้วที่มี
  • algorithm แก้ปัญหานี้อัตโนมัติ

แต่ตอนนี้หมดแรงปรับปรุงมันต่อแล้ว (และก็หมดแรงเขียน blog ตอนนี้นี้ด้วยเช่นกัน :p) ก็คงต้องฝากผู้อ่านที่รักความท้าทายเอามันไปต่อยอด/หาเทคนิคการเล่นด้วยละกันครับ อิอิ

ป.ล. ขอขอบคุณคุณ @iNViTiON สำหรับคำแนะนำด้าน UI มา ณ ที่นี้ด้วย