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

     การเรียกใช้งานคลาสและเมธอดที่มีอยู่ใน Java API เราใช้คีย์เวิร์ด import ตามด้วยชื่อแพคเกจและชื่อคลาสในรูปแบบ 

Import ชื่อแพคเกจ.ชื่อคลาส

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

     ในการเขียนโปรแกรมด้วยโปรแกรม IntelliJ IDEA เราสามารถเรียกใช้งานคลาสที่ต้องการในขั้นตอนการเขียนโปรแกรมได้เลย โดยโปรแกรม IntelliJ IDEA จะแสดงรายการคลาสให้เราเลือกและจัดการเติมประโยคคำสั่ง import ให้อย่างอัตโนมัติ

คลาส Random

      คลาส Random เป็นคลาสที่อยู่ในแพคเกจ java.util เราใช้คลาส Random ในการสุ่มค่า โดยสามารถกำหนดให้สุ่มค่าเป็นตัวเลขหรือค่าทางตรรกศาสตร์ก็ได้ เมื่อเรียกใช้งานคลาส Random แอพพลิเคชั่น IteliJ IDEA จะเพิ่มประโยคคำสั่ง import แพคเกจของคลาส Random เข้ามาเป็นส่วนหนึ่งของโปรแกรมที่เราเขียนดังนี้

     การใช้งานคลาส Random จะต้องสร้างออบเจกต์ขึ้นมาก่อน จากตัวอย่างเราสร้างออบเจกต์ชื่อ rand ด้วยคำสั่งสร้างออบเจกต์ดังนี้

     ในการใช้งานเมธอดเพื่อการสุ่มค่า เราต้องประกาศตัวแปรเพื่อเอามาเก็บค่าที่สุ่มขึ้นมา และเรียกใช้เมธอดในการสุ่มค่าผ่านทางออบเจกต์ที่สร้างขึ้นมา ตัวอย่างเช่น 

     คลาส Random มีเมธอดในการสุ่มค่าแบบต่างๆที่หลากหลายแต่ในเบื้องต้นเราจะทำความรู้จักกับบางเมธอดเท่านั้น 

     เมธอด nextInt() จะคืนค่าที่เป็นเลขจำนวนเต็ม  แต่หากเราต้องการกำหนดช่วงตัวเลขที่ต้องการ เราสามารถใช้เมธอด nextInt(int bound) โดยจะค่าที่ได้จะเป็นเลขจำนวนเต็มที่มีค่าระหว่าง 0 – เลขจำนวนเต็มที่กำหนดให้กับพารามิเตอร์ bound แต่ไม่รวม bound หากเราต้องการค่าที่เป็นเลขจำนวนจริงเราสามารถใช้เมธอด nextDouble() ซึ่งจะคืนค่าเลขจำนวนจริงระหว่าง  0.0 – 1.0  ตัวอย่างด้านล่างเป็นการสุ่มค่าของทั้ง 3 เมธอดที่กล่างถึงแล้วนำมาเก็บในอาเรย์จากนั้นให้แสดงผล

การรับข้อมูลจากคีย์บอร์ดด้วยคลาส Scanner

     คลาส Scanner เป็นคลาสที่อยู่ในแพคเกจ java.util  เราใช้คลาส Scanner ในการรับข้อมูลจากผู้ใช้งานผ่านคีย์บอร์ด โดยมีเมธอดให้เราเลือกใช้รับข้อมูลจากผู้ใช้งานตามแต่ละชนิดข้อมูลที่เป็น primitive data type และ String เมื่อเรียกใช้งานคลาส Scanner แอพพลิเคชั่น IteliJ IDEA จะเพิ่มประโยคคำสั่ง import แพคเกจของคลาส Scanner เข้ามาเป็นส่วนหนึ่งของโปรแกรมที่เราเขียนดังนี้

     การใช้งานคลาส Scanner จะต้องสร้างออบเจกต์แสกนเนอร์ขึ้นมาก่อนจากตัวอย่างเราสร้างออบเจกต์ชื่อ objScanner ด้วยคำสั่งดังนี้

     ในขั้นตอนการระบุชื่อคลาส Scanner ต้องแน่ใจว่าเลือกคลาส Scanner จาก java.util

     ก่อนที่จะดูเรื่องการรับข้อมูลด้วยออบเจกต์แสกนเนอร์ เรามาทำความเข้าใจเรื่อง white space ในภาษาจาวาก่อน คำว่า white space ในภาษาจาวาจะหมายถึงอักขระที่ไม่สามารถพิมพ์ออกมาได้ เช่น space, tab และรวมถึงอักขระ enter เวลาที่เรากด enter เพื่อขึ้นบรรทัดใหม่ ซึ่งจะมีผลกับการรับข้อมูลของบางเมธอด

     การรับข้อมูลด้วยออบเจกต์แสกนเนอร์โดยทั่วไปเราสามารถใช้เมธอด next() ในการรับข้อมูล โดยเมธอด next() จะรับข้อมูลเพียงตัวเดียวโดยดูจาก white space ที่ตามมา เช่น “123 45” จะรับเฉพาะ 123 เข้ามา หรือประโยค “this is my number” จะรับเฉพาะ this เข้ามา และข้อมูลจะถูกเก็บเป็น String ดังนั้นการนำไปใช้งานอาจจะไม่สะดวก จึงควรใช้เมธอดที่เฉพาะเจาะจงกว่าดังจะกล่าวถึงต่อไป

     การรับข้อมูลที่เป็นชนิดข้อมูล String จากหน้าจอคอนโซลจะใช้เมธอด nextLine() เช่น ประกาศตัวแปรชนิดข้อมูล String มารับข้อมูลไปเก็บไว้ทำได้โดยใช้ประโยคคำสั่งด้านล่าง

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

     เมื่อใช้งานออบเจกต์แสกนเนอร์เรียบร้อยแล้วต้องยกเลิกเพื่อคืนหน่วยความจำให้กับระบบด้วยเมธอด close() ดังตัวอย่าง

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

     ตัวอย่างด้านล่างเป็นการเขียนโปรแกรมเพื่อรับข้อมูลตัวเลข 2 ค่าแล้วนำมาบวกกัน โดยตรวจสอบว่าผู้ใช้งานป้อนข้อมูลเป็นตัวเลขเท่านั้น

     รายการเมธอดการรับข้อมูลสำหรับชนิดข้อมูลแบบต่างๆมีดังนี้ nextLine() nextInt() nextBoolean() nextShort() nextLong() nextDouble() nextFloat() 

     สำหรับการตรวจสอบค่าที่รับเข้ามาว่าเป็นชนิดข้อมูลตามที่กำหนดหรือไม่สามารถใช้เมธอด hasnextInt() hasnextBoolean() hasnextShort() hasnextLong() hasnextDouble() hasnextFloat()

     ในกรณีที่เราต้องใช้ออบเจกต์ของ Scanner ในแต่ละเมธอดในคลาสเดียวกัน เราควรสร้างออบเจกต์ของ Scanner แบบ static ที่ระดับคลาส ทั้งนี้การกำหนดคีย์เวิร์ด static ทำให้เมธอดสามารถเรียกอินแสตนซ์ของ Scanner ที่สร้างไว้มาใช้งานได้โดยไม่ต้องสร้างอินแสตนซ์ขึ้นมาเอง ดังตัวอย่างด้านล่าง

สร้างเกมส์ puzzle แบบง่ายๆ

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

     เกมส์ puzzle ที่เราจะสร้างเป็นเกมส์ puzzle แบบตัวเลขขนาด 3 แถว 3 คอลัมภ์ โดยเมื่อเริ่มเกมส์ตำแหน่งของเลขต่างๆจะถูกสุ่มขึ้นมาแล้วเราต้องเลื่อนตัวเลขจนกว่าเลขทั้งหมดจะเรียงกันอย่างถูกต้อง เราจะใช้เลข 99 แทนช่องว่างและใช้เลข 4 5 6 2 แทนการบอกทิศทางที่ต้องการเลื่อน เราไม่ใช้คีย์ลูกศรเพราะว่าหากต้องการจับค่าการกดคีย์ลูกศรเราต้องสร้างคลาสขึ้นมาซึ่งเราจะยังไม่สร้างคลาสในบทเรียนนี้ สำหรับการเล่นเกมส์จะเป็นการโต้ตอบกับโปรแกรมผ่านหน้าต่างผลลัพธ์ของโปรแกรม IntelliJ IDEA

     ขั้นตอนการทำงานของโปรแกรมสามารถแยกออกเป็นส่วนๆได้ดังนี้ 

1. สร้างเทมเพลตของ puzzle ขึ้นมา

2. สุ่มตำแหน่งให้ตัวเลขต่างๆและแสดงเทมเพลตของ puzzle

3. รับค่าการเลื่อนตัวเลขจากคีย์บอร์ดและแสดงเทมเพลตของ puzzle

4. ตรวจสอบว่าทำสำเร็จแล้วหรือยัง

1. สร้างเทมเพลตของ puzzle ขึ้นมา

     การสร้างเทมเพลตของ puzzle ขึ้นมาเราใช้ประโยคคำสั่งในบรรทัดที่ 11-16  เป็นโดยบรรทัดที่ 11 เป็นการสร้างอาเรย์ 2 มิติขนาด 3×3 และกำหนดค่าตั้งต้นให้กับทุกสมาชิกในอาเรย์เป็น 99 โดยใช้ประโยคคำสั่ง for ซ้อนกัน 2 ชั้นเพื่ออ้างถึงแต่ละสมาชิกในอาเรย์

2. สุ่มตำแหน่งให้ตัวเลขต่างๆและแสดงเทมเพลตของ puzzle

     ในบรรทัดที่ 19-44 เมื่อเราได้เทมเพลตของ puzzle แล้วเราจะสุ่มตัวเลข 0-7 เพื่อใส่ในตำแหน่งต่างๆของเทมเพลตและปล่อยให้ตำแหน่งขวาล่างเป็นช่องว่าง (ค่า99) 

     เริ่มจากบรรทัดที่ 19 เป็นการประกาศตัวแปรชื่อ rand เพื่อเก็บออบเจกต์ที่สร้างจากคลาส Random 

     บรรทัดที่ 22 เป็นการสร้างอาเรย์ชื่อ numberChecking ด้วยชนิดข้อมูลแบบ boolean โดยมีจำนวนสมาชิก 7 ตัวตามจำนวนตัวเลขที่จะใช้คือ 0-7 เพื่อใช้เก็บสถานะว่าตัวเลขใดบ้างที่ถูกกำหนดตำแหน่งให้แล้ว โดยสถานะเริ่มต้นของทุกสมาชิกในอาเรย์คือ false ซึ่งหมายถึงยังไม่ถูกกำหนดตำแหน่ง เนื่องจากตัวเลขที่ใช้ตรงกับดัชนีของอาเรย์พอดีการปรับปรุงค่าสำหรับแต่ละตัวเลขคือการปรับปรุงค่าของสมาชิกอาเรย์ที่มีดัชนีเดียวกันกับตัวเลขนั่นเอง

     บรรทัดที่  26-27 เราใช้ประโยคคำสั่ง for ซ้อนกัน 2 ชั้นเพื่ออ้างถึงแต่ละสมาชิกในอาเรย์และในบรรทัดที่ 28 เราใช้ประโยคคำสั่ง while เพื่อวนสุ่มค่าตัวเลขสำหรับแต่ละสมาชิกในอาเรย์ โดยใช้คำสั่งในบรรทัดที่ 30 ซึ่งเป็นการใช้เมธอด nextInt(8) ในการสุ่มค่าตัวเลข 0-7 ผ่านตัวแปร rand การวนสุ่มนี้จะทำจนกว่าทุกตัวเลขจะถูกกำหนดตำแหน่งแล้ว ด้วยประโยคคำสั่ง if ในบรรทัดที่ 31-34 หากพบว่าตัวแปรยังไม่ถูกกำหนดตำแหน่ง จะนำมาดำเนินการและปรับปรุงค่าในอาเรย์ numberChecking ส่วนประโยคคำสั่ง if ในบรรทัดที่ 35-43 เป็นการตรวจสอบว่าตัวเลขทุกตัวถูกกำหนดตำแหน่งครบหมดแล้วหรือไม่ เพราะเป็นไปได้ที่เลขที่สุ่มมาจะซ้ำกับเลขเดิมที่เคยใช้แล้วเพื่อให้ยังคงการวนสุ่มต่อไปหากยังคงมีตัวเลขเหลืออยู่ สังเกตุว่าเราใช้ตัวแปร loopCheck ในการควบคุมการทำงานของประโยคคำสั่ง while

     บรรทัดที่ 51-69 เป็นการแสดงข้อความวิธีการในการเล่นเกมส์

     บรรทัดที่ 64-68 เป็นการใช้คำสั่ง for ซ้อนกัน 2 ชั้นเพื่อแสดงเทมเพลตของ puzzle ที่มีการสุ่มตำแหน่งตัวเลขแล้ว เพื่อให้ผู้เล่นเริ่มเล่น

3. รับค่าการเลื่อนตัวเลขจากคีย์บอร์ดและแสดงเทมเพลตของ puzzle

     ในบรรทัดที่ 71 เราประกาศตัวแปร scanner เพื่อเก็บออบเจกต์ที่สร้างจากคลาส Scanner จากนั้นเราใช้ประโยคคำสั่ง while ซ้อนกัน 2 ชั้นโดยประโยคคำสั่ง while ชั้นที่บรรทัด 78 จะมีหน้าที่ในการวนรอบรับข้อมูลจากคีย์บอร์ด โดยใช้ตัวแปร correctKey เป็นตัวควบคุมเงื่อนไข ในกรณีที่ตัวเลขไม่ถูกต้องตามที่กำหนดจะแจ้งให้ผู้เล่นทราบด้วยข้อความในบรรทัดที่  124 และรอรับตัวเลขใหม่ ในกรณีที่ตัวเลขถูกต้องจะตรวจสอบว่าตำแหน่งใดที่สามารถเลื่อนได้ตามที่ต้องการบ้าง โดยใช้ประโยคคำสั่ง for ซ้อนกัน 2 ชั้นเพื่อตรวจสอบสมาชิกของอาเรย์ทุกตัว ด้วยเงื่อนไขจากประโยคคำสั่ง if ในบรรทัดที่ 87-111 

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

4. ตรวจสอบว่าทำสำเร็จแล้วหรือยัง

    ประโยคคำสั่ง while ชั้นนอกในบรรทัดที่ 76 มีหน้าที่ตรวจสอบว่าทำสำเร็จแล้วหรือไม่โดยตรวจสอบด้วยประโยคคำสั่ง if ในบรรทัดที่ 128-133 และแสดงข้อความแสดงความยินดีในบรรทัด 137

     ตัวอย่างของการเล่นเกมส์ puzzle ที่เราสร้างขึ้นมา

     จะเห็นว่าเมื่อเราได้เป้าหมายในการเขียนโปรแกรมแล้ว เราต้องแบ่งขั้นตอนต่างๆออกเป็นส่วนย่อยๆจากนั้นจึงเขียนโปรแกรมเพื่อทำงานในแต่ละส่วน รวมถึงการทดสอบความถูกต้องของโปรแกรมในส่วนย่อยๆจะง่ายกว่าการตรวจสอบเมื่อโปรแกรมมีขนาดใหญ่ ในกรณีที่ไม่แน่ใจว่าโปรแกรมทำงานมาถึงส่วนไหนหรือค่าของตัวแปรเป็นอะไร เราสามารถใช้ประโยคคำสั่ง System.out.println() เพื่อแสดงข้อมูลให้เราตรวจสอบได้ โดยแทรกประโยคคำสั่งดังกล่าวในช่วงบรรทัดที่ต้องการตรวจสอบ