Skip to content
Snippets Groups Projects
ManualBot.java 6.56 KiB
Newer Older
Martin Vítek's avatar
Martin Vítek committed
/*
 * ----------------------------------------------------------------------------------
 * "THE BEER-WARE LICENSE" (Revision 42):
 * <martinv@students.zcu.cz> wrote this file.  As long as you retain this notice you
 * can do whatever you want with this stuff. If we meet some day, and you think
 * this stuff is worth it, you can buy me a beer in return.   Martin Vítek
 * ----------------------------------------------------------------------------------
 */
package cz.zcu.martinv.MyRobocodeRobots;

import robocode.*;
import java.awt.Color;
import java.awt.event.KeyEvent;
import static java.awt.event.KeyEvent.*;


/**
 * Manualy controlled robot.
 * This simple robot is controlled by user using keyboard.
 * Keyboard keys can be changed in KeyboardKey constructors.
 * Accelerate with ARROW UP.
 * Deccelerate with ARROW DOWN.
 * Turn left with ARROW LEFT.
 * Turn right with ARROR RIGHT.
 * Fire with SPACEBAR.
 * Add firepower with NUM+.
 * Reduce firepower with NUM-.
 * 
Martin Vítek's avatar
Martin Vítek committed
 * @author Martin Vítek
Martin Vítek's avatar
Martin Vítek committed
 */
public class ManualBot extends RateControlRobot
{
    private KeyboardKey keyUp;
    private KeyboardKey keyDown;
    private KeyboardKey keyLeft;
    private KeyboardKey keyRight;
    private KeyboardKey keyFire;
    private KeyboardKey keyAddPower;
    private KeyboardKey keyReducePower;
    
    private double firePower = 1;
    
    /**
     * Main method - here is all robot logic.
     * It's called by RoboCode.
     */
    @Override
    public void run()
    {
        out.format("Hi, I'm your robot!%n");
        
        keyUp            = new KeyboardKey(VK_UP);
        keyDown          = new KeyboardKey(VK_DOWN);
        keyLeft          = new KeyboardKey(VK_LEFT);
        keyRight         = new KeyboardKey(VK_RIGHT);
        keyFire          = new KeyboardKey(VK_SPACE);
        keyAddPower      = new KeyboardKey(VK_ADD);
Martin Vítek's avatar
Martin Vítek committed
        keyReducePower   = new KeyboardKey(VK_SUBTRACT);
Martin Vítek's avatar
Martin Vítek committed
        
        
        setBodyColor(Color.YELLOW);
        setRadarColor(Color.CYAN);
        setGunColor(Color.PINK);
        
        setBulletColorWrapper(firePower);
        
        setAdjustGunForRobotTurn(false);    //Gun is turnig with body
        setAdjustRadarForGunTurn(true);     //Radar movement is independent
        setAdjustRadarForRobotTurn(true);   //Radar movement is independent
        
        setRadarRotationRate(4);
        
        while (true)
        {            
            keyboard_handler();
            
            execute();
        }
    }

    /**
     * This method is called on key press.
     * It's called by RoboCode.
     * @param e passed by RoboCode
     */
    @Override
    public void onKeyPressed(KeyEvent e)
    {
        //out.format("Key pressed:\t%d%n", e.getKeyCode());
        
        int keyCode = e.getKeyCode();
        
        keyUp.event(keyCode, true);
        keyDown.event(keyCode, true);
        keyLeft.event(keyCode, true);
        keyRight.event(keyCode, true);
        keyFire.event(keyCode, true);
        keyAddPower.event(keyCode, true);
        keyReducePower.event(keyCode, true);
    }

    /**
     * This method is called on key release.
     * It's called by RoboCode.
     * @param e passed by RoboCode
     */
    @Override
    public void onKeyReleased(KeyEvent e)
    {   
        //out.format("Key released:\t%d%n", e.getKeyCode());
        
        int keyCode = e.getKeyCode();
        
        keyUp.event(keyCode, false);
        keyDown.event(keyCode, false);
        keyLeft.event(keyCode, false);
        keyRight.event(keyCode, false);
        keyFire.event(keyCode, false);
        keyAddPower.event(keyCode, false);
        keyReducePower.event(keyCode, false);
    }
    
    /**
     * This method is called when this robot wins.
     * It's called by RoboCode.
     * @param e passed by RoboCode
     */
    @Override
    public void onWin(WinEvent e)
    {
        setRadarRotationRate(100);
        turnRight(-360);
        
        execute();
    }
    
    /**
     * Handling keyboard inputs.
     */
    private void keyboard_handler()
    {
        /**
         * Down
         */
        if (keyUp.isPressed() && !keyDown.isPressed())
        {
            if (keyUp.getCount() < 2) setVelocityRate(2);        
            if ((keyUp.getCount() >= 2)  && (keyUp.getCount() < 15)) setVelocityRate(4);
            if ((keyUp.getCount() >= 15) && (keyUp.getCount() < 30)) setVelocityRate(8);
            if (keyUp.getCount() >= 30) setVelocityRate(12);   
        }
        
        else if (!keyDown.isPressed()) setVelocityRate(0);
        
        /**
         * Down
         */
        if (keyDown.isPressed() && !keyUp.isPressed())
        {
            if (keyDown.getCount() < 2) setVelocityRate(-1);        
            if ((keyDown.getCount() >= 2)  && (keyDown.getCount() < 15)) setVelocityRate(-2);
            if ((keyDown.getCount() >= 15) && (keyDown.getCount() < 30)) setVelocityRate(-3);
            if (keyDown.getCount() >= 30) setVelocityRate(-4);   
        }        
        else if (!keyUp.isPressed()) setVelocityRate(0);
        
        /**
         *   Left
         */
        if (keyLeft.isPressed() && !keyRight.isPressed())setTurnRate(-5);
        else if (!keyRight.isPressed()) setTurnRate(0);
                
        /**
         * Right
         */
        if (keyRight.isPressed() && !keyLeft.isPressed()) setTurnRate(5);
        else if (!keyLeft.isPressed()) setTurnRate(0);
        
        /**
         * Fire
         */
        if (keyFire.isPressed()) setFire(firePower);
        
        
        /**
         * Add Power
         */
        if (keyAddPower.getAndServicePress() && !keyReducePower.isPressed())
        {
            if (firePower <= 2.5) firePower += 0.5;
            setBulletColorWrapper(firePower);
            
            out.format("Fire power is now: %f%n", firePower);
        }
        
        /**
         * Reduce Power
         */
        if (keyReducePower.getAndServicePress() && !keyAddPower.isPressed())
        {
            if (firePower >= 0.5) firePower -= 0.5;
            setBulletColorWrapper(firePower);
            
            out.format("Fire power is now: %f%n", firePower);
        }
    }
    
    /**
     * Wrapper for setBulletColor().
     * Sets bullet color based on power.
     * @param power bullet power in range 0.0 - 3.0
     */
    private void setBulletColorWrapper(double power)
    {
             if ((firePower >= 0.0) && (firePower <  1.0)) setBulletColor(Color.WHITE);
        else if ((firePower >= 1.0) && (firePower <  2.0)) setBulletColor(Color.YELLOW);
        else if ((firePower >= 2.0) && (firePower <= 3.0)) setBulletColor(Color.RED);
        else return;
    }            
}