วันพฤหัสบดีที่ 12 พฤศจิกายน พ.ศ. 2552

Robocode

รู้จักกับโปรแกรม Robocode
Robocode คือ ชุดซอฟต์แวร์เกมเพื่อการศึกษาที่ผู้เล่นจะต้องทำการเขียนโปรแกรมควบคุมหุ่นยนต์รถถังด้วยภาษาจาวา เพื่อทำการแข่งขันในสมรภูมิรบบนโลกไซเบอร์ ซึ่งผู้เล่นต้องพัฒนาปัญญาประดิษฐ์ (Artificial Intelligence : Al) ให้แก่รถถังของตนเองเพื่อให้ได้มาซึ่งชัยชนะ

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

ขั้นตอนการติดตั้งโปรแกรม Robocode

1. ให้ดับเบิ้ลคลิกไฟล์ที่ชื่อว่า jre-6u6-windows-i586-p-iftw.exe เพื่อเป็นการติดตั้งโปรแกรมที่ใช้ในการเปิดโปรแกรม Robocode
2. คลิกขวาที่ไฟล์ที่ชื่อว่า robocode-setup-1.6.0.1.jar เลือกเมนู Open With --> Java(TM) Platform SE binary
3. ตอบ Yes เพื่อทำการติดตั้งโปรแกรม Robocode ลงในเครื่อง (โปรแกรมจะอยู่ที่ไดร์ฟ C ชื่อโฟลเดอร์ Robocode)


4. ตอบ Yes เพื่อทำการติดตั้ง Shortcut บน Desktop

ส่วนประกอบของหุ่นยนต์

เรดาร์
ปืน
ตัวถัง

1) ตัวถัง สามารถเคลื่อนไปด้านหน้า ด้านหลัง หันไปด้านซ้าย และขวาได้
2) ปืน ติดตั้งบนตัวถัง สามารถหมุนซ้าย - ขวา และยิงลูกกระสุนออกมาได้ ซึ่งความแรงของกระสุนขึ้นอยู่กับพลังที่ตั้งไว้
3) เรดาร์ ติดตั้งอยู่บนปืน สามารถหมุนซ้าย – ขวา และส่งค่ากลับเมื่อสแกนพบหุ่นยนต์ตัวอื่น ๆ
การสร้างหุ่นยนต์ตัวใหม่
1. เมื่อเข้าสู่โปรแกรม Robocode ให้คลิกเลือกที่เมนู Robot --> Editor เมื่อเปิดมาครั้งแรกจะพบหน้าต่างที่ตั้งค่า compiler (การแปลภาษาคอมพิวเตอร์) ให้ตอบ OK เพื่อปิดหน้าต่าง
2. เมื่อเข้าสู่ Robot Editor ให้คลิกที่เมนู File --> New --> Robot จะปรากฏกรอบให้ใส่ชื่อหุ่นยนต์ โดยตัวอักษรตัวแรกจะต้องเป็นตัวอักษรตัวใหญ่


3. ตั้งชื่อ package (ชื่อโฟลเดอร์ที่ใช้ในการเก็บหุ่นยนต์) ให้ใช้ตัวอักษรตัวเล็กทั้งหมด


4. โปรแกรมจะสร้างโค้ดตัวอย่างให้ แต่เนื่องจากโปรแกรมที่จะเขียนต่อไปนี้จำเป็นต้องเรียกใช้จาก Robocode รุ่น JuniorRobot จึงต้องแก้ไขโค้ตดังตัวอย่างต่อไปนี้
(ข้อความที่อยู่หลังเครื่องหมาย // หรือ /** ………… */ นั้นข้อความที่ใช้ในการอธิบายโค้ดบรรทัดนั้น ๆ ไม่มีผลต่อโปรแกรม)
package newrobocode;
import robocode.*;
public class MyFirstRobot extends JuniorRobot อย่าลืมแก้ไขในส่วนนี้
{
public void run() {
ahead(100);
turnGunRight(360);
back(100);
turnGunRight(360);
}
public void onScannedRobot() {
fire(1);
}
public void onHitByBullet() {
turnLeft(90);
}
}
5. เมื่อแก้ไขโค้ดเรียบร้อยแล้ว ให้เลือกเมนู File --> Save และเลือกเมนู Compiler --> Compile
6. กลับไปที่โปรแกรม Robocode เลือกเมนู Battle --> New เลือกหุ่นยนต์ที่สร้างไว้ และเลือก หุ่นยนต์คู่ต่อสู่ กำหนดจำนวนรอบที่ใช้ในการแข่งขัน คลิกที่ Start Battle เพื่อเริ่มต้นการแข่งขัน

เลือกหุ่นยนต์
จำนวนรอบ
ยกเลิกหุ่นยนต์
ทำความเข้าใจในเหตุการณ์พื้นฐานของโปรแกรม Robocode
package newrobocode; //กำหนดแหล่งที่ใช้ในการเก็บหุ่นยนต์ ซึ่งในที่นี้เก็บไว้ที่ c:/robocode/robots/newrobocode
import robocode.*; //เรียกใช้คำสั่งพิเศษจาก Robocode ที่มีผู้กำหนดไว้แล้ว
public class MyFirstRobot extends JuniorRobot //กำหนดให้หุ่นยนต์ที่ชื่อ MyFirstRobot เป็นรุ่นจูเนียร์โรบอต
{
public void run() { //พฤติกรรมทั่วไปของหุ่นยนต์
setColors(red,red,red,red,red);
ahead(100);
turnGunRight(360);
back(100);
turnGunRight(360);
}
public void onScannedRobot() { //พฤติกรรมเมื่อสแกนเจอศัตรู
fire(1);
}
public void onHitByBullet() { //พฤติกรรมเมื่อถูกลูกกระสุน
turnLeft(90);
}
public void onHitRobot() { //พฤติกรรมเมื่อชนกับหุ่นยนต์ตัวอื่น ๆ
turnRight(90);
}
public void onHitWall() { //พฤติกรรมเมื่อชนกำแพง
ahead(100);
}
}

คำสั่งที่ใช้ในการกำหนดค่าสีให้กับหุ่นยนต์
setColors(สีตัวถัง,สีปืน,สีเรดาร์,สีลูกกระสุน,สีแถบสแกน);
*** ใช้ใน public void run() { //พฤติกรรมทั่วไปของหุ่นยนต์

คำสั่ง
สี
คำสั่ง
สี
black
ดำ
green
เขียว
white
ขาว
blue
น้ำเงิน
red
แดง
purple
ม่วง
orange
ส้ม
brown
น้ำตาล
yellow
เหลือง
gray
เทา

คำสั่งที่ใช้ในการสั่งให้หุ่นยนต์ทำงานในรูปแบบต่าง ๆ

คำสั่ง
การกระทำ
ตัวอย่างเพิ่มเติม
ahead(ระยะทาง);
เคลื่อนที่ไปข้างหน้า … พิกเซล
ahead(100);
back(ระยะทาง);
เคลื่อนที่ไปข้างหลัง … พิกเซล
back(100);
turnLeft(องศา);
หมุนไปทางซ้าย … องศา
turnLeft(90); (กำหนดได้ตั้งแต่ 0 - 360)
turnRight(องศา);
หมุนไปทางขวา … องศา
turnRight(90); (กำหนดได้ตั้งแต่ 0 - 360)
turnAheadLeft(ระยะทาง,องศา);
เคลื่อนที่ไปข้างหน้า … พิกเซลพร้อมกับหมุนไปทางซ้าย … องศา
turnAheadLeft(200,45);
turnAheadRight(ระยะทาง,องศา);
เคลื่อนที่ไปข้างหน้า … พิกเซลพร้อมกับหมุนไปทางขวา … องศา
turnAheadRight(300,45);
turnBackLeft(ระยะทาง,องศา);
เคลื่อนที่ถอยหลังไป … พิกเซลพร้อมกับหมุนไปทางซ้าย … องศา
turnBackLeft(100,90);
turnBackRight(ระยะทาง,องศา);
เคลื่อนที่ถอยหลังไป … พิกเซลพร้อมกับหมุนไปทางขวา … องศา
turnBackRight(100,90);
turnTo(องศา);
หมุนรถไป … องศา
turnTo(45); (กำหนดได้ตั้งแต่ 0 - 360)
turnGunLeft(องศา);
หมุนปืนไปทางซ้าย … องศา
turnGunLeft(90); (กำหนดได้ตั้งแต่ 0 - 360)
turnGunRight(องศา);
หมุนปืนไปทางขวา … องศา
turnGunRight(90); (กำหนดได้ตั้งแต่ 0 - 360)
turnGunTo(องศา);
หมุนปืนไป … องศา
turnGunTo(90); (กำหนดได้ตั้งแต่ 0 - 360)
bearGunTo(องศา);
หมุนปืนไป … องศาเมื่อเทียบกับตัวหุ่น
bearGunTo(45); (กำหนดได้ตั้งแต่ 0 - 360)
fire(ความแรง);
ยิงกระสุนด้วยความแรง …
fire(3); (ความแรงมีตั้งแต่ 1 – 3)
คุณสมบัติของหุ่นยนต์ และสนาม

คำสั่ง
การกระทำ
energy
พลังงานของหุ่นยนต์ที่เหลืออยู่
scannedAngle
ทิศของหุ่นยนต์ที่สแกนพบ
scannedDistance
ระยะทางของหุ่นยนต์ที่สแกนพบ
scannedEnergy
พลังงานของหุ่นยนต์ที่สแกนพบ
scannedVelocity
ความเร็วของหุ่นยนต์ที่สแกนพบ
scannedHeading
ทิศของหุ่นยนต์ที่สแกนพบกำลังหันไป
gunHeading
ทิศที่ปืนหันไปเมื่อเทียบกับสนาม
gunBearing
ทิศที่ปืนหันไปเมื่อเทียบกับหุ่นตัวอื่น
heading
ทิศที่หุ่นยนต์หันไป
hitByBulletAngle
ทิศล่าสุดที่หุ่นยนต์ถูกลูกกระสุนกระทบ
hitByBulletBearing
ทิศล่าสุดที่หุ่นยนต์ถูกลูกกระสุนกระทบเมื่อเทียบกับหุ่นยนต์ตัวอื่น
hitRobotAngle
ทิศล่าสุดที่หุ่นยนต์ถูกหุ่นยนต์ตัวอื่นกระทบ
hitRobotBearing
ทิศล่าสุดที่หุ่นยนต์ถูกหุ่นยนต์ตัวอื่นกระทบเมื่อเทียบกับหุ่นยนต์ตัวอื่น
others
จำนวนหุ่นยนต์ที่เหลือในสนาม
doNothing();
หยุดการกระทำใน ()
fieldHeight
ขนาดความสูงของสนาม
fieldWidht
ขนาดความกว้างของสนาม
robotX
ค่าพิกัด X ของหุ่นยนต์
robotY
ค่าพิกัด Y ของหุ่นยนต์
รูปแบบคำสั่ง if
If (เงื่อนไขที่ต้องการตรวจสอบ)
{
กลุ่มคำสั่งเมื่อเงื่อนไขเป็นจริง
}
else
{ กลุ่มคำสั่งเมื่อเงื่อนไขเป็นเท็จ
}


robocode Class JuniorRobot