วันอังคารที่ 23 กุมภาพันธ์ พ.ศ. 2559

construct 2 : Random ไม่ซ้ำ


บทความนี้จะขอนำเสนอวิธีการสุ่มตัวเลข หรือ random แบบไม่ให้ตัวเลขที่ได้ซ้ำกัน โดยอาศัยคุณสมบัติของ array ซึ่งวิธีการนี้รับรองผลได้ 100% ว่าข้อมูลที่ได้ไม่มีทางที่จะซ้ำกันอย่างแน่นอน
กรณีตัวอย่างของปัญหา สมมุติว่า ต้องการสุ่มตัวเลขตั้งแต่ 1 - 100 ที่ไม่ซ้ำกัน จำนวน 10 ตัวเลข
วิธีการ 
1. สร้าง array แบบ 1 มิติ ที่มีขนาด width = 10 เพื่อให้เก็บข้อมูลที่ได้จากการสุ่ม
2. วนซ้ำจำนวน 10 รอบ
2.1 สุ่มตัวเลขมา 1 ตัวเลข ตรวจสอบว่า ตัวเลขที่สุ่มได้ อยู่ใน array หรือไม่
2.2  ถ้าตัวเลขอยู่ใน array แล้ว ย้อนกลับไปทำข้อ 2.1
2.3 ถ้าตัวเลข ไม่อยู่ใน array ให้เพิ่มตัวเลขลงใน array แล้ววนซ้ำรอบต่อไป
3. เมื่อครบ 10 รอบ แล้ว ข้อมูลตัวเลขที่อยู่ใน array  คือ ตัวเลขที่สุ่มได้ โดยไม่ซ้ำกัน

ลงมือสร้างโปรแกรม
เปิดโปรแกรม construct 2 ขึ้นมา สร้าง Project ใหม่
เพิ่มวัตถุ array เข้ามาในโปรแกรม ตั้งชื่อว่า rand_arr กำหนดค่า width = 10



เพิ่มตัวแปร Global  ชื่อ rand_num เพื่อใช้เก็บค่าตัวเลขที่ได้จากการสุ่ม
เพิ่มเหตุการณ์เพื่อให้เกิดการ random ข้อมูล ผมกำหนดให้สุ่มข้อมูลเมื่อมีการใช้งาน layout
Add event --> System --> On start of Layout
Add action --> array rand_arr --> Clear (ลบข้อมูลใน array)
Add sub event --> System --> repeat 10 time
เพิ่มการสุ่มข้อมูลมาเก็บไว้ที่ตัวแปร rand_num โดย Add action --> System --> Set value เลือกตัวแปร rand_num และกำหนดค่าเป็น floor(rand(1,100)) คือ สุ่มค่าตัวเลขจำนวนเต็ม 1- 100



เพิ่มการตรวจสอบ ให้วนสุ่มค่าตัวเลขไปเรื่อยๆ ถ้าตัวเลขที่สุ่มได้ เป็นค่าที่ซ้ำใน array
Add sub event --> System --> while
Add another condition --> array rand_arr --> contains value --> rand_num
Add action --> System --> Set value เลือกตัวแปร rand_num
โปรแกรมจะทำการสุ่มตัวเลขใหม่เรื่อยๆ จนไม่ซ้ำกับตัวเลขที่อยู่ใน array ก็จะหลุดออกมาจาก การวนซ้ำ while

ถ้าตัวเลขที่สุ่มได้ ไม่ซ้ำ กับข้อมูลใน array ให้เพิ่มข้อมูลลงใน array
Add blank sub-event
Add action --> array rand_arr --> set at x --> กำหนด x = loopindex และ value = rand_num

คำสั่งทั้งหมด เป็นดังนี้



เมื่อทดสอบการทำงานใน debug mode จะพบว่า ค่าที่ได้จากการ random ตัวเลขจำนวน 10 ตัว จะไม่ซ้ำกันเลย


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

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

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