วันอังคารที่ 1 พฤศจิกายน พ.ศ. 2559

Casio fx-5800P - เกมม้าแข่ง

จำได้ว่าเมื่อสมัยที่เครื่องคิดเลข Casio fx-795P ออกมาใหม่ๆ มีโปรแกรมเกมม้าแข่งแถมมาในคู่มือด้วย สำหรับคนที่หัดเขียนโปรแกรมเครื่องคิดเลขใหม่ๆ เป็นอะไรที่สนุกมาก ป้อนผิดป้อนถูก ก็สนุกตรงหาบรรทัดที่ผิดนี่แหละ 

ในเกมมีม้าแข่งให้เลือกถึง 4 ตัว เป็นรูป โพดำ, โพแดง, ข้าวหลาม, ดอกจิก ม้าวิ่งแข่งกันบนหน้าจอที่มีบรรทัดเดียว พอม้าวิ่งเข้าเส้นชัยด้านขวาสุดก็มีการคำนวณเงินให้ด้วยเสร็จสรรพ


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









เป็นเครื่องฝาพับที่พอเปิดออกมามีปุ่มเยอะแยะน่าปวดหัวแต่แสดงผลบรรทัดเดียว อันดับแรกต้องหาคู่มือก่อน ลองค้นกูเกิ้ลดูก็ไปได้คู่มือมาจากที่นี่ https://www.manualslib.com/manual/358122/Casio-Fx-795p.html ทีนี้ก็เอาเฉพาะตัวโปรแกรมม้าแข่งกับคำอธิบายออกมาดังนี้




















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




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

บรรทัดที่ 510 ตรวจสอบว่ามีม้าเข้าเส้นชัยหรือยัง(ด้วยค่า G) ถ้ามีม้าเข้าเส้นชัยแล้ว(G=2) ให้หยุดวิ่งแล้วข้ามไปแสดงข้อความ "GOAL!" (บรรทัดที่ 610)

บรรทัดที่ 520 สั่งวนลูป 4 รอบสำหรับสุ่มให้ม้าแต่ละตัวว่าจะวิ่ง 1 ช่องหรืออยู่กับที่

บรรทัดที่ 530 ตรวจสอบม้าแต่ละตัวว่าเข้าเส้นชัยหรือยัง

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

บรรทัดที่ 550 ใช้ฟังก์ชั่น Ran# คูณกับค่าในวงเล็บ ผลที่ได้จะมีค่าอยู่ระหว่าง 0.0XXXXXXXXX ถึง 0.9XXXXXXXXX แล้วตรวจสอบว่ามากกว่า 0.7 หรือไม่ ซึ่งค่า 0.7 นี้จะทำให้โอกาสที่ม้าจะได้วิ่ง 1 ช่องมีประมาณ 30% (ค่ายิ่งมากเปอร์เซ็นต์ที่จะได้วิ่งยิ่งมีน้อยหรือทำให้ม้าวิ่งช้าลง ถ้าอยากให้ม้าวิ่งเร็วขึ้นก็ให้ลดค่านี้ลง) ผลจากการเปรียบเทียบด้วยเครื่องหมาย > จะมีค่าเป็น จริง หรือ เท็จ ถ้าเป็นจริงก็จะบวกเพิ่มตำแหน่งของม้า(A(1,J))ไปอีกหนึ่งช่อง

บรรทัดที่ 560 ตรวจสอบตำแหน่งของม้าตัวนั้นๆ (ในแต่ละรอบ)ว่าถึงตำแหน่งที่ 23 หรือยัง(23 คือตำแหน่งขวาสุดของหน้าจอเครื่อง 795) ถ้าวิ่งไปสุดหน้าจอแล้ว(เส้นชัย)ให้บวกค่า G เพิ่มไปอีกหนึ่ง

บรรทัดที่ 570 หลังจากที่ลบภาพม้าจากตำแหน่งเดิมในบรรทัดที่ 540 ไปแล้ว บรรทัดที่ 570 นี้ก็จะเป็นการวาดภาพม้าลงไปใหม่ ซึ่งอาจจะอยู่ตำแหน่งเดิมหรือตำแหน่งใหม่ก็ได้แล้วแต่ผลการสุ่มในบรรทัดที่ 550

บรรทัดที่ 590 ในลูป FOR (บรรทัดที่ 520 - 580) เป็นแค่การสุ่มว่าม้าทั้งสี่ตัวจะขยับหรือไม่ขยับ พอจบลูป FOR สี่รอบ(ม้าสี่ตัว) ก็จะย้อนกลับไปเริ่มต้นวนลูปใหม่จนกว่าจะมีม้าเข้าเส้นชัย (ค่า G=2)

บรรทัดที่ 610 แสดงข้อความ "GOAL!" จบการแข่งขัน


กลับมาที่โปรแกรมม้าแข่งของเราบ้าง อย่างที่บอกไปแล้วว่าข้อจำกัดของเครื่อง 5800 คือไม่มีตัวแปร Array 2 มิติ และที่สำคัญที่สุดคือไม่มีฟังก์ชั่นจัดการเกี่ยวกับอักขระ MID$() (ในที่นี้ไม่ขออธิบายคำสั่ง MID$) มานั่งดูโปรแกรมอย่างละเอียดแล้ว ถ้าจะใช้คำสั่ง FOR ลูปเดียวแบบ 795 นั้นสามารถใช้ Array 1 มิติที่มีในเครื่อง 5800 แทน Array 2 มิติ(A(1,J)) ได้ แต่ปัญหาคือคำสั่ง MID$() นี่คิดไม่ออกเลยว่าจะใช้วิธีไหนแทนได้ ก็เลยตัดสินใจว่าจะแยกการสุ่มวิ่งและการแสดงผลออกเป็นของใครของมัน แต่ก่อนจะเขียนโปรแกรมขออธิบายคำสั่งที่จะใช้เพิ่มเติมอีกซัก 1 คำสั่ง



คำสั่ง While ~ WhileEnd
เป็นคำสั่งที่ใช้ในการวนทำงานซ้ำคล้ายกันกับคำสั่ง For แต่แตกต่างกันที่คำสั่ง For นั้นเราทราบจำนวนรอบที่แน่นอนว่าจะให้วนกี่รอบ แต่คำสั่ง While นี้เป็นการสั่งวนรอบตามเงื่อนไขที่ระบุหลังคำสั่ง While โดยไม่ทราบจำนวนรอบที่แน่นอน คือถ้าเงื่อนไขยังเป็นจริงอยู่ก็จะทำงานตามคำสั่งในลูปไปเรื่อยๆ 

สามารถเรียกใช้คำสั่ง While ได้โดย 

                    ปุ่ม FUNCTION > 3:PROG > เลื่อนหน้าจอลง 3 ครั้ง > 5:WHILE

และ WhileEnd โดย

                    ปุ่ม FUNCTION > 3:PROG > เลื่อนหน้าจอลง 3 ครั้ง > 6:W.End


รูปแบบ :

                    While <เงื่อนไข>

                    <คำสั่งภายในลูป>
                    <...>
                    <...>
                    WhileEnd

ตัวอย่าง : (ขอยกตัวอย่างตามในคู่มือ)


                    ?A

                    While A<10
                    A²
                    A+1A
                    WhileEnd
                    A÷2


อธิบาย 

                    โปรแกรมเริ่มจากรับค่า A จากการคีย์ข้อมูล 
                    เริ่มตรวจสอบเงื่อนไขก่อนวนลูปว่าจะวนลูปเมื่อป้อนค่า A น้อยกว่า 10 
                    ถ้าเงื่อนไขเป็นจริงให้แสดงค่า A²
                    เพิ่มค่า A อีก 1 
                    วนกลับไปที่คำสั่ง While เพื่อตรวจสอบเงื่อนไข
                    หลังจากออกจากลูปให้แสดงค่า A÷2



เมื่อเข้าใจคำสั่ง While แล้ว มาดูหน้าตาโปรแกรมม้าแข่งที่เขียนเสร็จแล้วของเครื่อง 5800 กัน



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

โปรแกรมนี้จะมีม้าสี่ตัวที่มีรูปร่างเป็นตัวอักษร A, B, C และ D (เพราะ 5800 ไม่มีอักขระที่เป็นดอกของไพ่) วิ่งจากด้านซ้ายของหน้าจอไปยังขวาสุดของหน้าจอ(คอลัมน์ที่ 16) แล้วแสดงอันดับที่เข้าเส้นชัยของม้าแต่ละตัว ข้อได้เปรียบอย่างหนึ่งของ 5800 คือมีสี่บรรทัดพอดีกับจำนวนม้า ไม่ต้องวิ่งเบียดกันบรรทัดเดียวอย่าง 795


บรรทัดที่ 1 เอาค่า 0.7 นี้มาจากโปรแกรมม้าแข่งของ 795 แต่แยกออกมาต่างหากเพื่อให้ง่ายต่อการแก้ไข(เพิ่ม, ลด) เพราะมีการอ้างถึงค่านี้สี่บรรทัด การแยกออกมาทำให้การแก้ไขทำได้ในบรรทัดเดียว ซึ่งค่า 0.7 นี้สามารถเพิ่มหรือลดได้ คือถ้าอยากให้ม้าวิ่งเร็วขึ้นก็ให้ลดค่านี้ลง ใครสนใจก็ทดลองดู แต่ค่าต้องมากกว่า 0 เพราะถ้ากำหนดค่า R ตั้งแต่ 0 ลงไปจะทำให้ม้าทุกตัวจะวิ่งความเร็วเท่ากัน โดยม้า A วิ่งออกก่อน ตามด้วย B, C, D ตามลำดับ วิ่งตามๆ กันไปจนเข้าเส้นชัย ผลคือ A จะเข้าที่ 1, B ที่ 2, C ที่ 3 และ D ที่ 4 เป็นอย่างนี้ในทุกๆ รอบ และค่าตั้งแต่ 1 ขึ้นไปจะทำให้ม้าไม่วิ่ง เพราะค่า Ran# มีค่าอยู่ระหว่าง 0.0XXXXXXXXX ถึง 0.9XXXXXXXXX
ค่า R ตั้งแต่ 0 ลงไปจะทำให้เงื่อนไขในบรรทัดที่ 17, 24, 31, 38 เป็นจริงทุกครั้ง ส่วนค่า R ตั้งแต่ 1 ขึ้นไปจะทำให้ม้าไม่วิ่ง เพราะเงื่อนไขจะไม่มีวันเป็นจริง 

สรุปคือ 0<R<1 (ค่า R ต้องมากกว่า 0 แต่น้อยกว่า 1)

บรรทัดที่ 2 ตัวแปร G ใช้เพื่อตรวจสอบว่ามีม้าเข้าเส้นชัยกี่ตัวแล้ว ซึ่งเริ่มต้นกำหนดเป็น 0 เนื่องจากยังไม่มีม้าเข้าเส้นชัย

บรรทัดที่ 3 กำหนดตำแหน่งให้ม้าแต่ละตัวมีค่าเริ่มต้นเป็น 1 หรืออยู่ด้านซ้ายสุดของจอ

บรรทัดที่ 6-9 แสดงม้าทุกตัวในตำแหน่งเริ่มต้น

บรรทัดที่ 13-43 วนลูปไปเรื่อยเรื่อยจนกว่าม้าจะเข้าเส้นชัยครบ 4 ตัว 

ภายในลูป While ก็จะมีการสุ่มวิ่งของม้าแต่ละตัว ในที่นี้จะขออธิบายม้า A เพียงตัวเดียวเพราะตัวอื่นๆ ก็มีลักษณะการทำงานที่เหมือนกัน

บรรทัดที่ 15 ตรวจสอบว่าม้า A เข้าเส้นชัยไปแล้วหรือยัง ถ้าเข้าเส้นชัยแล้วก็ไม่ต้องสุ่มการวิ่งอีก

บรรทัดที่ 16 ลบม้าในตำแหน่งเดิมออกเพื่อรอการแสดงผลใหม่ว่าจะขยับหรือไม่ขยับ

บรรทัดที่ 17 สุ่มตัวเลขว่าม้าจะวิ่งหรือไม่

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

บรรทัดที่ 19 ตรวจสอบอีกครั้งหลังการสุ่มว่าม้าเข้าเส้นชัยหรือยัง(16 คือตำแหน่งขวาสุดของหน้าจอ) ถ้าเข้าเส้นชัยแล้วให้แสดงลำดับที่เข้าเส้นชัยที่ด้านซ้ายสุดของจอในบรรทัดที่ม้าตัวนั้นๆ อยู่

ในส่วนของม้า B, C และ D ก็มีลักษณะที่เหมือนกัน ซึ่งในแต่ละส่วนถ้ามีม้าตัวไหนเข้าเส้นชัยก็จะบวกค่า G เพิ่มขึ้นอีก 1 ไปเรื่อยๆ เป็นการนับจำนวนม้าที่เข้าเส้นชัย จนม้าเข้าเส้นชัยครบทั้งสี่ตัว เงื่อนไข While ในบรรทัดที่ 13 ก็จะเป็นเท็จแล้วออกจากลูปไป

ตัวอักขระที่ใช้แทนม้าทั้งสี่ตัวสามารถเปลี่ยนแปลงได้ตามชอบ คือถ้าใครไม่ชอบม้าที่เป็นรูป A, B, C, D ก็ให้แก้ไขที่บรรทัด 6, 7, 8, 9 และ 18, 25, 32, 39 เฉพาะ A, B, C, D ที่อยู่ในเครื่องหมายคำพูดเท่านั้น



ทดสอบรันโปรแกรม เริ่มต้นม้าทุกตัวจะอยู่ทางด้านซ้ายของหน้าจอ






ด EXE ม้าทุกตัวจะเริ่มวิ่งไปทางขวาตามการสุ่มของโปรแกรม






เมื่อม้าทุกตัวเข้าเส้นชัยจะแสดงลำดับที่เข้าเส้นชัยของม้าแต่ละตัวที่ด้านซ้ายของจอภาพ







จบบท

ไม่มีความคิดเห็น:

แสดงความคิดเห็น