Cấu trúc của một chương trình Robocode

Code template của một robo được hệ thống sinh ra như sau:

CaptureClass MyFirstRobot kế thừa từ Robot

class Robot của hệ thống đã quy định sẵn các thuộc tính và phương thức cho một robot. MyFirstRobot mà chúng ta đang viết là tùy chỉnh lại các phương thức cho robot này.

Đối với các bạn chưa học qua Lập trình Hướng đối tượng, có thể hiểu Robot là cái nhà chưa có sơn màu nước, có cửa sổ mà chưa có lắp gương các thứ… Bây giờ công việc của bạn là trang trí nhà cửa. Nhà sau khi đã trang trí xong chính là MyFirstRobot.

Để tiện cho các bạn chưa học Hướng đối tương, các bạn có thể bỏ qua không cần quan tâm các thuật ngữ chuyên môn hoặc hiểu nó theo một cách ngắn gọn như thế này.

Phương thức ảo.
Kế thừa.
Overide -> có một phương thức có sẵn trong robo, giờ ta viết lại tên hàm giống vậy trong trong MyFirstRibot. Mỗi bạn viết lại phương thức này theo một cách khác nhau thì robo của bạn sẽ chạy khác nhau, trong khi tên phương thức này lại giống nhau trong code của tất cả các bạn.

Phương thức Run.

public void run() {
while(true) {
ahead(100);
}
}

Là phương thức ảo của lớp robot. Trong một chươg trình Robot các bạn bắt buộc phải kế thừa lại phương thức này để hoàn thiện robot của mình.

main loop – vòng lặp chính

while(true) {
ahead(100);
}

các bạn sẽ tạo cách thức di chuyển và các hoạt động khác  của robo ở trong vòng lặp này.

Demo code có phương thức ahead(100) nghĩa là cho robo chạy về trước mặt 100 pixel.
Các bạn có thể cho demo thử để biệt hiệu quả.

Tham chiếu thuộc tính Robot

 String getName()
Lấy tên Robo
 double getX()
lấy tọa độ X hiện tại
 double getY()
lấy tọa độ Y hiện tại
 void setColors(Color bodyColor, Color gunColor, Color radarColor, Color bulletColor, Color scanArcColor)
đặt màu body, súng, radar, đạn, và vùng scan

Robot Movement

Di chuyển Robot là một điều thiết yếu. Bất cứ nơi đâu trong vòng lặp game hoặc các sự kiện các bạn cũng có thể thực hiện một hoặc nhiều phép di chuyển.

ahead(100) di chuyển tới trước 100 pixel.

Trong một battle các bạn có thể xây dựng một chuỗi các phép di chuyển tuần tự và dùng kĩ thuật lập trình để chọn thao tác move hợp lí.

Move (các move cơ bản)

 void ahead(double distance)
tiến tới phía trước distance pixel .
 void back(double distance)
lùi về sau distance pixel
 void doNothing()
Không làm gì cả.
 void fire(double power)
bắn viên đạn có sức công phá power.
 void resume()
quay lại hành động đang bị ngắt bởi stop()
 void stop()
dừng lại một di chuyển đang thực hiện , khi muốn thực hiện tiếp di chuyển thì gọi resume()
 void turnGunLeft(double degrees)
Xoay súng sang trái degrees độ (pi radian) eg: degree có thể mang giá trị âm, lúc này sẽ xoay bên phải.
 void turnGunRight(double degrees)
Xoay súng sang phải degrees độ
 void turnLeft(double degrees)
Xoay hướng sang trái degrees độ
 void turnRadarLeft(double degrees)
Xoay rađa sang trái degrees độ
 void turnRadarRight(double degrees)
Xoay rađa sang phải degrees độ
 void turnRight(double degrees)
Xoay hướng sang phải degrees độ

Sự kiện

Có rất nhiều sự kiện, nhưng trong demo code ta có 3 sự kiện

onHitByBullet:  khi bị trúng đạn
onHitWall: khi chạm tường
onScannedRobot: Khi  rađa của robot dò trúng 1 robot khác.

Ta có thể tùy chỉnh lại sự kiện onHitWall như sau:

public void onHitWall(HitWallEvent e) {
back(100);
turnRight(90);
}

Khi chạm tường, robot lùi lại phía sau 100 pixel, xoay sang phải 90 độ.

khi vào main loop, sẽ đi tiếp tới phí trươc 100 pixel và tiếp tục đi tới khi nào chạm tường rồi lặp lại cách xử lí chạm tường như trên.

Một số sự kiện quạn trọng: 

onScannedRobot – dò rađa thấy đối phương
onBulletHit – đạn của robot trúng đối phương
onBulletMissed – đạn bắn ra khôg trúng địch
onHitByBullet – trúng đạn đối phương
onHitRobot – chạm phải đối phương
onHitWall – chạm tường

vd: Tùy chỉnh khi scan được đối phương. e.getDistance() sẽ lấy khoảng cách tới kẻ thù và bắn viên đạn phù hợp.

public void onScannedRobot(ScannedRobotEvent e) {
// Replace the next line with any behavior you would like
if (e.getDistance() < 100) {
fire(3);
} else {
fire(1);
}
}

Các bạn có thể tìm hiểu thêm các API tại http://robocode.sourceforge.net/docs/robocode/

Leave a comment