เนื้อหาบทความนี้ จะมาแนะนำวิธีการสร้างรูปแบบเกมหรือแบบฝึกหัดสำหรับเรียงคำ
ให้เป็นประโยคที่ถูกต้อง โดยจะเป็นแนวทางเบื้องต้น สามารถนำไปประยุกต์ปรับแต่ง
เพิ่มเติมได้
รูปแบบการทำงาน
- นำประโยคที่ต้องการมาแยกเป็นคำ
- นำคำที่แยกมาสุ่มลำดับแล้วจัดเรียงเป็นตัวเลือก
- ผู้เล่นเลือกรายการคำ เพิ่มไปจัดเรียงใหม่
- ผู้เล่นสามารถยกเลิกการเลือกได้
- เมื่อเลือกจัดเรียงใหม่ครบ ทุกคำเป็นประโยคเรียบร้อยแล้วก็จะไปประโยคต่อไปจนจบเกม
แนวทางนี้จะใช้สำหรับการฝึกจำมากกว่า แต่ถ้าต้องการทำเป็นจับเวลาและเก็บคะแนนก็สามารถนำไป
ปรับประยุกต์เพิ่มเติมได้ ถ้าต้องการดูตัวอย่าง เลื่อนไปด้านล่าง ดู demo ได้
โค้ดตัวอย่างทั้งหมด จะอธิบายแยกส่วนในด้านล่าง
demo.html
<!doctype html> <html lang="th"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <title>Document</title> <link rel="stylesheet" href="https://unpkg.com/bootstrap@4.5.0/dist/css/bootstrap.min.css" > <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.min.css" > <style> body{ background: #CCCCCC; } </style> </head> <body> <style> ul.target-zone,ul.choice-zone{ list-style: none; padding: 0; margin: 0; display: flex; margin-bottom: 10px; justify-content: center; } ul.target-zone li,ul.choice-zone li{ display: flex; min-width: 50px; height: 50px; width: auto; align-content: center; justify-content: center; margin-right: 10px; cursor: pointer; line-height: 50px; } ul.target-zone li{ border: dashed 2px #37b992; } ul.target-zone li.filled{ background: #FFFFFF; border: solid 1px #37b992; } ul.target-zone li.filled.pass{ background: #84e41a; border: solid 1px #37b992; color: #FFFFFF; } ul.choice-zone li{ color: #FFFFFF; background: #ff9800; border: solid 1px #ff5722; } ul.choice-zone li:hover{ box-shadow: 0 0.25em 0.25em rgb(0 0 0 / 10%); } button.btn-game{ margin: auto; display: flex; border-radius:6px; cursor:pointer; font-weight:bold; padding:6px 24px; text-decoration:none; display: none; } button.btn-game:focus { position:relative; outline: none; top:1px; } #restart{ box-shadow:inset 0px 1px 0px 0px #f7c5c0; background:linear-gradient(to bottom, #fc8d83 5%, #e4685d 100%); background-color:#ff9800; border:1px solid #ff5722; text-shadow:0px 1px 0px #b23e35; color:#ffffff; } #restart:hover{ background:linear-gradient(to bottom, #e4685d 5%, #fc8d83 100%); background-color:#e4685d; } #nextstep{ box-shadow: inset 0px 1px 0px 0px #37a561; background: linear-gradient(to bottom, #31c372 5%, #44d273 100%); background-color: #8bc34a; border: 1px solid #37d05d; text-shadow: 0px 1px 0px #35b250; color:#ffffff; } #nextstep:hover{ background: linear-gradient(to bottom, #1fe076 5%, #44d273 100%); background-color:#5de47a; } #replay{ box-shadow: inset 0px 1px 0px 0px #378fa5; background: linear-gradient(to bottom, #31a6c3 5%, #44c9d2 100%); background-color: #4a93c3; border: 1px solid #3798d0; text-shadow: 0px 1px 0px #3595b2; color:#ffffff; } #replay:hover{ background: linear-gradient(to bottom, #31a6c3 5%, #44c9d2 100%); background-color: #4a93c3; } </style> <div class="container mt-5 mx-auto"> <!-- ส่วนสำหรับจัดเรียงเป็นประโยคใหม่ --> <ul class="target-zone"> </ul> <hr> <!-- ส่วนสำหรับคำสุ่ม --> <ul class="choice-zone"> </ul> <!-- ส่วนของปุ่มจัดการ --> <button type="button" class="btn-game" id="restart">ลองใหม่</button> <button type="button" class="btn-game" id="nextstep">ข้อต่อไป</button> <button type="button" class="btn-game" id="replay">เล่นใหม่อีกครั้ง</button> </div> <script src="https://unpkg.com/jquery@3.3.1/dist/jquery.min.js"></script> <script type="text/javascript"> jQuery(document).ready(function($) { var selectSound = new Audio('https://www.ninenik.com/demo/sound/select-sound_2.wav'); var correctSound = new Audio('https://www.ninenik.com/demo/sound/correct-bell_2.wav'); var winSound = new Audio('https://www.ninenik.com/demo/sound/winning-sound_2.wav'); // ฟังก์ชั่นสำหรับสุ่มคำสำหรับเลือก function shuffle(array) { var currentIndex = array.length, temporaryValue, randomIndex; while (currentIndex !== 0) { randomIndex = Math.floor(Math.random() * currentIndex); currentIndex -= 1; temporaryValue = array[currentIndex]; array[currentIndex] = array[randomIndex]; array[randomIndex] = temporaryValue; } return array; }; // array คำที่จะใช้สำหรับเรียงประโยค var listConversation = [ ("See you next time").split(" "), ("What's your job?").split(" "), ['คุณ','ชื่อ','อะไร'] ]; // เริ่มต้นใช้ค่าแรกแถวแรกก่อน ที่ key เท่ากับ 0 var choiceVal = listConversation[0]; // ส่วนสำหรับกำหนด element ต่างๆ var targetZone = $(".target-zone"); var choiceZone = $(".choice-zone"); var targetItem = $(".target-zone li"); var choiceItem = $(".choice-zone li"); var btnRestart = $("#restart"); var btnNextstep = $("#nextstep"); var btnReplay = $("#replay"); // นับลำดับข้อหรือรายการ var step = 0; // ฟังก์ชั่นเมื่อเริ่มเกม function startGame(){ let ran_choiceVal = []; // ค่าที่จะเก็บตัวเลือก targetZone.html(""); choiceZone.html(""); choiceZone.data("ans",choiceVal.join("")); ran_choiceVal = $.extend([],choiceVal); shuffle(ran_choiceVal); $.each(ran_choiceVal,function(i,v){ choiceZone.prepend('<li>'+v+'</li>'); targetZone.prepend('<li class="unfilled"></li>'); }); btnRestart.hide(); $(document.body).on("click",".target-zone li",function(){ if($(this).hasClass("filled")){ btnRestart.hide(); let textRemove = $(this).text(); $(this).toggleClass("filled unfilled") .text("").remove(); targetZone.append('<li class="unfilled"></li>'); choiceZone.append('<li>'+textRemove+'</li>'); } }); } function restartGame(){ startGame(); } function nextstep(){ step++; if(step==listConversation.length){ targetZone.html(""); choiceZone.html(""); step = -1; btnNextstep.hide(); btnReplay.css("display","flex"); }else{ choiceVal = listConversation[step]; btnNextstep.hide(); startGame(); } } startGame(); btnRestart.on("click",function(){ restartGame(); }); btnNextstep.on("click",function(){ nextstep(); }); btnReplay.on("click",function(){ btnReplay.hide(); nextstep(); }); $(document.body).on("click",".choice-zone li",function(){ selectSound.play(); targetZone.find(".unfilled:eq(0)") .text($(this).text()) .toggleClass("unfilled filled"); $(this).remove(); if(choiceZone.find("li").length==0){ let ans = $.trim(targetZone.text().replace(/\s+/g, '')); if(ans==choiceZone.data("ans")){ correctSound.play(); targetZone.find("li").toggleClass("pass"); $(document.body).off("click",".target-zone li"); btnNextstep.css("display","flex"); }else{ btnRestart.css("display","flex"); } } }); }); </script> <script> $(function(){ }); </script> </body> </html>
ส่วนที่เราสามารถแก้ไข แล้วนำไปใช้งานได้เลยก็คือ
// array คำที่จะใช้สำหรับเรียงประโยค var listConversation = [ ("See you next time").split(" "), ("What's your job?").split(" "), ['คุณ','ชื่อ','อะไร'] ];
สามารถกำหนดกี่รายการก็ได้ ในตัวอย่างกำหนดแค่ 3 รายการ สังเกตว่ากรณีภาษาไทย
เราจำเป็นต้องแยกคำเองแล้วกำหนดเป็น array ส่วนภาษาอังกฤษ เราสามารถใช้ฟังก์ชั่น split()
เพื่อแยกคำด้วยช่องว่างได้เลย หรือจะแยกแบบกำหนดเองเหมือนภาษาไทยก็ได้ สมมติถ้าต้องการเพิ่ม
ประโยคใหม่ก็จะเป็นประมาณนี้
var listConversation = [ ("See you next time").split(" "), ("What's your job?").split(" "), ['คุณ','ชื่อ','อะไร'], ['คุณ','สบาย','ดี','ไหม'] ];
หรือถ้าไม่อยากแยกตามตัวอย่าง ก็สามารถพิมพ์ประโยคแบบมีช่องว่าง แล้วใช้คำสั้ง split() แทนก็ได้
var listConversation = [ ("See you next time").split(" "), ("What's your job?").split(" "), ['คุณ','ชื่อ','อะไร'], ('คุณ สบาย ดี ไหม').split(" ") ];
รูปแบบรายการสามารถประยุกต์ดึงข้อมูลจาก ajax หรือฐานข้อมูลก็ได้ เพียงแค่นำมาจัดรูปแบบให้ได้เป็น
array ของคำเพื่อนำไปใช้งานต่อ
ตัวอย่างโค้ดพร้อมคำอธิบาย ศึกษาดูว่า ถ้าเข้าใจการทำงานทั้งหมด แสดงว่ามีความเข้าใจ
เกี่ยวกับคำสั่งต่างๆ ของ jQuery พื้นฐานดีอยู่แล้ว
<script type="text/javascript"> jQuery(document).ready(function($) { var selectSound = new Audio('https://www.ninenik.com/demo/sound/select-sound_2.wav'); var correctSound = new Audio('https://www.ninenik.com/demo/sound/correct-bell_2.wav'); var winSound = new Audio('https://www.ninenik.com/demo/sound/winning-sound_2.wav'); // ฟังก์ชั่นสำหรับสุ่มคำสำหรับเลือก function shuffle(array) { var currentIndex = array.length, temporaryValue, randomIndex; while (currentIndex !== 0) { randomIndex = Math.floor(Math.random() * currentIndex); currentIndex -= 1; temporaryValue = array[currentIndex]; array[currentIndex] = array[randomIndex]; array[randomIndex] = temporaryValue; } return array; }; // array คำที่จะใช้สำหรับเรียงประโยค var listConversation = [ ("See you next time").split(" "), ("What's your job?").split(" "), ['คุณ','ชื่อ','อะไร'] ]; // เริ่มต้นใช้ค่าแรกแถวแรกก่อน ที่ key เท่ากับ 0 var choiceVal = listConversation[0]; // ส่วนสำหรับกำหนด element ต่างๆ var targetZone = $(".target-zone"); var choiceZone = $(".choice-zone"); var targetItem = $(".target-zone li"); var choiceItem = $(".choice-zone li"); var btnRestart = $("#restart"); var btnNextstep = $("#nextstep"); var btnReplay = $("#replay"); // นับลำดับข้อหรือรายการ var step = 0; // ฟังก์ชั่นเมื่อเริ่มเกม function startGame(){ let ran_choiceVal = []; // ค่าที่จะเก็บตัวเลือก // รีเซ็คค่าต่างๆ ให้ว่าง targetZone.html(""); choiceZone.html(""); // กำหนดคำตอบ เอาคำมาต่อกันแล้วเก็บใน data attribute choiceZone.data("ans",choiceVal.join("")); ran_choiceVal = $.extend([],choiceVal); // เอาอาเรย์มาเก็บไว้สำหรับสุ่ม shuffle(ran_choiceVal); // สุ่มอาเรย์ // วนลูปสร้างรายการคำ สำหรับเลือก และรายการเป้าหมายเท่าๆ กัน // หมายถึง ถ้ามี 6 คำ ตำแหน่งว่างเป้าหมายต้องมี 6 ตำแหน่งด้วย $.each(ran_choiceVal,function(i,v){ choiceZone.prepend('<li>'+v+'</li>'); targetZone.prepend('<li class="unfilled"></li>'); }); btnRestart.hide(); // กำหนดการทำงาน กรณีตอ้งการยกเลิกการเลือกรายการนั้นๆ $(document.body).on("click",".target-zone li",function(){ // ดูว่ารายการที่เลือก ใช่ที่ถูกเติมแล้วหรือว่ายังไม่เติม if($(this).hasClass("filled")){ // ถ้าเติมหรือเลือกแล้ว btnRestart.hide(); let textRemove = $(this).text(); // เก็บค่าคำที่เอาออก $(this).toggleClass("filled unfilled") // เปลี่ยนคลาส .text("").remove(); // เอาคำออก แล้วลบตัวที่เลือกออกไป targetZone.append('<li class="unfilled"></li>');// เติมตัวว่างด้านหลัง choiceZone.append('<li>'+textRemove+'</li>'); // ย้ายที่เลือกกลับมาที่เดิม } }); } // ฟังก์ชั่นเรียงข้อเดิมใหม่ function restartGame(){ startGame(); } // ฟังก์ชั่นไปข้อหรือรายการถัดไป function nextstep(){ step++; // บวกลำดับคีร์ของรายการเพิ่ม if(step==listConversation.length){ // ถ้าหมดแล้ว // รีเซ็ด targetZone.html(""); choiceZone.html(""); step = -1; btnNextstep.hide(); // แสดงปุ่มเริ่มเกมใหม่ btnReplay.css("display","flex"); }else{ // เลื่อนไปข้อหรือรายการถัดไป choiceVal = listConversation[step]; btnNextstep.hide(); startGame(); // เริ่มเกิมในข้อถัดไป } } // เริ่มเกิมเมื่อโหลด startGame(); // ปุ่มเรียกใช้ฟังก์ชั่นทำใหม่ในข้อนั้นๆ btnRestart.on("click",function(){ restartGame(); }); // ปุ่มเรียกใช้ฟังก์ชั่นไปข้อต่อไป btnNextstep.on("click",function(){ nextstep(); }); // ปุ่มเรียกใช้ฟังก์ชั่น เริ่มเกิมใหม่ btnReplay.on("click",function(){ btnReplay.hide(); nextstep(); }); // กำหนดการทำงานเมื่อเลือกคำเพื่อจะเรียง $(document.body).on("click",".choice-zone li",function(){ selectSound.play(); // หาตัวช่องว่างแรกที่ยังไม่เติม ถ้ามีก็เติมคำ ที่่กดเลิอกลงไป // แล้วเปลี่ยนคลาสเป็นเติมแล้ว targetZone.find(".unfilled:eq(0)") .text($(this).text()) .toggleClass("unfilled filled"); $(this).remove(); // ลบที่เลือกแล้วออก // ถ้าเลือกหมดแล้ว ทำการตรวจคำตอบ if(choiceZone.find("li").length==0){ // เอาเฉพาะข้อความมาต่อกันเรียงเป็นคำตอบไว้ไปตรวจสอบ let ans = $.trim(targetZone.text().replace(/\s+/g, '')); if(ans==choiceZone.data("ans")){ // ถ้าตรงกับค่าที่กำหนด correctSound.play(); targetZone.find("li").toggleClass("pass"); //ให้รายการผ่านแล้ว ลบไม่ได้ $(document.body).off("click",".target-zone li"); btnNextstep.css("display","flex"); }else{ // ถ้าไม่ตรง ก็ขึ้นเปุ่มเลองใหม่ btnRestart.css("display","flex"); } } }); }); </script>
หวังว่าเนื้อหานี้จะเป็นแนวทางเอาไปปรับแต่งประยุกต์ใช้งานต่อไปได้ไม่มากก็น้อย
เช่นการสร้างแบบฝึกแต่งประโยคสำหรับการเรียนภาษา
หรือทำเป็นเกมแบบมีเวลากำกับและมีการเก็บคะแนนหรือเลเวล อะไรประมาณนั้น