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

Posted in Programming, Scratch | Tagged , , , | 1 Comment

หลักการเขียนโปรแกรมใน 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 ยังมีต่อในคราวหน้า

Posted in Programming, Scratch | Tagged , , | 1 Comment

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

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

Scratch สามารถสร้างช่องทางการติดต่อ ระหว่างผู้ใช้ กับโปรแกรมได้หลายวิธี ลองมาดูตัวอย่างในโปรเจก  PianoMachine

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

การสร้างปุ่มคำสั่ง ทำได้โดยการสร้างตัวละคร ที่รับการคลิกเมาส์จากผู้ใช้ เพื่อให้โปรแกรมทำงาน เช่น  เมื่อคลิกที่คีย์เปียโนใดๆ ก็จะมีเสียงออกมาจากคีย์นั้นๆ แต่การสร้างตัวละครให้เป็นปุ่มคำสั่งโดยเฉพาะก็มี เช่น ปุ่มเพิ่มหรือลดจำนวนลูกบอล และปุ่มการสะท้อนของลูกบอล  นอกจากนั้น โปรแกรมยังรับคำสั่งจากผู้ใช้ผ่านการกดคีย์ต่างๆ บนคีย์บอร์ด เช่น a-z 0-9 คีย์ลูกศร และคีย์เว้นวรรค (space bar)

Posted in Programming, Scratch | Tagged , , | Leave a comment

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

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

การคำนวณตัวเลขทั่วไป ก็มีการบวก (+) ลบ (-) คูณ (*) หาร (/) นอกจากนั้นยังมี การสุ่มค่า การใช้ฟังก์ชันคณิตศาสตร์อีกมากมาย

ส่วนการจัดการข้อมูลตัวอักษรนั้น สามารถรวมสองคำให้เป็นคำเดียวกันได้ (join) หรือดึงอักษรใดอักษรหนึ่งมาจากคำได้ (letter of ) นอกจากนั้นยังนับจำนวนอักษรทั้งหมดในคำได้ (length of)

สำหรับตรรกะที่ใช้ในเงื่อนไข หาได้จากการเปรียบเทียบตัวเลข เช่น การเปรียบเทียบ มากกว่า (>) น้อยกว่า (<) หรือ เท่ากับ (=) ซึ่งจะคืนค่าเป็น จริงหรือเท็จ เมื่อมีหลายเงื่อนไข ก็ยังสามารถประมวลผลระหว่างเงื่อนไขได้จาก ตรรกะและ (and) ตรรกะหรือ (or) ตรรกะไม่ (not)

สิ่งสำคัญอย่างหนึ่งในการคำนวณที่กล่าวมา คือลำดับการคำนวณ ตัวอย่างเช่น ถ้าต้องการคำนวณ 3 * 5 -4 /2 ในโปรแกรมภาษาอื่น จะคำนวณตามกฎลำดับการคำนวณของภาษานั้นๆ เพื่อลดความสับสน ใน Scratch จะทำการคำนวณได้ที่ละคู่ เหมือนการใส่วงเล็บ คนเขียนโปรแกรมต้องรู้ว่า ต้องการคำนวณอย่างไร เพราะจะได้ผลต่างกัน เช่น ((3*5)-(4/2)) = 13 หรือ ((3 * (5 – 4)) /2) = 1.5 เป็นต้น

มาดูตัวอย่าง GardenSecret ในสคริปต์ของดอกไม้ 1 ซึ่งจะเห็นบล็อกคำนวณสีเขียวอ่อน อยู่หลายบล็อก เช่น บล็อกเงื่อนไข (flower = 1) ในบล็อกถ้า (if)

การเล่นเอฟเฟคสี ความสว่าง ขนาดของดอกไม้นี้ ต่างใช้การคำนวณเพื่อสร้างความหลากหลาย เช่น สีเปลี่ยนโดยนำเอาตำแหน่ง x ของเมาส์ มาหารด้วย 5 ค่าความสว่าง เกิดจากการสุ่ม ส่วนการเปลี่ยนขนาด นำเอาตำแหน่ง y ของเมาส์ บวกด้วย 220 แล้วหารด้วย 3 สุดท้ายบวกกับค่าสุ่ม สังเกตุการใช้บล็อกซ้อนในบล็อก เสมือนการใส่วงเล็บ นั้นคือ (((mouse y + 220) / 3) + random)

ในบล็อกทำซ้ำ (repeat) หาจำนวนครั้ง ในการหมุนให้ได้ 1 รอบ ด้วยการคำนวณ (360 / 15)

Posted in Programming, Scratch | Tagged , , | Leave a comment

เด็กได้ฝึกอะไรจากการสร้างเว็บไซต์

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

นอกจากเขียน ก็จะได้ฝึกการอ่านควบคู่กันไปด้วย อ่านความคิดตัวเอง อ่านที่ตัวเองเขียน หัดเรียบเรียงใหม่ และแก้ไขคำที่เขียนผิด นอกจากนั้นก่อนการเขียน อาจค้นคว้าหาข้อมูล อ่านคู่มือ ลงมือปฏิบัติ เพื่อนำมาเขียน แสดงความคิดเห็น หรือให้คำแนะนำ จากการได้ทดลองทำจริง หรือจากข้อมูลเชิงลึกที่ค้นคว้ามา

การทำเว็บไซต์ต้องอาศัยการออกแบบ และเขียนโปรแกรม ทำให้เกิดทักษะการใช้คอมพิวเตอร์ ฝึกเขียนโปรแกรมภาษาต่างๆ สำหรับเว็บไซต์ เช่น HTML, CSS, PHP, Javascript และเมื่อมีพื้นฐานในการสร้างเว็บแล้ว อาจเริ่มทำธุรกิจบนเว็บไซต์ หัดใช้ฐานข้อมูล (Database) จัดการสินค้า ฝึกทำความเข้าใจกลไกทางธุรกิจว่าทำกำไรได้อย่างไร

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

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

Posted in Education | Tagged , , , | Leave a comment