package games; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; /// A Visible that represents an opponent in the game -- /// a "Monster" that attacks the Player. public class Monster extends Visible { protected int _radius = 4; /// Move the Monster according to internal rules: public boolean doAction(Game game) { if (move(game)) { attack(game.getPlayer()); if (!isAlive()) { System.out.println(getClass().getName()+" runs away!"); game.remove(this); return false; } } return true; } /// Move the Monster: public boolean move(Game game) { Player p = game.getPlayer(); int deltaX=0; int deltaY=0; if (p.getX() > getX()) deltaX = 1; else deltaX = -1; if (p.getY() > getY()) deltaY = 1; else deltaY = -1; //System.out.println("Moving w/delta: "+Integer.toString(deltaX)+ // ","+Integer.toString(deltaY)); moveTo(getX()+deltaX, getY() + deltaY); boolean isHit = (Math.abs(p.getX() - getX()) < _radius) && (Math.abs(p.getY() - getY()) < _radius); return isHit; } // Reset to random location void reset(Game game) { moveTo((int)(Math.random()*game.getWidth()), (int)(Math.random()*game.getHeight())); } // Draw this Monster; default representation is fairly // boring. public void draw(Graphics g) { g.setColor(Color.red); g.fillRect(getX()-_radius, getY()-_radius, _radius*2,_radius*2); } protected int _maxDamage = 10; protected int _health = 20; boolean isAlive() {return _health > 0;} // Attack a player: public void attack(Player p) { int damageToPlayer = (int) ( Math.random() * _maxDamage ); System.out.println(getClass().getName()+" does: "+Integer.toString(damageToPlayer)+ " damage to Player."); p.adjustHealth(-1 * damageToPlayer); int damageToMonster = p.calcAttackDamage(); _health -= damageToMonster; } }