แก้ไขโปรเจกที่แชร์ในเว็บไซต์ Scratch

สำหรับคนที่ได้สร้างโปรเจก Scratch แล้วแชร์โปรเจกนั้นในเว็บไซต์ scratch.mit.edu เมื่อต้องการแก้ไข ปรับปรุงโปรเจกที่ได้แชร์ไปแล้ว สามารถทำได้ง่ายๆ เพียงปรับปรุงโปรเจกด้วยโปรแกรม Scratch ในเครื่องของตัวเองตามที่ต้องการ แล้วทำการแชร์อีกครั้งด้วย ชื่อเดิม เท่านั้นเอง แต่ถ้าต้องการแชร์โปรเจกเดิม ในเวอร์ชั่นใหม่ ให้แก้ไขชื่อใหม่ อาจใช้ตัวเลขต่อท้าย เพื่อสื่อถึงโปรเจกเดิมแต่เป็นเวอร์ชั่นใหม่

Ant Sim

หลังจากโปรเจก Delicious Fish คราวนี้ขอแนะนำโปรเจก Ant Sim เป็นโปรเจกใหม่ของผม ลองเข้าไปเล่นในเว็บไซต์ Scratch หรือ ดาวน์โหลดไปเล่นที่เครื่องก็ได้ แนะนำติชมด้วย ยิ่งดีครับ

Scratch Project

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

BYOB

เราเรียนรู้ Scratch มาระดับหนึ่งแล้ว บางคนเห็นศักยภาพของมันในการส่งเสริมให้เด็กๆ เรียนรู้การเขียนโปรแกรม บางคนสงสัยว่าเด็กระดับไหนเหมาะกับโปรแกรม Scratch อันที่จริงเหมาะกับเด็กทุกระดับ แม้กระทั่งผู้ใหญ่ ที่ไม่มีประสบการณ์การเขียนโปรแกรมมาก่อน ก็สามารถใช้โปรแกรมนี้ได้ไม่ยาก โปรเจกใน Scratch เน้นการใช้สื่อชนิดต่างๆ ไม่ว่าจะเป็น ภาพ เสียง หรือ แอนิเมชั่น ฯลฯ ทำให้ผู้เรียนไม่เบื่อ อย่างไรก็ตาม กลุ่มเป้าหมายของ Scratch น่าจะเป็นเด็กประถมปลาย (ป.4-ป.6) ไปถึงมัธยมต้น (ม.1-ม.3)

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

ด้วยเหตุนี้ จึงมีกลุ่มนักวิจัยในมหาวิทยาลัย California Berkeley สร้างโปรเจก BYOB (build your own blocks) หรือ Snap ซึ่งเป็นโปรเจกต่อยอดจาก Scratch ให้มีความสามารถด้านการเขียนโปรแกรมสูงขึ้น โปรเจกที่ว่านี้มีตัวการ์ตูนชื่อ Alonzo เป็นสัญลักษณ์ ถ้าอยากทดลองดูแล้ว สามารถดาวน์โหลด BYOB ได้ที่ http://byob.berkeley.edu

หลักการเขียนโปรแกรมใน 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) มาเก็บค่าเหล่านึ้ไว้

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

โดยทั่วไป โปรแกรมมักประกอบไปด้วยงานย่อย (sub-program) หลายๆ งานเข้าด้วยกัน ซึ่งงานย่อยในโปรแกรม มักเรียกได้หลายแบบตามแต่ละบริบท คำที่น่าจะใช้เรียกทั่วไป คือฟังก์ชัน (function) เป็นการทำงานที่รับข้อมูลเข้าไป แล้วทำงานตามขั้นตอนที่กำหนดไว้ สุดท้ายให้ผลลัพธ์ออกมา ในบางโปรแกรมภาษา อาจได้ยินคำว่า โปรซีเจอร์ (procedure) ซึ่งคล้ายฟังก์ชัน แต่ไม่คืนผลลัพธ์ออกมาให้นำไปใช้ต่อ ส่วนในการเขียนโปรแกรมเชิงวัตถุ (object oriented) มักใช้ เมธเธิด (method) เป็นฟังก์ชันที่ผูกติดกับวัตถุ ถ้าจะเรียกใช้งาน ต้องเรียกผ่านวัตถุนั้นๆ

ทุกโปรแกรมจะต้องมีฟังก์ชันหลัก (main function) เป็นจุดเริ่มต้นของโปรแกรม ที่สามารถรับข้อมูลเข้ามาใช้ภายในโปรแกรม การจัดลำดับการทำงานของโปรแกรมจะอยู่ภายในฟังก์ชันหลัก (work flow) โดยการเรียกใช้และส่งผ่านข้อมูลให้ฟังก์ชันต่างๆ ทำงาน และสุดท้ายสามารถส่งข้อมูล ออกจากโปรแกรมได้

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

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

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

ลองมาดูตัวอย่างการใช้ฟังก์ชันในโปรเจก FishChomp

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

ระหว่างเล่นเกมนี้ ปลาทอง 1 จะส่งรหัส “got-me” ออกไป ถ้าถูกปลาตัวใหญ่กิน และเมื่อปลาตัวใหญ่รับรหัส “got-me” ก็จะแสดงแอนิเมชั่นการกินพร้อมเสียง “chomp” งานหลักของการส่งรหัส (broadcast) คือการเชื่อมต่อการทำงานให้สอดคล้องกัน หมายความว่า ณ เวลาที่ปลาทอง 1 ถูกกิน ก็ส่งรหัสสัญญาณ บอกปลาตัวใหญ่ให้แสดงท่าทางการกินพร้อมเสียงการเคี้ยวด้วย เพื่อให้เกมดูสมจริง

แต่ในมุมมองของการใช้ฟังก์ชัน การส่งรหัสคือ การเรียกชื่อฟังก์ชัน got-me ให้ทำงาน (function call) สคริปต์ที่รับรหัส got-me เปรียบเสมือนฟังก์ชันที่มีชื่อว่า got-me ซึ่งอาจเป็นสคริปต์ในตัวละครเดียวกันก็ได้ หรือ ตัวละครอื่นก็ได้ เช่นในกรณีนี้ เป็นสคริปต์หนึ่งในปลาตัวใหญ่

เรื่องของฟังก์ชันใน Scratch ยังมีต่อในคราวหน้า