Giới thiệu về Robocode
----------------------

Robocode là một chương trình trò chơi mà mục tiêu là tạo ra một robot, các robot mô phỏng xe tăng trong một đấu trường chiến đấu để tìm và cạnh tranh với các robot khác, nó được trang bị với hệ thống radar. Một robot có thể di chuyển tới, lui ở các tốc độ khác nhau và di chuyển qua trái, qua phải. Các radar và tháp pháo có thể được chuyển sang trái hoặc sang phải độc lập với nhau so với phần còn lại của xe tăng. Khẩu súng có thể bắn.
Khi cài đặt một trận đấu, ta có thể xem được trận đấu từ bên ngoài màn hình chơi hoặc dùng máy tính mô phỏng trận đấu mà không cần hiển thị đồ họa.
Người chơi là các lập trình của robot, những người này sẽ không ảnh hưởng trực tiếp vào trò chơi mà thay vào đó người chơi phải lập trình làm sao cho robot thông minh có thể xử lý và phản ứng tất cả các sự kiện xảy ra trong lĩnh vực chiến đấu.
Khi một robot đối thủ lọt vào rađa, một sự kiện sẽ được sinh ra và một hành động phù hợp sẽ được robot thực hiện. Robot có thể lấy được các thông tin về một đối thủ đang trong vùng quét của ra đa như tốc độ, heading, năng lượng còn lại, tên và gốc giữa heading của nó với robot đối thủ, khoảng cách giữa nó với đối thủ. Dựa vào các thông tin này mà rô bốt sẽ đưa ra các hành động phù hợp. Ví dụ, khi phát hiện một đối thủ trong vòng rađa, robot có thể dùng súng để bắn. 
Các robot có thể ra trận cùng với đội robot của nó. Bằng việc giao tiếp với các robot khác, chúng có thể trao đổi các thông tin như nơi có đối thủ được phát hiện và dựa trên chiến lược được chọn, một robot có thể chạy trốn từ đám các đối thủ hoặc thông báo tin cho các đồng minh của nó về thông tin các đối thủ đó. 
Các robot được viết bằng ngôn ngữ lập trình Java và các trò chơi Robocode có thể chạy trên bất kỳ hệ điều hành được hỗ trợ bởi các nền tảng Java, bao gồm tất cả các hệ thống phổ biến như Windows, Mac OS X, Linux etc.

Chiến trường Robocode
---------------------

Chiến trường Robocode là nơi mà tất cả các trận đấu diễn ra. Mỗi điểm có tọa độ x là tọa độ theo chiều ngang và y là tọa độ theo chiều dọc cặp tọa độ này sẽ thay đổi tùy theo vị trí của chiến trường. Vị trí ban đầu (0, 0) của chiến trường được đặt ở dưới cùng bên trái của chiến trường, một tọa độ (x, y) trên chiến trường luôn luôn là một cặp số thực dương.

Heading and Bearing
-------------------

Để robot biết được vị trí và hướng di chuyển của các đối thủ, chúng phải có các dữ liệu để tính toán. Đó chính là heading và bearing. Phần sau đây sẽ mô tả làm sao heading và bearing được thực hiện trong Robocode.

### Heading (hướng tuyệt đối)

Khi robot đang di chuyển, nó có heading. Heading này có thể lấy được cho các robot bằng phương thức getHeading() ở một thể hiện của lớp Robot. Chúng ta có thể lấy được heading của chính con robot của ta cũng như heading của các con robot khác bằng bộ quét rađa.
Heading trong Robocode được đo trong khoảng từ 0 độ tới 360 độ.
Nếu robot hướng mặt về phía bắc của chiến trường thì heading là 0 độ.
Thông thường thì trong toán học, khi robot hướng mặt về phía đông của chiến trường nó có heading bằng 0 độ. 

### Bearing (hướng tương đối)

Bearing là một hướng trong khoảng từ -180 độ tới 180 độ tương ứng với vị trí heading hiện tại. Một bearing từ 0 độ tới -180 độ sẽ ở bên trái của robot và bearing từ 0 độ tới 180 độ sẽ là ở bên phải của robot.

Môi trường Robocode
-------------------

Để cài đặt được cho một robot hoạt động, điều quan trọng là phải hiểu rõ môi trường hoạt động của các robot. Chúng ta hãy bắt đầu bằng cách giải thích cách Robocode xử lý thời gian và khoảng cách của nó.

* Thời gian được đo bằng Ticks. Vào lúc bắt đầu của một trò chơi tick count được thiết lập là 0 và tất cả các robot được thông báo để thực hiện các lệnh của chúng. Sau một khoảng thời gian, tất cả ác robot sẽ được tạm dừng và tăng tick count. Nếu một robot không thực hiện tất cả các lệnh khi thời gian bắt đầu thì robot đó sẽ bị loại bỏ. Điều này sau đó được lặp đi lặp lại cho đến khi trò chơi kết thúc. Một tick bằng một frame và bằng 1 turn. Khi một vòng mới bắt đầu thời gian được thiết lập lại.
* Khoảng cách được đo bằng pixel.Các chiến trường nhỏ nhất có thể trong Robocode là 400 x 400 pixels và lớn nhất là 5000 x 5000 pixel.

### Vòng lặp chính

Để điều khiển trò chơi, Robocode có một vòng lặp được xây dựng sẵn gọi là Battle Manager. Về cơ bản, Battle Manager hoạt động như một chương trình sử dụng các robot khác như các plug-in. Mọi rô bốt đều có luồng (thread) riêng của nó và có riêng một hàng đợi sự kiện riêng. Các sự kiện được sinh ra mỗi khi có điều gì đó xảy ra để ta có thể điều khiển được. Các sự kiện có thể được sinh ra khi rô bốt của ta va chạm vào tường, phát hiện có đối thủ trong vùng rađa, vv… Những sự kiện này được đặt vào một hàng đợi sự kiện (event queue) bởi Battle Manager. Các sự kiện này sau đó sẽ được robot tự thực hiện, xử lý. 
Việc chia trò chơi và các robot này có thể tránh được các con robot lập trình kém làm gián đoạn, ngắt trò chơi hoặc lỗi khác có thể xảy ra.

### Nguồn và năng lượng

Một robot sẽ được lấy một lượng năng lượng khi bắt đầu trò chơi, và một robot sau đó sẽ mất hoặc thêm năng lượng trong quá trình chơi. Năng lượng được bổ sung nếu bạn bắn trúng robot khác và năng lượng sẽ bị mất nếu bạn bắn đúng robot của bạn. Một robot thường có 100 điểm năng lượng lúc bắt đầu chơi. 
Nguồn là lượng năng lượng đặt trong mỗi viên đạn khi được bắn. Điều này có nghĩa rằng, một rô bốt sẽ mất năng lượng khi bị đạn bắn trúng. Nguồn càng mạnh, thì năng lượng khi bị bắn trúng sẽ mất càng nhiều. Đây là quan hệ một – một giữa nguồn và năng lượng, có nghĩa là một khi bắn trúng với nguồn là 0.5 thì năng lượng sẽ mất đi 0.5.

Robot Robocode
--------------

Trong Robocode, các rô bốt bao gồm ba phần: một ra đa, một sung, và một xe vận chuyển. Ba phần của rô bốt có thể di chuyển độc lập với nhau. Vì ra đa được gáp trên sung và sung được gán với xe vận chuyển, nên ba phần này có thể ảnh hưởng lẫn nhau.
Một robot Robocode có thể kế thừa từ 3 lớp khác nhau: Robot, AdvancedRobot,và TeamRobot.

* AdvancedRobotclass cho phép không ngăn chặn các cuộc gọi, tùy chỉnh các sự kiện. Với sự hỗ trợ không ngăn chặn cuộc gọi, bạn có thể cho phép robot của mình lái xe về phía trước, quay radar, và biến đổi các tháp pháo,tất cả cùng một lúc.
* Với Robocodeclass đơn giản, bạn sẽ phải chờ đợi cho một sự kiện kết thúc trước khi bắt đầu một sự kiện khác.
* TeamRobot có thể giúp cho các robot giao tiếp với nhau, do đó nó có thể thực hiện các quyết định theo nhóm.

Đội chơi
--------

Trong Robocode, một đội là một tập hợp của các robot cùng nhau làm việc để đánh lại kẻ địch. Ban đầu của dự án này, các robot không thể giao tiếp được với nhau, nên không thể xây dựng các đội robot được. Các robot phải kế thừa từ lớp TeamRobot để có thể truyền thông tin nội bộ vì lớp này chứa các phương thức gửi và nhận các thông điệp giữa các robot, ta có thể gửi thông điệp quảng bá cho tất cả các robot trong cùng đội hoặc gửi các thông điệp trực tiếp cho một robot cụ thể trong đội của nó. 
Lớp TeamRobot còn cung cấp khả năng kiểm tra xem một robot bất kì có cùng đội với nó hay không. Hơn nữa, trong đội robot còn có chỉ huy, chính là thành viên đầu tiên được thêm vào đội robot. Chỉ huy sẽ được thêm 100 điểm năng lượng, vì vậy nó có tất cả là 200 điểm năng lượng. 
Trong Robocode, ta còn có thể sử dụng quân bổ trợ (droids), quân này là phần cơ bản của một con robot thường, với hơn 20 điểm năng lượng và không có rađa, đương nhiên là các robot bổ trợ sẽ chỉ hoạt động trong các trò chơi dựa trên đội chơi, ở đó nó sẽ phụ thuộc vào các robot có rađa để có thể nhận biết được thông tin về chiến trường. Điểm lợi của quân phụ trợ là có thêm 20 điểm năng lượng, nhưng nó sẽ gây ra 1 loạt các vấn đề nếu đồng đội của nó bị mất đi rađa.

Tham khảo
---------