What is the difference between frames and ticks?

A tick refers to one unit, which is also called a Turn in Robocode. During one turn, you may perform one action as a Robot, or multiple (independent) actions as an AdvancedRobot. A frame is a unit of drawing to the Robocode client interface. If you are processing turns slowly, you will get one frame per tick / turn. However, if you up the turns per second beyond your computer’s ability to render the frames, you will miss some frames of animation. This won’t affect the robots’ behavior, unless you foolishly added code in your onPaint(Graphics2D) method that alters your bots behavior. In that case, your bot will behave differently depending on whether or not the Paint button has been enabled, and if the framerate can keep up with the turnrate.

Can I fire bullets with power higher than 3.0 or lower than 1.0?

No and yes. You can’t fire bullets with power greater than 3.0, but you can fire bullets with power as low as 0.1. If you call a firing function (i.e. setFire()) with a value greater than 3.0, Robocode will adjust it to 3.0, and if you call it with a power lower than 0.1 (except 0.0 which will not fire) it will adjust it to 0.1. Additionally, you can fire bullets with power less than 0.1 under one condition: when your robot has less than 0.1 energy left, in which case a bullet is fired with however much energy your robot had left.

How fast does a bullet travel?

A bullet travels at a speed between 11.0 and 19.7 depending on the power. The more powerful the bullet, the slower. The formula to calculate it is velocity = 20 – (3 * power).

Does the robot velocity get added to the bullet velocity on firing?

No, bullet velocity is not affected by robot velocity. It’s kind of like the speed-of-light thing. =)

Which is the range of a bullet?

A bullet has no range. It keeps going until it hits a robot or a wall.

I want to fire a bullet every turn, but I can’t. Why?

Every time you fire, the gun generates some heat. You must wait till it is cool again to fire. If you give a fire order when your gun is hot, it will do nothing. The heat generated by a shot is 1 + (firepower / 5). The gun cools down at a default rate of 0.1 per turn (note that you can change this parameter when you run the battle, but nobody usually does). It means you can fire a 3.0 power bullet every 16 ticks.

How much damage does a bullet do? How do I gain or lose energy?

You lose energy every time you hit a wall, you are hit by an enemy bullet, ram an enemy, or you fire your gun. The amount of energy you lose by being hit is 4 * bullet power + 2 * max(bullet power – 1 , 0). So the maximum amount is 16.0. When you fire, you spend a quantity of energy equal to the power of the bullet fired. When one of your bullets hits an enemy, you collect back 3 * bullet power energy. When you hit an enemy bot, each bot takes 0.6 damage. If an AdvancedRobot (but not a Robot or JuniorRobot) hits a wall, it will take max(abs(velocity) * 0.5 – 1, 0) damage.

Some times I get disabled. What happens?

You can’t kill yourself, so when your energy drops to zero because you hit a wall or you fire, your bot gets disabled. It will not be able to move nor fire. If you are lucky enough and one of your bullets in the air hits an enemy, you will get some energy back and recover from disabled status.

I get disabled, but I my energy > 0. Why?

There are a few possible causes. You may have called a getXXX() function – such as getVelocity() – too many times a turn. The limit is 10000 getXXX() function calls per turn. To avoid disabling in such situations, either store returned values in variables for future use or use a RobotStatus object obtained from StatusEvent. Another case in which you can get disabled is throwing an exception, which may disable your bot, even if you catch the exception. Also, if your bot gets stuck in an infinite (or very long) loop and skips many turns, it may also get disabled.

How fast do I move?

You can move at a maximum speed of 8.0 units/tick. You can modify (down) your maximum velocity by using setMaxVelocity(…). Note that your bot will always accelerate to reach its maximum velocity.

How fast do I accelerate?

You accelerate at 1 unit/tick, and you decelerate at 2 units/tick. For example, if you are moving at an speed of 8.0 and reverse your direction your velocities will be [6.0, 4.0, 2.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0].

How fast do I turn?

The faster you go, the slower you turn. The formula to calculate it in degrees is 10 – 0.75 * abs(velocity).

What is the size of a bot?

The size of a bot is 36×36. Note, this is slightly smaller than the image of the bot. It is modeled as a non rotating square, so it’s always the same regardless of its heading.

It seems that Robocode doesn’t follow standard physics. If my velocity is 0 and I accelerate (acceleration = 1) my final position is 1, but it should be 0.5. What happened?
Robocode好像并不遵循物理规律，当我以初速度为0加速度为1运动时，我的位置应该是0.5，但结果却是1，这是怎么了？
Time in Robocode, rather than being continuous, is in discrete “ticks”. First acceleration is calculated, then velocity, and then position. So if you are stopped at a position 0 and you accelerate 1, your velocity next turn will be 1 and your position also 1.
Robocode中的时间是离散的，以回合(tick)计数。加速度首先被计算，之后是速度和距离。所以如果你以初速度为0加速，一个回合之后你的速度和位置都会是1。

How can I detect when an enemy has fired?

There is no direct way to detect when an enemy fired, but you can deduce it by monitoring the enemy energy drop. A drop between 0.1 and 3 usually means that it fired a bullet (there can be other reasons, such as a low energy bullet hit or a wall hit). Wall hits are (more or less) detectable as well. A deceleration > 2 means the bot hit a wall (or another bot). A deceleration <= 2 may be simple a bot hitting the brakes, or hitting a wall at velocity = 2, but since hitting a wall at that speed won’t cause any damage, you can ignore that. AdvancedRobots take abs(velocity) / 2 – 1 (Never < 0) damage when hitting a wall, so by detecting (significant) wall-hits and adjusting the enemy drop accordingly, wall hits can be filtered out most of the time. This method fails when the enemy hits another robot.

How can I detect the position and heading of an enemy bullet?

You can’t. There is no way to know it, directly or indirectly. But of course, you can always guess

How fast can I turn my gun?

The gun turns at 20 degrees per tick.

How fast can I turn my radar?

It turns 45 degrees per tick.

Can I know the heading of the enemy gun/radar?

No.

Can I specify the initial position of my bot?

No. The bots are randomly placed in the field at the beginning of each round.

>> 本文章版权归作者所有，如需转载请联系作者授权许可。
>> 原文来自: 云飞机器人实验室
>> 原文地址: Robocode常见问题
>> 关于我们: 关于云飞实验室
>> 支持我们: 帮助我们可持续发展