บทที่ 4: ถนนบนโลกคาเรลชำรุด


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

Before:
After:

ถ้าผู้ใช้ถูกจำกัดให้ใช้คำสั่งได้เพียง 4 คำสั่งพื้นฐานของคาเรล ลำดับคำสั่งในฟังก์ชัน main() สำหรับแก้ปัญหานี้ จะมีลักษณะตามโปรแกรมดังนี้:

def main():
move()
turn_left()
turn_left()
turn_left()
move()
put_beeper()
turn_left()
turn_left()
move()
turn_left()
turn_left()
turn_left()
move()

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

จากตัวอย่างเงื่อนไขข้างต้น ผู้บังคับหุ่นสามารถกำหนดให้คาเรลทำงานเป็นลำดับขั้นแบบนี้ได้:

  1. เดินตรงไป
  2. เอาเหรียญอุดรูที่กำแพง
  3. เดินตรงไป

ถ้าจะเขียนโปรแกรมโดยวางวิธีแก้ปัญหาไว้แบบนี้ ผู้ใช้สามารถสร้างฟังก์ชัน main ออกมาได้ประมาณนี้

def main():
move()
fill_pothole()
move()

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

def fill_pothole():
turn_right()
move()
put_beeper()
turn_around()
move()
turn_right()

ข้างล่างคือตัวอย่างโปรแกรมที่คาเรลเดินเอาเหรียญไปอุดรูกำแพง โดยผู้ใช้สามารถเขียนฟังก์ชันที่มนุษย์พอจะเข้าใจได้ง่าย และคาเรลก็สามารถทำงานได้ตรงตามที่ได้โปรแกรมไว้ ลองกดปุ่ม “Run Program” แล้วสังเกตลำดับการทำงานของหุ่นยนต์โดยดูจากไฮไลท์ที่แสดงในหน้าต่าง IDE


บทถัดไป