Categories
Programming Scratch

หลักการเขียนโปรแกรมใน Scratch ตอนที่ 8

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

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

รูปแบบฟังก์ชันใน Scratch มีหลากหลาย และซับซ้อนกว่าที่คิด มาลองดูตัวอย่างใน Delicious Fish

เมธเธิด (method) คือฟังก์ชันที่ใช้เฉพาะกับตัวละครตัวใดตัวหนึ่ง (object function) คล้ายกับการเขียนโปรแกรมเชิงวัตถุ ปกติเมธเธิดของวัตถุใดจะทำงาน เมื่อมีการส่งสาร (massage) มายังวัตถุนั้นโดยตรง ใน Scratch สามารถสร้างสคริปต์ให้เป็นเมธเธิดได้ โดยสร้างรหัสให้กับวัตถุนั้นโดยเฉพาะ เช่น ปลาทองเมื่อถูกกิน จะส่งรหัส “got-me” ออกไป แต่มีเฉพาะปลาตัวใหญ่เท่านั้นที่รับรหัสนี้ อาจพูดได้ว่า สคริปต์ที่รับรหัส “got-me” ของปลาตัวใหญ่ เป็นเมธเธิดหรือฟังก์ชันของวัตถุ นอกจาก “got-me” แล้ว ยังมีรหัสที่ทำหน้าที่เหมือนกันอีก คือ “got 1” กับ “oh-no”

การส่งและรับรหัสเป็นรูปแบบหนึ่งของฟังก์ชันที่ขึ้นกับเหตุการณ์ การส่งรหัสเป็นเหตุการณ์แบบหนึ่ง (event) และเมื่อมีฟังก์ชันใดที่สนใจรหัสนี้ (event listening) ได้รับรหัสนี้ ก็จะเริ่มทำงานเพื่อตอบสนองกับเหตุการณ์ที่เกิดขึ้น (response function) ตัวอย่างเช่น เมื่อเริ่มต้นเกม ตัวควบคุมเกมจะส่งรหัส “setup” ให้ปลาทุกตัวเตรียมพร้อมสำหรับการเล่น ปลาทุกตัวก็ตอบสนองรหัสนี้ด้วยการซ่อนตัว (hide) เท่านั้นเอง แต่เมื่อเข้าสู่แต่ละระดับเกม ปลาจะได้รับรหัส “level1” ตามมาด้วย “level2” จนกระทั่งจบเกม เมื่อได้รับรหัส “game-over” ปลาแต่ละตัวจะตอบสนองต่างกันไป

การใช้การรับส่งรหัส เป็นการประสานงานให้สอดคล้องกันระหว่างตัวละคร แต่ฟังก์ชันที่ขึ้นกับเหตุการณ์ ยังมีอีกหลายแบบ ที่ไม่ขึ้นกับรหัส เช่น ขึ้นกับเวลา (time event) ในเกมที่มีการควบคุมเวลา เวลาหมดถือเป็นเหตุการณ์หนึ่ง ที่ทำให้เกิดการเปลี่ยนระดับเกม หรือการจบเกม นอกจากนั้น ผู้เล่นยังเป็นคนทำให้เกิดเหตุการณ์ต่างๆ อีก เช่น การใช้เมาส์ลากไปมา (mouse event) ทำให้ปลาตัวใหญ่เคลื่อนที่ตามเมาส์

เมื่อปลาตัวใหญ่กินปลาแต่ละชนิดได้ มันจะรับรหัสจากปลาทั้งสามชนิด และต้องแสดงแอนิเมชั่นการเคี้ยวพร้อมเสียงประกอบ แต่ถ้าต้องเขียนสคริปต์แสดงแอนิเมชั่นที่เหมือนกันหมด สำหรับปลาทั้งสามชนิด จะทำให้สคริปต์ยาวขึ้น และในอนาคตถ้าต้องการเพิ่มปลาชนิดอื่นอีก ก็ต้องเขียนสคริปต์เหมือนกันอีก ซึ่งไม่ใช่วิธีการเขียนโปรแกรมที่ดี ดังนั้นในสคริปต์ปลาตัวใหญ่ จึงนำส่วนที่เป็นแอนิเมชั่น (chomp) ออกมาเป็นฟังก์ชันต่างหาก ซึ่งเป็นฟังก์ชันที่ถูกเรียกใช้ภายในสคริปต์ปลาตัวใหญ่เท่านั้น เป็นฟังก์ชันส่วนตัว (private function) ด้วยวิธีนี้ ฟังก์ชัน oh-on, got 1, got-me จะเรียกใช้ฟังก์ชัน chomp เพื่อแสดงแอนิเมชั่นแทน ซึ่งเป็นการเรียกใช้ฟังก์ชันภายในฟังก์ชันอีกทีหนึ่ง

เมื่อปลาแต่ละชนิดถูกกิน คะแนนจะเปลี่ยนแปลง อาจขึ้นหรือลงก็ได้ และจำนวนปลาแต่ละชนิดที่ถูกกินก็เพิ่มขึ้นด้วย การที่จะตามการเปลี่ยนแปลงนี้ได้ ต้องสร้างตัวแปรโกลบอล (Score, goldfish, goldfish1, greenfish) มาเก็บค่าเหล่านึ้ไว้

One reply on “หลักการเขียนโปรแกรมใน Scratch ตอนที่ 8”

[…] ความสามารถในการสร้างฟังก์ชัน หรือการสร้างบล็อกใหม่ขึ้นมาได้ใน BYOB เป็นการเพิ่มขีดความสามารถในการเขียนโปรแกรมให้กับ Scratch เนื่องจากฟังก์ชันถือเป็นเครื่องมือสำคัญ ในการเขียนโปรแกรม แต่ใช่ว่า Scratch จะทำอะไรเกี่ยวกับฟังก์ชันไม่ได้เลย ลองอ่าน ฟังก์ชันใน Scratch 1 และ 2 […]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s