old-java-games

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 2c31e23d1387caf5ba5f4e470f10f5bbadc8e83f
parent 0ad01c199f183dd0fa9c9a0f2f158030c114ad06
Author: mpizzzle <michael.770211@gmail.com>
Date:   Sat,  2 Mar 2019 13:59:37 +0000

renaming entry point class names

Diffstat:
ALink/src/Link.java | 536+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MLink/src/LinkArea.java | 18+++++++++---------
DLink/src/LinkGame.java | 536-------------------------------------------------------------------------------
AMario/src/Mario.java | 1509+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MMario/src/MarioArea.java | 52++++++++++++++++++++++++++--------------------------
DMario/src/MarioGame.java | 1509-------------------------------------------------------------------------------
APong/src/Pong.java | 246+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MPong/src/PongArea.java | 14+++++++-------
DPong/src/PongGame.java | 246-------------------------------------------------------------------------------
AReaper/src/Reaper.java | 818+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MReaper/src/ReaperArea.java | 54+++++++++++++++++++++++++++---------------------------
DReaper/src/ReaperGame.java | 818-------------------------------------------------------------------------------
ATank/src/Tank.java | 439+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MTank/src/TankArea.java | 28++++++++++++++--------------
DTank/src/TankGame.java | 439-------------------------------------------------------------------------------
AZombie/src/Zombie.java | 304+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MZombie/src/ZombieArea.java | 18+++++++++---------
DZombie/src/ZombieGame.java | 304-------------------------------------------------------------------------------
18 files changed, 3944 insertions(+), 3944 deletions(-)

diff --git a/Link/src/Link.java b/Link/src/Link.java @@ -0,0 +1,536 @@ +import java.awt.Color; +import java.awt.Image; +import java.awt.Point; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; + +import javax.swing.JFrame; + +/* Copyright (c) Mary Percival 2003 */ +/* Link game Created May 2003 */ + +public class Link extends JFrame implements KeyListener, Runnable { + private static final long serialVersionUID = 136423218680421502L; + // all member variables 'static' because shared with the enemy action thread + static LinkArea area; + static boolean finished = false; + static boolean ingame = false; + static boolean juststarted = false; + static int level = 0; + static Point[] enemyPositions; + static Point playerPosition; + static Point[][] obstaclePositions; + static int direction[]; + static Thread timer; + static int enemyNumber = 1, enemiesRemaining = 1, obstacleNumber = 1; + static boolean herocrouching = false; + static final int MAXLEVELS = 1; + static final int levellengths[] = new int[MAXLEVELS]; + boolean hasWeaponOut = false; + + static int LEFT = -1; + static int RIGHT = 1; + + // the next 2 constants are overridden in init once we know the screen size + static int RIGHTEDGE = 789; + static int BOTTOMEDGE = 800; + // + static Point IMAGESIZE = new Point(152, 107); + static Point HEROPOS = new Point(63, 28); + static final int LEFTEDGE = -15; + static final int TOPEDGE = -10; + static final int FALLAMOUNT = 16; // amount he falls each time interval + static final int RISEAMOUNT = 16; // amount he rises each time interval + static int GROUNDLEVEL = 500; + static int XAMOUNT = 5; + static int YAMOUNT = 5; + static int JUMPAMOUNT = 70; + static final int X = 1; + static final int Y = 2; + static final int NOT = 3; + static final int DELAY = 60; + + static int heroImageNo = 0; + static final int OBSTACLEIMAGES = 1; + static final int HEROIMAGES = 4; + static Image[] heroImages = new Image[HEROIMAGES]; + static Image[] obstacleImages = new Image[OBSTACLEIMAGES]; // obstacles don't move + static int obstacleImageNo[]; + static boolean heroleft = false; + static boolean jumping = false; + static Point warpzone; + // static boolean superjump = false; + static final int JUMPDURATION = 5; + static final int SUPERJUMPDURATION = 8; + static final int LEFTOFOBSTACLE = 27; + static final int RIGHTOFOBSTACLE = 33; + static int[] keysdown = new int[4]; + static final int LEFTDOWN = 0; + static final int RIGHTDOWN = 1; + static final int DOWNDOWN = 2; + static final int SPACEDOWN = 3; + + static final int OBSTACLEHEIGHT = 42; + boolean onTheWayUp = false; + static int startPosY = GROUNDLEVEL; + + public static void main(String[] args) { + Link Link = new Link(); + + Link.setLayout(null); + Link.setBackground(Color.white); + Link.setSize(RIGHTEDGE, BOTTOMEDGE); + + area = new LinkArea(Link); + Link.add(area); + XAMOUNT = 12; + YAMOUNT = 12; + //RIGHTEDGE = (Link.getBounds().width / XAMOUNT) * XAMOUNT + LEFTEDGE; + //BOTTOMEDGE = Link.getBounds().height - 1; + Link.setVisible(true); + //area.setBounds(0, 0, Link.getBounds().width, BOTTOMEDGE); + area.setBounds(0, 0, RIGHTEDGE, BOTTOMEDGE); + area.setVisible(true); + + Link.addKeyListener(Link); + area.addKeyListener(Link); + area.requestFocus(); + + levellengths[0] = RIGHTEDGE; + obstacleImages[0] = area.obstacle; + + timer = new Thread(Link); + timer.start(); + } + + synchronized void faceRight() { + heroImages[0] = area.herostand; + heroImages[1] = area.hero1; + heroImages[2] = area.herostand; + heroImages[3] = area.hero2; + heroImageNo = 0; + heroleft = false; + } + + synchronized void faceLeft() { + heroImages[0] = area.herostandleft; + heroImages[1] = area.hero1left; + heroImages[2] = area.herostandleft; + heroImages[3] = area.hero2left; + heroImageNo = 0; + heroleft = true; + } + + synchronized void getSwordOut() { + hasWeaponOut = true; + if (heroleft) { + heroImages[0] = area.heroswordleft; + heroImages[1] = area.heroswordleft; + heroImages[2] = area.heroswordleft; + heroImages[3] = area.heroswordleft; + } else { + heroImages[0] = area.heroswordright; + heroImages[1] = area.heroswordright; + heroImages[2] = area.heroswordright; + heroImages[3] = area.heroswordright; + } + heroImageNo = 0; + } + + synchronized void getShieldOut() { + hasWeaponOut = true; + if (heroleft) { + heroImages[0] = area.heroshieldleft; + heroImages[1] = area.heroshieldleft; + heroImages[2] = area.heroshieldleft; + heroImages[3] = area.heroshieldleft; + } else { + heroImages[0] = area.heroshieldright; + heroImages[1] = area.heroshieldright; + heroImages[2] = area.heroshieldright; + heroImages[3] = area.heroshieldright; + } + heroImageNo = 0; + } + + synchronized void putWeaponAway() { + hasWeaponOut = false; + if (heroleft) + faceLeft(); + else + faceRight(); + } + + synchronized void standStill() { + heroImageNo = 0; + } + + public void doLevel(int level) { + // this runs one 'level' + juststarted = true; + + System.out.println("Started level " + level); + + // position Hero at the bottom left + playerPosition = new Point(LEFTEDGE, GROUNDLEVEL); + faceRight(); + + // initialise obstacle states + obstacleImageNo = new int[obstacleNumber]; + obstacleImageNo[0] = 0; + + // initialise the arrays of enemies, etc + enemyPositions = new Point[enemyNumber]; + obstaclePositions = new Point[MAXLEVELS][obstacleNumber]; + direction = new int[enemyNumber]; + for (int i = 0; i < enemyNumber; i++) { + enemyPositions[i] = new Point(RIGHTEDGE, GROUNDLEVEL); + direction[i] = LEFT; + } + for (int i = 0; i < obstacleNumber; i++) { + switch (level) { + case 1: + obstaclePositions[level - 1][i] = new Point((RIGHTEDGE + 15) / 2, GROUNDLEVEL); + System.out.println("Obstacle positioned at (" + (RIGHTEDGE - LEFTEDGE) / 2 + ", " + GROUNDLEVEL + ")"); + break; + default: + } + } + + // position the warp zone at the end of the level + warpzone = new Point(levellengths[level - 1], GROUNDLEVEL); + + // paint the panel here + // area.repaint(); + ingame = true; + } + + Point randomPosition() { + return new Point((int) (Math.random() * RIGHTEDGE) / XAMOUNT * XAMOUNT, + (int) (Math.random() * BOTTOMEDGE) / YAMOUNT * YAMOUNT); + } + + boolean isPlayerPosition(Point p) { + return (p.x == playerPosition.x && p.y == playerPosition.y); + } + + boolean isEnemyPosition(Point p) { + for (int i = 0; i < enemyNumber; i++) { + if (p.x == enemyPositions[i].x && p.y == enemyPositions[i].y) + return (true); + } + return (false); + } + + boolean isObstaclePosition(Point p) { + for (int i = 0; i < obstacleNumber; i++) { + if (isObstacleX(p) != -1 && isObstacleY(p) != -1) { + return (true); + } + } + return (false); + } + + boolean checkIfBlockingObstacle(Point p) { + boolean result = false; + for (int i = 0; i < obstacleNumber; i++) { + if (isObstacleX(p) != -1 && isBlockingObstacleY(p) != -1) { + // piranhaPopping[i] = false; + result = true; + } + // else piranhaPopping[i] = true; + } + if (!result) + startPosY = GROUNDLEVEL; + return (result); + } + + int isObstacleX(Point p) { + int obstaclex; + for (int i = 0; i < obstacleNumber; i++) { + // if x is >= obstacleposition - (LEFTOFOBSTACLE) and x <= obstacleposition + + // (RIGHTOFOBSTACLE) + obstaclex = obstaclePositions[level - 1][i].x; + if (p.x >= (obstaclex - LEFTOFOBSTACLE) && p.x <= (obstaclex + RIGHTOFOBSTACLE)) + return (i); // return the number of the matching obstacle + } + return (-1); + } + + int isBlockingObstacleY(Point p) { + for (int i = 0; i < obstacleNumber; i++) { + if (p.y <= obstaclePositions[level - 1][i].y - OBSTACLEHEIGHT) + return (i); + } + return (-1); + } + + int isObstacleY(Point p) { + for (int i = 0; i < obstacleNumber; i++) { + if (p.y > obstaclePositions[level - 1][i].y - OBSTACLEHEIGHT) + return (i); + } + return (-1); + } + + public void finished() { + finished = true; + System.exit(0); + } + + int randomMove() { + // return + or - value (randomly) + if (Math.random() >= 0.5) + return (24); + else + return (-24); + } + + private synchronized void incKeysDown(int whichone) { + keysdown[whichone] = 1; + } + + private synchronized void decKeysDown(int whichone) { + keysdown[whichone] = 0; + } + + // this class will use just the key pressed event + @Override + public void keyPressed(KeyEvent e) { + if (ingame) { + if (!((e.getKeyCode() == KeyEvent.VK_LEFT && playerPosition.x <= (LEFTEDGE + XAMOUNT)) + || (e.getKeyCode() == KeyEvent.VK_RIGHT && playerPosition.x >= (RIGHTEDGE - XAMOUNT)))) { + // valid move: move the player and then move the enemies + if (e.getKeyCode() == KeyEvent.VK_DOWN) { + herocrouching = true; + incKeysDown(DOWNDOWN); + } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { + incKeysDown(LEFTDOWN); + leftPressed(); + } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { + incKeysDown(RIGHTDOWN); + rightPressed(); + } else if (e.getKeyCode() == KeyEvent.VK_SPACE) { + // System.out.println("Jump when jumping is " + jumping); + if (!jumping) { + // incKeysDown(SPACEDOWN); + startPosY = playerPosition.y; + jumping = true; + onTheWayUp = true; + } + } else if (e.getKeyCode() == KeyEvent.VK_Z) { + getSwordOut(); + } else if (e.getKeyCode() == KeyEvent.VK_X) { + getShieldOut(); + } + if (isEnemyPosition(playerPosition)) { + System.out.println("The Player ran into an enemy!! Press the Enter key to restart the level"); + ingame = false; + } + // area.repaint(); + // System.out.println("Hero's position = (" + playerPosition.x + ", " + + // playerPosition.y + ")"); + System.out.println(" "); + } // if valid key press + } else if (e.getKeyCode() == KeyEvent.VK_ENTER) { + doLevel(++level); + } + } + + void leftPressed() { + if (!herocrouching) { + // superjump = true; // if jumping + // if Hero was facing right, turn him left + if (!heroleft && !hasWeaponOut) + faceLeft(); + else { + // if the target position is not occupied by a obstacle... + for (int i = 0; i < obstacleNumber; i++) { + if (isObstaclePosition(new Point(playerPosition.x - XAMOUNT, playerPosition.y))) + return; // can't move + } + playerPosition.x -= XAMOUNT; + incrementHeroImage(); + } + } + } + + void rightPressed() { + if (!herocrouching) { + // superjump = true; // if jumping + // if Hero was facing left, turn him right + if (heroleft && !hasWeaponOut) + faceRight(); + else { + for (int i = 0; i < obstacleNumber; i++) { + if (isObstaclePosition(new Point(playerPosition.x + XAMOUNT, playerPosition.y))) + return; // can't move + } + playerPosition.x += XAMOUNT; + incrementHeroImage(); + } + } + } + + @Override + public void run() { + while (true) { + if (juststarted) { + try { + Thread.sleep(750); + } catch (Exception e) { + } + area.repaint(); + juststarted = false; + } + try { + Thread.sleep(DELAY); + } catch (InterruptedException e) { + } + if (ingame) { + // System.out.println("Run: BEFORE: Hero's position = (" + playerPosition.x + ", + // " + playerPosition.y + ")"); + if (keysdown[LEFTDOWN] == 0 && keysdown[RIGHTDOWN] == 0 + && keysdown[DOWNDOWN] == 0 /* + * && keysdown[SPACEDOWN] == 0 + */) + standStill(); + + if (keysdown[LEFTDOWN] > 0) + leftPressed(); + else if (keysdown[RIGHTDOWN] > 0) + rightPressed(); + + // for each obstacle, cycle through the piranha pictures + for (int i = 0; i < obstacleNumber; i++) { + incrementObstacleImage(i); + } + + /* + * // for each enemy, move the enemy in the direction it was going for (int i=0; + * i < enemyPositions.length; i++) { if (!deadHero(enemyPositions[i])) { + * enemyPositions[i] = move(enemyPositions[i], direction[i]); } // if there is a + * obstacle at that position, fall into it and decrement count of enemies // and + * set that enemy's position to -1, -1 if + * (isObstaclePosition(enemyPositions[i])) { + * System.out.println("A enemy fell into a obstacle"); + * + * enemyPositions[i] = new Point(-1, -1); enemiesRemaining--; + * System.out.println(enemyNumber-enemiesRemaining + " down, " + + * enemiesRemaining + " to go..."); } // if player is caught by a enemy or all + * enemies are gone, end the game if (isPlayerPosition(enemyPositions[i])) { + * System.out. + * println("\"Mmm! Brains...\". The Player is dead. Press the Enter key to restart the level" + * ); level--; // because it will be incremented in a minute and we want to stay + * on the same 'level' ingame = false; } } if (enemiesRemaining == 0) { + * System.out. + * println("All the enemies are gone -- you won!! Press the Enter key to start the next level" + * ); enemyNumber++; if (obstacleNumber > 2) obstacleNumber--; ingame = false; } + */ + if (onTheWayUp) { + // System.out.println("OnTheWayUp. Start Y Position =" + startPosY); + if (playerPosition.y > startPosY - JUMPAMOUNT) + playerPosition = new Point(playerPosition.x, playerPosition.y - RISEAMOUNT); + else { + onTheWayUp = false; + } + } else { + int obstacleno = isObstacleX(playerPosition); + if (obstacleno == -1) { // no obstacle at this position + if (onTheWayUp == false) { + if (playerPosition.y < startPosY) + playerPosition = new Point(playerPosition.x, playerPosition.y + FALLAMOUNT); + else + jumping = false; + } + } else { + Point obstaclepos = obstaclePositions[level - 1][obstacleno]; + // if hero's y position <= obstacle's height + if (playerPosition.y <= (obstaclepos.y - OBSTACLEHEIGHT)) { // can't land on the obstacle if + // just < (??!) + // allow hero to land on the obstacle + // System.out.println("Allow Hero to land (or stay) on obstacle"); + jumping = false; + playerPosition = new Point(playerPosition.x, obstaclepos.y - OBSTACLEHEIGHT); + // if the piranha was up, Hero dies + if (obstacleImages[obstacleImageNo[obstacleno]] != area.obstacle) { + System.out.println("Hero dies!!"); + ingame = false; + + } + /* + * else { // otherwise stop this Piranha piranhaPopping[obstacleno] = false; } + */ + } else { + if (onTheWayUp == false) { + if (playerPosition.y < startPosY) + playerPosition = new Point(playerPosition.x, playerPosition.y + FALLAMOUNT); + else + jumping = false; + } + } + } + } + checkIfBlockingObstacle(playerPosition); + // System.out.println("Run: AFTER: Hero's position = (" + playerPosition.x + ", + // " + playerPosition.y + ")"); + area.repaint(); + } + } + } + + synchronized void incrementObstacleImage(int i) { + obstacleImageNo[i]++; + if (obstacleImageNo[i] == OBSTACLEIMAGES) + obstacleImageNo[i] = 0; + } + + synchronized void incrementHeroImage() { + heroImageNo++; + if (heroImageNo == HEROIMAGES) + heroImageNo = 0; + } + + Point move(Point start, int direction) { + return (new Point(start.x + direction, start.y)); + } + + boolean deadHero(Point p) { + return (p.x == -1 && p.y == -1); + } + + @Override + public void keyReleased(KeyEvent e) { + // boolean needrepaint = false; + if (e.getKeyCode() == KeyEvent.VK_DOWN) { + herocrouching = false; + decKeysDown(DOWNDOWN); + // needrepaint = true; + } + /* + * else if (e.getKeyCode() == KeyEvent.VK_SPACE) { decKeysDown(SPACEDOWN); } + */ + else if (e.getKeyCode() == KeyEvent.VK_LEFT) { + decKeysDown(LEFTDOWN); + // superjump = false; + } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { + decKeysDown(RIGHTDOWN); + // superjump = false; + } else + putWeaponAway(); + // if (needrepaint) area.repaint(); + } + + @Override + public void keyTyped(KeyEvent e) { + } + + synchronized Image getHeroImage() { + return (heroImages[heroImageNo]); + } + + synchronized Image getObstacleImage(int obstaclenum) { + return (obstacleImages[obstacleImageNo[obstaclenum]]); + } + +} diff --git a/Link/src/LinkArea.java b/Link/src/LinkArea.java @@ -12,7 +12,7 @@ public class LinkArea extends JPanel { private static final long serialVersionUID = 635033554190094921L; static final int FLOORLEVEL = 587; static final int FLOORWIDTH = 150; - LinkGame myApplet = null; + Link myApplet = null; Image yellowgem; Image spider; Image obstacle; @@ -38,7 +38,7 @@ public class LinkArea extends JPanel { Image blob; MediaTracker mt = null; - public LinkArea(LinkGame parent) { + public LinkArea(Link parent) { mt = new MediaTracker(parent); myApplet = parent; yellowgem = load(myApplet, "yellowgem.gif"); @@ -79,7 +79,7 @@ public class LinkArea extends JPanel { } } - Image load(LinkGame parent, String picture) { + Image load(Link parent, String picture) { try { Image im = ImageIO.read(new File("../Assets/" + picture)); checkImage(im, picture); @@ -107,12 +107,12 @@ public class LinkArea extends JPanel { * g.drawImage(floor,pos, FLOORLEVEL,Color.black, null); } */ - if (LinkGame.obstaclePositions != null) { + if (Link.obstaclePositions != null) { // show the obstacles - for (int i = 0; i < LinkGame.obstaclePositions.length; i++) { + for (int i = 0; i < Link.obstaclePositions.length; i++) { obstacleimage = myApplet.getObstacleImage(i); - g.drawImage(obstacleimage, LinkGame.obstaclePositions[LinkGame.level - 1][i].x, - LinkGame.obstaclePositions[LinkGame.level - 1][i].y - 4, Color.white, null); + g.drawImage(obstacleimage, Link.obstaclePositions[Link.level - 1][i].x, + Link.obstaclePositions[Link.level - 1][i].y - 4, Color.white, null); } } @@ -122,7 +122,7 @@ public class LinkArea extends JPanel { * myApplet.enemyPositions[i].x, myApplet.enemyPositions[i].y,null); } } */ // draw Hero (on top of preceding images) - if (LinkGame.playerPosition != null) { + if (Link.playerPosition != null) { // show the player Image herosimage = myApplet.getHeroImage(); /* @@ -130,7 +130,7 @@ public class LinkArea extends JPanel { * herocrouchleft; else herosimage = herocrouch; } if (myApplet.jumping) { if * (myApplet.heroleft) herosimage = herojumpleft; else herosimage = herojump; } */ - g.drawImage(herosimage, LinkGame.playerPosition.x, LinkGame.playerPosition.y, /* Color.white, */ null); + g.drawImage(herosimage, Link.playerPosition.x, Link.playerPosition.y, /* Color.white, */ null); } /* * // draw warp image (on top of Hero) if (myApplet.warpzone != null) { // show diff --git a/Link/src/LinkGame.java b/Link/src/LinkGame.java @@ -1,536 +0,0 @@ -import java.awt.Color; -import java.awt.Image; -import java.awt.Point; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; - -import javax.swing.JFrame; - -/* Copyright (c) Mary Percival 2003 */ -/* Link game Created May 2003 */ - -public class LinkGame extends JFrame implements KeyListener, Runnable { - private static final long serialVersionUID = 136423218680421502L; - // all member variables 'static' because shared with the enemy action thread - static LinkArea area; - static boolean finished = false; - static boolean ingame = false; - static boolean juststarted = false; - static int level = 0; - static Point[] enemyPositions; - static Point playerPosition; - static Point[][] obstaclePositions; - static int direction[]; - static Thread timer; - static int enemyNumber = 1, enemiesRemaining = 1, obstacleNumber = 1; - static boolean herocrouching = false; - static final int MAXLEVELS = 1; - static final int levellengths[] = new int[MAXLEVELS]; - boolean hasWeaponOut = false; - - static int LEFT = -1; - static int RIGHT = 1; - - // the next 2 constants are overridden in init once we know the screen size - static int RIGHTEDGE = 789; - static int BOTTOMEDGE = 800; - // - static Point IMAGESIZE = new Point(152, 107); - static Point HEROPOS = new Point(63, 28); - static final int LEFTEDGE = -15; - static final int TOPEDGE = -10; - static final int FALLAMOUNT = 16; // amount he falls each time interval - static final int RISEAMOUNT = 16; // amount he rises each time interval - static int GROUNDLEVEL = 500; - static int XAMOUNT = 5; - static int YAMOUNT = 5; - static int JUMPAMOUNT = 70; - static final int X = 1; - static final int Y = 2; - static final int NOT = 3; - static final int DELAY = 60; - - static int heroImageNo = 0; - static final int OBSTACLEIMAGES = 1; - static final int HEROIMAGES = 4; - static Image[] heroImages = new Image[HEROIMAGES]; - static Image[] obstacleImages = new Image[OBSTACLEIMAGES]; // obstacles don't move - static int obstacleImageNo[]; - static boolean heroleft = false; - static boolean jumping = false; - static Point warpzone; - // static boolean superjump = false; - static final int JUMPDURATION = 5; - static final int SUPERJUMPDURATION = 8; - static final int LEFTOFOBSTACLE = 27; - static final int RIGHTOFOBSTACLE = 33; - static int[] keysdown = new int[4]; - static final int LEFTDOWN = 0; - static final int RIGHTDOWN = 1; - static final int DOWNDOWN = 2; - static final int SPACEDOWN = 3; - - static final int OBSTACLEHEIGHT = 42; - boolean onTheWayUp = false; - static int startPosY = GROUNDLEVEL; - - public static void main(String[] args) { - LinkGame linkGame = new LinkGame(); - - linkGame.setLayout(null); - linkGame.setBackground(Color.white); - linkGame.setSize(RIGHTEDGE, BOTTOMEDGE); - - area = new LinkArea(linkGame); - linkGame.add(area); - XAMOUNT = 12; - YAMOUNT = 12; - //RIGHTEDGE = (linkGame.getBounds().width / XAMOUNT) * XAMOUNT + LEFTEDGE; - //BOTTOMEDGE = linkGame.getBounds().height - 1; - linkGame.setVisible(true); - //area.setBounds(0, 0, linkGame.getBounds().width, BOTTOMEDGE); - area.setBounds(0, 0, RIGHTEDGE, BOTTOMEDGE); - area.setVisible(true); - - linkGame.addKeyListener(linkGame); - area.addKeyListener(linkGame); - area.requestFocus(); - - levellengths[0] = RIGHTEDGE; - obstacleImages[0] = area.obstacle; - - timer = new Thread(linkGame); - timer.start(); - } - - synchronized void faceRight() { - heroImages[0] = area.herostand; - heroImages[1] = area.hero1; - heroImages[2] = area.herostand; - heroImages[3] = area.hero2; - heroImageNo = 0; - heroleft = false; - } - - synchronized void faceLeft() { - heroImages[0] = area.herostandleft; - heroImages[1] = area.hero1left; - heroImages[2] = area.herostandleft; - heroImages[3] = area.hero2left; - heroImageNo = 0; - heroleft = true; - } - - synchronized void getSwordOut() { - hasWeaponOut = true; - if (heroleft) { - heroImages[0] = area.heroswordleft; - heroImages[1] = area.heroswordleft; - heroImages[2] = area.heroswordleft; - heroImages[3] = area.heroswordleft; - } else { - heroImages[0] = area.heroswordright; - heroImages[1] = area.heroswordright; - heroImages[2] = area.heroswordright; - heroImages[3] = area.heroswordright; - } - heroImageNo = 0; - } - - synchronized void getShieldOut() { - hasWeaponOut = true; - if (heroleft) { - heroImages[0] = area.heroshieldleft; - heroImages[1] = area.heroshieldleft; - heroImages[2] = area.heroshieldleft; - heroImages[3] = area.heroshieldleft; - } else { - heroImages[0] = area.heroshieldright; - heroImages[1] = area.heroshieldright; - heroImages[2] = area.heroshieldright; - heroImages[3] = area.heroshieldright; - } - heroImageNo = 0; - } - - synchronized void putWeaponAway() { - hasWeaponOut = false; - if (heroleft) - faceLeft(); - else - faceRight(); - } - - synchronized void standStill() { - heroImageNo = 0; - } - - public void doLevel(int level) { - // this runs one 'level' - juststarted = true; - - System.out.println("Started level " + level); - - // position Hero at the bottom left - playerPosition = new Point(LEFTEDGE, GROUNDLEVEL); - faceRight(); - - // initialise obstacle states - obstacleImageNo = new int[obstacleNumber]; - obstacleImageNo[0] = 0; - - // initialise the arrays of enemies, etc - enemyPositions = new Point[enemyNumber]; - obstaclePositions = new Point[MAXLEVELS][obstacleNumber]; - direction = new int[enemyNumber]; - for (int i = 0; i < enemyNumber; i++) { - enemyPositions[i] = new Point(RIGHTEDGE, GROUNDLEVEL); - direction[i] = LEFT; - } - for (int i = 0; i < obstacleNumber; i++) { - switch (level) { - case 1: - obstaclePositions[level - 1][i] = new Point((RIGHTEDGE + 15) / 2, GROUNDLEVEL); - System.out.println("Obstacle positioned at (" + (RIGHTEDGE - LEFTEDGE) / 2 + ", " + GROUNDLEVEL + ")"); - break; - default: - } - } - - // position the warp zone at the end of the level - warpzone = new Point(levellengths[level - 1], GROUNDLEVEL); - - // paint the panel here - // area.repaint(); - ingame = true; - } - - Point randomPosition() { - return new Point((int) (Math.random() * RIGHTEDGE) / XAMOUNT * XAMOUNT, - (int) (Math.random() * BOTTOMEDGE) / YAMOUNT * YAMOUNT); - } - - boolean isPlayerPosition(Point p) { - return (p.x == playerPosition.x && p.y == playerPosition.y); - } - - boolean isEnemyPosition(Point p) { - for (int i = 0; i < enemyNumber; i++) { - if (p.x == enemyPositions[i].x && p.y == enemyPositions[i].y) - return (true); - } - return (false); - } - - boolean isObstaclePosition(Point p) { - for (int i = 0; i < obstacleNumber; i++) { - if (isObstacleX(p) != -1 && isObstacleY(p) != -1) { - return (true); - } - } - return (false); - } - - boolean checkIfBlockingObstacle(Point p) { - boolean result = false; - for (int i = 0; i < obstacleNumber; i++) { - if (isObstacleX(p) != -1 && isBlockingObstacleY(p) != -1) { - // piranhaPopping[i] = false; - result = true; - } - // else piranhaPopping[i] = true; - } - if (!result) - startPosY = GROUNDLEVEL; - return (result); - } - - int isObstacleX(Point p) { - int obstaclex; - for (int i = 0; i < obstacleNumber; i++) { - // if x is >= obstacleposition - (LEFTOFOBSTACLE) and x <= obstacleposition + - // (RIGHTOFOBSTACLE) - obstaclex = obstaclePositions[level - 1][i].x; - if (p.x >= (obstaclex - LEFTOFOBSTACLE) && p.x <= (obstaclex + RIGHTOFOBSTACLE)) - return (i); // return the number of the matching obstacle - } - return (-1); - } - - int isBlockingObstacleY(Point p) { - for (int i = 0; i < obstacleNumber; i++) { - if (p.y <= obstaclePositions[level - 1][i].y - OBSTACLEHEIGHT) - return (i); - } - return (-1); - } - - int isObstacleY(Point p) { - for (int i = 0; i < obstacleNumber; i++) { - if (p.y > obstaclePositions[level - 1][i].y - OBSTACLEHEIGHT) - return (i); - } - return (-1); - } - - public void finished() { - finished = true; - System.exit(0); - } - - int randomMove() { - // return + or - value (randomly) - if (Math.random() >= 0.5) - return (24); - else - return (-24); - } - - private synchronized void incKeysDown(int whichone) { - keysdown[whichone] = 1; - } - - private synchronized void decKeysDown(int whichone) { - keysdown[whichone] = 0; - } - - // this class will use just the key pressed event - @Override - public void keyPressed(KeyEvent e) { - if (ingame) { - if (!((e.getKeyCode() == KeyEvent.VK_LEFT && playerPosition.x <= (LEFTEDGE + XAMOUNT)) - || (e.getKeyCode() == KeyEvent.VK_RIGHT && playerPosition.x >= (RIGHTEDGE - XAMOUNT)))) { - // valid move: move the player and then move the enemies - if (e.getKeyCode() == KeyEvent.VK_DOWN) { - herocrouching = true; - incKeysDown(DOWNDOWN); - } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { - incKeysDown(LEFTDOWN); - leftPressed(); - } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { - incKeysDown(RIGHTDOWN); - rightPressed(); - } else if (e.getKeyCode() == KeyEvent.VK_SPACE) { - // System.out.println("Jump when jumping is " + jumping); - if (!jumping) { - // incKeysDown(SPACEDOWN); - startPosY = playerPosition.y; - jumping = true; - onTheWayUp = true; - } - } else if (e.getKeyCode() == KeyEvent.VK_Z) { - getSwordOut(); - } else if (e.getKeyCode() == KeyEvent.VK_X) { - getShieldOut(); - } - if (isEnemyPosition(playerPosition)) { - System.out.println("The Player ran into an enemy!! Press the Enter key to restart the level"); - ingame = false; - } - // area.repaint(); - // System.out.println("Hero's position = (" + playerPosition.x + ", " + - // playerPosition.y + ")"); - System.out.println(" "); - } // if valid key press - } else if (e.getKeyCode() == KeyEvent.VK_ENTER) { - doLevel(++level); - } - } - - void leftPressed() { - if (!herocrouching) { - // superjump = true; // if jumping - // if Hero was facing right, turn him left - if (!heroleft && !hasWeaponOut) - faceLeft(); - else { - // if the target position is not occupied by a obstacle... - for (int i = 0; i < obstacleNumber; i++) { - if (isObstaclePosition(new Point(playerPosition.x - XAMOUNT, playerPosition.y))) - return; // can't move - } - playerPosition.x -= XAMOUNT; - incrementHeroImage(); - } - } - } - - void rightPressed() { - if (!herocrouching) { - // superjump = true; // if jumping - // if Hero was facing left, turn him right - if (heroleft && !hasWeaponOut) - faceRight(); - else { - for (int i = 0; i < obstacleNumber; i++) { - if (isObstaclePosition(new Point(playerPosition.x + XAMOUNT, playerPosition.y))) - return; // can't move - } - playerPosition.x += XAMOUNT; - incrementHeroImage(); - } - } - } - - @Override - public void run() { - while (true) { - if (juststarted) { - try { - Thread.sleep(750); - } catch (Exception e) { - } - area.repaint(); - juststarted = false; - } - try { - Thread.sleep(DELAY); - } catch (InterruptedException e) { - } - if (ingame) { - // System.out.println("Run: BEFORE: Hero's position = (" + playerPosition.x + ", - // " + playerPosition.y + ")"); - if (keysdown[LEFTDOWN] == 0 && keysdown[RIGHTDOWN] == 0 - && keysdown[DOWNDOWN] == 0 /* - * && keysdown[SPACEDOWN] == 0 - */) - standStill(); - - if (keysdown[LEFTDOWN] > 0) - leftPressed(); - else if (keysdown[RIGHTDOWN] > 0) - rightPressed(); - - // for each obstacle, cycle through the piranha pictures - for (int i = 0; i < obstacleNumber; i++) { - incrementObstacleImage(i); - } - - /* - * // for each enemy, move the enemy in the direction it was going for (int i=0; - * i < enemyPositions.length; i++) { if (!deadHero(enemyPositions[i])) { - * enemyPositions[i] = move(enemyPositions[i], direction[i]); } // if there is a - * obstacle at that position, fall into it and decrement count of enemies // and - * set that enemy's position to -1, -1 if - * (isObstaclePosition(enemyPositions[i])) { - * System.out.println("A enemy fell into a obstacle"); - * - * enemyPositions[i] = new Point(-1, -1); enemiesRemaining--; - * System.out.println(enemyNumber-enemiesRemaining + " down, " + - * enemiesRemaining + " to go..."); } // if player is caught by a enemy or all - * enemies are gone, end the game if (isPlayerPosition(enemyPositions[i])) { - * System.out. - * println("\"Mmm! Brains...\". The Player is dead. Press the Enter key to restart the level" - * ); level--; // because it will be incremented in a minute and we want to stay - * on the same 'level' ingame = false; } } if (enemiesRemaining == 0) { - * System.out. - * println("All the enemies are gone -- you won!! Press the Enter key to start the next level" - * ); enemyNumber++; if (obstacleNumber > 2) obstacleNumber--; ingame = false; } - */ - if (onTheWayUp) { - // System.out.println("OnTheWayUp. Start Y Position =" + startPosY); - if (playerPosition.y > startPosY - JUMPAMOUNT) - playerPosition = new Point(playerPosition.x, playerPosition.y - RISEAMOUNT); - else { - onTheWayUp = false; - } - } else { - int obstacleno = isObstacleX(playerPosition); - if (obstacleno == -1) { // no obstacle at this position - if (onTheWayUp == false) { - if (playerPosition.y < startPosY) - playerPosition = new Point(playerPosition.x, playerPosition.y + FALLAMOUNT); - else - jumping = false; - } - } else { - Point obstaclepos = obstaclePositions[level - 1][obstacleno]; - // if hero's y position <= obstacle's height - if (playerPosition.y <= (obstaclepos.y - OBSTACLEHEIGHT)) { // can't land on the obstacle if - // just < (??!) - // allow hero to land on the obstacle - // System.out.println("Allow Hero to land (or stay) on obstacle"); - jumping = false; - playerPosition = new Point(playerPosition.x, obstaclepos.y - OBSTACLEHEIGHT); - // if the piranha was up, Hero dies - if (obstacleImages[obstacleImageNo[obstacleno]] != area.obstacle) { - System.out.println("Hero dies!!"); - ingame = false; - - } - /* - * else { // otherwise stop this Piranha piranhaPopping[obstacleno] = false; } - */ - } else { - if (onTheWayUp == false) { - if (playerPosition.y < startPosY) - playerPosition = new Point(playerPosition.x, playerPosition.y + FALLAMOUNT); - else - jumping = false; - } - } - } - } - checkIfBlockingObstacle(playerPosition); - // System.out.println("Run: AFTER: Hero's position = (" + playerPosition.x + ", - // " + playerPosition.y + ")"); - area.repaint(); - } - } - } - - synchronized void incrementObstacleImage(int i) { - obstacleImageNo[i]++; - if (obstacleImageNo[i] == OBSTACLEIMAGES) - obstacleImageNo[i] = 0; - } - - synchronized void incrementHeroImage() { - heroImageNo++; - if (heroImageNo == HEROIMAGES) - heroImageNo = 0; - } - - Point move(Point start, int direction) { - return (new Point(start.x + direction, start.y)); - } - - boolean deadHero(Point p) { - return (p.x == -1 && p.y == -1); - } - - @Override - public void keyReleased(KeyEvent e) { - boolean needrepaint = false; - if (e.getKeyCode() == KeyEvent.VK_DOWN) { - herocrouching = false; - decKeysDown(DOWNDOWN); - needrepaint = true; - } - /* - * else if (e.getKeyCode() == KeyEvent.VK_SPACE) { decKeysDown(SPACEDOWN); } - */ - else if (e.getKeyCode() == KeyEvent.VK_LEFT) { - decKeysDown(LEFTDOWN); - // superjump = false; - } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { - decKeysDown(RIGHTDOWN); - // superjump = false; - } else - putWeaponAway(); - // if (needrepaint) area.repaint(); - } - - @Override - public void keyTyped(KeyEvent e) { - } - - synchronized Image getHeroImage() { - return (heroImages[heroImageNo]); - } - - synchronized Image getObstacleImage(int obstaclenum) { - return (obstacleImages[obstacleImageNo[obstaclenum]]); - } - -} diff --git a/Mario/src/Mario.java b/Mario/src/Mario.java @@ -0,0 +1,1509 @@ + +/* Copyright (c) Mary Percival 2003 */ +/* Mario game Created May 2003 */ + +import java.awt.Color; +import java.awt.Image; +import java.awt.Point; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; + +import javax.swing.JFrame; + +public class Mario extends JFrame implements KeyListener, Runnable { + private static final long serialVersionUID = 7030451342808203557L; + boolean easymode = true; + static int MAXLEVEL = 9; + static int level = 0; + + // the levels so far are: + // 1 beginner level: 1 piranha & 1 goomba + // 2 introducing green koopa + // 3 more of the same + // 4 introducing red koopa (flying) + // 5 more and harder + // 6 ? + // 7 ? + // 8 ? + // 9 ? + + static int LEFT = 1; + static int RIGHT = 0; + // the next 2 constants are overridden in init once we know the screen size + static int RIGHTEDGE = 789; + static int BOTTOMEDGE = 800; + static int PAGEWIDTH = 741; + + static Point IMAGESIZE = new Point(152, 107); + static final int LEFTEDGE = -45; + static final int TOPEDGE = -10; + static int GROUNDLEVEL = 503; + static int startPosY; + static int JUMPAMOUNT = 90; + static int BOUNCEAMOUNT = 90; + static final int FALLAMOUNT = 16; // amount he falls each time interval + static final int RISEAMOUNT = 16; // amount he rises each time interval + static final int XAMOUNT = 12; + + static final int X = 1; + static final int Y = 2; + static final int NOT = 3; + static final int DELAY = 50; + + static final int OBSTACLEIMAGES = 19; + static final int HEROIMAGES = 4; + static final int ENEMYIMAGES = 3; + + // ---------------------------------------------------------------------------------------------- + // ENEMY TYPES + // ---------------------------------------------------------------------------------------------- + static final int ENEMYTYPES = 15; // goomba, koopa red, koopa green, koopa red flying, banzai, wiggler, boo, + // fireboo,bobomb,warship,yeti,chainchomp,atom + static final int GOOMBA = 0; + static final int KOOPARED = 1; + static final int KOOPAGREEN = 2; + static final int KOOPAREDFLYING = 3; + static final int BANZAI = 4; + static final int WIGGLER = 5; + static final int BOO = 6; + static final int FIREBOO = 7; + static final int BOBOMB = 8; + static final int BULLET = 9; + static final int WARSHIP = 10; + static final int YETI = 11; + static final int FLYER = 12; + static final int CHOMP = 13; + static final int ATOM = 14; + + // enemy positions (height) + static final int GOOMBAHEIGHT = GROUNDLEVEL + 55; + static final int KOOPAREDHEIGHT = GROUNDLEVEL + 39; + static final int KOOPAGREENHEIGHT = GROUNDLEVEL + 39; + static final int KOOPAREDFLYINGHEIGHT = GROUNDLEVEL - 16; + static final int BANZAIHEIGHT = GROUNDLEVEL - 90; + static final int WIGGLERHEIGHT = GROUNDLEVEL + 16; + static final int BOOHEIGHT = GROUNDLEVEL - 7; + static final int FIREBOOHEIGHT = GROUNDLEVEL - 7; + static final int BOBOMBHEIGHT = GROUNDLEVEL + 5; + static final int BULLETHEIGHT = GROUNDLEVEL + 55; + static final int WARSHIPHEIGHT = GROUNDLEVEL + 100; + static final int YETIHEIGHT = GROUNDLEVEL; + static final int FLYERHEIGHT = GROUNDLEVEL - 20; + static final int CHOMPHEIGHT = GROUNDLEVEL - 55; + static final int ATOMHEIGHT = GROUNDLEVEL + 40; + static int enemyHeight[] = new int[ENEMYTYPES]; + + static final int enemySize[] = { 27, 42, 42, 42, 172, 75, 37, 37, 74, 8, 152, 86, 86, 75, 25 }; + static final int enemyTopSpace[] = { 4, 13, 13, 0, 0, 10, 6, 6, 7, 0, 20, 8, 17, 10, 0 }; + + static final int SPACE_FROM_X_TO_MARIO = 55; + static final int MARIOHEIGHT = 86; + static final int MARIOOFFSET = 21; + static final int MARIOCROUCHOFFSET = 39; + static final int MARIOSTANDINGSIZE = 65; + static final int MARIOCROUCHINGSIZE = 45; + + static final int JUMPDURATION = 5; + static final int SUPERJUMPDURATION = 8; + static final int MARIOLEFTOFOBSTACLE = 45; // fudge factor because Mario image is diff size to obstacle image + static final int MARIORIGHTOFOBSTACLE = 10; // fudge factor because Mario image is diff size to obstacle image + static final int ENEMYLEFTOFOBSTACLE = 16; // fudge factor for enemy images + static final int ENEMYRIGHTOFOBSTACLE = 49; // >49 causes panic! + static final int MARIOLEFTOFENEMY = 73; + static final int MARIORIGHTOFENEMY = -23; + + static final int LEFTDOWN = 0; + static final int RIGHTDOWN = 1; + static final int DOWNDOWN = 2; + static final int SPACEDOWN = 3; + + static final int OBSTACLEHEIGHT = 42; + static final int TALLOBSTACLEDIFF = 28; + static final int OBSTACLEWIDTH = 86; + static int GROUNDDIFF = 605 - GROUNDLEVEL; + + // all member variables 'static' because shared with the enemy action thread + static MarioArea area; + static Thread timer; + static boolean finished = false; + static boolean ingame = false; + static boolean juststarted = true; + static Point warpzone; + static int[] keysdown = new int[4]; + static Point[] enemyPositions; + static Point playerPosition; + static Point[] obstaclePositions; + static boolean[] piranhaPopping; // one for each obstacle + static boolean[] hasPiranha; // one for each obstacle + static boolean[] isTall; // one for each obstacle + static int enemyDirection[]; + static int enemyNumber = 1, enemiesRemaining = 1, obstacleNumber = 1; + static boolean herocrouching = false; + static boolean onTheWayUp = false; + static boolean bouncing = false; + static boolean wasbouncing = false; + static boolean dead = false; + static int page = 0; + static int heroImageNo = 0; + static int enemyImageNo[]; + static int levellength = 1482; + static Image[] heroImages = new Image[HEROIMAGES]; + static Image[] obstacleImages = new Image[OBSTACLEIMAGES]; // pipe, piranhapeep, piranha peepy etc + static Image[] squished = new Image[ENEMYTYPES]; // squished images for each enemy type + static Image[][][] enemyImages = new Image[ENEMYTYPES][2][ENEMYIMAGES]; // left right left right or whatever + static int obstacleImageNo[]; // what is the current image for obstacle n + static Image[][] enemyImage = new Image[ENEMYTYPES][ENEMYIMAGES];// what is the current image for enemy n? + static Image floors[] = new Image[MAXLEVEL]; + static int enemyType[]; // what is the type of enemy n? + static boolean enemyDead[]; // is enemy n dead? + static boolean heroleft = false; + static boolean jumping = false; + static int enemyMove[] = new int[ENEMYTYPES]; + boolean somethingChangedSinceRepaint = false; + + // ************************************************************* + public static void main(String[] args) { + Mario Mario = new Mario(); + Mario.setLayout(null); + Mario.setBackground(Color.white); + Mario.setSize(RIGHTEDGE, BOTTOMEDGE); + area = new MarioArea(Mario); + Mario.add(area); + //RIGHTEDGE = (Mario.getBounds().width / XAMOUNT) * XAMOUNT + LEFTEDGE; + //BOTTOMEDGE = Mario.getBounds().height - 1; + Mario.setVisible(true); + area.setBounds(0, 0, RIGHTEDGE, BOTTOMEDGE); + //GROUNDLEVEL = Mario.getBounds().height - GROUNDDIFF; + //GROUNDLEVEL = BOTTOMEDGE;// - GROUNDDIFF; + startPosY = GROUNDLEVEL; + //MarioArea.FLOORLEVEL = Mario.getBounds().height - MarioArea.FLOORDIFF; + area.setVisible(true); + + Mario.addKeyListener(Mario); + area.addKeyListener(Mario); + area.requestFocus(); + + obstacleImages[0] = area.obstacle; + obstacleImages[1] = area.obstacle; + obstacleImages[2] = area.obstacle; + obstacleImages[3] = area.obstacle; + obstacleImages[4] = area.piranhapeepo; + obstacleImages[5] = area.piranhapeep; + obstacleImages[6] = area.piranhapeepy; + obstacleImages[7] = area.piranha1; + obstacleImages[8] = area.piranha1; + obstacleImages[9] = area.piranha1; + obstacleImages[10] = area.piranha2; // + obstacleImages[11] = area.piranha2; // + obstacleImages[12] = area.piranha2; // + obstacleImages[13] = area.piranhapeepy; // + obstacleImages[14] = area.piranhapeep; // + obstacleImages[15] = area.piranhapeepo; + obstacleImages[16] = area.obstacle; // + obstacleImages[17] = area.obstacle; // + obstacleImages[18] = area.obstacle; // + + enemyImages[GOOMBA][RIGHT][0] = area.goomba; + enemyImages[GOOMBA][RIGHT][1] = area.goomba2; + enemyImages[GOOMBA][LEFT][0] = area.goombaleft; + enemyImages[GOOMBA][LEFT][1] = area.goomba2left; + + enemyImages[KOOPARED][RIGHT][0] = area.kooparedleft; + enemyImages[KOOPARED][RIGHT][1] = area.kooparedleft; + enemyImages[KOOPARED][LEFT][0] = area.koopared; + enemyImages[KOOPARED][LEFT][1] = area.koopared; + + enemyImages[KOOPAGREEN][RIGHT][0] = area.koopagreen; + enemyImages[KOOPAGREEN][RIGHT][1] = area.koopagreen; + enemyImages[KOOPAGREEN][LEFT][0] = area.koopagreenleft; + enemyImages[KOOPAGREEN][LEFT][1] = area.koopagreenleft; + + enemyImages[KOOPAREDFLYING][RIGHT][0] = area.kooparedfleft; + enemyImages[KOOPAREDFLYING][RIGHT][1] = area.kooparedfleft; + enemyImages[KOOPAREDFLYING][LEFT][0] = area.kooparedf; + enemyImages[KOOPAREDFLYING][LEFT][1] = area.kooparedf; + + enemyImages[BANZAI][RIGHT][0] = area.Banzai; + enemyImages[BANZAI][RIGHT][1] = area.Banzai; + enemyImages[BANZAI][LEFT][0] = area.Banzai; + enemyImages[BANZAI][LEFT][1] = area.Banzai; + + enemyImages[WIGGLER][RIGHT][0] = area.Wiglerright; + enemyImages[WIGGLER][RIGHT][1] = area.Wiglerright1; + enemyImages[WIGGLER][RIGHT][2] = area.Wiglerright2; + enemyImages[WIGGLER][LEFT][0] = area.Wiglerleft; + enemyImages[WIGGLER][LEFT][1] = area.Wiglerleft1; + enemyImages[WIGGLER][LEFT][2] = area.Wiglerleft2; + + enemyImages[BOO][RIGHT][0] = area.Boo2; + enemyImages[BOO][RIGHT][1] = area.Boo2; + enemyImages[BOO][LEFT][0] = area.Boo1; + enemyImages[BOO][LEFT][1] = area.Boo1; + + enemyImages[FIREBOO][RIGHT][0] = area.Fireboo2; + enemyImages[FIREBOO][RIGHT][1] = area.Fireboo2; + enemyImages[FIREBOO][LEFT][0] = area.Fireboo1; + enemyImages[FIREBOO][LEFT][1] = area.Fireboo1; + + enemyImages[BOBOMB][LEFT][0] = area.Bobomb; + enemyImages[BOBOMB][LEFT][1] = area.Bobomb2; + enemyImages[BOBOMB][RIGHT][0] = area.Bobombf; + enemyImages[BOBOMB][RIGHT][1] = area.Bobombf2; + + enemyImages[BULLET][LEFT][0] = area.Bullet; + enemyImages[BULLET][LEFT][1] = area.Bullet; + enemyImages[BULLET][RIGHT][0] = area.Bullet; + enemyImages[BULLET][RIGHT][1] = area.Bullet; + + enemyImages[WARSHIP][LEFT][0] = area.Warship1; + enemyImages[WARSHIP][LEFT][1] = area.Warship2; + enemyImages[WARSHIP][RIGHT][0] = area.Warship1; + enemyImages[WARSHIP][RIGHT][1] = area.Warship2; + + enemyImages[YETI][LEFT][0] = area.Yetil1; + enemyImages[YETI][LEFT][1] = area.Yetil2; + enemyImages[YETI][RIGHT][0] = area.Yetir1; + enemyImages[YETI][RIGHT][1] = area.Yetir2; + + enemyImages[FLYER][LEFT][0] = area.p1fl; + enemyImages[FLYER][LEFT][1] = area.p2fl; + enemyImages[FLYER][RIGHT][0] = area.p1fr; + enemyImages[FLYER][RIGHT][1] = area.p2fr; + + enemyImages[CHOMP][LEFT][0] = area.chainchomp1; + enemyImages[CHOMP][LEFT][1] = area.chainchomp2; + enemyImages[CHOMP][RIGHT][0] = area.chainchomp1; + enemyImages[CHOMP][RIGHT][1] = area.chainchomp2; + + enemyImages[ATOM][LEFT][0] = area.Atom1; + enemyImages[ATOM][LEFT][1] = area.Atom2; + enemyImages[ATOM][RIGHT][0] = area.Atom1; + enemyImages[ATOM][RIGHT][1] = area.Atom2; + + enemyMove[GOOMBA] = 5; + enemyMove[KOOPARED] = 5; + enemyMove[KOOPAGREEN] = 5; + enemyMove[KOOPAREDFLYING] = 8; + enemyMove[BANZAI] = 16; + enemyMove[WIGGLER] = 15; + enemyMove[BOO] = 5; + enemyMove[FIREBOO] = 10; + enemyMove[BOBOMB] = 5; + enemyMove[BULLET] = 10; + enemyMove[WARSHIP] = 20; + enemyMove[YETI] = 5; + enemyMove[FLYER] = 10; + enemyMove[CHOMP] = 0; + enemyMove[ATOM] = 1; + + enemyHeight[GOOMBA] = 40; + enemyHeight[KOOPARED] = 33; + enemyHeight[KOOPAGREEN] = 33; + enemyHeight[KOOPAREDFLYING] = 33; + enemyHeight[BANZAI] = 60; + enemyHeight[WIGGLER] = 33; + enemyHeight[BOO] = 33; + enemyHeight[FIREBOO] = 33; + enemyHeight[BOBOMB] = 33; + enemyHeight[BULLET] = 5; + enemyHeight[WARSHIP] = 50; + enemyHeight[YETI] = 33; + enemyHeight[FLYER] = 50; + enemyHeight[CHOMP] = 60; + enemyHeight[ATOM] = 22; + + squished[GOOMBA] = area.squishedgoomba; + squished[KOOPARED] = area.redshell; + squished[KOOPAGREEN] = area.greenshell; + squished[KOOPAREDFLYING] = area.koopared; + squished[BANZAI] = area.Banzai; // not actually used + squished[WIGGLER] = area.Wiglerleft; // not actually used + squished[BOO] = area.Boo1; + squished[FIREBOO] = area.Fireboo1; + squished[BOBOMB] = area.Bobomb; + squished[BULLET] = area.Bullet; + squished[WARSHIP] = area.Warship2; + squished[YETI] = area.Yetil1; + squished[FLYER] = area.p1fl; + squished[CHOMP] = area.chainchompdead; + squished[ATOM] = area.Atom1; + + for (int i = 0; i < MAXLEVEL; i++) { + floors[i] = area.floor4; + } + + floors[0] = area.floor4; + floors[1] = area.floor5; + floors[2] = area.floor3; + floors[3] = area.floor7; + floors[4] = area.floor8; + floors[5] = area.floor9; + floors[6] = area.floor2; + floors[7] = area.floor6; + floors[8] = area.Floor10; + + timer = new Thread(Mario); + timer.start(); + + } + + synchronized void faceRight() { + heroImages[0] = area.herostand; + heroImages[1] = area.hero1; + heroImages[2] = area.herostand; + heroImages[3] = area.hero2; + heroImageNo = 0; + heroleft = false; + } + + synchronized void faceLeft() { + heroImages[0] = area.herostandleft; + heroImages[1] = area.hero1left; + heroImages[2] = area.herostandleft; + heroImages[3] = area.hero2left; + heroImageNo = 0; + heroleft = true; + } + + synchronized void enemyFaceRight(int enemyno) { + enemyImage[enemyno][0] = enemyImages[enemyType[enemyno]][RIGHT][0]; + enemyImage[enemyno][1] = enemyImages[enemyType[enemyno]][RIGHT][1]; + if (enemyType[enemyno] == WIGGLER) + enemyImage[enemyno][2] = enemyImages[enemyType[enemyno]][RIGHT][2]; + enemyDirection[enemyno] = RIGHT; + } + + synchronized void enemyFaceLeft(int enemyno) { + enemyImage[enemyno][0] = enemyImages[enemyType[enemyno]][LEFT][0]; + enemyImage[enemyno][1] = enemyImages[enemyType[enemyno]][LEFT][1]; + if (enemyType[enemyno] == WIGGLER) + enemyImage[enemyno][2] = enemyImages[enemyType[enemyno]][LEFT][2]; + enemyDirection[enemyno] = LEFT; + } + + synchronized void enemyDie(int enemyno) { + // displayStatus(); + enemyImage[enemyno][0] = squished[enemyType[enemyno]]; + enemyImage[enemyno][1] = squished[enemyType[enemyno]]; + if (enemyType[enemyno] == WIGGLER) + enemyImage[enemyno][2] = squished[enemyType[enemyno]]; + } + + synchronized void standStill() { + heroImageNo = 0; + } + + public void doLevel(int level) { + // this runs one 'level' + juststarted = true; + dead = false; + + // position Hero at the bottom left + playerPosition = new Point(LEFTEDGE, GROUNDLEVEL); + faceRight(); + + // *********** THIS STUFF DEPENDS WHAT LEVEL YOU ARE ON ************ + switch (level) { + case 1: + obstacleNumber = 4; // 4 pipes for level 1 + enemyNumber = 1; + levellength = 1482; // 2 pages + break; + case 2: + obstacleNumber = 11; + enemyNumber = 5; + levellength = 2964; // 4 pages + break; + case 3: + obstacleNumber = 13; + enemyNumber = 8; + levellength = 2223; // 3 pages + break; + case 4: + obstacleNumber = 11; + enemyNumber = 12; + levellength = 4446; // 6 pages + break; + case 5: + obstacleNumber = 17; + enemyNumber = 13; + levellength = 5928; // 8 pages + break; + case 6: + obstacleNumber = 14; + enemyNumber = 1; + levellength = 5928; // 8 pages + break; + case 7: + obstacleNumber = 14; + enemyNumber = 6; + levellength = 3705; // 5 pages + break; + case 8: + obstacleNumber = 16; + enemyNumber = 9; + levellength = 5928; // 8 pages + break; + case 9: + obstacleNumber = 6; + enemyNumber = 9; + levellength = 3705; // 5 pages + break; + case 10: + obstacleNumber = 29; + enemyNumber = 0; + levellength = 4446; // 6 pages + default: + System.out.println("Level " + level + " has not yet been implemented"); + } + + enemyImage = new Image[enemyNumber][ENEMYIMAGES];// what is the current image for enemy n? + // initialise piranha states + obstacleImageNo = new int[obstacleNumber]; + hasPiranha = new boolean[obstacleNumber]; + piranhaPopping = new boolean[obstacleNumber]; + isTall = new boolean[obstacleNumber]; + + // initialise the arrays of enemies, etc + enemyPositions = new Point[enemyNumber]; + enemyType = new int[enemyNumber]; + enemyDead = new boolean[enemyNumber]; + obstaclePositions = new Point[obstacleNumber]; + enemyDirection = new int[enemyNumber]; + enemyImageNo = new int[enemyNumber]; + + for (int i = 0; i < enemyNumber; i++) { + enemyImageNo[i] = 0; + } + + switch (level) { + // --------------------------------- + // LEVEL 1 + // --------------------------------- + case 1: + for (int i = 0; i < obstacleNumber; i++) { + isTall[i] = false; + if (i == 0) { + piranhaPopping[i] = true; + hasPiranha[i] = true; + } else { + if (i == 3) + isTall[i] = true; + piranhaPopping[i] = false; + hasPiranha[i] = false; + } + } + obstaclePositions[0] = new Point(400, GROUNDLEVEL); + obstaclePositions[1] = new Point(950, GROUNDLEVEL); + obstaclePositions[2] = new Point(1245, GROUNDLEVEL); // 1255 for adjacent + obstaclePositions[3] = new Point(1320, GROUNDLEVEL); + + enemyPositions[0] = new Point(1000, GOOMBAHEIGHT); + enemyType = new int[] { GOOMBA }; + break; + // ----------------------------------------------- + // LEVEL 2 + // ----------------------------------------------- + case 2: + for (int i = 0; i < obstacleNumber; i++) { + isTall[i] = false; + if (i == 2 || i == 7 || i == 8) { + piranhaPopping[i] = true; + hasPiranha[i] = true; + } else { + if (i == 4 || i == 6 || i == 10) + isTall[i] = true; + piranhaPopping[i] = false; + hasPiranha[i] = false; + } + } + + // PAGE 1 + obstaclePositions[0] = new Point(150, GROUNDLEVEL); + obstaclePositions[1] = new Point(225, GROUNDLEVEL); + obstaclePositions[2] = new Point(300, GROUNDLEVEL); + // PAGE 2 + obstaclePositions[3] = new Point(891, GROUNDLEVEL); + obstaclePositions[4] = new Point(966, GROUNDLEVEL); + // PAGE 3 + obstaclePositions[5] = new Point(1632, GROUNDLEVEL); + obstaclePositions[6] = new Point(1707, GROUNDLEVEL); + obstaclePositions[7] = new Point(1782, GROUNDLEVEL); + // PAGE 4 + obstaclePositions[8] = new Point(2373, GROUNDLEVEL); + obstaclePositions[9] = new Point(2743, GROUNDLEVEL); + obstaclePositions[10] = new Point(2818, GROUNDLEVEL); + + enemyType = new int[] { KOOPAGREEN, GOOMBA, GOOMBA, GOOMBA, GOOMBA }; + enemyPositions[0] = new Point(375, KOOPAGREENHEIGHT); + enemyPositions[1] = new Point(1041, GOOMBAHEIGHT); + enemyPositions[2] = new Point(1141, GOOMBAHEIGHT); + enemyPositions[3] = new Point(1882, GOOMBAHEIGHT); + enemyPositions[4] = new Point(2473, GOOMBAHEIGHT); + break; + // ----------------------------------------------- + // LEVEL 3 + // ----------------------------------------------- + case 3: + for (int i = 0; i < obstacleNumber; i++) { + isTall[i] = false; + if (i == 4) + isTall[i] = true; + if (i != 4 && i != 11 && i != 12) { + piranhaPopping[i] = true; + hasPiranha[i] = true; + } else { + piranhaPopping[i] = false; + hasPiranha[i] = false; + } + } + // PAGE 1 + obstaclePositions[0] = new Point(50, GROUNDLEVEL); + obstaclePositions[1] = new Point(130, GROUNDLEVEL); + obstaclePositions[2] = new Point(210, GROUNDLEVEL); + + obstaclePositions[3] = new Point(540, GROUNDLEVEL); + obstaclePositions[4] = new Point(620, GROUNDLEVEL); + obstaclePositions[5] = new Point(700, GROUNDLEVEL); + // PAGE 2 + obstaclePositions[6] = new Point(850, GROUNDLEVEL); + obstaclePositions[7] = new Point(925, GROUNDLEVEL); + obstaclePositions[8] = new Point(1000, GROUNDLEVEL); + obstaclePositions[9] = new Point(1075, GROUNDLEVEL); + obstaclePositions[10] = new Point(1150, GROUNDLEVEL); + obstaclePositions[11] = new Point(1350, GROUNDLEVEL); + + // PAGE 3 + obstaclePositions[12] = new Point(2000, GROUNDLEVEL); + + enemyType = new int[] { KOOPAGREEN, GOOMBA, GOOMBA, GOOMBA, GOOMBA, GOOMBA, GOOMBA, GOOMBA }; + + enemyPositions[0] = new Point(365, KOOPAGREENHEIGHT); + enemyPositions[1] = new Point(420, GOOMBAHEIGHT); + enemyPositions[2] = new Point(495, GOOMBAHEIGHT); + enemyPositions[3] = new Point(1250, GOOMBAHEIGHT); + enemyPositions[4] = new Point(1500, GOOMBAHEIGHT); + enemyPositions[5] = new Point(1575, GOOMBAHEIGHT); + enemyPositions[6] = new Point(1650, GOOMBAHEIGHT); + enemyPositions[7] = new Point(1725, GOOMBAHEIGHT); + + break; + // ----------------------------------------------- + // LEVEL 4 + // ----------------------------------------------- + case 4: + for (int i = 0; i < obstacleNumber; i++) { + isTall[i] = false; + if (i == 2 || i == 5 || i == 7 || i == 8 || i == 9 || i == 10) { + piranhaPopping[i] = true; + hasPiranha[i] = true; + } else { + if (i == 1 || i == 4 || i == 6) + isTall[i] = true; + piranhaPopping[i] = false; + hasPiranha[i] = false; + } + } + + // PAGE 1 + obstaclePositions[0] = new Point(185, GROUNDLEVEL); + obstaclePositions[1] = new Point(370, GROUNDLEVEL); + obstaclePositions[2] = new Point(700, GROUNDLEVEL); + // PAGE 2 + obstaclePositions[3] = new Point(900, GROUNDLEVEL); + obstaclePositions[4] = new Point(1300, GROUNDLEVEL); + // PAGE 3 + obstaclePositions[5] = new Point(1500, GROUNDLEVEL); + obstaclePositions[6] = new Point(1750, GROUNDLEVEL); + obstaclePositions[7] = new Point(2000, GROUNDLEVEL); + // PAGE 4 + + // PAGE 5 + obstaclePositions[8] = new Point(3064, GROUNDLEVEL); + obstaclePositions[9] = new Point(3264, GROUNDLEVEL); + // PAGE 6 + obstaclePositions[10] = new Point(4100, GROUNDLEVEL); + + enemyType = new int[] { KOOPARED, KOOPARED, KOOPAREDFLYING, GOOMBA, GOOMBA, GOOMBA, GOOMBA, KOOPAREDFLYING, + KOOPARED, KOOPARED, KOOPARED, FLYER }; + + enemyPositions[0] = new Point(470, KOOPAREDHEIGHT); + enemyPositions[1] = new Point(520, KOOPAREDHEIGHT); + + enemyPositions[2] = new Point(1000, KOOPAREDFLYINGHEIGHT); + enemyPositions[3] = new Point(1400, GOOMBAHEIGHT); + + enemyPositions[4] = new Point(2230, GOOMBAHEIGHT); + enemyPositions[5] = new Point(2280, GOOMBAHEIGHT); + enemyPositions[6] = new Point(2320, GOOMBAHEIGHT); + + enemyPositions[7] = new Point(3600, KOOPAREDFLYINGHEIGHT); + + enemyPositions[8] = new Point(3710, KOOPAREDHEIGHT); + enemyPositions[9] = new Point(3760, KOOPAREDHEIGHT); + enemyPositions[10] = new Point(3810, KOOPAREDHEIGHT); + enemyPositions[11] = new Point(3500, FLYERHEIGHT); + + break; + // ----------------------------------------------- + // LEVEL 5 + // ----------------------------------------------- + case 5: + for (int i = 0; i < obstacleNumber; i++) { + isTall[i] = false; + if (i == 0 || i == 2 || i == 4 || i == 10 || i == 11 || i == 14 || i == 16) { + piranhaPopping[i] = true; + hasPiranha[i] = true; + } else { + if (i == 1 || i == 3 || i == 6 || i == 7 || i == 8 || i == 9 || i == 12 || i == 15) + isTall[i] = true; + piranhaPopping[i] = false; + hasPiranha[i] = false; + } + } + // page1 + obstaclePositions[0] = new Point(150, GROUNDLEVEL); + obstaclePositions[1] = new Point(300, GROUNDLEVEL); + obstaclePositions[2] = new Point(600, GROUNDLEVEL); + // page2 + obstaclePositions[3] = new Point(800, GROUNDLEVEL); + obstaclePositions[4] = new Point(900, GROUNDLEVEL); + // page3 + obstaclePositions[5] = new Point(1600, GROUNDLEVEL); + obstaclePositions[6] = new Point(1700, GROUNDLEVEL); + obstaclePositions[7] = new Point(1800, GROUNDLEVEL); + obstaclePositions[8] = new Point(1900, GROUNDLEVEL); + obstaclePositions[9] = new Point(2000, GROUNDLEVEL); + // page4 + obstaclePositions[10] = new Point(2400, GROUNDLEVEL); + // page5 + obstaclePositions[11] = new Point(3100, GROUNDLEVEL); + obstaclePositions[12] = new Point(3200, GROUNDLEVEL); + // page6 + obstaclePositions[13] = new Point(3850, GROUNDLEVEL); + obstaclePositions[14] = new Point(3950, GROUNDLEVEL); + obstaclePositions[15] = new Point(4050, GROUNDLEVEL); + // page7 + // NONE\\ + // page8 + obstaclePositions[16] = new Point(5550, GROUNDLEVEL); + + enemyType = new int[] { KOOPAREDFLYING, GOOMBA, GOOMBA, KOOPAGREEN, KOOPAREDFLYING, KOOPAGREEN, KOOPAGREEN, + KOOPAGREEN, KOOPAREDFLYING, KOOPAREDFLYING, GOOMBA, GOOMBA, GOOMBA }; + + enemyPositions[0] = new Point(450, KOOPAREDFLYINGHEIGHT); + enemyPositions[1] = new Point(700, GOOMBAHEIGHT); + enemyPositions[2] = new Point(1000, GOOMBAHEIGHT); + enemyPositions[3] = new Point(1100, KOOPAGREENHEIGHT); + enemyPositions[4] = new Point(2100, KOOPAREDFLYINGHEIGHT); + enemyPositions[5] = new Point(2500, KOOPAGREENHEIGHT); + enemyPositions[6] = new Point(2600, KOOPAGREENHEIGHT); + enemyPositions[7] = new Point(2700, KOOPAGREENHEIGHT); + enemyPositions[8] = new Point(3400, KOOPAREDFLYINGHEIGHT); + enemyPositions[9] = new Point(3600, KOOPAREDFLYINGHEIGHT); + enemyPositions[10] = new Point(4700, GOOMBAHEIGHT); + enemyPositions[11] = new Point(4800, GOOMBAHEIGHT); + enemyPositions[12] = new Point(4800, GOOMBAHEIGHT); + break; + // ----------------------------------------------- + // LEVEL 6 + // ----------------------------------------------- + case 6: + for (int i = 0; i < obstacleNumber; i++) { + isTall[i] = false; + piranhaPopping[i] = false; + hasPiranha[i] = false; + if (i == 2 || i == 3 || i == 4 || i == 5 || i == 7 || i == 10 || i == 11) { + isTall[i] = true; + } else { + if (i == 13) { + piranhaPopping[i] = true; + hasPiranha[i] = true; + } + + } + } + obstaclePositions[0] = new Point(350, GROUNDLEVEL); + obstaclePositions[1] = new Point(1091, GROUNDLEVEL); + obstaclePositions[2] = new Point(1191, GROUNDLEVEL); + obstaclePositions[3] = new Point(1600, GROUNDLEVEL); + obstaclePositions[4] = new Point(1675, GROUNDLEVEL); + obstaclePositions[5] = new Point(1750, GROUNDLEVEL); + obstaclePositions[6] = new Point(2500, GROUNDLEVEL); + obstaclePositions[7] = new Point(2600, GROUNDLEVEL); + obstaclePositions[8] = new Point(2700, GROUNDLEVEL); + obstaclePositions[9] = new Point(3975, GROUNDLEVEL); + obstaclePositions[10] = new Point(4050, GROUNDLEVEL); + obstaclePositions[11] = new Point(4150, GROUNDLEVEL); + obstaclePositions[12] = new Point(4225, GROUNDLEVEL); + obstaclePositions[13] = new Point(5550, GROUNDLEVEL); + + enemyPositions[0] = new Point(-400, BANZAIHEIGHT); + enemyType[0] = BANZAI; + + break; + + // ----------------------------------------------- + // LEVEL 7 + // ----------------------------------------------- + case 7: + + for (int i = 0; i < obstacleNumber; i++) { + isTall[i] = false; + piranhaPopping[i] = false; + hasPiranha[i] = false; + if (i == 1 || i == 2 || i == 8) { + isTall[i] = true; + } else { + if (i == 0 || i == 3 || i == 5 || i == 7 || i == 9 || i == 10 || i == 11) { + piranhaPopping[i] = true; + hasPiranha[i] = true; + } + } + } + obstaclePositions[0] = new Point(250, GROUNDLEVEL); + obstaclePositions[1] = new Point(350, GROUNDLEVEL); + obstaclePositions[2] = new Point(450, GROUNDLEVEL); + obstaclePositions[3] = new Point(550, GROUNDLEVEL); + obstaclePositions[4] = new Point(800, GROUNDLEVEL); + obstaclePositions[5] = new Point(1000, GROUNDLEVEL); + obstaclePositions[6] = new Point(1200, GROUNDLEVEL); + obstaclePositions[7] = new Point(1400, GROUNDLEVEL); + obstaclePositions[8] = new Point(1800, GROUNDLEVEL); + obstaclePositions[9] = new Point(2400, GROUNDLEVEL); + obstaclePositions[10] = new Point(2550, GROUNDLEVEL); + obstaclePositions[11] = new Point(2700, GROUNDLEVEL); + obstaclePositions[12] = new Point(3100, GROUNDLEVEL); + obstaclePositions[13] = new Point(3600, GROUNDLEVEL); + + enemyType = new int[] { GOOMBA, GOOMBA, GOOMBA, GOOMBA, GOOMBA, WIGGLER }; + enemyPositions[0] = new Point(900, GOOMBAHEIGHT); + enemyPositions[1] = new Point(1100, GOOMBAHEIGHT); + enemyPositions[2] = new Point(1300, GOOMBAHEIGHT); + enemyPositions[3] = new Point(1600, GOOMBAHEIGHT); + enemyPositions[4] = new Point(2000, GOOMBAHEIGHT); + enemyPositions[5] = new Point(3250, WIGGLERHEIGHT); + break; + // ----------------------------------------------- + // LEVEL 8 + // ----------------------------------------------- + case 8: + + for (int i = 0; i < obstacleNumber; i++) { + isTall[i] = false; + piranhaPopping[i] = false; + hasPiranha[i] = false; + if (i == 2 || i == 3 || i == 4 || i == 6 || i == 8 || i == 11) { + isTall[i] = true; + } else { + if (i == 0 || i == 1 || i == 10 || i == 12 || i == 13) { + piranhaPopping[i] = true; + hasPiranha[i] = true; + } + } + } + + obstaclePositions[0] = new Point(100, GROUNDLEVEL); + obstaclePositions[1] = new Point(650, GROUNDLEVEL); + obstaclePositions[2] = new Point(1000, GROUNDLEVEL); + obstaclePositions[3] = new Point(1075, GROUNDLEVEL); + obstaclePositions[4] = new Point(1150, GROUNDLEVEL); + obstaclePositions[5] = new Point(1500, GROUNDLEVEL); + obstaclePositions[6] = new Point(1575, GROUNDLEVEL); + obstaclePositions[7] = new Point(1650, GROUNDLEVEL); + obstaclePositions[8] = new Point(1725, GROUNDLEVEL); + obstaclePositions[9] = new Point(1800, GROUNDLEVEL); + obstaclePositions[10] = new Point(2500, GROUNDLEVEL); + obstaclePositions[11] = new Point(3400, GROUNDLEVEL); + obstaclePositions[12] = new Point(4000, GROUNDLEVEL); + obstaclePositions[13] = new Point(4075, GROUNDLEVEL); + obstaclePositions[14] = new Point(5275, GROUNDLEVEL); + obstaclePositions[15] = new Point(5775, GROUNDLEVEL); + + enemyType = new int[] { BOO, FIREBOO, GOOMBA, BOO, GOOMBA, FIREBOO, GOOMBA, GOOMBA, BOBOMB }; + + enemyPositions[0] = new Point(350, BOOHEIGHT); + enemyPositions[1] = new Point(900, FIREBOOHEIGHT); + enemyPositions[2] = new Point(1200, GOOMBAHEIGHT); + enemyPositions[3] = new Point(1900, BOOHEIGHT); + enemyPositions[4] = new Point(2600, GOOMBAHEIGHT); + enemyPositions[5] = new Point(3500, FIREBOOHEIGHT); + enemyPositions[6] = new Point(4175, GOOMBAHEIGHT); + enemyPositions[7] = new Point(4250, GOOMBAHEIGHT); + enemyPositions[8] = new Point(5375, BOBOMBHEIGHT); + break; + case 9: + enemyType = new int[] { FLYER, GOOMBA, GOOMBA, KOOPAREDFLYING, KOOPAREDFLYING, KOOPAREDFLYING, + KOOPAREDFLYING, KOOPAREDFLYING, CHOMP }; + + enemyPositions[0] = new Point(400, FLYERHEIGHT); + enemyPositions[1] = new Point(950, GOOMBAHEIGHT); + enemyPositions[2] = new Point(1000, GOOMBAHEIGHT); + enemyPositions[3] = new Point(1300, KOOPAREDFLYINGHEIGHT - 10); + enemyPositions[4] = new Point(1500, KOOPAREDFLYINGHEIGHT - 10); + enemyPositions[5] = new Point(1700, KOOPAREDFLYINGHEIGHT - 10); + enemyPositions[6] = new Point(1900, KOOPAREDFLYINGHEIGHT - 10); + enemyPositions[7] = new Point(2100, KOOPAREDFLYINGHEIGHT - 10); + enemyPositions[8] = new Point(2850, CHOMPHEIGHT); + + for (int i = 0; i < obstacleNumber; i++) { + + piranhaPopping[i] = false; + hasPiranha[i] = false; + if (i == 0 || i == 3 || i == 5) { + isTall[i] = true; + } else { + if (i == 1 || i == 2 || i == 4) { + piranhaPopping[i] = true; + hasPiranha[i] = true; + } + } + } + + obstaclePositions[0] = new Point(200, GROUNDLEVEL); + obstaclePositions[1] = new Point(900, GROUNDLEVEL); + obstaclePositions[2] = new Point(1100, GROUNDLEVEL); + obstaclePositions[3] = new Point(2400, GROUNDLEVEL); + obstaclePositions[4] = new Point(2550, GROUNDLEVEL); + obstaclePositions[5] = new Point(2700, GROUNDLEVEL); + + default: + + } + + for (int j = 0; j < enemyNumber; j++) { + enemyFaceRight(j); + enemyDead[j] = false; + } + + for (int i = 0; i < obstacleNumber; i++) { + if (hasPiranha[i]) { // pick a random image number between 0 and 18 (inclusive) + obstacleImageNo[i] = (int) (Math.random() * 18) / 1; + } else + obstacleImageNo[i] = 0; + } + + // position the warp zone at the end of the level + warpzone = new Point(levellength, GROUNDLEVEL); + // *********** END OF STUFF THAT DEPENDS WHAT LEVEL YOU ARE ON ************ + + ingame = true; + System.out.println("Started level " + level); + } + + boolean isPlayerPosition(Point p) { + return (p.x == playerPosition.x && p.y == playerPosition.y); + } + + int isEnemyPosition(Point p) { + for (int i = 0; i < enemyNumber; i++) { + if (isEnemyX(p) != -1 && isEnemyY(p) != -1 && !enemyDead[i]) + return (i); + } + return (-1); + } + + boolean isObstaclePosition(Point p, boolean forMario) { + int obby; + for (int i = 0; i < obstacleNumber; i++) { + obby = isObstacleX(p, forMario); + if (obby != -1 && isObstacleY(p, obby, forMario) != -1) { + return (true); + } + } + return (false); + } + + boolean checkIfBlockingObstacle(Point p) { + boolean result = false; + int obby; + obby = isObstacleX(p, true); + if (obby != -1 && isBlockingObstacleY(p, obby)) { + piranhaPopping[obby] = false; + result = true; + } + for (int i = 0; i < obstacleNumber; i++) { + if (i != obby || !result) { + if (hasPiranha[i]) + piranhaPopping[i] = true; + } + } + if (!result) + startPosY = GROUNDLEVEL; + return (result); + } + + int isObstacleX(Point p, boolean forMario) { + int obstaclex; + for (int i = 0; i < obstacleNumber; i++) { + // if x is >= obstacleposition - (MARIOLEFTOFOBSTACLE) and x <= obstacleposition + // + (MARIORIGHTOFOBSTACLE) + obstaclex = obstaclePositions[i].x; + if (forMario) { + if (p.x >= (obstaclex - MARIOLEFTOFOBSTACLE) && p.x <= (obstaclex + MARIORIGHTOFOBSTACLE)) + return (i); // return the number of the matching obstacle + } else { + if (p.x >= (obstaclex - ENEMYLEFTOFOBSTACLE) && p.x <= (obstaclex + ENEMYRIGHTOFOBSTACLE)) + return (i); // return the number of the matching obstacle + } + } + return (-1); + } + + boolean isBlockingObstacleY(Point p, int obstaclenumber) { + if (isTall[obstaclenumber]) { + if (p.y <= obstaclePositions[obstaclenumber].y - (OBSTACLEHEIGHT + TALLOBSTACLEDIFF)) { + // System.out.println(s+": Yes"); + return (true); + } + } else { + if (p.y <= obstaclePositions[obstaclenumber].y - OBSTACLEHEIGHT) { + // System.out.println(s+": Yes"); + return (true); + } + } + // System.out.println(s+": No"); + return (false); + } + + int isObstacleY(Point p, int obstaclenumber, boolean forMario) { + if (isTall[obstaclenumber]) { + if (p.y > obstaclePositions[obstaclenumber].y - (OBSTACLEHEIGHT + TALLOBSTACLEDIFF)) { + return (obstaclenumber); + } + } else { + if (p.y > obstaclePositions[obstaclenumber].y - OBSTACLEHEIGHT) { + return (obstaclenumber); + } + } + return (-1); + } + + int isEnemyX(Point p) { + int enemyx; + for (int i = 0; i < enemyNumber; i++) { + // if x is >= enemyposition - (LEFTOFENEMY) and x <= enemyposition + + // (RIGHTOFENEMY) + enemyx = enemyPositions[i].x; + // System.out.println("Player got by enemy if " + + // p.x + " >= " + (enemyx - MARIOLEFTOFENEMY) + " && " + p.x + " <= " + (enemyx + // + MARIORIGHTOFENEMY)); + if (p.x >= (enemyx - MARIOLEFTOFENEMY) && p.x <= (enemyx + MARIORIGHTOFENEMY) && !enemyDead[i]) + return (i); // return the number of the matching enemy + } + return (-1); + } + + int isEnemyY(Point p) { + int offset = herocrouching ? MARIOCROUCHOFFSET : MARIOOFFSET; + for (int i = 0; i < enemyNumber; i++) { + if (!enemyDead[i] && ((p.y + offset <= enemyPositions[i].y + enemySize[enemyType[i]]) + && (p.y + MARIOHEIGHT) >= enemyPositions[i].y)) + return (i); + } + return (-1); + } + + public void finished() { + finished = true; + System.exit(0); + } + + public String getAppletInfo() { + return ("Mario Game"); + } + + int randomMove() { + // return + or - value (randomly) + if (Math.random() >= 0.5) + return (24); + else + return (-24); + } + + private synchronized void incKeysDown(int whichone) { + keysdown[whichone] = 1; + } + + private synchronized void decKeysDown(int whichone) { + keysdown[whichone] = 0; + } + + // this class will use just the key pressed event + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_F1) { + displayStatus(); + } + if (ingame) { + if (!(e.getKeyCode() == KeyEvent.VK_LEFT && playerPosition.x <= (LEFTEDGE + XAMOUNT))) { + + // valid move: move the player and then move the enemies + if (e.getKeyCode() == KeyEvent.VK_DOWN) { + herocrouching = true; + incKeysDown(DOWNDOWN); + setSomethingChangedSinceRepaint(true); + } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { + incKeysDown(LEFTDOWN); + leftPressed(false); + setSomethingChangedSinceRepaint(true); + } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { + incKeysDown(RIGHTDOWN); + rightPressed(false); + setSomethingChangedSinceRepaint(true); + } else if (e.getKeyCode() == KeyEvent.VK_SPACE) { + if (!jumping) { + startPosY = playerPosition.y; + jumping = true; + onTheWayUp = true; + setSomethingChangedSinceRepaint(true); + } + } + if (somethingChangedSinceRepaint) { + area.repaint(); + } + } // if valid key press + } else if (e.getKeyCode() == KeyEvent.VK_ENTER) { + if (level == MAXLEVEL || dead) + doLevel(level); + else + doLevel(++level); + page = 0; + area.repaint(); + } + } + + /* synchronized */ void setSomethingChangedSinceRepaint(boolean val) { + somethingChangedSinceRepaint = val; + } + + void leftPressed(boolean skid) { + if (!herocrouching) { + // if Hero was facing right, turn him left + if (!heroleft) + faceLeft(); + else { + // if the target position is not occupied by a obstacle... + for (int i = 0; i < obstacleNumber; i++) { + if (isObstaclePosition(new Point(playerPosition.x - XAMOUNT, playerPosition.y), true)) + return; // can't move + } + playerPosition.x -= XAMOUNT; + if (!skid) + incrementHeroImage(); + } + } + } + + void rightPressed(boolean skid) { + if (!herocrouching) { + if ((playerPosition.x + SPACE_FROM_X_TO_MARIO) >= (warpzone.x + 4)) { + // level complete! + ingame = false; + } else { + // if Hero was facing left, turn him right + if (heroleft) + faceRight(); + else { + for (int i = 0; i < obstacleNumber; i++) { + if (isObstaclePosition(new Point(playerPosition.x + XAMOUNT, playerPosition.y), true)) + return; // can't move + } + playerPosition.x += XAMOUNT; + // System.out.println("Mario's x position is " + playerPosition.x); + if (!skid) + incrementHeroImage(); + } + } + } + } + + boolean anythingVisibleChanged() { + return (somethingChangedSinceRepaint); + } + + public void run() { + boolean odd = true; // only change piranha image every other cycle + while (true) { + if (juststarted) { + try { + Thread.sleep(750); + } catch (Exception e) { + } + area.repaint(); + juststarted = false; + } + try { + Thread.sleep(DELAY); + } catch (InterruptedException e) { + } + if (ingame) { + if (keysdown[LEFTDOWN] == 0 && keysdown[RIGHTDOWN] == 0 && keysdown[DOWNDOWN] == 0) + standStill(); + + if (keysdown[LEFTDOWN] > 0) { + leftPressed(false); + setSomethingChangedSinceRepaint(true); + } else if (keysdown[RIGHTDOWN] > 0) { + rightPressed(false); + setSomethingChangedSinceRepaint(true); + } + + if (!odd) { + // for each obstacle, cycle through the piranha pictures + for (int i = 0; i < obstacleNumber; i++) { + if (piranhaPopping[i]) { + incrementObstacleImage(i); + if (isVisibleObstacle(i)) + setSomethingChangedSinceRepaint(true); + } + } + } + odd = !odd; + + // for each enemy, move the enemy in the direction it was going + for (int i = 0; i < enemyNumber; i++) { + // TODO if there is a fatal obstacle at that position, fall into it and + // decrement count of enemies + // and set that enemy's position to -1, -1 + /* + * if (isObstaclePosition(enemyPositions[i])) { + * System.out.Println("A enemy fell into a obstacle"); + * + * enemyPositions[i] = new Point(-1, -1); enemiesRemaining--; + * System.out.Println(enemyNumber-enemiesRemaining + " down, " + + * enemiesRemaining + " to go..."); } + */ + // if there is a non-fatal obstacle + if (isObstaclePosition(enemyPositions[i], false) && enemyType[i] != BANZAI) { + // change direction + changeDirection(i); + if (isVisibleEnemy(i)) + setSomethingChangedSinceRepaint(true); + } + if (!enemyDead[i]) { + enemyPositions[i] = move(i, enemyPositions[i], enemyDirection[i], odd); + if (isVisibleEnemy(i)) + setSomethingChangedSinceRepaint(true); + } + + // if player is caught by a enemy, end the game + int enemyno = isEnemyPosition(playerPosition); + if (enemyno > -1) { + int NEEDTOBEABOVE = enemyPositions[enemyno].y + enemyTopSpace[enemyno] - MARIOHEIGHT; + if (easymode) + NEEDTOBEABOVE = enemyPositions[enemyno].y - enemyHeight[enemyType[enemyno]]; + if ((!onTheWayUp && (playerPosition.y <= NEEDTOBEABOVE)) && enemyType[enemyno] != BANZAI) { + // player may have squished an enemy + if (enemyType[enemyno] == KOOPAREDFLYING) { + enemyType[enemyno] = KOOPARED; + enemyPositions[enemyno].y = KOOPAREDHEIGHT; + if (enemyDirection[enemyno] == LEFT) + enemyFaceLeft(enemyno); + else + enemyFaceRight(enemyno); + } else { + enemyDead[enemyno] = true; + enemyDie(enemyno); + } + // player bounces + bouncing = true; + startPosY = playerPosition.y; + setSomethingChangedSinceRepaint(true); + } else { + int offset = herocrouching ? MARIOCROUCHOFFSET : MARIOOFFSET; + if (playerPosition.y > NEEDTOBEABOVE && (playerPosition.y + + offset <= enemyPositions[enemyno].y + enemySize[enemyType[enemyno]])) { + die(); + setSomethingChangedSinceRepaint(true); + } + } + } + } + if (!dead) { + if (onTheWayUp) { + if (playerPosition.y > startPosY - JUMPAMOUNT) { + playerPosition = new Point(playerPosition.x, playerPosition.y - RISEAMOUNT); + setSomethingChangedSinceRepaint(true); + } else { + onTheWayUp = false; + } + } else if (bouncing) { + if (playerPosition.y > startPosY - BOUNCEAMOUNT) { + playerPosition = new Point(playerPosition.x, playerPosition.y - RISEAMOUNT); + setSomethingChangedSinceRepaint(true); + } else { + bouncing = false; + wasbouncing = true; + } + } else { + int obstacleno = isObstacleX(playerPosition, true); + if (obstacleno == -1) { // no obstacle at this position + if (!onTheWayUp && !bouncing) { + if (playerPosition.y < startPosY) { + playerPosition = new Point(playerPosition.x, playerPosition.y + FALLAMOUNT); + if (playerPosition.y >= GROUNDLEVEL && floorIsIcy()) { + if (!wasbouncing) { + if (heroleft) + skidLeft(); + else + skidRight(); + } + } + wasbouncing = false; + setSomethingChangedSinceRepaint(true); + } else + jumping = false; + } + } else { + Point obstaclepos = obstaclePositions[obstacleno]; + // if hero's y position <= obstacle's height + int thisObstacleHeight = isTall[obstacleno] ? OBSTACLEHEIGHT + TALLOBSTACLEDIFF + : OBSTACLEHEIGHT; + if (playerPosition.y <= (obstaclepos.y - thisObstacleHeight) && // can't land on the + // obstacle if just < (??!) + (playerPosition.y + FALLAMOUNT >= (obstaclepos.y - thisObstacleHeight))) { + // allow hero to land on the obstacle + jumping = false; + if (playerPosition.y != obstaclepos.y - thisObstacleHeight) + setSomethingChangedSinceRepaint(true); + playerPosition = new Point(playerPosition.x, obstaclepos.y - thisObstacleHeight); + // if the piranha was up, Hero dies + if (obstacleImages[obstacleImageNo[obstacleno]] != area.obstacle) { + die(); + } else { + // otherwise stop this Piranha + piranhaPopping[obstacleno] = false; + } + } else { + if (!onTheWayUp && !bouncing) { + if (playerPosition.y < startPosY) { + setSomethingChangedSinceRepaint(true); + playerPosition = new Point(playerPosition.x, playerPosition.y + FALLAMOUNT); + if (playerPosition.y >= GROUNDLEVEL && floorIsIcy()) { + if (!wasbouncing) { + if (heroleft) + skidLeft(); + else + skidRight(); + } + } + wasbouncing = false; + } else + jumping = false; + } + } + } + } + if (!dead) { + checkIfBlockingObstacle(playerPosition); + if (playerPosition.y > GROUNDLEVEL) + playerPosition.y = GROUNDLEVEL; + } + if (anythingVisibleChanged()) { + area.repaint(); + } + } else { + if (!area.showingMessage) + area.repaint(); + } + } + } + } + + boolean isVisibleObstacle(int i) { + // TODO - this probably needs fixing when obstacle is near page boundary + return ((obstaclePositions[i].x >= page * PAGEWIDTH) && (obstaclePositions[i].x < (page + 1) * PAGEWIDTH)); + } + + boolean isVisibleEnemy(int i) { + // TODO - this probably needs fixing when enemy is near page boundary + return ((enemyPositions[i].x >= page * PAGEWIDTH) && (enemyPositions[i].x < (page + 1) * PAGEWIDTH) + && !enemyDead[i]); + } + + void changeDirection(int enemyno) { + if (enemyDirection[enemyno] == LEFT) { + enemyFaceRight(enemyno); + } else { + enemyFaceLeft(enemyno); + } + } + + synchronized void die() { + System.out.println("The Player is dead. Press the Enter key to restart the level"); + ingame = false; + dead = true; + displayStatus(); + } + + synchronized void incrementObstacleImage(int i) { + obstacleImageNo[i]++; + if (obstacleImageNo[i] == OBSTACLEIMAGES) + obstacleImageNo[i] = 0; + } + + synchronized void incrementHeroImage() { + heroImageNo++; + if (heroImageNo == HEROIMAGES) + heroImageNo = 0; + } + + synchronized void incrementEnemyImage(int i) { + enemyImageNo[i]++; + if (enemyType[i] == WIGGLER) { + if (enemyImageNo[i] > (ENEMYIMAGES - 1)) + enemyImageNo[i] = 0; + } else { + if (enemyImageNo[i] > (ENEMYIMAGES - 2)) + enemyImageNo[i] = 0; + } + } + + Point move(int enemyNo, Point start, int direction, boolean odd) { + if (odd) + incrementEnemyImage(enemyNo); + if (direction == LEFT) { + return (new Point(start.x - enemyMove[enemyType[enemyNo]], start.y)); + } else { + return (new Point(start.x + enemyMove[enemyType[enemyNo]], start.y)); + } + } + + public void keyReleased(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_DOWN) { + herocrouching = false; + decKeysDown(DOWNDOWN); + } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { + if (floorIsIcy()) { + skidLeft(); + } + decKeysDown(LEFTDOWN); + } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { + if (floorIsIcy()) { + skidRight(); + } + decKeysDown(RIGHTDOWN); + } + } + + public void keyTyped(KeyEvent e) { + } + + synchronized Image getHeroImage() { + return (heroImages[heroImageNo]); + } + + synchronized Image getObstacleImage(int obstaclenum) { + return (obstacleImages[obstacleImageNo[obstaclenum]]); + } + + synchronized Image getEnemyImage(int enemyno) { + return (enemyImage[enemyno][enemyImageNo[enemyno]]); + } + + boolean floorIsIcy() { + return (floors[level - 1] == area.icefloor); + } + + void skidLeft() { + for (int i = 0; i < 6; i++) { + leftPressed(true); + try { + Thread.sleep(7); + } catch (Exception e) { + } + area.repaint(); + } + } + + void skidRight() { + for (int i = 0; i < 6; i++) { + rightPressed(true); + area.repaint(); + try { + Thread.sleep(7); + } catch (Exception e) { + } + } + } + + void displayStatus() { + /* + * // when a certain F Key is pressed, display positions of Mario, // all pipes + * and all enemies and the end flag (warp zone) System.out.println("--------"); + * System.out.println("Mario is " + (dead? "dead" : "alive")); if (dead) { int + * enemyno = isEnemyPosition(playerPosition); + * System.out.println("Mario was killed by enemy " + enemyno); } + * System.out.println("In game is " + ingame); System.out.println("Mario is " + + * (onTheWayUp? "on the way up" : "not on the way up")); + * System.out.println("Mario's position is (" + playerPosition.x + ", " + + * playerPosition.y + ")"); + * System.out.println("Mario's visible left, bottom co-ordinates are " + + * (playerPosition.x + 55) + " and " + (playerPosition.y + MARIOHEIGHT)); + * System.out.println("Mario is on page " + page + + * " (which shows x positions from " + (page*PAGEWIDTH) + " to " + + * ((page+1)*PAGEWIDTH) + ")"); System.out.println("Screen bounds are (" + + * getBounds().width + ", " + getBounds().height + ")"); System.out.println(""); + * for (int enemy=0; enemy < enemyNumber; enemy++) { System.out.println("Enemy " + * + enemy + " is " + enemyTypeString(enemyType[enemy]) + " and is " + + * (enemyDead[enemy] ? " " : "not ") + "dead"); System.out.println("Enemy " + + * enemy + " is at position (" + enemyPositions[enemy].x + ", " + + * enemyPositions[enemy].y+") and has size " + enemySize[enemyType[enemy]]); } + * //System.out.println(""); //for (int obstacle=0; obstacle < obstacleNumber; + * obstacle++) { // System.out.println("Obstacle " + obstacle + + * " is at position (" + obstaclePositions[obstacle].x + // ", " + + * obstaclePositions[obstacle].y+")"); //} System.out.println(""); + * System.out.println("The warp zone is positioned at (" + warpzone.x + ", " + + * warpzone.y + ")"); System.out.println("========"); + */ + } + + String enemyTypeString(int fortype) { + switch (fortype) { + case GOOMBA: + return ("GOOMBA"); + case KOOPARED: + return ("KOOPA RED"); + case KOOPAGREEN: + return ("KOOPA GREEN"); + case KOOPAREDFLYING: + return ("KOOPA RED FLYING"); + case BANZAI: + return ("BANZAI"); + case WIGGLER: + return ("WIGGLER"); + case BOO: + return ("BOO"); + case FIREBOO: + return ("FOREBOO"); + case BOBOMB: + return ("BOBOMB"); + case BULLET: + return ("BULLET"); + case WARSHIP: + return ("WARSHIP"); + case YETI: + return ("YETI"); + case FLYER: + return ("FLYER"); + default: + return ("Unknown type (" + fortype + ")"); + } + } + + void changePageIfNecessary() { + if (playerPosition.x == LEFTEDGE) + return; + if ((playerPosition.x + SPACE_FROM_X_TO_MARIO) > (page * PAGEWIDTH + RIGHTEDGE - XAMOUNT)) { + // System.out.println("Change page up: (" + playerPosition.x+ "+" + + // SPACE_FROM_X_TO_MARIO+ ") > (" + page+ "*" + PAGEWIDTH + "+" + RIGHTEDGE + + // "-" + XAMOUNT + ")"); + page++; + } else if ((playerPosition.x + SPACE_FROM_X_TO_MARIO) - (page * PAGEWIDTH) < (LEFTEDGE + XAMOUNT)) { + // System.out.println("Change page down: (" + playerPosition.x+ "+" + + // SPACE_FROM_X_TO_MARIO+ ")-(" + page+ "*" + PAGEWIDTH + ") < (" + LEFTEDGE+ + // "+" + XAMOUNT+")"); + page--; + } + } +} diff --git a/Mario/src/MarioArea.java b/Mario/src/MarioArea.java @@ -15,7 +15,7 @@ public class MarioArea extends JPanel implements ActionListener { static int FLOORLEVEL = 589; static final int FLOORWIDTH = 150; static int FLOORDIFF = 605 - FLOORLEVEL; - MarioGame myApplet = null; + Mario myApplet = null; Image mariotitle; Image icefloor; Image floor2; @@ -109,7 +109,7 @@ public class MarioArea extends JPanel implements ActionListener { MediaTracker mt = null; boolean showingMessage = false; - public MarioArea(MarioGame parent) { + public MarioArea(Mario parent) { mt = new MediaTracker(parent); myApplet = parent; upmushroom = load(parent, "1up!mushroom.gif"); @@ -210,7 +210,7 @@ public class MarioArea extends JPanel implements ActionListener { Floor10 = load(parent, "mariofloor10.gif"); } - Image load(MarioGame parent, String picture) { + Image load(Mario parent, String picture) { try { Image im = ImageIO.read(new File("../Assets/" + picture)); checkImage(im, picture); @@ -249,67 +249,67 @@ public class MarioArea extends JPanel implements ActionListener { g.setColor(Color.black); // paint the floor - if (MarioGame.floors[MarioGame.level - 1] != null) { + if (Mario.floors[Mario.level - 1] != null) { for (int pos = 0; pos < w; pos += FLOORWIDTH) { - g.drawImage(MarioGame.floors[MarioGame.level - 1], pos, FLOORLEVEL, Color.black, null); + g.drawImage(Mario.floors[Mario.level - 1], pos, FLOORLEVEL, Color.black, null); } } - if (!MarioGame.juststarted) { - if (MarioGame.obstaclePositions != null) { + if (!Mario.juststarted) { + if (Mario.obstaclePositions != null) { myApplet.changePageIfNecessary(); // show the obstacles from right to left (because pipes have white space to // their left but not their right) - for (int i = MarioGame.obstacleNumber - 1; i >= 0; i--) { + for (int i = Mario.obstacleNumber - 1; i >= 0; i--) { obstacleimage = myApplet.getObstacleImage(i); - if (MarioGame.isTall[i]) + if (Mario.isTall[i]) obstacleimage = tallobstacle; // only one image for this for now g.drawImage(obstacleimage, - MarioGame.obstaclePositions[i].x - (MarioGame.page * MarioGame.PAGEWIDTH), - MarioGame.obstaclePositions[i].y, Color.white, null); + Mario.obstaclePositions[i].x - (Mario.page * Mario.PAGEWIDTH), + Mario.obstaclePositions[i].y, Color.white, null); } } // show the enemies - if (MarioGame.enemyPositions != null) { - for (int i = 0; i < MarioGame.enemyNumber; i++) { + if (Mario.enemyPositions != null) { + for (int i = 0; i < Mario.enemyNumber; i++) { // if (!myApplet.enemyDead[i]) { enemyimage = myApplet.getEnemyImage(i); - g.drawImage(enemyimage, MarioGame.enemyPositions[i].x - (MarioGame.page * MarioGame.PAGEWIDTH), - MarioGame.enemyPositions[i].y, null); + g.drawImage(enemyimage, Mario.enemyPositions[i].x - (Mario.page * Mario.PAGEWIDTH), + Mario.enemyPositions[i].y, null); // } } } // draw Hero (on top of preceding images) - if (MarioGame.playerPosition != null) { + if (Mario.playerPosition != null) { // show the player Image herosimage = myApplet.getHeroImage(); - if (MarioGame.herocrouching) { - if (MarioGame.heroleft) + if (Mario.herocrouching) { + if (Mario.heroleft) herosimage = herocrouchleft; else herosimage = herocrouch; } - if (MarioGame.jumping) { - if (MarioGame.heroleft) + if (Mario.jumping) { + if (Mario.heroleft) herosimage = herojumpleft; else herosimage = herojump; } - g.drawImage(herosimage, MarioGame.playerPosition.x - (MarioGame.page * MarioGame.PAGEWIDTH), - MarioGame.playerPosition.y, /* Color.white, */ null); + g.drawImage(herosimage, Mario.playerPosition.x - (Mario.page * Mario.PAGEWIDTH), + Mario.playerPosition.y, /* Color.white, */ null); } } // draw warp image (on top of Hero) - if (MarioGame.warpzone != null) { + if (Mario.warpzone != null) { // show the warp zone at the end of the level - g.drawImage(herowarp, MarioGame.warpzone.x - (MarioGame.page * MarioGame.PAGEWIDTH), MarioGame.warpzone.y, + g.drawImage(herowarp, Mario.warpzone.x - (Mario.page * Mario.PAGEWIDTH), Mario.warpzone.y, Color.white, null); } - if (MarioGame.ingame == false && !MarioGame.juststarted) { - if (MarioGame.dead) { + if (Mario.ingame == false && !Mario.juststarted) { + if (Mario.dead) { // Hero is dead g.drawImage(herodead, myApplet.getBounds().width / 2, getBounds().height / 2, Color.white, null); } else { diff --git a/Mario/src/MarioGame.java b/Mario/src/MarioGame.java @@ -1,1509 +0,0 @@ - -/* Copyright (c) Mary Percival 2003 */ -/* Mario game Created May 2003 */ - -import java.awt.Color; -import java.awt.Image; -import java.awt.Point; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; - -import javax.swing.JFrame; - -public class MarioGame extends JFrame implements KeyListener, Runnable { - private static final long serialVersionUID = 7030451342808203557L; - boolean easymode = true; - static int MAXLEVEL = 9; - static int level = 0; - - // the levels so far are: - // 1 beginner level: 1 piranha & 1 goomba - // 2 introducing green koopa - // 3 more of the same - // 4 introducing red koopa (flying) - // 5 more and harder - // 6 ? - // 7 ? - // 8 ? - // 9 ? - - static int LEFT = 1; - static int RIGHT = 0; - // the next 2 constants are overridden in init once we know the screen size - static int RIGHTEDGE = 789; - static int BOTTOMEDGE = 800; - static int PAGEWIDTH = 741; - - static Point IMAGESIZE = new Point(152, 107); - static final int LEFTEDGE = -45; - static final int TOPEDGE = -10; - static int GROUNDLEVEL = 503; - static int startPosY; - static int JUMPAMOUNT = 90; - static int BOUNCEAMOUNT = 90; - static final int FALLAMOUNT = 16; // amount he falls each time interval - static final int RISEAMOUNT = 16; // amount he rises each time interval - static final int XAMOUNT = 12; - - static final int X = 1; - static final int Y = 2; - static final int NOT = 3; - static final int DELAY = 50; - - static final int OBSTACLEIMAGES = 19; - static final int HEROIMAGES = 4; - static final int ENEMYIMAGES = 3; - - // ---------------------------------------------------------------------------------------------- - // ENEMY TYPES - // ---------------------------------------------------------------------------------------------- - static final int ENEMYTYPES = 15; // goomba, koopa red, koopa green, koopa red flying, banzai, wiggler, boo, - // fireboo,bobomb,warship,yeti,chainchomp,atom - static final int GOOMBA = 0; - static final int KOOPARED = 1; - static final int KOOPAGREEN = 2; - static final int KOOPAREDFLYING = 3; - static final int BANZAI = 4; - static final int WIGGLER = 5; - static final int BOO = 6; - static final int FIREBOO = 7; - static final int BOBOMB = 8; - static final int BULLET = 9; - static final int WARSHIP = 10; - static final int YETI = 11; - static final int FLYER = 12; - static final int CHOMP = 13; - static final int ATOM = 14; - - // enemy positions (height) - static final int GOOMBAHEIGHT = GROUNDLEVEL + 55; - static final int KOOPAREDHEIGHT = GROUNDLEVEL + 39; - static final int KOOPAGREENHEIGHT = GROUNDLEVEL + 39; - static final int KOOPAREDFLYINGHEIGHT = GROUNDLEVEL - 16; - static final int BANZAIHEIGHT = GROUNDLEVEL - 90; - static final int WIGGLERHEIGHT = GROUNDLEVEL + 16; - static final int BOOHEIGHT = GROUNDLEVEL - 7; - static final int FIREBOOHEIGHT = GROUNDLEVEL - 7; - static final int BOBOMBHEIGHT = GROUNDLEVEL + 5; - static final int BULLETHEIGHT = GROUNDLEVEL + 55; - static final int WARSHIPHEIGHT = GROUNDLEVEL + 100; - static final int YETIHEIGHT = GROUNDLEVEL; - static final int FLYERHEIGHT = GROUNDLEVEL - 20; - static final int CHOMPHEIGHT = GROUNDLEVEL - 55; - static final int ATOMHEIGHT = GROUNDLEVEL + 40; - static int enemyHeight[] = new int[ENEMYTYPES]; - - static final int enemySize[] = { 27, 42, 42, 42, 172, 75, 37, 37, 74, 8, 152, 86, 86, 75, 25 }; - static final int enemyTopSpace[] = { 4, 13, 13, 0, 0, 10, 6, 6, 7, 0, 20, 8, 17, 10, 0 }; - - static final int SPACE_FROM_X_TO_MARIO = 55; - static final int MARIOHEIGHT = 86; - static final int MARIOOFFSET = 21; - static final int MARIOCROUCHOFFSET = 39; - static final int MARIOSTANDINGSIZE = 65; - static final int MARIOCROUCHINGSIZE = 45; - - static final int JUMPDURATION = 5; - static final int SUPERJUMPDURATION = 8; - static final int MARIOLEFTOFOBSTACLE = 45; // fudge factor because Mario image is diff size to obstacle image - static final int MARIORIGHTOFOBSTACLE = 10; // fudge factor because Mario image is diff size to obstacle image - static final int ENEMYLEFTOFOBSTACLE = 16; // fudge factor for enemy images - static final int ENEMYRIGHTOFOBSTACLE = 49; // >49 causes panic! - static final int MARIOLEFTOFENEMY = 73; - static final int MARIORIGHTOFENEMY = -23; - - static final int LEFTDOWN = 0; - static final int RIGHTDOWN = 1; - static final int DOWNDOWN = 2; - static final int SPACEDOWN = 3; - - static final int OBSTACLEHEIGHT = 42; - static final int TALLOBSTACLEDIFF = 28; - static final int OBSTACLEWIDTH = 86; - static int GROUNDDIFF = 605 - GROUNDLEVEL; - - // all member variables 'static' because shared with the enemy action thread - static MarioArea area; - static Thread timer; - static boolean finished = false; - static boolean ingame = false; - static boolean juststarted = true; - static Point warpzone; - static int[] keysdown = new int[4]; - static Point[] enemyPositions; - static Point playerPosition; - static Point[] obstaclePositions; - static boolean[] piranhaPopping; // one for each obstacle - static boolean[] hasPiranha; // one for each obstacle - static boolean[] isTall; // one for each obstacle - static int enemyDirection[]; - static int enemyNumber = 1, enemiesRemaining = 1, obstacleNumber = 1; - static boolean herocrouching = false; - static boolean onTheWayUp = false; - static boolean bouncing = false; - static boolean wasbouncing = false; - static boolean dead = false; - static int page = 0; - static int heroImageNo = 0; - static int enemyImageNo[]; - static int levellength = 1482; - static Image[] heroImages = new Image[HEROIMAGES]; - static Image[] obstacleImages = new Image[OBSTACLEIMAGES]; // pipe, piranhapeep, piranha peepy etc - static Image[] squished = new Image[ENEMYTYPES]; // squished images for each enemy type - static Image[][][] enemyImages = new Image[ENEMYTYPES][2][ENEMYIMAGES]; // left right left right or whatever - static int obstacleImageNo[]; // what is the current image for obstacle n - static Image[][] enemyImage = new Image[ENEMYTYPES][ENEMYIMAGES];// what is the current image for enemy n? - static Image floors[] = new Image[MAXLEVEL]; - static int enemyType[]; // what is the type of enemy n? - static boolean enemyDead[]; // is enemy n dead? - static boolean heroleft = false; - static boolean jumping = false; - static int enemyMove[] = new int[ENEMYTYPES]; - boolean somethingChangedSinceRepaint = false; - - // ************************************************************* - public static void main(String[] args) { - MarioGame marioGame = new MarioGame(); - marioGame.setLayout(null); - marioGame.setBackground(Color.white); - marioGame.setSize(RIGHTEDGE, BOTTOMEDGE); - area = new MarioArea(marioGame); - marioGame.add(area); - //RIGHTEDGE = (marioGame.getBounds().width / XAMOUNT) * XAMOUNT + LEFTEDGE; - //BOTTOMEDGE = marioGame.getBounds().height - 1; - marioGame.setVisible(true); - area.setBounds(0, 0, RIGHTEDGE, BOTTOMEDGE); - //GROUNDLEVEL = marioGame.getBounds().height - GROUNDDIFF; - //GROUNDLEVEL = BOTTOMEDGE;// - GROUNDDIFF; - startPosY = GROUNDLEVEL; - //MarioArea.FLOORLEVEL = marioGame.getBounds().height - MarioArea.FLOORDIFF; - area.setVisible(true); - - marioGame.addKeyListener(marioGame); - area.addKeyListener(marioGame); - area.requestFocus(); - - obstacleImages[0] = area.obstacle; - obstacleImages[1] = area.obstacle; - obstacleImages[2] = area.obstacle; - obstacleImages[3] = area.obstacle; - obstacleImages[4] = area.piranhapeepo; - obstacleImages[5] = area.piranhapeep; - obstacleImages[6] = area.piranhapeepy; - obstacleImages[7] = area.piranha1; - obstacleImages[8] = area.piranha1; - obstacleImages[9] = area.piranha1; - obstacleImages[10] = area.piranha2; // - obstacleImages[11] = area.piranha2; // - obstacleImages[12] = area.piranha2; // - obstacleImages[13] = area.piranhapeepy; // - obstacleImages[14] = area.piranhapeep; // - obstacleImages[15] = area.piranhapeepo; - obstacleImages[16] = area.obstacle; // - obstacleImages[17] = area.obstacle; // - obstacleImages[18] = area.obstacle; // - - enemyImages[GOOMBA][RIGHT][0] = area.goomba; - enemyImages[GOOMBA][RIGHT][1] = area.goomba2; - enemyImages[GOOMBA][LEFT][0] = area.goombaleft; - enemyImages[GOOMBA][LEFT][1] = area.goomba2left; - - enemyImages[KOOPARED][RIGHT][0] = area.kooparedleft; - enemyImages[KOOPARED][RIGHT][1] = area.kooparedleft; - enemyImages[KOOPARED][LEFT][0] = area.koopared; - enemyImages[KOOPARED][LEFT][1] = area.koopared; - - enemyImages[KOOPAGREEN][RIGHT][0] = area.koopagreen; - enemyImages[KOOPAGREEN][RIGHT][1] = area.koopagreen; - enemyImages[KOOPAGREEN][LEFT][0] = area.koopagreenleft; - enemyImages[KOOPAGREEN][LEFT][1] = area.koopagreenleft; - - enemyImages[KOOPAREDFLYING][RIGHT][0] = area.kooparedfleft; - enemyImages[KOOPAREDFLYING][RIGHT][1] = area.kooparedfleft; - enemyImages[KOOPAREDFLYING][LEFT][0] = area.kooparedf; - enemyImages[KOOPAREDFLYING][LEFT][1] = area.kooparedf; - - enemyImages[BANZAI][RIGHT][0] = area.Banzai; - enemyImages[BANZAI][RIGHT][1] = area.Banzai; - enemyImages[BANZAI][LEFT][0] = area.Banzai; - enemyImages[BANZAI][LEFT][1] = area.Banzai; - - enemyImages[WIGGLER][RIGHT][0] = area.Wiglerright; - enemyImages[WIGGLER][RIGHT][1] = area.Wiglerright1; - enemyImages[WIGGLER][RIGHT][2] = area.Wiglerright2; - enemyImages[WIGGLER][LEFT][0] = area.Wiglerleft; - enemyImages[WIGGLER][LEFT][1] = area.Wiglerleft1; - enemyImages[WIGGLER][LEFT][2] = area.Wiglerleft2; - - enemyImages[BOO][RIGHT][0] = area.Boo2; - enemyImages[BOO][RIGHT][1] = area.Boo2; - enemyImages[BOO][LEFT][0] = area.Boo1; - enemyImages[BOO][LEFT][1] = area.Boo1; - - enemyImages[FIREBOO][RIGHT][0] = area.Fireboo2; - enemyImages[FIREBOO][RIGHT][1] = area.Fireboo2; - enemyImages[FIREBOO][LEFT][0] = area.Fireboo1; - enemyImages[FIREBOO][LEFT][1] = area.Fireboo1; - - enemyImages[BOBOMB][LEFT][0] = area.Bobomb; - enemyImages[BOBOMB][LEFT][1] = area.Bobomb2; - enemyImages[BOBOMB][RIGHT][0] = area.Bobombf; - enemyImages[BOBOMB][RIGHT][1] = area.Bobombf2; - - enemyImages[BULLET][LEFT][0] = area.Bullet; - enemyImages[BULLET][LEFT][1] = area.Bullet; - enemyImages[BULLET][RIGHT][0] = area.Bullet; - enemyImages[BULLET][RIGHT][1] = area.Bullet; - - enemyImages[WARSHIP][LEFT][0] = area.Warship1; - enemyImages[WARSHIP][LEFT][1] = area.Warship2; - enemyImages[WARSHIP][RIGHT][0] = area.Warship1; - enemyImages[WARSHIP][RIGHT][1] = area.Warship2; - - enemyImages[YETI][LEFT][0] = area.Yetil1; - enemyImages[YETI][LEFT][1] = area.Yetil2; - enemyImages[YETI][RIGHT][0] = area.Yetir1; - enemyImages[YETI][RIGHT][1] = area.Yetir2; - - enemyImages[FLYER][LEFT][0] = area.p1fl; - enemyImages[FLYER][LEFT][1] = area.p2fl; - enemyImages[FLYER][RIGHT][0] = area.p1fr; - enemyImages[FLYER][RIGHT][1] = area.p2fr; - - enemyImages[CHOMP][LEFT][0] = area.chainchomp1; - enemyImages[CHOMP][LEFT][1] = area.chainchomp2; - enemyImages[CHOMP][RIGHT][0] = area.chainchomp1; - enemyImages[CHOMP][RIGHT][1] = area.chainchomp2; - - enemyImages[ATOM][LEFT][0] = area.Atom1; - enemyImages[ATOM][LEFT][1] = area.Atom2; - enemyImages[ATOM][RIGHT][0] = area.Atom1; - enemyImages[ATOM][RIGHT][1] = area.Atom2; - - enemyMove[GOOMBA] = 5; - enemyMove[KOOPARED] = 5; - enemyMove[KOOPAGREEN] = 5; - enemyMove[KOOPAREDFLYING] = 8; - enemyMove[BANZAI] = 16; - enemyMove[WIGGLER] = 15; - enemyMove[BOO] = 5; - enemyMove[FIREBOO] = 10; - enemyMove[BOBOMB] = 5; - enemyMove[BULLET] = 10; - enemyMove[WARSHIP] = 20; - enemyMove[YETI] = 5; - enemyMove[FLYER] = 10; - enemyMove[CHOMP] = 0; - enemyMove[ATOM] = 1; - - enemyHeight[GOOMBA] = 40; - enemyHeight[KOOPARED] = 33; - enemyHeight[KOOPAGREEN] = 33; - enemyHeight[KOOPAREDFLYING] = 33; - enemyHeight[BANZAI] = 60; - enemyHeight[WIGGLER] = 33; - enemyHeight[BOO] = 33; - enemyHeight[FIREBOO] = 33; - enemyHeight[BOBOMB] = 33; - enemyHeight[BULLET] = 5; - enemyHeight[WARSHIP] = 50; - enemyHeight[YETI] = 33; - enemyHeight[FLYER] = 50; - enemyHeight[CHOMP] = 60; - enemyHeight[ATOM] = 22; - - squished[GOOMBA] = area.squishedgoomba; - squished[KOOPARED] = area.redshell; - squished[KOOPAGREEN] = area.greenshell; - squished[KOOPAREDFLYING] = area.koopared; - squished[BANZAI] = area.Banzai; // not actually used - squished[WIGGLER] = area.Wiglerleft; // not actually used - squished[BOO] = area.Boo1; - squished[FIREBOO] = area.Fireboo1; - squished[BOBOMB] = area.Bobomb; - squished[BULLET] = area.Bullet; - squished[WARSHIP] = area.Warship2; - squished[YETI] = area.Yetil1; - squished[FLYER] = area.p1fl; - squished[CHOMP] = area.chainchompdead; - squished[ATOM] = area.Atom1; - - for (int i = 0; i < MAXLEVEL; i++) { - floors[i] = area.floor4; - } - - floors[0] = area.floor4; - floors[1] = area.floor5; - floors[2] = area.floor3; - floors[3] = area.floor7; - floors[4] = area.floor8; - floors[5] = area.floor9; - floors[6] = area.floor2; - floors[7] = area.floor6; - floors[8] = area.Floor10; - - timer = new Thread(marioGame); - timer.start(); - - } - - synchronized void faceRight() { - heroImages[0] = area.herostand; - heroImages[1] = area.hero1; - heroImages[2] = area.herostand; - heroImages[3] = area.hero2; - heroImageNo = 0; - heroleft = false; - } - - synchronized void faceLeft() { - heroImages[0] = area.herostandleft; - heroImages[1] = area.hero1left; - heroImages[2] = area.herostandleft; - heroImages[3] = area.hero2left; - heroImageNo = 0; - heroleft = true; - } - - synchronized void enemyFaceRight(int enemyno) { - enemyImage[enemyno][0] = enemyImages[enemyType[enemyno]][RIGHT][0]; - enemyImage[enemyno][1] = enemyImages[enemyType[enemyno]][RIGHT][1]; - if (enemyType[enemyno] == WIGGLER) - enemyImage[enemyno][2] = enemyImages[enemyType[enemyno]][RIGHT][2]; - enemyDirection[enemyno] = RIGHT; - } - - synchronized void enemyFaceLeft(int enemyno) { - enemyImage[enemyno][0] = enemyImages[enemyType[enemyno]][LEFT][0]; - enemyImage[enemyno][1] = enemyImages[enemyType[enemyno]][LEFT][1]; - if (enemyType[enemyno] == WIGGLER) - enemyImage[enemyno][2] = enemyImages[enemyType[enemyno]][LEFT][2]; - enemyDirection[enemyno] = LEFT; - } - - synchronized void enemyDie(int enemyno) { - // displayStatus(); - enemyImage[enemyno][0] = squished[enemyType[enemyno]]; - enemyImage[enemyno][1] = squished[enemyType[enemyno]]; - if (enemyType[enemyno] == WIGGLER) - enemyImage[enemyno][2] = squished[enemyType[enemyno]]; - } - - synchronized void standStill() { - heroImageNo = 0; - } - - public void doLevel(int level) { - // this runs one 'level' - juststarted = true; - dead = false; - - // position Hero at the bottom left - playerPosition = new Point(LEFTEDGE, GROUNDLEVEL); - faceRight(); - - // *********** THIS STUFF DEPENDS WHAT LEVEL YOU ARE ON ************ - switch (level) { - case 1: - obstacleNumber = 4; // 4 pipes for level 1 - enemyNumber = 1; - levellength = 1482; // 2 pages - break; - case 2: - obstacleNumber = 11; - enemyNumber = 5; - levellength = 2964; // 4 pages - break; - case 3: - obstacleNumber = 13; - enemyNumber = 8; - levellength = 2223; // 3 pages - break; - case 4: - obstacleNumber = 11; - enemyNumber = 12; - levellength = 4446; // 6 pages - break; - case 5: - obstacleNumber = 17; - enemyNumber = 13; - levellength = 5928; // 8 pages - break; - case 6: - obstacleNumber = 14; - enemyNumber = 1; - levellength = 5928; // 8 pages - break; - case 7: - obstacleNumber = 14; - enemyNumber = 6; - levellength = 3705; // 5 pages - break; - case 8: - obstacleNumber = 16; - enemyNumber = 9; - levellength = 5928; // 8 pages - break; - case 9: - obstacleNumber = 6; - enemyNumber = 9; - levellength = 3705; // 5 pages - break; - case 10: - obstacleNumber = 29; - enemyNumber = 0; - levellength = 4446; // 6 pages - default: - System.out.println("Level " + level + " has not yet been implemented"); - } - - enemyImage = new Image[enemyNumber][ENEMYIMAGES];// what is the current image for enemy n? - // initialise piranha states - obstacleImageNo = new int[obstacleNumber]; - hasPiranha = new boolean[obstacleNumber]; - piranhaPopping = new boolean[obstacleNumber]; - isTall = new boolean[obstacleNumber]; - - // initialise the arrays of enemies, etc - enemyPositions = new Point[enemyNumber]; - enemyType = new int[enemyNumber]; - enemyDead = new boolean[enemyNumber]; - obstaclePositions = new Point[obstacleNumber]; - enemyDirection = new int[enemyNumber]; - enemyImageNo = new int[enemyNumber]; - - for (int i = 0; i < enemyNumber; i++) { - enemyImageNo[i] = 0; - } - - switch (level) { - // --------------------------------- - // LEVEL 1 - // --------------------------------- - case 1: - for (int i = 0; i < obstacleNumber; i++) { - isTall[i] = false; - if (i == 0) { - piranhaPopping[i] = true; - hasPiranha[i] = true; - } else { - if (i == 3) - isTall[i] = true; - piranhaPopping[i] = false; - hasPiranha[i] = false; - } - } - obstaclePositions[0] = new Point(400, GROUNDLEVEL); - obstaclePositions[1] = new Point(950, GROUNDLEVEL); - obstaclePositions[2] = new Point(1245, GROUNDLEVEL); // 1255 for adjacent - obstaclePositions[3] = new Point(1320, GROUNDLEVEL); - - enemyPositions[0] = new Point(1000, GOOMBAHEIGHT); - enemyType = new int[] { GOOMBA }; - break; - // ----------------------------------------------- - // LEVEL 2 - // ----------------------------------------------- - case 2: - for (int i = 0; i < obstacleNumber; i++) { - isTall[i] = false; - if (i == 2 || i == 7 || i == 8) { - piranhaPopping[i] = true; - hasPiranha[i] = true; - } else { - if (i == 4 || i == 6 || i == 10) - isTall[i] = true; - piranhaPopping[i] = false; - hasPiranha[i] = false; - } - } - - // PAGE 1 - obstaclePositions[0] = new Point(150, GROUNDLEVEL); - obstaclePositions[1] = new Point(225, GROUNDLEVEL); - obstaclePositions[2] = new Point(300, GROUNDLEVEL); - // PAGE 2 - obstaclePositions[3] = new Point(891, GROUNDLEVEL); - obstaclePositions[4] = new Point(966, GROUNDLEVEL); - // PAGE 3 - obstaclePositions[5] = new Point(1632, GROUNDLEVEL); - obstaclePositions[6] = new Point(1707, GROUNDLEVEL); - obstaclePositions[7] = new Point(1782, GROUNDLEVEL); - // PAGE 4 - obstaclePositions[8] = new Point(2373, GROUNDLEVEL); - obstaclePositions[9] = new Point(2743, GROUNDLEVEL); - obstaclePositions[10] = new Point(2818, GROUNDLEVEL); - - enemyType = new int[] { KOOPAGREEN, GOOMBA, GOOMBA, GOOMBA, GOOMBA }; - enemyPositions[0] = new Point(375, KOOPAGREENHEIGHT); - enemyPositions[1] = new Point(1041, GOOMBAHEIGHT); - enemyPositions[2] = new Point(1141, GOOMBAHEIGHT); - enemyPositions[3] = new Point(1882, GOOMBAHEIGHT); - enemyPositions[4] = new Point(2473, GOOMBAHEIGHT); - break; - // ----------------------------------------------- - // LEVEL 3 - // ----------------------------------------------- - case 3: - for (int i = 0; i < obstacleNumber; i++) { - isTall[i] = false; - if (i == 4) - isTall[i] = true; - if (i != 4 && i != 11 && i != 12) { - piranhaPopping[i] = true; - hasPiranha[i] = true; - } else { - piranhaPopping[i] = false; - hasPiranha[i] = false; - } - } - // PAGE 1 - obstaclePositions[0] = new Point(50, GROUNDLEVEL); - obstaclePositions[1] = new Point(130, GROUNDLEVEL); - obstaclePositions[2] = new Point(210, GROUNDLEVEL); - - obstaclePositions[3] = new Point(540, GROUNDLEVEL); - obstaclePositions[4] = new Point(620, GROUNDLEVEL); - obstaclePositions[5] = new Point(700, GROUNDLEVEL); - // PAGE 2 - obstaclePositions[6] = new Point(850, GROUNDLEVEL); - obstaclePositions[7] = new Point(925, GROUNDLEVEL); - obstaclePositions[8] = new Point(1000, GROUNDLEVEL); - obstaclePositions[9] = new Point(1075, GROUNDLEVEL); - obstaclePositions[10] = new Point(1150, GROUNDLEVEL); - obstaclePositions[11] = new Point(1350, GROUNDLEVEL); - - // PAGE 3 - obstaclePositions[12] = new Point(2000, GROUNDLEVEL); - - enemyType = new int[] { KOOPAGREEN, GOOMBA, GOOMBA, GOOMBA, GOOMBA, GOOMBA, GOOMBA, GOOMBA }; - - enemyPositions[0] = new Point(365, KOOPAGREENHEIGHT); - enemyPositions[1] = new Point(420, GOOMBAHEIGHT); - enemyPositions[2] = new Point(495, GOOMBAHEIGHT); - enemyPositions[3] = new Point(1250, GOOMBAHEIGHT); - enemyPositions[4] = new Point(1500, GOOMBAHEIGHT); - enemyPositions[5] = new Point(1575, GOOMBAHEIGHT); - enemyPositions[6] = new Point(1650, GOOMBAHEIGHT); - enemyPositions[7] = new Point(1725, GOOMBAHEIGHT); - - break; - // ----------------------------------------------- - // LEVEL 4 - // ----------------------------------------------- - case 4: - for (int i = 0; i < obstacleNumber; i++) { - isTall[i] = false; - if (i == 2 || i == 5 || i == 7 || i == 8 || i == 9 || i == 10) { - piranhaPopping[i] = true; - hasPiranha[i] = true; - } else { - if (i == 1 || i == 4 || i == 6) - isTall[i] = true; - piranhaPopping[i] = false; - hasPiranha[i] = false; - } - } - - // PAGE 1 - obstaclePositions[0] = new Point(185, GROUNDLEVEL); - obstaclePositions[1] = new Point(370, GROUNDLEVEL); - obstaclePositions[2] = new Point(700, GROUNDLEVEL); - // PAGE 2 - obstaclePositions[3] = new Point(900, GROUNDLEVEL); - obstaclePositions[4] = new Point(1300, GROUNDLEVEL); - // PAGE 3 - obstaclePositions[5] = new Point(1500, GROUNDLEVEL); - obstaclePositions[6] = new Point(1750, GROUNDLEVEL); - obstaclePositions[7] = new Point(2000, GROUNDLEVEL); - // PAGE 4 - - // PAGE 5 - obstaclePositions[8] = new Point(3064, GROUNDLEVEL); - obstaclePositions[9] = new Point(3264, GROUNDLEVEL); - // PAGE 6 - obstaclePositions[10] = new Point(4100, GROUNDLEVEL); - - enemyType = new int[] { KOOPARED, KOOPARED, KOOPAREDFLYING, GOOMBA, GOOMBA, GOOMBA, GOOMBA, KOOPAREDFLYING, - KOOPARED, KOOPARED, KOOPARED, FLYER }; - - enemyPositions[0] = new Point(470, KOOPAREDHEIGHT); - enemyPositions[1] = new Point(520, KOOPAREDHEIGHT); - - enemyPositions[2] = new Point(1000, KOOPAREDFLYINGHEIGHT); - enemyPositions[3] = new Point(1400, GOOMBAHEIGHT); - - enemyPositions[4] = new Point(2230, GOOMBAHEIGHT); - enemyPositions[5] = new Point(2280, GOOMBAHEIGHT); - enemyPositions[6] = new Point(2320, GOOMBAHEIGHT); - - enemyPositions[7] = new Point(3600, KOOPAREDFLYINGHEIGHT); - - enemyPositions[8] = new Point(3710, KOOPAREDHEIGHT); - enemyPositions[9] = new Point(3760, KOOPAREDHEIGHT); - enemyPositions[10] = new Point(3810, KOOPAREDHEIGHT); - enemyPositions[11] = new Point(3500, FLYERHEIGHT); - - break; - // ----------------------------------------------- - // LEVEL 5 - // ----------------------------------------------- - case 5: - for (int i = 0; i < obstacleNumber; i++) { - isTall[i] = false; - if (i == 0 || i == 2 || i == 4 || i == 10 || i == 11 || i == 14 || i == 16) { - piranhaPopping[i] = true; - hasPiranha[i] = true; - } else { - if (i == 1 || i == 3 || i == 6 || i == 7 || i == 8 || i == 9 || i == 12 || i == 15) - isTall[i] = true; - piranhaPopping[i] = false; - hasPiranha[i] = false; - } - } - // page1 - obstaclePositions[0] = new Point(150, GROUNDLEVEL); - obstaclePositions[1] = new Point(300, GROUNDLEVEL); - obstaclePositions[2] = new Point(600, GROUNDLEVEL); - // page2 - obstaclePositions[3] = new Point(800, GROUNDLEVEL); - obstaclePositions[4] = new Point(900, GROUNDLEVEL); - // page3 - obstaclePositions[5] = new Point(1600, GROUNDLEVEL); - obstaclePositions[6] = new Point(1700, GROUNDLEVEL); - obstaclePositions[7] = new Point(1800, GROUNDLEVEL); - obstaclePositions[8] = new Point(1900, GROUNDLEVEL); - obstaclePositions[9] = new Point(2000, GROUNDLEVEL); - // page4 - obstaclePositions[10] = new Point(2400, GROUNDLEVEL); - // page5 - obstaclePositions[11] = new Point(3100, GROUNDLEVEL); - obstaclePositions[12] = new Point(3200, GROUNDLEVEL); - // page6 - obstaclePositions[13] = new Point(3850, GROUNDLEVEL); - obstaclePositions[14] = new Point(3950, GROUNDLEVEL); - obstaclePositions[15] = new Point(4050, GROUNDLEVEL); - // page7 - // NONE\\ - // page8 - obstaclePositions[16] = new Point(5550, GROUNDLEVEL); - - enemyType = new int[] { KOOPAREDFLYING, GOOMBA, GOOMBA, KOOPAGREEN, KOOPAREDFLYING, KOOPAGREEN, KOOPAGREEN, - KOOPAGREEN, KOOPAREDFLYING, KOOPAREDFLYING, GOOMBA, GOOMBA, GOOMBA }; - - enemyPositions[0] = new Point(450, KOOPAREDFLYINGHEIGHT); - enemyPositions[1] = new Point(700, GOOMBAHEIGHT); - enemyPositions[2] = new Point(1000, GOOMBAHEIGHT); - enemyPositions[3] = new Point(1100, KOOPAGREENHEIGHT); - enemyPositions[4] = new Point(2100, KOOPAREDFLYINGHEIGHT); - enemyPositions[5] = new Point(2500, KOOPAGREENHEIGHT); - enemyPositions[6] = new Point(2600, KOOPAGREENHEIGHT); - enemyPositions[7] = new Point(2700, KOOPAGREENHEIGHT); - enemyPositions[8] = new Point(3400, KOOPAREDFLYINGHEIGHT); - enemyPositions[9] = new Point(3600, KOOPAREDFLYINGHEIGHT); - enemyPositions[10] = new Point(4700, GOOMBAHEIGHT); - enemyPositions[11] = new Point(4800, GOOMBAHEIGHT); - enemyPositions[12] = new Point(4800, GOOMBAHEIGHT); - break; - // ----------------------------------------------- - // LEVEL 6 - // ----------------------------------------------- - case 6: - for (int i = 0; i < obstacleNumber; i++) { - isTall[i] = false; - piranhaPopping[i] = false; - hasPiranha[i] = false; - if (i == 2 || i == 3 || i == 4 || i == 5 || i == 7 || i == 10 || i == 11) { - isTall[i] = true; - } else { - if (i == 13) { - piranhaPopping[i] = true; - hasPiranha[i] = true; - } - - } - } - obstaclePositions[0] = new Point(350, GROUNDLEVEL); - obstaclePositions[1] = new Point(1091, GROUNDLEVEL); - obstaclePositions[2] = new Point(1191, GROUNDLEVEL); - obstaclePositions[3] = new Point(1600, GROUNDLEVEL); - obstaclePositions[4] = new Point(1675, GROUNDLEVEL); - obstaclePositions[5] = new Point(1750, GROUNDLEVEL); - obstaclePositions[6] = new Point(2500, GROUNDLEVEL); - obstaclePositions[7] = new Point(2600, GROUNDLEVEL); - obstaclePositions[8] = new Point(2700, GROUNDLEVEL); - obstaclePositions[9] = new Point(3975, GROUNDLEVEL); - obstaclePositions[10] = new Point(4050, GROUNDLEVEL); - obstaclePositions[11] = new Point(4150, GROUNDLEVEL); - obstaclePositions[12] = new Point(4225, GROUNDLEVEL); - obstaclePositions[13] = new Point(5550, GROUNDLEVEL); - - enemyPositions[0] = new Point(-400, BANZAIHEIGHT); - enemyType[0] = BANZAI; - - break; - - // ----------------------------------------------- - // LEVEL 7 - // ----------------------------------------------- - case 7: - - for (int i = 0; i < obstacleNumber; i++) { - isTall[i] = false; - piranhaPopping[i] = false; - hasPiranha[i] = false; - if (i == 1 || i == 2 || i == 8) { - isTall[i] = true; - } else { - if (i == 0 || i == 3 || i == 5 || i == 7 || i == 9 || i == 10 || i == 11) { - piranhaPopping[i] = true; - hasPiranha[i] = true; - } - } - } - obstaclePositions[0] = new Point(250, GROUNDLEVEL); - obstaclePositions[1] = new Point(350, GROUNDLEVEL); - obstaclePositions[2] = new Point(450, GROUNDLEVEL); - obstaclePositions[3] = new Point(550, GROUNDLEVEL); - obstaclePositions[4] = new Point(800, GROUNDLEVEL); - obstaclePositions[5] = new Point(1000, GROUNDLEVEL); - obstaclePositions[6] = new Point(1200, GROUNDLEVEL); - obstaclePositions[7] = new Point(1400, GROUNDLEVEL); - obstaclePositions[8] = new Point(1800, GROUNDLEVEL); - obstaclePositions[9] = new Point(2400, GROUNDLEVEL); - obstaclePositions[10] = new Point(2550, GROUNDLEVEL); - obstaclePositions[11] = new Point(2700, GROUNDLEVEL); - obstaclePositions[12] = new Point(3100, GROUNDLEVEL); - obstaclePositions[13] = new Point(3600, GROUNDLEVEL); - - enemyType = new int[] { GOOMBA, GOOMBA, GOOMBA, GOOMBA, GOOMBA, WIGGLER }; - enemyPositions[0] = new Point(900, GOOMBAHEIGHT); - enemyPositions[1] = new Point(1100, GOOMBAHEIGHT); - enemyPositions[2] = new Point(1300, GOOMBAHEIGHT); - enemyPositions[3] = new Point(1600, GOOMBAHEIGHT); - enemyPositions[4] = new Point(2000, GOOMBAHEIGHT); - enemyPositions[5] = new Point(3250, WIGGLERHEIGHT); - break; - // ----------------------------------------------- - // LEVEL 8 - // ----------------------------------------------- - case 8: - - for (int i = 0; i < obstacleNumber; i++) { - isTall[i] = false; - piranhaPopping[i] = false; - hasPiranha[i] = false; - if (i == 2 || i == 3 || i == 4 || i == 6 || i == 8 || i == 11) { - isTall[i] = true; - } else { - if (i == 0 || i == 1 || i == 10 || i == 12 || i == 13) { - piranhaPopping[i] = true; - hasPiranha[i] = true; - } - } - } - - obstaclePositions[0] = new Point(100, GROUNDLEVEL); - obstaclePositions[1] = new Point(650, GROUNDLEVEL); - obstaclePositions[2] = new Point(1000, GROUNDLEVEL); - obstaclePositions[3] = new Point(1075, GROUNDLEVEL); - obstaclePositions[4] = new Point(1150, GROUNDLEVEL); - obstaclePositions[5] = new Point(1500, GROUNDLEVEL); - obstaclePositions[6] = new Point(1575, GROUNDLEVEL); - obstaclePositions[7] = new Point(1650, GROUNDLEVEL); - obstaclePositions[8] = new Point(1725, GROUNDLEVEL); - obstaclePositions[9] = new Point(1800, GROUNDLEVEL); - obstaclePositions[10] = new Point(2500, GROUNDLEVEL); - obstaclePositions[11] = new Point(3400, GROUNDLEVEL); - obstaclePositions[12] = new Point(4000, GROUNDLEVEL); - obstaclePositions[13] = new Point(4075, GROUNDLEVEL); - obstaclePositions[14] = new Point(5275, GROUNDLEVEL); - obstaclePositions[15] = new Point(5775, GROUNDLEVEL); - - enemyType = new int[] { BOO, FIREBOO, GOOMBA, BOO, GOOMBA, FIREBOO, GOOMBA, GOOMBA, BOBOMB }; - - enemyPositions[0] = new Point(350, BOOHEIGHT); - enemyPositions[1] = new Point(900, FIREBOOHEIGHT); - enemyPositions[2] = new Point(1200, GOOMBAHEIGHT); - enemyPositions[3] = new Point(1900, BOOHEIGHT); - enemyPositions[4] = new Point(2600, GOOMBAHEIGHT); - enemyPositions[5] = new Point(3500, FIREBOOHEIGHT); - enemyPositions[6] = new Point(4175, GOOMBAHEIGHT); - enemyPositions[7] = new Point(4250, GOOMBAHEIGHT); - enemyPositions[8] = new Point(5375, BOBOMBHEIGHT); - break; - case 9: - enemyType = new int[] { FLYER, GOOMBA, GOOMBA, KOOPAREDFLYING, KOOPAREDFLYING, KOOPAREDFLYING, - KOOPAREDFLYING, KOOPAREDFLYING, CHOMP }; - - enemyPositions[0] = new Point(400, FLYERHEIGHT); - enemyPositions[1] = new Point(950, GOOMBAHEIGHT); - enemyPositions[2] = new Point(1000, GOOMBAHEIGHT); - enemyPositions[3] = new Point(1300, KOOPAREDFLYINGHEIGHT - 10); - enemyPositions[4] = new Point(1500, KOOPAREDFLYINGHEIGHT - 10); - enemyPositions[5] = new Point(1700, KOOPAREDFLYINGHEIGHT - 10); - enemyPositions[6] = new Point(1900, KOOPAREDFLYINGHEIGHT - 10); - enemyPositions[7] = new Point(2100, KOOPAREDFLYINGHEIGHT - 10); - enemyPositions[8] = new Point(2850, CHOMPHEIGHT); - - for (int i = 0; i < obstacleNumber; i++) { - - piranhaPopping[i] = false; - hasPiranha[i] = false; - if (i == 0 || i == 3 || i == 5) { - isTall[i] = true; - } else { - if (i == 1 || i == 2 || i == 4) { - piranhaPopping[i] = true; - hasPiranha[i] = true; - } - } - } - - obstaclePositions[0] = new Point(200, GROUNDLEVEL); - obstaclePositions[1] = new Point(900, GROUNDLEVEL); - obstaclePositions[2] = new Point(1100, GROUNDLEVEL); - obstaclePositions[3] = new Point(2400, GROUNDLEVEL); - obstaclePositions[4] = new Point(2550, GROUNDLEVEL); - obstaclePositions[5] = new Point(2700, GROUNDLEVEL); - - default: - - } - - for (int j = 0; j < enemyNumber; j++) { - enemyFaceRight(j); - enemyDead[j] = false; - } - - for (int i = 0; i < obstacleNumber; i++) { - if (hasPiranha[i]) { // pick a random image number between 0 and 18 (inclusive) - obstacleImageNo[i] = (int) (Math.random() * 18) / 1; - } else - obstacleImageNo[i] = 0; - } - - // position the warp zone at the end of the level - warpzone = new Point(levellength, GROUNDLEVEL); - // *********** END OF STUFF THAT DEPENDS WHAT LEVEL YOU ARE ON ************ - - ingame = true; - System.out.println("Started level " + level); - } - - boolean isPlayerPosition(Point p) { - return (p.x == playerPosition.x && p.y == playerPosition.y); - } - - int isEnemyPosition(Point p) { - for (int i = 0; i < enemyNumber; i++) { - if (isEnemyX(p) != -1 && isEnemyY(p) != -1 && !enemyDead[i]) - return (i); - } - return (-1); - } - - boolean isObstaclePosition(Point p, boolean forMario) { - int obby; - for (int i = 0; i < obstacleNumber; i++) { - obby = isObstacleX(p, forMario); - if (obby != -1 && isObstacleY(p, obby, forMario) != -1) { - return (true); - } - } - return (false); - } - - boolean checkIfBlockingObstacle(Point p) { - boolean result = false; - int obby; - obby = isObstacleX(p, true); - if (obby != -1 && isBlockingObstacleY(p, obby)) { - piranhaPopping[obby] = false; - result = true; - } - for (int i = 0; i < obstacleNumber; i++) { - if (i != obby || !result) { - if (hasPiranha[i]) - piranhaPopping[i] = true; - } - } - if (!result) - startPosY = GROUNDLEVEL; - return (result); - } - - int isObstacleX(Point p, boolean forMario) { - int obstaclex; - for (int i = 0; i < obstacleNumber; i++) { - // if x is >= obstacleposition - (MARIOLEFTOFOBSTACLE) and x <= obstacleposition - // + (MARIORIGHTOFOBSTACLE) - obstaclex = obstaclePositions[i].x; - if (forMario) { - if (p.x >= (obstaclex - MARIOLEFTOFOBSTACLE) && p.x <= (obstaclex + MARIORIGHTOFOBSTACLE)) - return (i); // return the number of the matching obstacle - } else { - if (p.x >= (obstaclex - ENEMYLEFTOFOBSTACLE) && p.x <= (obstaclex + ENEMYRIGHTOFOBSTACLE)) - return (i); // return the number of the matching obstacle - } - } - return (-1); - } - - boolean isBlockingObstacleY(Point p, int obstaclenumber) { - if (isTall[obstaclenumber]) { - if (p.y <= obstaclePositions[obstaclenumber].y - (OBSTACLEHEIGHT + TALLOBSTACLEDIFF)) { - // System.out.println(s+": Yes"); - return (true); - } - } else { - if (p.y <= obstaclePositions[obstaclenumber].y - OBSTACLEHEIGHT) { - // System.out.println(s+": Yes"); - return (true); - } - } - // System.out.println(s+": No"); - return (false); - } - - int isObstacleY(Point p, int obstaclenumber, boolean forMario) { - if (isTall[obstaclenumber]) { - if (p.y > obstaclePositions[obstaclenumber].y - (OBSTACLEHEIGHT + TALLOBSTACLEDIFF)) { - return (obstaclenumber); - } - } else { - if (p.y > obstaclePositions[obstaclenumber].y - OBSTACLEHEIGHT) { - return (obstaclenumber); - } - } - return (-1); - } - - int isEnemyX(Point p) { - int enemyx; - for (int i = 0; i < enemyNumber; i++) { - // if x is >= enemyposition - (LEFTOFENEMY) and x <= enemyposition + - // (RIGHTOFENEMY) - enemyx = enemyPositions[i].x; - // System.out.println("Player got by enemy if " + - // p.x + " >= " + (enemyx - MARIOLEFTOFENEMY) + " && " + p.x + " <= " + (enemyx - // + MARIORIGHTOFENEMY)); - if (p.x >= (enemyx - MARIOLEFTOFENEMY) && p.x <= (enemyx + MARIORIGHTOFENEMY) && !enemyDead[i]) - return (i); // return the number of the matching enemy - } - return (-1); - } - - int isEnemyY(Point p) { - int offset = herocrouching ? MARIOCROUCHOFFSET : MARIOOFFSET; - for (int i = 0; i < enemyNumber; i++) { - if (!enemyDead[i] && ((p.y + offset <= enemyPositions[i].y + enemySize[enemyType[i]]) - && (p.y + MARIOHEIGHT) >= enemyPositions[i].y)) - return (i); - } - return (-1); - } - - public void finished() { - finished = true; - System.exit(0); - } - - public String getAppletInfo() { - return ("Mario Game"); - } - - int randomMove() { - // return + or - value (randomly) - if (Math.random() >= 0.5) - return (24); - else - return (-24); - } - - private synchronized void incKeysDown(int whichone) { - keysdown[whichone] = 1; - } - - private synchronized void decKeysDown(int whichone) { - keysdown[whichone] = 0; - } - - // this class will use just the key pressed event - public void keyPressed(KeyEvent e) { - if (e.getKeyCode() == KeyEvent.VK_F1) { - displayStatus(); - } - if (ingame) { - if (!(e.getKeyCode() == KeyEvent.VK_LEFT && playerPosition.x <= (LEFTEDGE + XAMOUNT))) { - - // valid move: move the player and then move the enemies - if (e.getKeyCode() == KeyEvent.VK_DOWN) { - herocrouching = true; - incKeysDown(DOWNDOWN); - setSomethingChangedSinceRepaint(true); - } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { - incKeysDown(LEFTDOWN); - leftPressed(false); - setSomethingChangedSinceRepaint(true); - } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { - incKeysDown(RIGHTDOWN); - rightPressed(false); - setSomethingChangedSinceRepaint(true); - } else if (e.getKeyCode() == KeyEvent.VK_SPACE) { - if (!jumping) { - startPosY = playerPosition.y; - jumping = true; - onTheWayUp = true; - setSomethingChangedSinceRepaint(true); - } - } - if (somethingChangedSinceRepaint) { - area.repaint(); - } - } // if valid key press - } else if (e.getKeyCode() == KeyEvent.VK_ENTER) { - if (level == MAXLEVEL || dead) - doLevel(level); - else - doLevel(++level); - page = 0; - area.repaint(); - } - } - - /* synchronized */ void setSomethingChangedSinceRepaint(boolean val) { - somethingChangedSinceRepaint = val; - } - - void leftPressed(boolean skid) { - if (!herocrouching) { - // if Hero was facing right, turn him left - if (!heroleft) - faceLeft(); - else { - // if the target position is not occupied by a obstacle... - for (int i = 0; i < obstacleNumber; i++) { - if (isObstaclePosition(new Point(playerPosition.x - XAMOUNT, playerPosition.y), true)) - return; // can't move - } - playerPosition.x -= XAMOUNT; - if (!skid) - incrementHeroImage(); - } - } - } - - void rightPressed(boolean skid) { - if (!herocrouching) { - if ((playerPosition.x + SPACE_FROM_X_TO_MARIO) >= (warpzone.x + 4)) { - // level complete! - ingame = false; - } else { - // if Hero was facing left, turn him right - if (heroleft) - faceRight(); - else { - for (int i = 0; i < obstacleNumber; i++) { - if (isObstaclePosition(new Point(playerPosition.x + XAMOUNT, playerPosition.y), true)) - return; // can't move - } - playerPosition.x += XAMOUNT; - // System.out.println("Mario's x position is " + playerPosition.x); - if (!skid) - incrementHeroImage(); - } - } - } - } - - boolean anythingVisibleChanged() { - return (somethingChangedSinceRepaint); - } - - public void run() { - boolean odd = true; // only change piranha image every other cycle - while (true) { - if (juststarted) { - try { - Thread.sleep(750); - } catch (Exception e) { - } - area.repaint(); - juststarted = false; - } - try { - Thread.sleep(DELAY); - } catch (InterruptedException e) { - } - if (ingame) { - if (keysdown[LEFTDOWN] == 0 && keysdown[RIGHTDOWN] == 0 && keysdown[DOWNDOWN] == 0) - standStill(); - - if (keysdown[LEFTDOWN] > 0) { - leftPressed(false); - setSomethingChangedSinceRepaint(true); - } else if (keysdown[RIGHTDOWN] > 0) { - rightPressed(false); - setSomethingChangedSinceRepaint(true); - } - - if (!odd) { - // for each obstacle, cycle through the piranha pictures - for (int i = 0; i < obstacleNumber; i++) { - if (piranhaPopping[i]) { - incrementObstacleImage(i); - if (isVisibleObstacle(i)) - setSomethingChangedSinceRepaint(true); - } - } - } - odd = !odd; - - // for each enemy, move the enemy in the direction it was going - for (int i = 0; i < enemyNumber; i++) { - // TODO if there is a fatal obstacle at that position, fall into it and - // decrement count of enemies - // and set that enemy's position to -1, -1 - /* - * if (isObstaclePosition(enemyPositions[i])) { - * System.out.Println("A enemy fell into a obstacle"); - * - * enemyPositions[i] = new Point(-1, -1); enemiesRemaining--; - * System.out.Println(enemyNumber-enemiesRemaining + " down, " + - * enemiesRemaining + " to go..."); } - */ - // if there is a non-fatal obstacle - if (isObstaclePosition(enemyPositions[i], false) && enemyType[i] != BANZAI) { - // change direction - changeDirection(i); - if (isVisibleEnemy(i)) - setSomethingChangedSinceRepaint(true); - } - if (!enemyDead[i]) { - enemyPositions[i] = move(i, enemyPositions[i], enemyDirection[i], odd); - if (isVisibleEnemy(i)) - setSomethingChangedSinceRepaint(true); - } - - // if player is caught by a enemy, end the game - int enemyno = isEnemyPosition(playerPosition); - if (enemyno > -1) { - int NEEDTOBEABOVE = enemyPositions[enemyno].y + enemyTopSpace[enemyno] - MARIOHEIGHT; - if (easymode) - NEEDTOBEABOVE = enemyPositions[enemyno].y - enemyHeight[enemyType[enemyno]]; - if ((!onTheWayUp && (playerPosition.y <= NEEDTOBEABOVE)) && enemyType[enemyno] != BANZAI) { - // player may have squished an enemy - if (enemyType[enemyno] == KOOPAREDFLYING) { - enemyType[enemyno] = KOOPARED; - enemyPositions[enemyno].y = KOOPAREDHEIGHT; - if (enemyDirection[enemyno] == LEFT) - enemyFaceLeft(enemyno); - else - enemyFaceRight(enemyno); - } else { - enemyDead[enemyno] = true; - enemyDie(enemyno); - } - // player bounces - bouncing = true; - startPosY = playerPosition.y; - setSomethingChangedSinceRepaint(true); - } else { - int offset = herocrouching ? MARIOCROUCHOFFSET : MARIOOFFSET; - if (playerPosition.y > NEEDTOBEABOVE && (playerPosition.y - + offset <= enemyPositions[enemyno].y + enemySize[enemyType[enemyno]])) { - die(); - setSomethingChangedSinceRepaint(true); - } - } - } - } - if (!dead) { - if (onTheWayUp) { - if (playerPosition.y > startPosY - JUMPAMOUNT) { - playerPosition = new Point(playerPosition.x, playerPosition.y - RISEAMOUNT); - setSomethingChangedSinceRepaint(true); - } else { - onTheWayUp = false; - } - } else if (bouncing) { - if (playerPosition.y > startPosY - BOUNCEAMOUNT) { - playerPosition = new Point(playerPosition.x, playerPosition.y - RISEAMOUNT); - setSomethingChangedSinceRepaint(true); - } else { - bouncing = false; - wasbouncing = true; - } - } else { - int obstacleno = isObstacleX(playerPosition, true); - if (obstacleno == -1) { // no obstacle at this position - if (!onTheWayUp && !bouncing) { - if (playerPosition.y < startPosY) { - playerPosition = new Point(playerPosition.x, playerPosition.y + FALLAMOUNT); - if (playerPosition.y >= GROUNDLEVEL && floorIsIcy()) { - if (!wasbouncing) { - if (heroleft) - skidLeft(); - else - skidRight(); - } - } - wasbouncing = false; - setSomethingChangedSinceRepaint(true); - } else - jumping = false; - } - } else { - Point obstaclepos = obstaclePositions[obstacleno]; - // if hero's y position <= obstacle's height - int thisObstacleHeight = isTall[obstacleno] ? OBSTACLEHEIGHT + TALLOBSTACLEDIFF - : OBSTACLEHEIGHT; - if (playerPosition.y <= (obstaclepos.y - thisObstacleHeight) && // can't land on the - // obstacle if just < (??!) - (playerPosition.y + FALLAMOUNT >= (obstaclepos.y - thisObstacleHeight))) { - // allow hero to land on the obstacle - jumping = false; - if (playerPosition.y != obstaclepos.y - thisObstacleHeight) - setSomethingChangedSinceRepaint(true); - playerPosition = new Point(playerPosition.x, obstaclepos.y - thisObstacleHeight); - // if the piranha was up, Hero dies - if (obstacleImages[obstacleImageNo[obstacleno]] != area.obstacle) { - die(); - } else { - // otherwise stop this Piranha - piranhaPopping[obstacleno] = false; - } - } else { - if (!onTheWayUp && !bouncing) { - if (playerPosition.y < startPosY) { - setSomethingChangedSinceRepaint(true); - playerPosition = new Point(playerPosition.x, playerPosition.y + FALLAMOUNT); - if (playerPosition.y >= GROUNDLEVEL && floorIsIcy()) { - if (!wasbouncing) { - if (heroleft) - skidLeft(); - else - skidRight(); - } - } - wasbouncing = false; - } else - jumping = false; - } - } - } - } - if (!dead) { - checkIfBlockingObstacle(playerPosition); - if (playerPosition.y > GROUNDLEVEL) - playerPosition.y = GROUNDLEVEL; - } - if (anythingVisibleChanged()) { - area.repaint(); - } - } else { - if (!area.showingMessage) - area.repaint(); - } - } - } - } - - boolean isVisibleObstacle(int i) { - // TODO - this probably needs fixing when obstacle is near page boundary - return ((obstaclePositions[i].x >= page * PAGEWIDTH) && (obstaclePositions[i].x < (page + 1) * PAGEWIDTH)); - } - - boolean isVisibleEnemy(int i) { - // TODO - this probably needs fixing when enemy is near page boundary - return ((enemyPositions[i].x >= page * PAGEWIDTH) && (enemyPositions[i].x < (page + 1) * PAGEWIDTH) - && !enemyDead[i]); - } - - void changeDirection(int enemyno) { - if (enemyDirection[enemyno] == LEFT) { - enemyFaceRight(enemyno); - } else { - enemyFaceLeft(enemyno); - } - } - - synchronized void die() { - System.out.println("The Player is dead. Press the Enter key to restart the level"); - ingame = false; - dead = true; - displayStatus(); - } - - synchronized void incrementObstacleImage(int i) { - obstacleImageNo[i]++; - if (obstacleImageNo[i] == OBSTACLEIMAGES) - obstacleImageNo[i] = 0; - } - - synchronized void incrementHeroImage() { - heroImageNo++; - if (heroImageNo == HEROIMAGES) - heroImageNo = 0; - } - - synchronized void incrementEnemyImage(int i) { - enemyImageNo[i]++; - if (enemyType[i] == WIGGLER) { - if (enemyImageNo[i] > (ENEMYIMAGES - 1)) - enemyImageNo[i] = 0; - } else { - if (enemyImageNo[i] > (ENEMYIMAGES - 2)) - enemyImageNo[i] = 0; - } - } - - Point move(int enemyNo, Point start, int direction, boolean odd) { - if (odd) - incrementEnemyImage(enemyNo); - if (direction == LEFT) { - return (new Point(start.x - enemyMove[enemyType[enemyNo]], start.y)); - } else { - return (new Point(start.x + enemyMove[enemyType[enemyNo]], start.y)); - } - } - - public void keyReleased(KeyEvent e) { - if (e.getKeyCode() == KeyEvent.VK_DOWN) { - herocrouching = false; - decKeysDown(DOWNDOWN); - } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { - if (floorIsIcy()) { - skidLeft(); - } - decKeysDown(LEFTDOWN); - } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { - if (floorIsIcy()) { - skidRight(); - } - decKeysDown(RIGHTDOWN); - } - } - - public void keyTyped(KeyEvent e) { - } - - synchronized Image getHeroImage() { - return (heroImages[heroImageNo]); - } - - synchronized Image getObstacleImage(int obstaclenum) { - return (obstacleImages[obstacleImageNo[obstaclenum]]); - } - - synchronized Image getEnemyImage(int enemyno) { - return (enemyImage[enemyno][enemyImageNo[enemyno]]); - } - - boolean floorIsIcy() { - return (floors[level - 1] == area.icefloor); - } - - void skidLeft() { - for (int i = 0; i < 6; i++) { - leftPressed(true); - try { - Thread.sleep(7); - } catch (Exception e) { - } - area.repaint(); - } - } - - void skidRight() { - for (int i = 0; i < 6; i++) { - rightPressed(true); - area.repaint(); - try { - Thread.sleep(7); - } catch (Exception e) { - } - } - } - - void displayStatus() { - /* - * // when a certain F Key is pressed, display positions of Mario, // all pipes - * and all enemies and the end flag (warp zone) System.out.println("--------"); - * System.out.println("Mario is " + (dead? "dead" : "alive")); if (dead) { int - * enemyno = isEnemyPosition(playerPosition); - * System.out.println("Mario was killed by enemy " + enemyno); } - * System.out.println("In game is " + ingame); System.out.println("Mario is " + - * (onTheWayUp? "on the way up" : "not on the way up")); - * System.out.println("Mario's position is (" + playerPosition.x + ", " + - * playerPosition.y + ")"); - * System.out.println("Mario's visible left, bottom co-ordinates are " + - * (playerPosition.x + 55) + " and " + (playerPosition.y + MARIOHEIGHT)); - * System.out.println("Mario is on page " + page + - * " (which shows x positions from " + (page*PAGEWIDTH) + " to " + - * ((page+1)*PAGEWIDTH) + ")"); System.out.println("Screen bounds are (" + - * getBounds().width + ", " + getBounds().height + ")"); System.out.println(""); - * for (int enemy=0; enemy < enemyNumber; enemy++) { System.out.println("Enemy " - * + enemy + " is " + enemyTypeString(enemyType[enemy]) + " and is " + - * (enemyDead[enemy] ? " " : "not ") + "dead"); System.out.println("Enemy " + - * enemy + " is at position (" + enemyPositions[enemy].x + ", " + - * enemyPositions[enemy].y+") and has size " + enemySize[enemyType[enemy]]); } - * //System.out.println(""); //for (int obstacle=0; obstacle < obstacleNumber; - * obstacle++) { // System.out.println("Obstacle " + obstacle + - * " is at position (" + obstaclePositions[obstacle].x + // ", " + - * obstaclePositions[obstacle].y+")"); //} System.out.println(""); - * System.out.println("The warp zone is positioned at (" + warpzone.x + ", " + - * warpzone.y + ")"); System.out.println("========"); - */ - } - - String enemyTypeString(int fortype) { - switch (fortype) { - case GOOMBA: - return ("GOOMBA"); - case KOOPARED: - return ("KOOPA RED"); - case KOOPAGREEN: - return ("KOOPA GREEN"); - case KOOPAREDFLYING: - return ("KOOPA RED FLYING"); - case BANZAI: - return ("BANZAI"); - case WIGGLER: - return ("WIGGLER"); - case BOO: - return ("BOO"); - case FIREBOO: - return ("FOREBOO"); - case BOBOMB: - return ("BOBOMB"); - case BULLET: - return ("BULLET"); - case WARSHIP: - return ("WARSHIP"); - case YETI: - return ("YETI"); - case FLYER: - return ("FLYER"); - default: - return ("Unknown type (" + fortype + ")"); - } - } - - void changePageIfNecessary() { - if (playerPosition.x == LEFTEDGE) - return; - if ((playerPosition.x + SPACE_FROM_X_TO_MARIO) > (page * PAGEWIDTH + RIGHTEDGE - XAMOUNT)) { - // System.out.println("Change page up: (" + playerPosition.x+ "+" + - // SPACE_FROM_X_TO_MARIO+ ") > (" + page+ "*" + PAGEWIDTH + "+" + RIGHTEDGE + - // "-" + XAMOUNT + ")"); - page++; - } else if ((playerPosition.x + SPACE_FROM_X_TO_MARIO) - (page * PAGEWIDTH) < (LEFTEDGE + XAMOUNT)) { - // System.out.println("Change page down: (" + playerPosition.x+ "+" + - // SPACE_FROM_X_TO_MARIO+ ")-(" + page+ "*" + PAGEWIDTH + ") < (" + LEFTEDGE+ - // "+" + XAMOUNT+")"); - page--; - } - } -} diff --git a/Pong/src/Pong.java b/Pong/src/Pong.java @@ -0,0 +1,246 @@ + +/* Copyright (c) Mike Percival 2004 */ +/* Pong game Created April 2004 */ + +import java.awt.Color; +import java.awt.Point; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; + +import javax.swing.JFrame; + +public class Pong extends JFrame implements KeyListener, Runnable { + private static final long serialVersionUID = 1018529427970832700L; + // all member variables 'static' because shared with the ball action thread + private static PongArea area; + private static boolean ingame = false; + private boolean juststarted = false; + private static int level = 1; + protected static Point[] ballPositions; + protected static Point playerPosition; + private static Thread balls; + + protected static int ballNumber = 1; + protected static int RIGHTEDGE = 800; + protected static final int LEFTEDGE = 0; + protected static final int TOPEDGE = 0; + protected static int BOTTOMEDGE = 800; + protected static int BALL_XAMOUNT = 3; + protected static int BALL_YAMOUNT = 3; + protected static int PLAYER_XAMOUNT = 12; + protected static int PLAYER_YAMOUNT = 12; + private static final int DELAY = 15; + boolean[] goingLeft, goingRight, goingUp, goingDown; + boolean deadball = false; + int timeSinceLastBall = 0; + + public static void main(String[] args) { + Pong Pong = new Pong(); + + Pong.setLayout(null); + Pong.setBackground(Color.black); + Pong.setSize(RIGHTEDGE, BOTTOMEDGE); + Pong.area = new PongArea(Pong); + Pong.add(area); + //RIGHTEDGE = Pong.getBounds().width - 1; + //BOTTOMEDGE = Pong.getBounds().height - 1; + Pong.setVisible(true); + area.setBounds(0, 0, RIGHTEDGE, BOTTOMEDGE); + area.setVisible(true); + + Pong.addKeyListener(Pong); + area.addKeyListener(Pong); + area.requestFocus(); + + balls = new Thread(Pong); + balls.start(); + + //EventQueue.invokeLater(Pong); + } + + public void doLevel(int level) { + // this runs one 'level' + // create arrays of ball balls here. + // Maybe each level will have different numbers? + juststarted = true; + deadball = false; + ballNumber = 1; + ballPositions = new Point[ballNumber]; + goingLeft = new boolean[ballNumber]; + goingRight = new boolean[ballNumber]; + goingUp = new boolean[ballNumber]; + goingDown = new boolean[ballNumber]; + + for (int i = 0; i < ballNumber; i++) { + ballPositions[i] = new Point(0, 0); + goingLeft[i] = true; + goingRight[i] = false; + goingUp[i] = false; + goingDown[i] = true; + } + + // System.out.println("Started level " + level); + + // randomly position 1 player, x balls + playerPosition = new Point(RIGHTEDGE - 20, 0); + + for (int i = 0; i < ballNumber; i++) { + ballPositions[i] = randomPosition(); + } + + // paint the panel here + area.repaint(); + ingame = true; + } + + private Point randomPosition() { + Point p = new Point((int) (Math.random() * RIGHTEDGE) / BALL_XAMOUNT * BALL_XAMOUNT, (int) 0); + if (p.x >= RIGHTEDGE * 2 / 3) + p.x = p.x - RIGHTEDGE / 3; + + return (p); + } + + synchronized void addABall() { + System.out.println("ADD A BALL!"); + Point[] newBallPos = new Point[ballNumber + 1]; + boolean[] newgl = new boolean[ballNumber + 1], newgr = new boolean[ballNumber + 1], + newgu = new boolean[ballNumber + 1], newgd = new boolean[ballNumber + 1]; + + for (int i = 0; i < ballNumber; i++) { + newBallPos[i] = new Point(ballPositions[i]); + newgl[i] = goingLeft[i]; + newgr[i] = goingRight[i]; + newgu[i] = goingUp[i]; + newgd[i] = goingDown[i]; + } + + newBallPos[ballNumber] = randomPosition(); + newgl[ballNumber] = true; + newgr[ballNumber] = false; + newgu[ballNumber] = false; + newgu[ballNumber] = true; + ballPositions = newBallPos; + goingLeft = newgl; + goingRight = newgr; + goingUp = newgu; + goingDown = newgd; + ballNumber++; + } + + void seeIfBallHitWallFloorOrCeiling(int ballno) { + if (ballPositions[ballno].x <= 0) { // ball hit the left wall + goingRight[ballno] = true; + goingLeft[ballno] = false; + } else if (ballPositions[ballno].y <= 0) {// ball hit the ceiling + goingUp[ballno] = false; + goingDown[ballno] = true; + } else if (ballPositions[ballno].y >= BOTTOMEDGE - BALL_YAMOUNT) {// ball hit the floor + goingDown[ballno] = false; + goingUp[ballno] = true; + } else if (ballPositions[ballno].x >= RIGHTEDGE) { // ball reached the right edge + deadball = true; + level--; // because it will be incremented in a minute and we want to stay on the same + // 'level' + ingame = false; + System.out.println("LOZER!"); + } + } + + private boolean isPlayerPosition(Point p) { + return (p.x >= playerPosition.x && p.y >= playerPosition.y && p.y <= playerPosition.y + 154); + } + + private Point moveBall(int ballno, Point original) { + Point result = new Point(original); + if (goingLeft[ballno]) + result.x = result.x - BALL_XAMOUNT; + else if (goingRight[ballno]) + result.x = result.x + BALL_XAMOUNT; + + if (goingUp[ballno]) + result.y = result.y - BALL_YAMOUNT; + else if (goingDown[ballno]) + result.y = result.y + BALL_YAMOUNT; + if (isPlayerPosition(result)) { + goingRight[ballno] = false; + goingLeft[ballno] = true; + } else + seeIfBallHitWallFloorOrCeiling(ballno); + + return (result); + } + + // this class will use just the key pressed event + @Override + public void keyPressed(KeyEvent e) { + if (ingame) { + if (!((e.getKeyCode() == KeyEvent.VK_DOWN && playerPosition.y >= (BOTTOMEDGE - PLAYER_YAMOUNT)) + || (e.getKeyCode() == KeyEvent.VK_UP && playerPosition.y <= (TOPEDGE + PLAYER_YAMOUNT)))) { + // valid move: move the player and then move the balls + if (e.getKeyCode() == KeyEvent.VK_DOWN) { + playerPosition.y += PLAYER_YAMOUNT; + } else if (e.getKeyCode() == KeyEvent.VK_UP) { + playerPosition.y -= PLAYER_YAMOUNT; + } + + for (int i = 0; i < ballNumber; i++) { + if (isPlayerPosition(ballPositions[i])) { + goingRight[i] = false; + goingLeft[i] = true; + } + } + area.repaint(); + } // if valid key press + } else if (e.getKeyCode() == KeyEvent.VK_ENTER) { + doLevel(level++); + } + } + + @Override + public void run() { + while (true) { + if (juststarted) { + try { + Thread.sleep(750); + } catch (Exception e) { + } + juststarted = false; + } + + try { + Thread.sleep(DELAY); + } catch (InterruptedException e) { + } + + if (ingame) { + timeSinceLastBall += DELAY; + // System.out.println(String.valueOf(timeSinceLastBall)); + if (timeSinceLastBall >= 10000) { + addABall(); + timeSinceLastBall = 0; + } + + // for each ball, move the ball closer to the player + for (int i = 0; i < ballPositions.length; i++) { + if (!deadball) { + ballPositions[i] = moveBall(i, ballPositions[i]); + } + if (isPlayerPosition(ballPositions[i])) { + goingRight[i] = false; + goingLeft[i] = true; + } + } + area.repaint(); + } + } + } + + @Override + public void keyReleased(KeyEvent e) { + } + + @Override + public void keyTyped(KeyEvent e) { + } +} diff --git a/Pong/src/PongArea.java b/Pong/src/PongArea.java @@ -13,12 +13,12 @@ import javax.swing.JPanel; public class PongArea extends JPanel implements ActionListener { private static final long serialVersionUID = -842988339431434549L; - PongGame myApplet = null; + Pong myApplet = null; Image paddle; Color[] colours = new Color[] { Color.white, Color.blue, Color.green, Color.red, Color.yellow }; int colourno = 0; - public PongArea(PongGame parent) { + public PongArea(Pong parent) { myApplet = parent; try { paddle = ImageIO.read(new File("../Assets/paddle.gif")); @@ -40,22 +40,22 @@ public class PongArea extends JPanel implements ActionListener { g.fillRect(0, 0, w, h); g.setColor(Color.black); - if (PongGame.playerPosition != null) { + if (Pong.playerPosition != null) { // show the player's paddle // g.drawString("|", myApplet.playerPosition.x, myApplet.playerPosition.y); - g.drawImage(paddle, PongGame.playerPosition.x, PongGame.playerPosition.y, Color.black, null); + g.drawImage(paddle, Pong.playerPosition.x, Pong.playerPosition.y, Color.black, null); // show the ball colourno = 0;// <-------remove this for confusion mode! - for (int i = 0; i < PongGame.ballPositions.length; i++) { - if (PongGame.ballPositions[i].x > -1) + for (int i = 0; i < Pong.ballPositions.length; i++) { + if (Pong.ballPositions[i].x > -1) // g.drawImage(pongImage, myApplet.ballPositions[i].x, // myApplet.ballPositions[i].y,null); g.setColor(colours[colourno++]); if (colourno >= colours.length) colourno = 0; - g.drawString("O", PongGame.ballPositions[i].x, PongGame.ballPositions[i].y); + g.drawString("O", Pong.ballPositions[i].x, Pong.ballPositions[i].y); } } } diff --git a/Pong/src/PongGame.java b/Pong/src/PongGame.java @@ -1,246 +0,0 @@ - -/* Copyright (c) Mike Percival 2004 */ -/* Pong game Created April 2004 */ - -import java.awt.Color; -import java.awt.Point; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; - -import javax.swing.JFrame; - -public class PongGame extends JFrame implements KeyListener, Runnable { - private static final long serialVersionUID = 1018529427970832700L; - // all member variables 'static' because shared with the ball action thread - private static PongArea area; - private static boolean ingame = false; - private boolean juststarted = false; - private static int level = 1; - protected static Point[] ballPositions; - protected static Point playerPosition; - private static Thread balls; - - protected static int ballNumber = 1; - protected static int RIGHTEDGE = 800; - protected static final int LEFTEDGE = 0; - protected static final int TOPEDGE = 0; - protected static int BOTTOMEDGE = 800; - protected static int BALL_XAMOUNT = 3; - protected static int BALL_YAMOUNT = 3; - protected static int PLAYER_XAMOUNT = 12; - protected static int PLAYER_YAMOUNT = 12; - private static final int DELAY = 15; - boolean[] goingLeft, goingRight, goingUp, goingDown; - boolean deadball = false; - int timeSinceLastBall = 0; - - public static void main(String[] args) { - PongGame pongGame = new PongGame(); - - pongGame.setLayout(null); - pongGame.setBackground(Color.black); - pongGame.setSize(RIGHTEDGE, BOTTOMEDGE); - PongGame.area = new PongArea(pongGame); - pongGame.add(area); - //RIGHTEDGE = pongGame.getBounds().width - 1; - //BOTTOMEDGE = pongGame.getBounds().height - 1; - pongGame.setVisible(true); - area.setBounds(0, 0, RIGHTEDGE, BOTTOMEDGE); - area.setVisible(true); - - pongGame.addKeyListener(pongGame); - area.addKeyListener(pongGame); - area.requestFocus(); - - balls = new Thread(pongGame); - balls.start(); - - //EventQueue.invokeLater(pongGame); - } - - public void doLevel(int level) { - // this runs one 'level' - // create arrays of ball balls here. - // Maybe each level will have different numbers? - juststarted = true; - deadball = false; - ballNumber = 1; - ballPositions = new Point[ballNumber]; - goingLeft = new boolean[ballNumber]; - goingRight = new boolean[ballNumber]; - goingUp = new boolean[ballNumber]; - goingDown = new boolean[ballNumber]; - - for (int i = 0; i < ballNumber; i++) { - ballPositions[i] = new Point(0, 0); - goingLeft[i] = true; - goingRight[i] = false; - goingUp[i] = false; - goingDown[i] = true; - } - - // System.out.println("Started level " + level); - - // randomly position 1 player, x balls - playerPosition = new Point(RIGHTEDGE - 20, 0); - - for (int i = 0; i < ballNumber; i++) { - ballPositions[i] = randomPosition(); - } - - // paint the panel here - area.repaint(); - ingame = true; - } - - private Point randomPosition() { - Point p = new Point((int) (Math.random() * RIGHTEDGE) / BALL_XAMOUNT * BALL_XAMOUNT, (int) 0); - if (p.x >= RIGHTEDGE * 2 / 3) - p.x = p.x - RIGHTEDGE / 3; - - return (p); - } - - synchronized void addABall() { - System.out.println("ADD A BALL!"); - Point[] newBallPos = new Point[ballNumber + 1]; - boolean[] newgl = new boolean[ballNumber + 1], newgr = new boolean[ballNumber + 1], - newgu = new boolean[ballNumber + 1], newgd = new boolean[ballNumber + 1]; - - for (int i = 0; i < ballNumber; i++) { - newBallPos[i] = new Point(ballPositions[i]); - newgl[i] = goingLeft[i]; - newgr[i] = goingRight[i]; - newgu[i] = goingUp[i]; - newgd[i] = goingDown[i]; - } - - newBallPos[ballNumber] = randomPosition(); - newgl[ballNumber] = true; - newgr[ballNumber] = false; - newgu[ballNumber] = false; - newgu[ballNumber] = true; - ballPositions = newBallPos; - goingLeft = newgl; - goingRight = newgr; - goingUp = newgu; - goingDown = newgd; - ballNumber++; - } - - void seeIfBallHitWallFloorOrCeiling(int ballno) { - if (ballPositions[ballno].x <= 0) { // ball hit the left wall - goingRight[ballno] = true; - goingLeft[ballno] = false; - } else if (ballPositions[ballno].y <= 0) {// ball hit the ceiling - goingUp[ballno] = false; - goingDown[ballno] = true; - } else if (ballPositions[ballno].y >= BOTTOMEDGE - BALL_YAMOUNT) {// ball hit the floor - goingDown[ballno] = false; - goingUp[ballno] = true; - } else if (ballPositions[ballno].x >= RIGHTEDGE) { // ball reached the right edge - deadball = true; - level--; // because it will be incremented in a minute and we want to stay on the same - // 'level' - ingame = false; - System.out.println("LOZER!"); - } - } - - private boolean isPlayerPosition(Point p) { - return (p.x >= playerPosition.x && p.y >= playerPosition.y && p.y <= playerPosition.y + 154); - } - - private Point moveBall(int ballno, Point original) { - Point result = new Point(original); - if (goingLeft[ballno]) - result.x = result.x - BALL_XAMOUNT; - else if (goingRight[ballno]) - result.x = result.x + BALL_XAMOUNT; - - if (goingUp[ballno]) - result.y = result.y - BALL_YAMOUNT; - else if (goingDown[ballno]) - result.y = result.y + BALL_YAMOUNT; - if (isPlayerPosition(result)) { - goingRight[ballno] = false; - goingLeft[ballno] = true; - } else - seeIfBallHitWallFloorOrCeiling(ballno); - - return (result); - } - - // this class will use just the key pressed event - @Override - public void keyPressed(KeyEvent e) { - if (ingame) { - if (!((e.getKeyCode() == KeyEvent.VK_DOWN && playerPosition.y >= (BOTTOMEDGE - PLAYER_YAMOUNT)) - || (e.getKeyCode() == KeyEvent.VK_UP && playerPosition.y <= (TOPEDGE + PLAYER_YAMOUNT)))) { - // valid move: move the player and then move the balls - if (e.getKeyCode() == KeyEvent.VK_DOWN) { - playerPosition.y += PLAYER_YAMOUNT; - } else if (e.getKeyCode() == KeyEvent.VK_UP) { - playerPosition.y -= PLAYER_YAMOUNT; - } - - for (int i = 0; i < ballNumber; i++) { - if (isPlayerPosition(ballPositions[i])) { - goingRight[i] = false; - goingLeft[i] = true; - } - } - area.repaint(); - } // if valid key press - } else if (e.getKeyCode() == KeyEvent.VK_ENTER) { - doLevel(level++); - } - } - - @Override - public void run() { - while (true) { - if (juststarted) { - try { - Thread.sleep(750); - } catch (Exception e) { - } - juststarted = false; - } - - try { - Thread.sleep(DELAY); - } catch (InterruptedException e) { - } - - if (ingame) { - timeSinceLastBall += DELAY; - // System.out.println(String.valueOf(timeSinceLastBall)); - if (timeSinceLastBall >= 10000) { - addABall(); - timeSinceLastBall = 0; - } - - // for each ball, move the ball closer to the player - for (int i = 0; i < ballPositions.length; i++) { - if (!deadball) { - ballPositions[i] = moveBall(i, ballPositions[i]); - } - if (isPlayerPosition(ballPositions[i])) { - goingRight[i] = false; - goingLeft[i] = true; - } - } - area.repaint(); - } - } - } - - @Override - public void keyReleased(KeyEvent e) { - } - - @Override - public void keyTyped(KeyEvent e) { - } -} diff --git a/Reaper/src/Reaper.java b/Reaper/src/Reaper.java @@ -0,0 +1,818 @@ +import java.awt.Color; +import java.awt.Image; +import java.awt.Point; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; + +import javax.swing.JFrame; + +//* Copyright (c) Mary Percival 2003 */ +/* Reaper game Created May 2003 */ + +public class Reaper extends JFrame implements KeyListener, Runnable { + private static final long serialVersionUID = -3998951090286400255L; + boolean easymode = true; + static int MAXLEVEL = 1; + static int level = 1; + + // the levels so far are: + // 1 beginner level: 4 fire hydrants & 1 runner + + static int LEFT = 1; + static int RIGHT = 0; + // the next 2 constants are overridden in init once we know the screen size + static int RIGHTEDGE = 789; + static int BOTTOMEDGE = 900; + static int PAGEWIDTH = 741; + + static Point IMAGESIZE = new Point(152, 107); + static final int LEFTEDGE = 0; + static final int TOPEDGE = -10; + static int GROUNDLEVEL = 503; + static int startPosY; + static int JUMPAMOUNT = 70; + static int BOUNCEAMOUNT = 48; + static final int FALLAMOUNT = 16; // amount he falls each time interval + static final int RISEAMOUNT = 16; // amount he rises each time interval + static final int XAMOUNT = 12; + + static final int X = 1; + static final int Y = 2; + static final int NOT = 3; + static final int DELAY = 50; + + static final int OBSTACLEIMAGES = 1; // static obstacles - unlike reaper obstacles + static final int HEROIMAGES = 4; + static final int PREYIMAGES = 3; + + // ---------------------------------------------------------------------------------------------- + // PREY TYPES + // ---------------------------------------------------------------------------------------------- + static final int PREYTYPES = 1; // runner + static final int RUNNER = 0; + + // prey positions (height) + static final int RUNNERHEIGHT = GROUNDLEVEL - 20; + static int preyHeight[] = new int[PREYTYPES]; + + static final int preySize[] = { 27 }; + static final int preyTopSpace[] = { 4 }; + + static final int SPACE_FROM_X_TO_REAPER = 55; + static final int REAPERHEIGHT = 86; + static final int REAPEROFFSET = 21; + static final int REAPERCROUCHOFFSET = 39; + static final int REAPERSTANDINGSIZE = 65; + static final int REAPERCROUCHINGSIZE = 45; + + static final int JUMPDURATION = 5; + static final int SUPERJUMPDURATION = 8; + static final int REAPERLEFTOFOBSTACLE = 45; // fudge factor because Reaper image is diff size to obstacle image + static final int REAPERRIGHTOFOBSTACLE = 10; // fudge factor because Reaper image is diff size to obstacle image + static final int PREYLEFTOFOBSTACLE = 33; // fudge factor for prey images + static final int PREYRIGHTOFOBSTACLE = 7; // >49 causes panic! + static final int REAPERLEFTOFPREY = 73; + static final int REAPERRIGHTOFPREY = -23; + + static final int LEFTDOWN = 0; + static final int RIGHTDOWN = 1; + static final int DOWNDOWN = 2; + static final int SPACEDOWN = 3; + + static final int OBSTACLEHEIGHT = 42; + static final int TALLOBSTACLEDIFF = 28; + static final int OBSTACLEWIDTH = 40; + int GROUNDDIFF = 605 - GROUNDLEVEL; + + // all member variables 'static' because shared with the prey action thread + static ReaperArea area; + static Thread timer; + static boolean finished = false; + static boolean ingame = false; + static boolean juststarted = true; + static Point warpzone; + static int[] keysdown = new int[4]; + static Point[] preyPositions; + static Point playerPosition; + static Point[] obstaclePositions; + static boolean[] piranhaPopping; // one for each obstacle + static boolean[] hasPiranha; // one for each obstacle + static boolean[] isTall; // one for each obstacle + static int preyDirection[]; + static int preyNumber = 1, preyRemaining = 1, obstacleNumber = 1; + static boolean reapercrouching = false; + static boolean onTheWayUp = false; + static boolean bouncing = false; + static boolean wasbouncing = false; + static boolean dead = false; + static int page = 0; + static int reaperImageNo = 0; + static int preyImageNo[]; + static int levellength = 1482; + static Image[] reaperImages = new Image[HEROIMAGES]; + static Image[] obstacleImages = new Image[OBSTACLEIMAGES]; // obstacle, piranhapeep, piranha peepy etc + static Image[] squished = new Image[PREYTYPES]; // squished images for each prey type + static Image[][][] preyImages = new Image[PREYTYPES][2][PREYIMAGES]; // left right left right or whatever + static int obstacleImageNo[]; // what is the current image for obstacle n + static Image[][] preyImage = new Image[PREYTYPES][PREYIMAGES];// what is the current image for prey n? + static Image floors[] = new Image[MAXLEVEL]; + static int preyType[]; // what is the type of prey n? + static boolean preyDead[]; // is prey n dead? + static boolean reaperleft = false; + static boolean jumping = false; + static int preyMove[] = new int[PREYTYPES]; + boolean somethingChangedSinceRepaint = false; + + // ************************************************************* + public static void main(String[] args) { + Reaper Reaper = new Reaper(); + + Reaper.setLayout(null); + Reaper.setBackground(Color.white); + Reaper.setSize(RIGHTEDGE, BOTTOMEDGE); + + area = new ReaperArea(Reaper); + Reaper.add(area); + //RIGHTEDGE = (Reaper.getBounds().width / XAMOUNT) * XAMOUNT + LEFTEDGE; + //BOTTOMEDGE = Reaper.getBounds().height - 1; + Reaper.setVisible(true); + area.setBounds(0, 0, RIGHTEDGE, BOTTOMEDGE); + //GROUNDLEVEL = Reaper.getBounds().height - Reaper.GROUNDDIFF; + startPosY = GROUNDLEVEL; + //ReaperArea.FLOORLEVEL = Reaper.getBounds().height - ReaperArea.FLOORDIFF; + area.setVisible(true); + + Reaper.addKeyListener(Reaper); + area.addKeyListener(Reaper); + area.requestFocus(); + + for (int i = 0; i < OBSTACLEIMAGES; i++) { + obstacleImages[i] = area.obstacle; + } + + preyImages[RUNNER][RIGHT][0] = area.runner; + preyImages[RUNNER][RIGHT][1] = area.runner2; + preyImages[RUNNER][LEFT][0] = area.runnerleft; + preyImages[RUNNER][LEFT][1] = area.runner2left; + + preyMove[RUNNER] = 5; + preyHeight[RUNNER] = 40; + squished[RUNNER] = area.squishedrunner; + + // for (int i=0; i < MAXLEVEL; i++) { + // floors[i] = area.floor4; + // } + + timer = new Thread(Reaper); + timer.start(); + + } + + synchronized void faceRight() { + reaperImages[0] = area.reaperstand; + reaperImages[1] = area.reaper1; + reaperImages[2] = area.reaperstand; + reaperImages[3] = area.reaper2; + reaperImageNo = 0; + reaperleft = false; + } + + synchronized void faceLeft() { + reaperImages[0] = area.reaperstandleft; + reaperImages[1] = area.reaper1left; + reaperImages[2] = area.reaperstandleft; + reaperImages[3] = area.reaper2left; + reaperImageNo = 0; + reaperleft = true; + } + + synchronized void preyFaceRight(int preyno) { + preyImage[preyno][0] = preyImages[preyType[preyno]][RIGHT][0]; + preyImage[preyno][1] = preyImages[preyType[preyno]][RIGHT][1]; + preyDirection[preyno] = RIGHT; + } + + synchronized void preyFaceLeft(int preyno) { + preyImage[preyno][0] = preyImages[preyType[preyno]][LEFT][0]; + preyImage[preyno][1] = preyImages[preyType[preyno]][LEFT][1]; + preyDirection[preyno] = LEFT; + } + + synchronized void preyDie(int preyno) { + // displayStatus(); + preyImage[preyno][0] = squished[preyType[preyno]]; + preyImage[preyno][1] = squished[preyType[preyno]]; + } + + synchronized void standStill() { + reaperImageNo = 0; + } + + public void doLevel(int level) { + // this runs one 'level' + juststarted = true; + dead = false; + + // position reaper at the bottom left + playerPosition = new Point(LEFTEDGE, GROUNDLEVEL); + faceRight(); + + // *********** THIS STUFF DEPENDS WHAT LEVEL YOU ARE ON ************ + switch (level) { + case 1: + obstacleNumber = 4; // 4 obstacles for level 1 + preyNumber = 1; + levellength = 1482; // 2 pages + break; + default: + System.out.println("Level " + level + " has not yet been implemented"); + } + preyImage = new Image[preyNumber][PREYIMAGES];// what is the current image for prey n? + // initialise piranha states + obstacleImageNo = new int[obstacleNumber]; + hasPiranha = new boolean[obstacleNumber]; + piranhaPopping = new boolean[obstacleNumber]; + isTall = new boolean[obstacleNumber]; + + // initialise the arrays of prey, etc + preyPositions = new Point[preyNumber]; + preyType = new int[preyNumber]; + preyDead = new boolean[preyNumber]; + obstaclePositions = new Point[obstacleNumber]; + preyDirection = new int[preyNumber]; + preyImageNo = new int[preyNumber]; + + for (int i = 0; i < preyNumber; i++) { + preyImageNo[i] = 0; + } + + switch (level) { + // ----------------------------------------------- + // LEVEL 1 + // ----------------------------------------------- + case 1: + for (int i = 0; i < obstacleNumber; i++) { + isTall[i] = false; + piranhaPopping[i] = false; + hasPiranha[i] = false; + } + obstaclePositions[0] = new Point(400, GROUNDLEVEL); + obstaclePositions[1] = new Point(950, GROUNDLEVEL); + obstaclePositions[2] = new Point(1245, GROUNDLEVEL); // 1255 for adjacent + obstaclePositions[3] = new Point(1320, GROUNDLEVEL); + + preyPositions[0] = new Point(1000, RUNNERHEIGHT); + preyType = new int[] { RUNNER }; + break; + // ----------------------------------------------- + // LEVEL 2 + // ----------------------------------------------- + default: + + } + + for (int j = 0; j < preyNumber; j++) { + preyFaceRight(j); // in this game all the 'prey' are fleeing to the right + preyDead[j] = false; + } + + for (int i = 0; i < obstacleNumber; i++) { + if (hasPiranha[i]) { // pick a random image number between 0 and 18 (inclusive) + obstacleImageNo[i] = (int) (Math.random() * 18) / 1; + } else + obstacleImageNo[i] = 0; + } + + // position the warp zone at the end of the level + warpzone = new Point(levellength, GROUNDLEVEL); + // *********** END OF STUFF THAT DEPENDS WHAT LEVEL YOU ARE ON ************ + + ingame = true; + System.out.println("Started level " + level); + } + + boolean isPlayerPosition(Point p) { + return (p.x == playerPosition.x && p.y == playerPosition.y); + } + + int isEnemyPosition(Point p) { + for (int i = 0; i < preyNumber; i++) { + if (isEnemyX(p) != -1 && isEnemyY(p) != -1 && !preyDead[i]) + return (i); + } + return (-1); + } + + boolean isObstaclePosition(Point p, boolean forReaper) { + int obby; + for (int i = 0; i < obstacleNumber; i++) { + obby = isObstacleX(p, forReaper); + if (obby != -1 && isObstacleY(p, obby, forReaper) != -1) { + return (true); + } + } + return (false); + } + + boolean checkIfBlockingObstacle(Point p) { + boolean result = false; + int obby; + obby = isObstacleX(p, true); + if (obby != -1 && isBlockingObstacleY(p, obby)) { + piranhaPopping[obby] = false; + result = true; + } + for (int i = 0; i < obstacleNumber; i++) { + if (i != obby || !result) { + if (hasPiranha[i]) + piranhaPopping[i] = true; + } + } + if (!result) + startPosY = GROUNDLEVEL; + return (result); + } + + int isObstacleX(Point p, boolean forReaper) { + int obstaclex; + for (int i = 0; i < obstacleNumber; i++) { + // if x is >= obstacleposition - (REAPERLEFTOFOBSTACLE) and x <= + // obstacleposition + (REAPERRIGHTOFOBSTACLE) + obstaclex = obstaclePositions[i].x; + if (forReaper) { + if (p.x >= (obstaclex - REAPERLEFTOFOBSTACLE) && p.x <= (obstaclex + REAPERRIGHTOFOBSTACLE)) + return (i); // return the number of the matching obstacle + } else { + if (p.x >= (obstaclex - PREYLEFTOFOBSTACLE) && p.x <= (obstaclex + PREYRIGHTOFOBSTACLE)) + return (i); // return the number of the matching obstacle + } + } + return (-1); + } + + boolean isBlockingObstacleY(Point p, int obstaclenumber) { + // String s = "Is Reaper blocking obstacle " + obstaclenumber + " which is " + + // (isTall[obstaclenumber] ? "" : "not ") + "tall"; + if (isTall[obstaclenumber]) { + if (p.y <= obstaclePositions[obstaclenumber].y - (OBSTACLEHEIGHT + TALLOBSTACLEDIFF)) { + // System.out.println(s+": Yes"); + return (true); + } + } else { + if (p.y <= obstaclePositions[obstaclenumber].y - OBSTACLEHEIGHT) { + // System.out.println(s+": Yes"); + return (true); + } + } + // System.out.println(s+": No"); + return (false); + } + + int isObstacleY(Point p, int obstaclenumber, boolean forReaper) { + if (isTall[obstaclenumber]) { + if (p.y > obstaclePositions[obstaclenumber].y - (OBSTACLEHEIGHT + TALLOBSTACLEDIFF)) { + return (obstaclenumber); + } + } else { + if (p.y > obstaclePositions[obstaclenumber].y - OBSTACLEHEIGHT) { + return (obstaclenumber); + } + } + return (-1); + } + + int isEnemyX(Point p) { + int preyx; + for (int i = 0; i < preyNumber; i++) { + // if x is >= preyposition - (LEFTOFPREY) and x <= preyposition + (RIGHTOFPREY) + preyx = preyPositions[i].x; + // System.out.println("Player got by prey if " + + // p.x + " >= " + (preyx - REAPERLEFTOFPREY) + " && " + p.x + " <= " + (preyx + + // REAPERRIGHTOFPREY)); + if (p.x >= (preyx - REAPERLEFTOFPREY) && p.x <= (preyx + REAPERRIGHTOFPREY) && !preyDead[i]) + return (i); // return the number of the matching prey + } + return (-1); + } + + int isEnemyY(Point p) { + int offset = reapercrouching ? REAPERCROUCHOFFSET : REAPEROFFSET; + for (int i = 0; i < preyNumber; i++) { + if (!preyDead[i] && ((p.y + offset <= preyPositions[i].y + preySize[preyType[i]]) + && (p.y + REAPERHEIGHT) >= preyPositions[i].y)) + return (i); + } + return (-1); + } + + int randomMove() { + // return + or - value (randomly) + if (Math.random() >= 0.5) + return (24); + else + return (-24); + } + + private synchronized void incKeysDown(int whichone) { + keysdown[whichone] = 1; + } + + private synchronized void decKeysDown(int whichone) { + keysdown[whichone] = 0; + } + + // this class will use just the key pressed event + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_F1) { + displayStatus(); + } + if (ingame) { + if (!(e.getKeyCode() == KeyEvent.VK_LEFT && playerPosition.x <= (LEFTEDGE + XAMOUNT))) { + + // valid move: move the player and then move the prey + if (e.getKeyCode() == KeyEvent.VK_DOWN) { + reapercrouching = true; + incKeysDown(DOWNDOWN); + setSomethingChangedSinceRepaint(true); + } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { + incKeysDown(LEFTDOWN); + leftPressed(false); + setSomethingChangedSinceRepaint(true); + } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { + incKeysDown(RIGHTDOWN); + rightPressed(false); + setSomethingChangedSinceRepaint(true); + } else if (e.getKeyCode() == KeyEvent.VK_SPACE) { + if (!jumping) { + startPosY = playerPosition.y; + jumping = true; + onTheWayUp = true; + setSomethingChangedSinceRepaint(true); + } + } + if (somethingChangedSinceRepaint) { + area.repaint(); + } + } // if valid key press + } else if (e.getKeyCode() == KeyEvent.VK_ENTER) { + if (level == MAXLEVEL || dead) + doLevel(level); + else + doLevel(++level); + page = 0; + area.repaint(); + } + } + + /* synchronized */ void setSomethingChangedSinceRepaint(boolean val) { + somethingChangedSinceRepaint = val; + } + + void leftPressed(boolean skid) { + if (!reapercrouching) { + // if Hero was facing right, turn him left + if (!reaperleft) + faceLeft(); + else { + // if the target position is not occupied by a obstacle... + for (int i = 0; i < obstacleNumber; i++) { + if (isObstaclePosition(new Point(playerPosition.x - XAMOUNT, playerPosition.y), true)) + return; // can't move + } + playerPosition.x -= XAMOUNT; + if (!skid) + incrementHeroImage(); + } + } + } + + void rightPressed(boolean skid) { + if (!reapercrouching) { + if ((playerPosition.x + SPACE_FROM_X_TO_REAPER) >= (warpzone.x + 4)) { + // level complete! + ingame = false; + } else { + // if Hero was facing left, turn him right + if (reaperleft) + faceRight(); + else { + for (int i = 0; i < obstacleNumber; i++) { + if (isObstaclePosition(new Point(playerPosition.x + XAMOUNT, playerPosition.y), true)) + return; // can't move + } + playerPosition.x += XAMOUNT; + // System.out.println("Reaper's x position is " + playerPosition.x); + if (!skid) + incrementHeroImage(); + } + } + } + } + + boolean anythingVisibleChanged() { + return (somethingChangedSinceRepaint); + } + + @Override + public void run() { + boolean odd = true; // only change piranha image every other cycle + while (true) { + if (juststarted) { + try { + Thread.sleep(750); + } catch (Exception e) { + } + area.repaint(); + juststarted = false; + } + try { + Thread.sleep(DELAY); + } catch (InterruptedException e) { + } + if (ingame) { + if (keysdown[LEFTDOWN] == 0 && keysdown[RIGHTDOWN] == 0 && keysdown[DOWNDOWN] == 0) + standStill(); + + if (keysdown[LEFTDOWN] > 0) { + leftPressed(false); + setSomethingChangedSinceRepaint(true); + } else if (keysdown[RIGHTDOWN] > 0) { + rightPressed(false); + setSomethingChangedSinceRepaint(true); + } + + if (!odd) { + // for each obstacle, cycle through the piranha pictures + for (int i = 0; i < obstacleNumber; i++) { + if (piranhaPopping[i]) { + incrementObstacleImage(i); + if (isVisibleObstacle(i)) + setSomethingChangedSinceRepaint(true); + } + } + } + odd = !odd; + + // for each prey, move the prey in the direction it was going + for (int i = 0; i < preyNumber; i++) { + // TODO if there is a fatal obstacle at that position, fall into it and + // decrement count of prey + // and set that prey's position to -1, -1 + /* + * if (isObstaclePosition(preyPositions[i])) { + * System.out.println("A prey fell into a obstacle"); + * + * preyPositions[i] = new Point(-1, -1); preyRemaining--; + * System.out.println(preyNumber-preyRemaining + " down, " + preyRemaining + + * " to go..."); } + */ + // if there is a non-fatal obstacle + if (isObstaclePosition(preyPositions[i], false)) { + // change direction + changeDirection(i); + if (isVisibleEnemy(i)) + setSomethingChangedSinceRepaint(true); + } + if (!preyDead[i]) { + preyPositions[i] = move(i, preyPositions[i], preyDirection[i], odd); + if (isVisibleEnemy(i)) + setSomethingChangedSinceRepaint(true); + } + + // if player is caught by a prey, end the game + int preyno = isEnemyPosition(playerPosition); + if (preyno > -1) { + int NEEDTOBEABOVE = preyPositions[preyno].y + preyTopSpace[preyno] - REAPERHEIGHT; + if (easymode) + NEEDTOBEABOVE = preyPositions[preyno].y - preyHeight[preyType[preyno]]; + if ((!onTheWayUp && (playerPosition.y <= NEEDTOBEABOVE))) { + // player may have squished an prey + preyDead[preyno] = true; + preyDie(preyno); + // player bounces + bouncing = true; + startPosY = playerPosition.y; + setSomethingChangedSinceRepaint(true); + } else { + int offset = reapercrouching ? REAPERCROUCHOFFSET : REAPEROFFSET; + if (playerPosition.y > NEEDTOBEABOVE && (playerPosition.y + + offset <= preyPositions[preyno].y + preySize[preyType[preyno]])) { + die(); + setSomethingChangedSinceRepaint(true); + } + } + } + } + if (!dead) { + if (onTheWayUp) { + if (playerPosition.y > startPosY - JUMPAMOUNT) { + playerPosition = new Point(playerPosition.x, playerPosition.y - RISEAMOUNT); + setSomethingChangedSinceRepaint(true); + } else { + onTheWayUp = false; + } + } else if (bouncing) { + if (playerPosition.y > startPosY - BOUNCEAMOUNT) { + playerPosition = new Point(playerPosition.x, playerPosition.y - RISEAMOUNT); + setSomethingChangedSinceRepaint(true); + } else { + bouncing = false; + wasbouncing = true; + } + } else { + int obstacleno = isObstacleX(playerPosition, true); + if (obstacleno == -1) { // no obstacle at this position + if (!onTheWayUp && !bouncing) { + if (playerPosition.y < startPosY) { + playerPosition = new Point(playerPosition.x, playerPosition.y + FALLAMOUNT); + wasbouncing = false; + setSomethingChangedSinceRepaint(true); + } else + jumping = false; + } + } else { + Point obstaclepos = obstaclePositions[obstacleno]; + // if reaper's y position <= obstacle's height + int thisObstacleHeight = isTall[obstacleno] ? OBSTACLEHEIGHT + TALLOBSTACLEDIFF + : OBSTACLEHEIGHT; + if (playerPosition.y <= (obstaclepos.y - thisObstacleHeight) && // can't land on the + // obstacle if just < (??!) + (playerPosition.y + FALLAMOUNT >= (obstaclepos.y - thisObstacleHeight))) { + // allow reaper to land on the obstacle + jumping = false; + if (playerPosition.y != obstaclepos.y - thisObstacleHeight) + setSomethingChangedSinceRepaint(true); + playerPosition = new Point(playerPosition.x, obstaclepos.y - thisObstacleHeight); + // if the piranha was up, Hero dies + if (obstacleImages[obstacleImageNo[obstacleno]] != area.obstacle) { + die(); + } else { + // otherwise stop this Piranha + piranhaPopping[obstacleno] = false; + } + } else { + if (!onTheWayUp && !bouncing) { + if (playerPosition.y < startPosY) { + setSomethingChangedSinceRepaint(true); + playerPosition = new Point(playerPosition.x, playerPosition.y + FALLAMOUNT); + wasbouncing = false; + } else + jumping = false; + } + } + } + } + if (!dead) { + checkIfBlockingObstacle(playerPosition); + if (playerPosition.y > GROUNDLEVEL) + playerPosition.y = GROUNDLEVEL; + } + if (anythingVisibleChanged()) { + area.repaint(); + } + } else { + if (!area.showingMessage) + area.repaint(); + } + } + } + } + + boolean isVisibleObstacle(int i) { + // TODO - this probably needs fixing when obstacle is near page boundary + return ((obstaclePositions[i].x >= page * PAGEWIDTH) && (obstaclePositions[i].x < (page + 1) * PAGEWIDTH)); + } + + boolean isVisibleEnemy(int i) { + // TODO - this probably needs fixing when prey is near page boundary + return ((preyPositions[i].x >= page * PAGEWIDTH) && (preyPositions[i].x < (page + 1) * PAGEWIDTH) + && !preyDead[i]); + } + + void changeDirection(int preyno) { + if (preyDirection[preyno] == LEFT) { + preyFaceRight(preyno); + } else { + preyFaceLeft(preyno); + } + } + + synchronized void die() { + System.out.println("The Player is dead. Press the Enter key to restart the level"); + ingame = false; + dead = true; + displayStatus(); + } + + synchronized void incrementObstacleImage(int i) { + obstacleImageNo[i]++; + if (obstacleImageNo[i] == OBSTACLEIMAGES) + obstacleImageNo[i] = 0; + } + + synchronized void incrementHeroImage() { + reaperImageNo++; + if (reaperImageNo == HEROIMAGES) + reaperImageNo = 0; + } + + synchronized void incrementEnemyImage(int i) { + preyImageNo[i]++; + if (preyImageNo[i] > (PREYIMAGES - 2)) + preyImageNo[i] = 0; + } + + Point move(int preyNo, Point start, int direction, boolean odd) { + if (odd) + incrementEnemyImage(preyNo); + if (direction == LEFT) { + return (new Point(start.x - preyMove[preyType[preyNo]], start.y)); + } else { + return (new Point(start.x + preyMove[preyType[preyNo]], start.y)); + } + } + + @Override + public void keyReleased(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_DOWN) { + reapercrouching = false; + decKeysDown(DOWNDOWN); + } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { + decKeysDown(LEFTDOWN); + } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { + decKeysDown(RIGHTDOWN); + } + } + + public void keyTyped(KeyEvent e) { + } + + synchronized Image getHeroImage() { + return (reaperImages[reaperImageNo]); + } + + synchronized Image getObstacleImage(int obstaclenum) { + return (obstacleImages[obstacleImageNo[obstaclenum]]); + } + + synchronized Image getEnemyImage(int preyno) { + return (preyImage[preyno][preyImageNo[preyno]]); + } + + void displayStatus() { + /* + * // when a certain F Key is pressed, display positions of Reaper, // all + * obstacles and all prey and the end flag (warp zone) + * System.out.println("--------"); System.out.println("Reaper is " + (dead? + * "dead" : "alive")); if (dead) { int preyno = isEnemyPosition(playerPosition); + * System.out.println("Reaper was killed by prey " + preyno); } + * System.out.println("In game is " + ingame); System.out.println("Reaper is " + + * (onTheWayUp? "on the way up" : "not on the way up")); + * System.out.println("Reaper's position is (" + playerPosition.x + ", " + + * playerPosition.y + ")"); + * System.out.println("Reaper's visible left, bottom co-ordinates are " + + * (playerPosition.x + 55) + " and " + (playerPosition.y + REAPERHEIGHT)); + * System.out.println("Reaper is on page " + page + + * " (which shows x positions from " + (page*PAGEWIDTH) + " to " + + * ((page+1)*PAGEWIDTH) + ")"); System.out.println("Screen bounds are (" + + * getBounds().width + ", " + getBounds().height + ")"); System.out.println(""); + * for (int prey=0; prey < preyNumber; prey++) { System.out.println("Enemy " + + * prey + " is " + preyTypeString(preyType[prey]) + " and is " + (preyDead[prey] + * ? " " : "not ") + "dead"); System.out.println("Enemy " + prey + + * " is at position (" + preyPositions[prey].x + ", " + + * preyPositions[prey].y+") and has size " + preySize[preyType[prey]]); } + * //System.out.println(""); //for (int obstacle=0; obstacle < obstacleNumber; + * obstacle++) { // System.out.println("Obstacle " + obstacle + + * " is at position (" + obstaclePositions[obstacle].x + // ", " + + * obstaclePositions[obstacle].y+")"); //} System.out.println(""); + * System.out.println("The warp zone is positioned at (" + warpzone.x + ", " + + * warpzone.y + ")"); System.out.println("========"); + */ + } + + String preyTypeString(int fortype) { + switch (fortype) { + case RUNNER: + return ("RUNNER"); + default: + return ("Unknown type (" + fortype + ")"); + } + } + + void changePageIfNecessary() { + if (playerPosition.x == LEFTEDGE) + return; + if ((playerPosition.x + SPACE_FROM_X_TO_REAPER) > (page * PAGEWIDTH + RIGHTEDGE - XAMOUNT)) { + // System.out.println("Change page up: (" + playerPosition.x+ "+" + + // SPACE_FROM_X_TO_REAPER+ ") > (" + page+ "*" + PAGEWIDTH + "+" + RIGHTEDGE + + // "-" + XAMOUNT + ")"); + page++; + } else if ((playerPosition.x + SPACE_FROM_X_TO_REAPER) - (page * PAGEWIDTH) < (LEFTEDGE + XAMOUNT)) { + // System.out.println("Change page down: (" + playerPosition.x+ "+" + + // SPACE_FROM_X_TO_REAPER+ ")-(" + page+ "*" + PAGEWIDTH + ") < (" + LEFTEDGE+ + // "+" + XAMOUNT+")"); + page--; + } + } +} diff --git a/Reaper/src/ReaperArea.java b/Reaper/src/ReaperArea.java @@ -13,7 +13,7 @@ public class ReaperArea extends JPanel { static int FLOORLEVEL = 589; static final int FLOORWIDTH = 150; static int FLOORDIFF = 605 - FLOORLEVEL; - ReaperGame myApplet = null; + Reaper myApplet = null; Image reaperwarp; Image reaper1; Image reaper1left; @@ -36,7 +36,7 @@ public class ReaperArea extends JPanel { boolean showingMessage = false; boolean starting = true; - public ReaperArea(ReaperGame parent) { + public ReaperArea(Reaper parent) { mt = new MediaTracker(parent); myApplet = parent; @@ -78,7 +78,7 @@ public class ReaperArea extends JPanel { } - Image load(ReaperGame parent, String picture) { + Image load(Reaper parent, String picture) { try { Image im = ImageIO.read(new File("../Assets/" + picture)); checkImage(im, picture); @@ -115,67 +115,67 @@ public class ReaperArea extends JPanel { g.setColor(Color.black); // paint the floor - if (ReaperGame.floors[ReaperGame.level - 1] != null) { + if (Reaper.floors[Reaper.level - 1] != null) { for (int pos = 0; pos < w; pos += FLOORWIDTH) { - g.drawImage(ReaperGame.floors[ReaperGame.level - 1], pos, FLOORLEVEL, Color.black, null); + g.drawImage(Reaper.floors[Reaper.level - 1], pos, FLOORLEVEL, Color.black, null); } } - if (!ReaperGame.juststarted) { - if (ReaperGame.obstaclePositions != null) { + if (!Reaper.juststarted) { + if (Reaper.obstaclePositions != null) { myApplet.changePageIfNecessary(); // show the obstacles from right to left (because obstacles have white space to // their left but not their right) - for (int i = ReaperGame.obstacleNumber - 1; i >= 0; i--) { + for (int i = Reaper.obstacleNumber - 1; i >= 0; i--) { obstacleimage = myApplet.getObstacleImage(i); - if (ReaperGame.isTall[i]) + if (Reaper.isTall[i]) obstacleimage = tallobstacle; // only one image for this for now g.drawImage(obstacleimage, - ReaperGame.obstaclePositions[i].x - (ReaperGame.page * ReaperGame.PAGEWIDTH), - ReaperGame.obstaclePositions[i].y, Color.white, null); + Reaper.obstaclePositions[i].x - (Reaper.page * Reaper.PAGEWIDTH), + Reaper.obstaclePositions[i].y, Color.white, null); } } // show the prey - if (ReaperGame.preyPositions != null) { - for (int i = 0; i < ReaperGame.preyNumber; i++) { + if (Reaper.preyPositions != null) { + for (int i = 0; i < Reaper.preyNumber; i++) { // if (!myApplet.preyDead[i]) { preyimage = myApplet.getEnemyImage(i); - g.drawImage(preyimage, ReaperGame.preyPositions[i].x - (ReaperGame.page * ReaperGame.PAGEWIDTH), - ReaperGame.preyPositions[i].y, null); + g.drawImage(preyimage, Reaper.preyPositions[i].x - (Reaper.page * Reaper.PAGEWIDTH), + Reaper.preyPositions[i].y, null); // } } } // draw Hero (on top of preceding images) - if (ReaperGame.playerPosition != null) { + if (Reaper.playerPosition != null) { // show the player Image reapersimage = myApplet.getHeroImage(); - if (ReaperGame.reapercrouching) { - if (ReaperGame.reaperleft) + if (Reaper.reapercrouching) { + if (Reaper.reaperleft) reapersimage = reapercrouchleft; else reapersimage = reapercrouch; } - if (ReaperGame.jumping) { - if (ReaperGame.reaperleft) + if (Reaper.jumping) { + if (Reaper.reaperleft) reapersimage = reaperjumpleft; else reapersimage = reaperjump; } - g.drawImage(reapersimage, ReaperGame.playerPosition.x - (ReaperGame.page * ReaperGame.PAGEWIDTH), - ReaperGame.playerPosition.y, /* Color.white, */ null); + g.drawImage(reapersimage, Reaper.playerPosition.x - (Reaper.page * Reaper.PAGEWIDTH), + Reaper.playerPosition.y, /* Color.white, */ null); } } // draw warp image (on top of Hero) - if (ReaperGame.warpzone != null) { + if (Reaper.warpzone != null) { // show the warp zone at the end of the level - g.drawImage(reaperwarp, ReaperGame.warpzone.x - (ReaperGame.page * ReaperGame.PAGEWIDTH), - ReaperGame.warpzone.y, Color.white, null); + g.drawImage(reaperwarp, Reaper.warpzone.x - (Reaper.page * Reaper.PAGEWIDTH), + Reaper.warpzone.y, Color.white, null); } - if (ReaperGame.ingame == false && !ReaperGame.juststarted) { - if (ReaperGame.dead) { + if (Reaper.ingame == false && !Reaper.juststarted) { + if (Reaper.dead) { // Reaper is dead (?!) g.drawImage(reaperdead, myApplet.getBounds().width / 2, getBounds().height / 2, Color.white, null); } else { diff --git a/Reaper/src/ReaperGame.java b/Reaper/src/ReaperGame.java @@ -1,818 +0,0 @@ -import java.awt.Color; -import java.awt.Image; -import java.awt.Point; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; - -import javax.swing.JFrame; - -//* Copyright (c) Mary Percival 2003 */ -/* Reaper game Created May 2003 */ - -public class ReaperGame extends JFrame implements KeyListener, Runnable { - private static final long serialVersionUID = -3998951090286400255L; - boolean easymode = true; - static int MAXLEVEL = 1; - static int level = 1; - - // the levels so far are: - // 1 beginner level: 4 fire hydrants & 1 runner - - static int LEFT = 1; - static int RIGHT = 0; - // the next 2 constants are overridden in init once we know the screen size - static int RIGHTEDGE = 789; - static int BOTTOMEDGE = 900; - static int PAGEWIDTH = 741; - - static Point IMAGESIZE = new Point(152, 107); - static final int LEFTEDGE = 0; - static final int TOPEDGE = -10; - static int GROUNDLEVEL = 503; - static int startPosY; - static int JUMPAMOUNT = 70; - static int BOUNCEAMOUNT = 48; - static final int FALLAMOUNT = 16; // amount he falls each time interval - static final int RISEAMOUNT = 16; // amount he rises each time interval - static final int XAMOUNT = 12; - - static final int X = 1; - static final int Y = 2; - static final int NOT = 3; - static final int DELAY = 50; - - static final int OBSTACLEIMAGES = 1; // static obstacles - unlike reaper obstacles - static final int HEROIMAGES = 4; - static final int PREYIMAGES = 3; - - // ---------------------------------------------------------------------------------------------- - // PREY TYPES - // ---------------------------------------------------------------------------------------------- - static final int PREYTYPES = 1; // runner - static final int RUNNER = 0; - - // prey positions (height) - static final int RUNNERHEIGHT = GROUNDLEVEL - 20; - static int preyHeight[] = new int[PREYTYPES]; - - static final int preySize[] = { 27 }; - static final int preyTopSpace[] = { 4 }; - - static final int SPACE_FROM_X_TO_REAPER = 55; - static final int REAPERHEIGHT = 86; - static final int REAPEROFFSET = 21; - static final int REAPERCROUCHOFFSET = 39; - static final int REAPERSTANDINGSIZE = 65; - static final int REAPERCROUCHINGSIZE = 45; - - static final int JUMPDURATION = 5; - static final int SUPERJUMPDURATION = 8; - static final int REAPERLEFTOFOBSTACLE = 45; // fudge factor because Reaper image is diff size to obstacle image - static final int REAPERRIGHTOFOBSTACLE = 10; // fudge factor because Reaper image is diff size to obstacle image - static final int PREYLEFTOFOBSTACLE = 33; // fudge factor for prey images - static final int PREYRIGHTOFOBSTACLE = 7; // >49 causes panic! - static final int REAPERLEFTOFPREY = 73; - static final int REAPERRIGHTOFPREY = -23; - - static final int LEFTDOWN = 0; - static final int RIGHTDOWN = 1; - static final int DOWNDOWN = 2; - static final int SPACEDOWN = 3; - - static final int OBSTACLEHEIGHT = 42; - static final int TALLOBSTACLEDIFF = 28; - static final int OBSTACLEWIDTH = 40; - int GROUNDDIFF = 605 - GROUNDLEVEL; - - // all member variables 'static' because shared with the prey action thread - static ReaperArea area; - static Thread timer; - static boolean finished = false; - static boolean ingame = false; - static boolean juststarted = true; - static Point warpzone; - static int[] keysdown = new int[4]; - static Point[] preyPositions; - static Point playerPosition; - static Point[] obstaclePositions; - static boolean[] piranhaPopping; // one for each obstacle - static boolean[] hasPiranha; // one for each obstacle - static boolean[] isTall; // one for each obstacle - static int preyDirection[]; - static int preyNumber = 1, preyRemaining = 1, obstacleNumber = 1; - static boolean reapercrouching = false; - static boolean onTheWayUp = false; - static boolean bouncing = false; - static boolean wasbouncing = false; - static boolean dead = false; - static int page = 0; - static int reaperImageNo = 0; - static int preyImageNo[]; - static int levellength = 1482; - static Image[] reaperImages = new Image[HEROIMAGES]; - static Image[] obstacleImages = new Image[OBSTACLEIMAGES]; // obstacle, piranhapeep, piranha peepy etc - static Image[] squished = new Image[PREYTYPES]; // squished images for each prey type - static Image[][][] preyImages = new Image[PREYTYPES][2][PREYIMAGES]; // left right left right or whatever - static int obstacleImageNo[]; // what is the current image for obstacle n - static Image[][] preyImage = new Image[PREYTYPES][PREYIMAGES];// what is the current image for prey n? - static Image floors[] = new Image[MAXLEVEL]; - static int preyType[]; // what is the type of prey n? - static boolean preyDead[]; // is prey n dead? - static boolean reaperleft = false; - static boolean jumping = false; - static int preyMove[] = new int[PREYTYPES]; - boolean somethingChangedSinceRepaint = false; - - // ************************************************************* - public static void main(String[] args) { - ReaperGame reaperGame = new ReaperGame(); - - reaperGame.setLayout(null); - reaperGame.setBackground(Color.white); - reaperGame.setSize(RIGHTEDGE, BOTTOMEDGE); - - area = new ReaperArea(reaperGame); - reaperGame.add(area); - //RIGHTEDGE = (reaperGame.getBounds().width / XAMOUNT) * XAMOUNT + LEFTEDGE; - //BOTTOMEDGE = reaperGame.getBounds().height - 1; - reaperGame.setVisible(true); - area.setBounds(0, 0, RIGHTEDGE, BOTTOMEDGE); - //GROUNDLEVEL = reaperGame.getBounds().height - reaperGame.GROUNDDIFF; - startPosY = GROUNDLEVEL; - //ReaperArea.FLOORLEVEL = reaperGame.getBounds().height - ReaperArea.FLOORDIFF; - area.setVisible(true); - - reaperGame.addKeyListener(reaperGame); - area.addKeyListener(reaperGame); - area.requestFocus(); - - for (int i = 0; i < OBSTACLEIMAGES; i++) { - obstacleImages[i] = area.obstacle; - } - - preyImages[RUNNER][RIGHT][0] = area.runner; - preyImages[RUNNER][RIGHT][1] = area.runner2; - preyImages[RUNNER][LEFT][0] = area.runnerleft; - preyImages[RUNNER][LEFT][1] = area.runner2left; - - preyMove[RUNNER] = 5; - preyHeight[RUNNER] = 40; - squished[RUNNER] = area.squishedrunner; - - // for (int i=0; i < MAXLEVEL; i++) { - // floors[i] = area.floor4; - // } - - timer = new Thread(reaperGame); - timer.start(); - - } - - synchronized void faceRight() { - reaperImages[0] = area.reaperstand; - reaperImages[1] = area.reaper1; - reaperImages[2] = area.reaperstand; - reaperImages[3] = area.reaper2; - reaperImageNo = 0; - reaperleft = false; - } - - synchronized void faceLeft() { - reaperImages[0] = area.reaperstandleft; - reaperImages[1] = area.reaper1left; - reaperImages[2] = area.reaperstandleft; - reaperImages[3] = area.reaper2left; - reaperImageNo = 0; - reaperleft = true; - } - - synchronized void preyFaceRight(int preyno) { - preyImage[preyno][0] = preyImages[preyType[preyno]][RIGHT][0]; - preyImage[preyno][1] = preyImages[preyType[preyno]][RIGHT][1]; - preyDirection[preyno] = RIGHT; - } - - synchronized void preyFaceLeft(int preyno) { - preyImage[preyno][0] = preyImages[preyType[preyno]][LEFT][0]; - preyImage[preyno][1] = preyImages[preyType[preyno]][LEFT][1]; - preyDirection[preyno] = LEFT; - } - - synchronized void preyDie(int preyno) { - // displayStatus(); - preyImage[preyno][0] = squished[preyType[preyno]]; - preyImage[preyno][1] = squished[preyType[preyno]]; - } - - synchronized void standStill() { - reaperImageNo = 0; - } - - public void doLevel(int level) { - // this runs one 'level' - juststarted = true; - dead = false; - - // position reaper at the bottom left - playerPosition = new Point(LEFTEDGE, GROUNDLEVEL); - faceRight(); - - // *********** THIS STUFF DEPENDS WHAT LEVEL YOU ARE ON ************ - switch (level) { - case 1: - obstacleNumber = 4; // 4 obstacles for level 1 - preyNumber = 1; - levellength = 1482; // 2 pages - break; - default: - System.out.println("Level " + level + " has not yet been implemented"); - } - preyImage = new Image[preyNumber][PREYIMAGES];// what is the current image for prey n? - // initialise piranha states - obstacleImageNo = new int[obstacleNumber]; - hasPiranha = new boolean[obstacleNumber]; - piranhaPopping = new boolean[obstacleNumber]; - isTall = new boolean[obstacleNumber]; - - // initialise the arrays of prey, etc - preyPositions = new Point[preyNumber]; - preyType = new int[preyNumber]; - preyDead = new boolean[preyNumber]; - obstaclePositions = new Point[obstacleNumber]; - preyDirection = new int[preyNumber]; - preyImageNo = new int[preyNumber]; - - for (int i = 0; i < preyNumber; i++) { - preyImageNo[i] = 0; - } - - switch (level) { - // ----------------------------------------------- - // LEVEL 1 - // ----------------------------------------------- - case 1: - for (int i = 0; i < obstacleNumber; i++) { - isTall[i] = false; - piranhaPopping[i] = false; - hasPiranha[i] = false; - } - obstaclePositions[0] = new Point(400, GROUNDLEVEL); - obstaclePositions[1] = new Point(950, GROUNDLEVEL); - obstaclePositions[2] = new Point(1245, GROUNDLEVEL); // 1255 for adjacent - obstaclePositions[3] = new Point(1320, GROUNDLEVEL); - - preyPositions[0] = new Point(1000, RUNNERHEIGHT); - preyType = new int[] { RUNNER }; - break; - // ----------------------------------------------- - // LEVEL 2 - // ----------------------------------------------- - default: - - } - - for (int j = 0; j < preyNumber; j++) { - preyFaceRight(j); // in this game all the 'prey' are fleeing to the right - preyDead[j] = false; - } - - for (int i = 0; i < obstacleNumber; i++) { - if (hasPiranha[i]) { // pick a random image number between 0 and 18 (inclusive) - obstacleImageNo[i] = (int) (Math.random() * 18) / 1; - } else - obstacleImageNo[i] = 0; - } - - // position the warp zone at the end of the level - warpzone = new Point(levellength, GROUNDLEVEL); - // *********** END OF STUFF THAT DEPENDS WHAT LEVEL YOU ARE ON ************ - - ingame = true; - System.out.println("Started level " + level); - } - - boolean isPlayerPosition(Point p) { - return (p.x == playerPosition.x && p.y == playerPosition.y); - } - - int isEnemyPosition(Point p) { - for (int i = 0; i < preyNumber; i++) { - if (isEnemyX(p) != -1 && isEnemyY(p) != -1 && !preyDead[i]) - return (i); - } - return (-1); - } - - boolean isObstaclePosition(Point p, boolean forReaper) { - int obby; - for (int i = 0; i < obstacleNumber; i++) { - obby = isObstacleX(p, forReaper); - if (obby != -1 && isObstacleY(p, obby, forReaper) != -1) { - return (true); - } - } - return (false); - } - - boolean checkIfBlockingObstacle(Point p) { - boolean result = false; - int obby; - obby = isObstacleX(p, true); - if (obby != -1 && isBlockingObstacleY(p, obby)) { - piranhaPopping[obby] = false; - result = true; - } - for (int i = 0; i < obstacleNumber; i++) { - if (i != obby || !result) { - if (hasPiranha[i]) - piranhaPopping[i] = true; - } - } - if (!result) - startPosY = GROUNDLEVEL; - return (result); - } - - int isObstacleX(Point p, boolean forReaper) { - int obstaclex; - for (int i = 0; i < obstacleNumber; i++) { - // if x is >= obstacleposition - (REAPERLEFTOFOBSTACLE) and x <= - // obstacleposition + (REAPERRIGHTOFOBSTACLE) - obstaclex = obstaclePositions[i].x; - if (forReaper) { - if (p.x >= (obstaclex - REAPERLEFTOFOBSTACLE) && p.x <= (obstaclex + REAPERRIGHTOFOBSTACLE)) - return (i); // return the number of the matching obstacle - } else { - if (p.x >= (obstaclex - PREYLEFTOFOBSTACLE) && p.x <= (obstaclex + PREYRIGHTOFOBSTACLE)) - return (i); // return the number of the matching obstacle - } - } - return (-1); - } - - boolean isBlockingObstacleY(Point p, int obstaclenumber) { - // String s = "Is Reaper blocking obstacle " + obstaclenumber + " which is " + - // (isTall[obstaclenumber] ? "" : "not ") + "tall"; - if (isTall[obstaclenumber]) { - if (p.y <= obstaclePositions[obstaclenumber].y - (OBSTACLEHEIGHT + TALLOBSTACLEDIFF)) { - // System.out.println(s+": Yes"); - return (true); - } - } else { - if (p.y <= obstaclePositions[obstaclenumber].y - OBSTACLEHEIGHT) { - // System.out.println(s+": Yes"); - return (true); - } - } - // System.out.println(s+": No"); - return (false); - } - - int isObstacleY(Point p, int obstaclenumber, boolean forReaper) { - if (isTall[obstaclenumber]) { - if (p.y > obstaclePositions[obstaclenumber].y - (OBSTACLEHEIGHT + TALLOBSTACLEDIFF)) { - return (obstaclenumber); - } - } else { - if (p.y > obstaclePositions[obstaclenumber].y - OBSTACLEHEIGHT) { - return (obstaclenumber); - } - } - return (-1); - } - - int isEnemyX(Point p) { - int preyx; - for (int i = 0; i < preyNumber; i++) { - // if x is >= preyposition - (LEFTOFPREY) and x <= preyposition + (RIGHTOFPREY) - preyx = preyPositions[i].x; - // System.out.println("Player got by prey if " + - // p.x + " >= " + (preyx - REAPERLEFTOFPREY) + " && " + p.x + " <= " + (preyx + - // REAPERRIGHTOFPREY)); - if (p.x >= (preyx - REAPERLEFTOFPREY) && p.x <= (preyx + REAPERRIGHTOFPREY) && !preyDead[i]) - return (i); // return the number of the matching prey - } - return (-1); - } - - int isEnemyY(Point p) { - int offset = reapercrouching ? REAPERCROUCHOFFSET : REAPEROFFSET; - for (int i = 0; i < preyNumber; i++) { - if (!preyDead[i] && ((p.y + offset <= preyPositions[i].y + preySize[preyType[i]]) - && (p.y + REAPERHEIGHT) >= preyPositions[i].y)) - return (i); - } - return (-1); - } - - int randomMove() { - // return + or - value (randomly) - if (Math.random() >= 0.5) - return (24); - else - return (-24); - } - - private synchronized void incKeysDown(int whichone) { - keysdown[whichone] = 1; - } - - private synchronized void decKeysDown(int whichone) { - keysdown[whichone] = 0; - } - - // this class will use just the key pressed event - @Override - public void keyPressed(KeyEvent e) { - if (e.getKeyCode() == KeyEvent.VK_F1) { - displayStatus(); - } - if (ingame) { - if (!(e.getKeyCode() == KeyEvent.VK_LEFT && playerPosition.x <= (LEFTEDGE + XAMOUNT))) { - - // valid move: move the player and then move the prey - if (e.getKeyCode() == KeyEvent.VK_DOWN) { - reapercrouching = true; - incKeysDown(DOWNDOWN); - setSomethingChangedSinceRepaint(true); - } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { - incKeysDown(LEFTDOWN); - leftPressed(false); - setSomethingChangedSinceRepaint(true); - } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { - incKeysDown(RIGHTDOWN); - rightPressed(false); - setSomethingChangedSinceRepaint(true); - } else if (e.getKeyCode() == KeyEvent.VK_SPACE) { - if (!jumping) { - startPosY = playerPosition.y; - jumping = true; - onTheWayUp = true; - setSomethingChangedSinceRepaint(true); - } - } - if (somethingChangedSinceRepaint) { - area.repaint(); - } - } // if valid key press - } else if (e.getKeyCode() == KeyEvent.VK_ENTER) { - if (level == MAXLEVEL || dead) - doLevel(level); - else - doLevel(++level); - page = 0; - area.repaint(); - } - } - - /* synchronized */ void setSomethingChangedSinceRepaint(boolean val) { - somethingChangedSinceRepaint = val; - } - - void leftPressed(boolean skid) { - if (!reapercrouching) { - // if Hero was facing right, turn him left - if (!reaperleft) - faceLeft(); - else { - // if the target position is not occupied by a obstacle... - for (int i = 0; i < obstacleNumber; i++) { - if (isObstaclePosition(new Point(playerPosition.x - XAMOUNT, playerPosition.y), true)) - return; // can't move - } - playerPosition.x -= XAMOUNT; - if (!skid) - incrementHeroImage(); - } - } - } - - void rightPressed(boolean skid) { - if (!reapercrouching) { - if ((playerPosition.x + SPACE_FROM_X_TO_REAPER) >= (warpzone.x + 4)) { - // level complete! - ingame = false; - } else { - // if Hero was facing left, turn him right - if (reaperleft) - faceRight(); - else { - for (int i = 0; i < obstacleNumber; i++) { - if (isObstaclePosition(new Point(playerPosition.x + XAMOUNT, playerPosition.y), true)) - return; // can't move - } - playerPosition.x += XAMOUNT; - // System.out.println("Reaper's x position is " + playerPosition.x); - if (!skid) - incrementHeroImage(); - } - } - } - } - - boolean anythingVisibleChanged() { - return (somethingChangedSinceRepaint); - } - - @Override - public void run() { - boolean odd = true; // only change piranha image every other cycle - while (true) { - if (juststarted) { - try { - Thread.sleep(750); - } catch (Exception e) { - } - area.repaint(); - juststarted = false; - } - try { - Thread.sleep(DELAY); - } catch (InterruptedException e) { - } - if (ingame) { - if (keysdown[LEFTDOWN] == 0 && keysdown[RIGHTDOWN] == 0 && keysdown[DOWNDOWN] == 0) - standStill(); - - if (keysdown[LEFTDOWN] > 0) { - leftPressed(false); - setSomethingChangedSinceRepaint(true); - } else if (keysdown[RIGHTDOWN] > 0) { - rightPressed(false); - setSomethingChangedSinceRepaint(true); - } - - if (!odd) { - // for each obstacle, cycle through the piranha pictures - for (int i = 0; i < obstacleNumber; i++) { - if (piranhaPopping[i]) { - incrementObstacleImage(i); - if (isVisibleObstacle(i)) - setSomethingChangedSinceRepaint(true); - } - } - } - odd = !odd; - - // for each prey, move the prey in the direction it was going - for (int i = 0; i < preyNumber; i++) { - // TODO if there is a fatal obstacle at that position, fall into it and - // decrement count of prey - // and set that prey's position to -1, -1 - /* - * if (isObstaclePosition(preyPositions[i])) { - * System.out.println("A prey fell into a obstacle"); - * - * preyPositions[i] = new Point(-1, -1); preyRemaining--; - * System.out.println(preyNumber-preyRemaining + " down, " + preyRemaining + - * " to go..."); } - */ - // if there is a non-fatal obstacle - if (isObstaclePosition(preyPositions[i], false)) { - // change direction - changeDirection(i); - if (isVisibleEnemy(i)) - setSomethingChangedSinceRepaint(true); - } - if (!preyDead[i]) { - preyPositions[i] = move(i, preyPositions[i], preyDirection[i], odd); - if (isVisibleEnemy(i)) - setSomethingChangedSinceRepaint(true); - } - - // if player is caught by a prey, end the game - int preyno = isEnemyPosition(playerPosition); - if (preyno > -1) { - int NEEDTOBEABOVE = preyPositions[preyno].y + preyTopSpace[preyno] - REAPERHEIGHT; - if (easymode) - NEEDTOBEABOVE = preyPositions[preyno].y - preyHeight[preyType[preyno]]; - if ((!onTheWayUp && (playerPosition.y <= NEEDTOBEABOVE))) { - // player may have squished an prey - preyDead[preyno] = true; - preyDie(preyno); - // player bounces - bouncing = true; - startPosY = playerPosition.y; - setSomethingChangedSinceRepaint(true); - } else { - int offset = reapercrouching ? REAPERCROUCHOFFSET : REAPEROFFSET; - if (playerPosition.y > NEEDTOBEABOVE && (playerPosition.y - + offset <= preyPositions[preyno].y + preySize[preyType[preyno]])) { - die(); - setSomethingChangedSinceRepaint(true); - } - } - } - } - if (!dead) { - if (onTheWayUp) { - if (playerPosition.y > startPosY - JUMPAMOUNT) { - playerPosition = new Point(playerPosition.x, playerPosition.y - RISEAMOUNT); - setSomethingChangedSinceRepaint(true); - } else { - onTheWayUp = false; - } - } else if (bouncing) { - if (playerPosition.y > startPosY - BOUNCEAMOUNT) { - playerPosition = new Point(playerPosition.x, playerPosition.y - RISEAMOUNT); - setSomethingChangedSinceRepaint(true); - } else { - bouncing = false; - wasbouncing = true; - } - } else { - int obstacleno = isObstacleX(playerPosition, true); - if (obstacleno == -1) { // no obstacle at this position - if (!onTheWayUp && !bouncing) { - if (playerPosition.y < startPosY) { - playerPosition = new Point(playerPosition.x, playerPosition.y + FALLAMOUNT); - wasbouncing = false; - setSomethingChangedSinceRepaint(true); - } else - jumping = false; - } - } else { - Point obstaclepos = obstaclePositions[obstacleno]; - // if reaper's y position <= obstacle's height - int thisObstacleHeight = isTall[obstacleno] ? OBSTACLEHEIGHT + TALLOBSTACLEDIFF - : OBSTACLEHEIGHT; - if (playerPosition.y <= (obstaclepos.y - thisObstacleHeight) && // can't land on the - // obstacle if just < (??!) - (playerPosition.y + FALLAMOUNT >= (obstaclepos.y - thisObstacleHeight))) { - // allow reaper to land on the obstacle - jumping = false; - if (playerPosition.y != obstaclepos.y - thisObstacleHeight) - setSomethingChangedSinceRepaint(true); - playerPosition = new Point(playerPosition.x, obstaclepos.y - thisObstacleHeight); - // if the piranha was up, Hero dies - if (obstacleImages[obstacleImageNo[obstacleno]] != area.obstacle) { - die(); - } else { - // otherwise stop this Piranha - piranhaPopping[obstacleno] = false; - } - } else { - if (!onTheWayUp && !bouncing) { - if (playerPosition.y < startPosY) { - setSomethingChangedSinceRepaint(true); - playerPosition = new Point(playerPosition.x, playerPosition.y + FALLAMOUNT); - wasbouncing = false; - } else - jumping = false; - } - } - } - } - if (!dead) { - checkIfBlockingObstacle(playerPosition); - if (playerPosition.y > GROUNDLEVEL) - playerPosition.y = GROUNDLEVEL; - } - if (anythingVisibleChanged()) { - area.repaint(); - } - } else { - if (!area.showingMessage) - area.repaint(); - } - } - } - } - - boolean isVisibleObstacle(int i) { - // TODO - this probably needs fixing when obstacle is near page boundary - return ((obstaclePositions[i].x >= page * PAGEWIDTH) && (obstaclePositions[i].x < (page + 1) * PAGEWIDTH)); - } - - boolean isVisibleEnemy(int i) { - // TODO - this probably needs fixing when prey is near page boundary - return ((preyPositions[i].x >= page * PAGEWIDTH) && (preyPositions[i].x < (page + 1) * PAGEWIDTH) - && !preyDead[i]); - } - - void changeDirection(int preyno) { - if (preyDirection[preyno] == LEFT) { - preyFaceRight(preyno); - } else { - preyFaceLeft(preyno); - } - } - - synchronized void die() { - System.out.println("The Player is dead. Press the Enter key to restart the level"); - ingame = false; - dead = true; - displayStatus(); - } - - synchronized void incrementObstacleImage(int i) { - obstacleImageNo[i]++; - if (obstacleImageNo[i] == OBSTACLEIMAGES) - obstacleImageNo[i] = 0; - } - - synchronized void incrementHeroImage() { - reaperImageNo++; - if (reaperImageNo == HEROIMAGES) - reaperImageNo = 0; - } - - synchronized void incrementEnemyImage(int i) { - preyImageNo[i]++; - if (preyImageNo[i] > (PREYIMAGES - 2)) - preyImageNo[i] = 0; - } - - Point move(int preyNo, Point start, int direction, boolean odd) { - if (odd) - incrementEnemyImage(preyNo); - if (direction == LEFT) { - return (new Point(start.x - preyMove[preyType[preyNo]], start.y)); - } else { - return (new Point(start.x + preyMove[preyType[preyNo]], start.y)); - } - } - - @Override - public void keyReleased(KeyEvent e) { - if (e.getKeyCode() == KeyEvent.VK_DOWN) { - reapercrouching = false; - decKeysDown(DOWNDOWN); - } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { - decKeysDown(LEFTDOWN); - } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { - decKeysDown(RIGHTDOWN); - } - } - - public void keyTyped(KeyEvent e) { - } - - synchronized Image getHeroImage() { - return (reaperImages[reaperImageNo]); - } - - synchronized Image getObstacleImage(int obstaclenum) { - return (obstacleImages[obstacleImageNo[obstaclenum]]); - } - - synchronized Image getEnemyImage(int preyno) { - return (preyImage[preyno][preyImageNo[preyno]]); - } - - void displayStatus() { - /* - * // when a certain F Key is pressed, display positions of Reaper, // all - * obstacles and all prey and the end flag (warp zone) - * System.out.println("--------"); System.out.println("Reaper is " + (dead? - * "dead" : "alive")); if (dead) { int preyno = isEnemyPosition(playerPosition); - * System.out.println("Reaper was killed by prey " + preyno); } - * System.out.println("In game is " + ingame); System.out.println("Reaper is " + - * (onTheWayUp? "on the way up" : "not on the way up")); - * System.out.println("Reaper's position is (" + playerPosition.x + ", " + - * playerPosition.y + ")"); - * System.out.println("Reaper's visible left, bottom co-ordinates are " + - * (playerPosition.x + 55) + " and " + (playerPosition.y + REAPERHEIGHT)); - * System.out.println("Reaper is on page " + page + - * " (which shows x positions from " + (page*PAGEWIDTH) + " to " + - * ((page+1)*PAGEWIDTH) + ")"); System.out.println("Screen bounds are (" + - * getBounds().width + ", " + getBounds().height + ")"); System.out.println(""); - * for (int prey=0; prey < preyNumber; prey++) { System.out.println("Enemy " + - * prey + " is " + preyTypeString(preyType[prey]) + " and is " + (preyDead[prey] - * ? " " : "not ") + "dead"); System.out.println("Enemy " + prey + - * " is at position (" + preyPositions[prey].x + ", " + - * preyPositions[prey].y+") and has size " + preySize[preyType[prey]]); } - * //System.out.println(""); //for (int obstacle=0; obstacle < obstacleNumber; - * obstacle++) { // System.out.println("Obstacle " + obstacle + - * " is at position (" + obstaclePositions[obstacle].x + // ", " + - * obstaclePositions[obstacle].y+")"); //} System.out.println(""); - * System.out.println("The warp zone is positioned at (" + warpzone.x + ", " + - * warpzone.y + ")"); System.out.println("========"); - */ - } - - String preyTypeString(int fortype) { - switch (fortype) { - case RUNNER: - return ("RUNNER"); - default: - return ("Unknown type (" + fortype + ")"); - } - } - - void changePageIfNecessary() { - if (playerPosition.x == LEFTEDGE) - return; - if ((playerPosition.x + SPACE_FROM_X_TO_REAPER) > (page * PAGEWIDTH + RIGHTEDGE - XAMOUNT)) { - // System.out.println("Change page up: (" + playerPosition.x+ "+" + - // SPACE_FROM_X_TO_REAPER+ ") > (" + page+ "*" + PAGEWIDTH + "+" + RIGHTEDGE + - // "-" + XAMOUNT + ")"); - page++; - } else if ((playerPosition.x + SPACE_FROM_X_TO_REAPER) - (page * PAGEWIDTH) < (LEFTEDGE + XAMOUNT)) { - // System.out.println("Change page down: (" + playerPosition.x+ "+" + - // SPACE_FROM_X_TO_REAPER+ ")-(" + page+ "*" + PAGEWIDTH + ") < (" + LEFTEDGE+ - // "+" + XAMOUNT+")"); - page--; - } - } -} diff --git a/Tank/src/Tank.java b/Tank/src/Tank.java @@ -0,0 +1,439 @@ +import java.awt.Color; +import java.awt.Image; +import java.awt.Point; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; + +import javax.swing.JFrame; + +/* Copyright (c) Mary Percival 2002 */ +/* Tank game Created October 2002 */ + +public class Tank extends JFrame implements KeyListener, Runnable { + private static final long serialVersionUID = 2750159877444817519L; + // all member variables 'static' because shared with the enemy action thread + private static TankArea area; + private static boolean ingame = false; + private boolean juststarted = false; + private static int level = 1; + private static int enemiesRemaining; + protected static Point[] enemyPositions; + protected static Point playerPosition; + protected static Point[] pitPositions; + private static Thread enemies; + + protected static int pitNumber = 15; + protected static int enemyNumber = 1; + protected static int RIGHTEDGE = 1200; + protected static final int LEFTEDGE = 0; + protected static final int TOPEDGE = 0; + protected static int BOTTOMEDGE = 1000; + protected static int XAMOUNT = 5; + protected static int YAMOUNT = 5; + private static final int X = 1; + private static final int Y = 2; + private static final int NOT = 3; + private static final int DELAY = 125; + protected int explosionx = -1, explosiony = -1; + + // tank game stuff + boolean up = true, down = false, left = false, right = false, shooting = false; + static int NOTSHOOTING = 0; + static int SHOOTING = 1; + static int FIRSTUP = 0; + static int FIRSTDOWN = 2; + static int FIRSTLEFT = 4; + static int FIRSTRIGHT = 6; + int goodImageNo = FIRSTUP; // TODO - randomise + int[] enemyImageNo; + boolean[] enemyShooting; + Image[][] goodImages = new Image[8][2]; // up up2 down down2 left left2 right right2 x SHOOTING and NON_SHOOTING + Image[][] badImages = new Image[8][2]; // up up2 down down2 left left2 right right2 x SHOOTING and NON_SHOOTING + + public static void main(String[] args) { + Tank Tank = new Tank(); + Tank.setLayout(null); + Tank.setBackground(Color.gray); + Tank.setSize(RIGHTEDGE, BOTTOMEDGE); + + area = new TankArea(Tank); + Tank.add(area); + //RIGHTEDGE = Tank.getBounds().width - 1; + //BOTTOMEDGE = Tank.getBounds().height - 1; + XAMOUNT = 12; + YAMOUNT = 12; + Tank.setVisible(true); + area.setBounds(0, 0, RIGHTEDGE, BOTTOMEDGE); + area.setVisible(true); + + Tank.addKeyListener(Tank); + area.addKeyListener(Tank); + area.requestFocus(); + + Tank.goodImages[FIRSTUP][NOTSHOOTING] = area.tankup; + Tank.goodImages[FIRSTUP + 1][NOTSHOOTING] = area.tankup2; + Tank.goodImages[FIRSTUP][SHOOTING] = area.tankupshoot; + Tank.goodImages[FIRSTUP + 1][SHOOTING] = area.tankupshoot2; + + Tank.goodImages[FIRSTDOWN][NOTSHOOTING] = area.tankdown; + Tank.goodImages[FIRSTDOWN + 1][NOTSHOOTING] = area.tankdown2; + Tank.goodImages[FIRSTDOWN][SHOOTING] = area.tankdownshoot; + Tank.goodImages[FIRSTDOWN + 1][SHOOTING] = area.tankdownshoot2; + + Tank.goodImages[FIRSTLEFT][NOTSHOOTING] = area.tankleft; + Tank.goodImages[FIRSTLEFT + 1][NOTSHOOTING] = area.tankleft2; + Tank.goodImages[FIRSTLEFT][SHOOTING] = area.tankleftshoot; + Tank.goodImages[FIRSTLEFT + 1][SHOOTING] = area.tankleftshoot2; + + Tank.goodImages[FIRSTRIGHT][NOTSHOOTING] = area.tankright; + Tank.goodImages[FIRSTRIGHT + 1][NOTSHOOTING] = area.tankright2; + Tank.goodImages[FIRSTRIGHT][SHOOTING] = area.tankrightshoot; + Tank.goodImages[FIRSTRIGHT + 1][SHOOTING] = area.tankrightshoot2; + + Tank.badImages[FIRSTUP][NOTSHOOTING] = area.badtankup; + Tank.badImages[FIRSTUP + 1][NOTSHOOTING] = area.badtankup2; + Tank.badImages[FIRSTUP][SHOOTING] = area.badtankupshoot; + Tank.badImages[FIRSTUP + 1][SHOOTING] = area.badtankupshoot2; + + Tank.badImages[FIRSTDOWN][NOTSHOOTING] = area.badtankdown; + Tank.badImages[FIRSTDOWN + 1][NOTSHOOTING] = area.badtankdown2; + Tank.badImages[FIRSTDOWN][SHOOTING] = area.badtankdownshoot; + Tank.badImages[FIRSTDOWN + 1][SHOOTING] = area.badtankdownshoot2; + + Tank.badImages[FIRSTLEFT][NOTSHOOTING] = area.badtankleft; + Tank.badImages[FIRSTLEFT + 1][NOTSHOOTING] = area.badtankleft2; + Tank.badImages[FIRSTLEFT][SHOOTING] = area.badtankleftshoot; + Tank.badImages[FIRSTLEFT + 1][SHOOTING] = area.badtankleftshoot2; + + Tank.badImages[FIRSTRIGHT][NOTSHOOTING] = area.badtankright; + Tank.badImages[FIRSTRIGHT + 1][NOTSHOOTING] = area.badtankright2; + Tank.badImages[FIRSTRIGHT][SHOOTING] = area.badtankrightshoot; + Tank.badImages[FIRSTRIGHT + 1][SHOOTING] = area.badtankrightshoot2; + + enemies = new Thread(Tank); + enemies.start(); + } + + public void doLevel(int level) { + // this runs one 'level' + // create arrays of pits and enemies here. + // Maybe each level will have different numbers? + juststarted = true; + Point temppoint; + pitPositions = new Point[pitNumber]; + enemyPositions = new Point[enemyNumber]; + for (int i = 0; i < enemyNumber; i++) + enemyPositions[i] = new Point(0, 0); + for (int i = 0; i < pitNumber; i++) + pitPositions[i] = new Point(0, 0); + + enemyImageNo = new int[enemyNumber]; + enemyShooting = new boolean[enemyNumber]; + for (int i = 0; i < enemyNumber; i++) { + enemyShooting[i] = false; + enemyImageNo[i] = FIRSTUP; // TODO - randomise + } + System.out.println("Started level " + level + ": " + enemyNumber + " enemies and " + pitNumber + " pits"); + + // randomly position 1 player, x enemies and y pits + playerPosition = randomPosition(); + + for (int i = 0; i < enemyNumber; i++) { + temppoint = randomPosition(); + while (isPlayerPosition(temppoint) || isTankPosition(temppoint)) { + // don't position any enemy on the player or on top of another enemy + temppoint = randomPosition(); + } + enemyPositions[i] = temppoint; + } + + for (int i = 0; i < pitNumber; i++) { + temppoint = randomPosition(); + while (isPlayerPosition(temppoint) || isPitPosition(temppoint) || isTankPosition(temppoint)) { + // don't position any enemy at the player, an enemy or another pit + temppoint = randomPosition(); + } + pitPositions[i] = temppoint; + } + + enemiesRemaining = enemyNumber; + // paint the panel here + area.repaint(); + ingame = true; + } + + synchronized void incrementImageNo() { + goodImageNo++; + if ((goodImageNo % 2) == 0) + goodImageNo -= 2; + } + + synchronized void incrementImageNo(int enemyNo) { + enemyImageNo[enemyNo]++; + if ((enemyImageNo[enemyNo] % 2) == 0) + enemyImageNo[enemyNo] -= 2; + } + + void goLeft(int enemyno) { + if (enemyImageNo[enemyno] == FIRSTLEFT || enemyImageNo[enemyno] == FIRSTLEFT + 1) { + incrementImageNo(enemyno); + } else + enemyImageNo[enemyno] = FIRSTLEFT; + } + + void goLeft() { + if (goodImageNo == FIRSTLEFT || goodImageNo == FIRSTLEFT + 1) { + incrementImageNo(); + } else + goodImageNo = FIRSTLEFT; + } + + void goRight(int enemyno) { + if (enemyImageNo[enemyno] == FIRSTRIGHT || enemyImageNo[enemyno] == FIRSTRIGHT + 1) { + incrementImageNo(enemyno); + } else + enemyImageNo[enemyno] = FIRSTRIGHT; + } + + void goRight() { + if (goodImageNo == FIRSTRIGHT || goodImageNo == FIRSTRIGHT + 1) { + incrementImageNo(); + } else + goodImageNo = FIRSTRIGHT; + } + + void goUp(int enemyno) { + if (enemyImageNo[enemyno] == FIRSTUP || enemyImageNo[enemyno] == FIRSTUP + 1) { + incrementImageNo(enemyno); + } else + enemyImageNo[enemyno] = FIRSTUP; + } + + void goUp() { + if (goodImageNo == FIRSTUP || goodImageNo == FIRSTUP + 1) { + incrementImageNo(); + } else + goodImageNo = FIRSTUP; + } + + void goDown(int enemyno) { + if (enemyImageNo[enemyno] == FIRSTDOWN || enemyImageNo[enemyno] == FIRSTDOWN + 1) { + incrementImageNo(enemyno); + } else + enemyImageNo[enemyno] = FIRSTDOWN; + } + + void goDown() { + if (goodImageNo == FIRSTDOWN || goodImageNo == FIRSTDOWN + 1) { + incrementImageNo(); + } else + goodImageNo = FIRSTDOWN; + } + + private Point randomPosition() { + return new Point((int) (Math.random() * RIGHTEDGE) / XAMOUNT * XAMOUNT, + (int) (Math.random() * BOTTOMEDGE) / YAMOUNT * YAMOUNT); + } + + private boolean isPlayerPosition(Point p) { + return (p.x == playerPosition.x && p.y == playerPosition.y); + } + + private boolean isTankPosition(Point p) { + for (int i = 0; i < enemyNumber; i++) { + if (p.x == enemyPositions[i].x && p.y == enemyPositions[i].y) + return (true); + } + return (false); + } + + private int isInline(Point p) { + // is the new position in the same row as the player? + if (Math.abs(p.x - playerPosition.x) < XAMOUNT) { + // see whether there is another enemy between this position and the player + if (playerPosition.y > p.y) { + for (int i = 0; i < enemyNumber; i++) { + if (p.x == enemyPositions[i].x && p.y < enemyPositions[i].y) + return (X); + } + } else { // playerPosition y < p.y + for (int i = 0; i < enemyNumber; i++) { + if (p.x == enemyPositions[i].x && p.y > enemyPositions[i].y) + return (X); + } + } + } else if (Math.abs(p.y - playerPosition.y) < YAMOUNT) { + // see whether there is another enemy between this position and the player + if (playerPosition.x > p.x) { + for (int i = 0; i < enemyNumber; i++) { + if (p.y == enemyPositions[i].y && p.x < enemyPositions[i].x) + return (Y); + } + } else { // playerPosition x < p.x + for (int i = 0; i < enemyNumber; i++) { + if (p.y == enemyPositions[i].y && p.x > enemyPositions[i].x) + return (Y); + } + } + } + return (NOT); + } + + private boolean isPitPosition(Point p) { + for (int i = 0; i < pitNumber; i++) { + if (p.x == pitPositions[i].x && p.y == pitPositions[i].y) + return (true); + } + return (false); + } + + private Point moveCloser(int enemyNo, Point original, Point target) { + Point result = new Point(original); + int inlineType = isInline(original); + // allowed to move EITHER X or Y but not both + if (Math.random() >= 0.5) { + // move in X direction + if (inlineType != X) { + if (original.x < target.x) { + result.x = original.x + (XAMOUNT / 2); + goRight(enemyNo); + } else if (original.x > target.x) { + result.x = original.x - (XAMOUNT / 2); + goLeft(enemyNo); + } + } + } else { + // move in Y direction + if (inlineType != Y) { + if (original.y < target.y) { + result.y = original.y + (YAMOUNT / 2); + goDown(enemyNo); + } else if (original.y > target.y) { + result.y = original.y - (YAMOUNT / 2); + goUp(enemyNo); + } + } + } + /* + * if (isTankPosition(result)) { if (isTankPosition(new Point(result.x, + * original.y))) { if (isTankPosition(new Point(original.x, result.y))) result = + * original; else result = new Point(original.x, result.y); } else result = new + * Point(result.x, original.y); } + */ + inlineType = isInline(result); + if (inlineType == X) { + // fire along the X axis + } else if (inlineType == Y) { + // fire along the Y axis + } + return (result); + } + + /* + * private int randomMove() { // return + or - value (randomly) if + * (Math.random() >= 0.5) return(24); else return(-24); } + */ + + // this class will use just the key pressed event + @Override + public void keyPressed(KeyEvent e) { + if (ingame) { + if (!((e.getKeyCode() == KeyEvent.VK_DOWN && playerPosition.y >= (BOTTOMEDGE - YAMOUNT)) + || (e.getKeyCode() == KeyEvent.VK_UP && playerPosition.y <= (TOPEDGE + YAMOUNT)) + || (e.getKeyCode() == KeyEvent.VK_LEFT && playerPosition.x <= (LEFTEDGE + XAMOUNT)) + || (e.getKeyCode() == KeyEvent.VK_RIGHT && playerPosition.x >= (RIGHTEDGE - XAMOUNT)))) { + // valid move: move the player and then move the enemies + if (e.getKeyCode() == KeyEvent.VK_DOWN) { + playerPosition.y += YAMOUNT; + goDown(); + } else if (e.getKeyCode() == KeyEvent.VK_UP) { + playerPosition.y -= YAMOUNT; + goUp(); + } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { + playerPosition.x -= XAMOUNT; + goLeft(); + } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { + playerPosition.x += XAMOUNT; + goRight(); + } + if (isTankPosition(playerPosition)) { + System.out.println("The Player ran into an enemy!! Press the Enter key to restart the level"); + ingame = false; + } + if (isPitPosition(playerPosition)) { + System.out.println("The Player ran into a pit!! Press the Enter key to restart the level"); + ingame = false; + } + area.repaint(); + } // if valid key press + } else if (e.getKeyCode() == KeyEvent.VK_ENTER) { + doLevel(level++); + } + } + + @Override + public void run() { + while (true) { + if (juststarted) { + try { + Thread.sleep(750); + } catch (Exception e) { + } + juststarted = false; + } + try { + Thread.sleep(DELAY); + } catch (InterruptedException e) { + } + if (ingame) { + // for each enemy, move the enemy closer to the player + for (int i = 0; i < enemyPositions.length; i++) { + if (!deadTank(enemyPositions[i])) { + enemyPositions[i] = moveCloser(i, enemyPositions[i], playerPosition); + } + // if there is a pit at that position, fall into it and decrement count of + // enemies + // and set that enemy's position to -1, -1 + if (isPitPosition(enemyPositions[i])) { + System.out.println("an enemy fell into a pit"); + explosionx = enemyPositions[i].x; + explosiony = enemyPositions[i].y; + + enemyPositions[i] = new Point(-1, -1); + enemiesRemaining--; + System.out.println(enemyNumber - enemiesRemaining + " down, " + enemiesRemaining + " to go..."); + } + // if player is caught by an enemy or all enemies are gone, end the game + if (isPlayerPosition(enemyPositions[i])) { + System.out.println( + "\"Mmm! Brains...\". The Player is dead. Press the Enter key to restart the level"); + level--; // because it will be incremented in a minute and we want to stay on the same + // 'level' + ingame = false; + } + } + if (enemiesRemaining == 0) { + System.out.println( + "All the enemies are gone -- you won!! Press the Enter key to start the next level"); + enemyNumber++; + if (pitNumber > 2) + pitNumber--; + ingame = false; + } else + area.repaint(); + } + } + } + + private boolean deadTank(Point p) { + return (p.x == -1 && p.y == -1); + } + + @Override + public void keyReleased(KeyEvent e) { + } + + @Override + public void keyTyped(KeyEvent e) { + } +} diff --git a/Tank/src/TankArea.java b/Tank/src/TankArea.java @@ -11,7 +11,7 @@ import javax.swing.JPanel; public class TankArea extends JPanel { private static final long serialVersionUID = -2906196036928924340L; - TankGame myApplet = null; + Tank myApplet = null; Image badtankdown2; Image badtankdownshoot; @@ -52,7 +52,7 @@ public class TankArea extends JPanel { private Image explosion1, explosion2, explosion3; MediaTracker mt = null; - public TankArea(TankGame parent) { + public TankArea(Tank parent) { myApplet = parent; enemyImage = load(myApplet, "bad-tank-up.gif"); personImage = load(myApplet, "tank-up.gif"); @@ -94,7 +94,7 @@ public class TankArea extends JPanel { tankup = load(myApplet, "tank-up.gif"); } - Image load(TankGame parent, String picture) { + Image load(Tank parent, String picture) { try { Image im = ImageIO.read(new File("../Assets/" + picture)); checkImage(im, picture); @@ -131,24 +131,24 @@ public class TankArea extends JPanel { g.fillRect(0, 0, w, h); g.setColor(Color.black); - if (TankGame.playerPosition != null) { + if (Tank.playerPosition != null) { // show the player // g.drawString("#", myApplet.playerPosition.x, myApplet.playerPosition.y); - int elem = myApplet.shooting ? myApplet.SHOOTING : myApplet.NOTSHOOTING; - g.drawImage(myApplet.goodImages[myApplet.goodImageNo][elem], TankGame.playerPosition.x, - TankGame.playerPosition.y, Color.gray, null); + int elem = myApplet.shooting ? Tank.SHOOTING : Tank.NOTSHOOTING; + g.drawImage(myApplet.goodImages[myApplet.goodImageNo][elem], Tank.playerPosition.x, + Tank.playerPosition.y, Color.gray, null); // show the pits - for (int i = 0; i < TankGame.pitPositions.length; i++) { - g.drawImage(pitImage, TankGame.pitPositions[i].x, TankGame.pitPositions[i].y, Color.gray, null); + for (int i = 0; i < Tank.pitPositions.length; i++) { + g.drawImage(pitImage, Tank.pitPositions[i].x, Tank.pitPositions[i].y, Color.gray, null); } // show the enemies - for (int i = 0; i < TankGame.enemyPositions.length; i++) { - if (TankGame.enemyPositions[i].x > -1) { - int eelem = myApplet.enemyShooting[i] ? myApplet.SHOOTING : myApplet.NOTSHOOTING; - g.drawImage(myApplet.badImages[myApplet.enemyImageNo[i]][eelem], TankGame.enemyPositions[i].x, - TankGame.enemyPositions[i].y, null); + for (int i = 0; i < Tank.enemyPositions.length; i++) { + if (Tank.enemyPositions[i].x > -1) { + int eelem = myApplet.enemyShooting[i] ? Tank.SHOOTING : Tank.NOTSHOOTING; + g.drawImage(myApplet.badImages[myApplet.enemyImageNo[i]][eelem], Tank.enemyPositions[i].x, + Tank.enemyPositions[i].y, null); } } if (myApplet.explosionx != -1) { diff --git a/Tank/src/TankGame.java b/Tank/src/TankGame.java @@ -1,439 +0,0 @@ -import java.awt.Color; -import java.awt.Image; -import java.awt.Point; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; - -import javax.swing.JFrame; - -/* Copyright (c) Mary Percival 2002 */ -/* Tank game Created October 2002 */ - -public class TankGame extends JFrame implements KeyListener, Runnable { - private static final long serialVersionUID = 2750159877444817519L; - // all member variables 'static' because shared with the enemy action thread - private static TankArea area; - private static boolean ingame = false; - private boolean juststarted = false; - private static int level = 1; - private static int enemiesRemaining; - protected static Point[] enemyPositions; - protected static Point playerPosition; - protected static Point[] pitPositions; - private static Thread enemies; - - protected static int pitNumber = 15; - protected static int enemyNumber = 1; - protected static int RIGHTEDGE = 1200; - protected static final int LEFTEDGE = 0; - protected static final int TOPEDGE = 0; - protected static int BOTTOMEDGE = 1000; - protected static int XAMOUNT = 5; - protected static int YAMOUNT = 5; - private static final int X = 1; - private static final int Y = 2; - private static final int NOT = 3; - private static final int DELAY = 125; - protected int explosionx = -1, explosiony = -1; - - // tank game stuff - boolean up = true, down = false, left = false, right = false, shooting = false; - static int NOTSHOOTING = 0; - static int SHOOTING = 1; - static int FIRSTUP = 0; - static int FIRSTDOWN = 2; - static int FIRSTLEFT = 4; - static int FIRSTRIGHT = 6; - int goodImageNo = FIRSTUP; // TODO - randomise - int[] enemyImageNo; - boolean[] enemyShooting; - Image[][] goodImages = new Image[8][2]; // up up2 down down2 left left2 right right2 x SHOOTING and NON_SHOOTING - Image[][] badImages = new Image[8][2]; // up up2 down down2 left left2 right right2 x SHOOTING and NON_SHOOTING - - public static void main(String[] args) { - TankGame tankGame = new TankGame(); - tankGame.setLayout(null); - tankGame.setBackground(Color.gray); - tankGame.setSize(RIGHTEDGE, BOTTOMEDGE); - - area = new TankArea(tankGame); - tankGame.add(area); - //RIGHTEDGE = tankGame.getBounds().width - 1; - //BOTTOMEDGE = tankGame.getBounds().height - 1; - XAMOUNT = 12; - YAMOUNT = 12; - tankGame.setVisible(true); - area.setBounds(0, 0, RIGHTEDGE, BOTTOMEDGE); - area.setVisible(true); - - tankGame.addKeyListener(tankGame); - area.addKeyListener(tankGame); - area.requestFocus(); - - tankGame.goodImages[FIRSTUP][NOTSHOOTING] = area.tankup; - tankGame.goodImages[FIRSTUP + 1][NOTSHOOTING] = area.tankup2; - tankGame.goodImages[FIRSTUP][SHOOTING] = area.tankupshoot; - tankGame.goodImages[FIRSTUP + 1][SHOOTING] = area.tankupshoot2; - - tankGame.goodImages[FIRSTDOWN][NOTSHOOTING] = area.tankdown; - tankGame.goodImages[FIRSTDOWN + 1][NOTSHOOTING] = area.tankdown2; - tankGame.goodImages[FIRSTDOWN][SHOOTING] = area.tankdownshoot; - tankGame.goodImages[FIRSTDOWN + 1][SHOOTING] = area.tankdownshoot2; - - tankGame.goodImages[FIRSTLEFT][NOTSHOOTING] = area.tankleft; - tankGame.goodImages[FIRSTLEFT + 1][NOTSHOOTING] = area.tankleft2; - tankGame.goodImages[FIRSTLEFT][SHOOTING] = area.tankleftshoot; - tankGame.goodImages[FIRSTLEFT + 1][SHOOTING] = area.tankleftshoot2; - - tankGame.goodImages[FIRSTRIGHT][NOTSHOOTING] = area.tankright; - tankGame.goodImages[FIRSTRIGHT + 1][NOTSHOOTING] = area.tankright2; - tankGame.goodImages[FIRSTRIGHT][SHOOTING] = area.tankrightshoot; - tankGame.goodImages[FIRSTRIGHT + 1][SHOOTING] = area.tankrightshoot2; - - tankGame.badImages[FIRSTUP][NOTSHOOTING] = area.badtankup; - tankGame.badImages[FIRSTUP + 1][NOTSHOOTING] = area.badtankup2; - tankGame.badImages[FIRSTUP][SHOOTING] = area.badtankupshoot; - tankGame.badImages[FIRSTUP + 1][SHOOTING] = area.badtankupshoot2; - - tankGame.badImages[FIRSTDOWN][NOTSHOOTING] = area.badtankdown; - tankGame.badImages[FIRSTDOWN + 1][NOTSHOOTING] = area.badtankdown2; - tankGame.badImages[FIRSTDOWN][SHOOTING] = area.badtankdownshoot; - tankGame.badImages[FIRSTDOWN + 1][SHOOTING] = area.badtankdownshoot2; - - tankGame.badImages[FIRSTLEFT][NOTSHOOTING] = area.badtankleft; - tankGame.badImages[FIRSTLEFT + 1][NOTSHOOTING] = area.badtankleft2; - tankGame.badImages[FIRSTLEFT][SHOOTING] = area.badtankleftshoot; - tankGame.badImages[FIRSTLEFT + 1][SHOOTING] = area.badtankleftshoot2; - - tankGame.badImages[FIRSTRIGHT][NOTSHOOTING] = area.badtankright; - tankGame.badImages[FIRSTRIGHT + 1][NOTSHOOTING] = area.badtankright2; - tankGame.badImages[FIRSTRIGHT][SHOOTING] = area.badtankrightshoot; - tankGame.badImages[FIRSTRIGHT + 1][SHOOTING] = area.badtankrightshoot2; - - enemies = new Thread(tankGame); - enemies.start(); - } - - public void doLevel(int level) { - // this runs one 'level' - // create arrays of pits and enemies here. - // Maybe each level will have different numbers? - juststarted = true; - Point temppoint; - pitPositions = new Point[pitNumber]; - enemyPositions = new Point[enemyNumber]; - for (int i = 0; i < enemyNumber; i++) - enemyPositions[i] = new Point(0, 0); - for (int i = 0; i < pitNumber; i++) - pitPositions[i] = new Point(0, 0); - - enemyImageNo = new int[enemyNumber]; - enemyShooting = new boolean[enemyNumber]; - for (int i = 0; i < enemyNumber; i++) { - enemyShooting[i] = false; - enemyImageNo[i] = FIRSTUP; // TODO - randomise - } - System.out.println("Started level " + level + ": " + enemyNumber + " enemies and " + pitNumber + " pits"); - - // randomly position 1 player, x enemies and y pits - playerPosition = randomPosition(); - - for (int i = 0; i < enemyNumber; i++) { - temppoint = randomPosition(); - while (isPlayerPosition(temppoint) || isTankPosition(temppoint)) { - // don't position any enemy on the player or on top of another enemy - temppoint = randomPosition(); - } - enemyPositions[i] = temppoint; - } - - for (int i = 0; i < pitNumber; i++) { - temppoint = randomPosition(); - while (isPlayerPosition(temppoint) || isPitPosition(temppoint) || isTankPosition(temppoint)) { - // don't position any enemy at the player, an enemy or another pit - temppoint = randomPosition(); - } - pitPositions[i] = temppoint; - } - - enemiesRemaining = enemyNumber; - // paint the panel here - area.repaint(); - ingame = true; - } - - synchronized void incrementImageNo() { - goodImageNo++; - if ((goodImageNo % 2) == 0) - goodImageNo -= 2; - } - - synchronized void incrementImageNo(int enemyNo) { - enemyImageNo[enemyNo]++; - if ((enemyImageNo[enemyNo] % 2) == 0) - enemyImageNo[enemyNo] -= 2; - } - - void goLeft(int enemyno) { - if (enemyImageNo[enemyno] == FIRSTLEFT || enemyImageNo[enemyno] == FIRSTLEFT + 1) { - incrementImageNo(enemyno); - } else - enemyImageNo[enemyno] = FIRSTLEFT; - } - - void goLeft() { - if (goodImageNo == FIRSTLEFT || goodImageNo == FIRSTLEFT + 1) { - incrementImageNo(); - } else - goodImageNo = FIRSTLEFT; - } - - void goRight(int enemyno) { - if (enemyImageNo[enemyno] == FIRSTRIGHT || enemyImageNo[enemyno] == FIRSTRIGHT + 1) { - incrementImageNo(enemyno); - } else - enemyImageNo[enemyno] = FIRSTRIGHT; - } - - void goRight() { - if (goodImageNo == FIRSTRIGHT || goodImageNo == FIRSTRIGHT + 1) { - incrementImageNo(); - } else - goodImageNo = FIRSTRIGHT; - } - - void goUp(int enemyno) { - if (enemyImageNo[enemyno] == FIRSTUP || enemyImageNo[enemyno] == FIRSTUP + 1) { - incrementImageNo(enemyno); - } else - enemyImageNo[enemyno] = FIRSTUP; - } - - void goUp() { - if (goodImageNo == FIRSTUP || goodImageNo == FIRSTUP + 1) { - incrementImageNo(); - } else - goodImageNo = FIRSTUP; - } - - void goDown(int enemyno) { - if (enemyImageNo[enemyno] == FIRSTDOWN || enemyImageNo[enemyno] == FIRSTDOWN + 1) { - incrementImageNo(enemyno); - } else - enemyImageNo[enemyno] = FIRSTDOWN; - } - - void goDown() { - if (goodImageNo == FIRSTDOWN || goodImageNo == FIRSTDOWN + 1) { - incrementImageNo(); - } else - goodImageNo = FIRSTDOWN; - } - - private Point randomPosition() { - return new Point((int) (Math.random() * RIGHTEDGE) / XAMOUNT * XAMOUNT, - (int) (Math.random() * BOTTOMEDGE) / YAMOUNT * YAMOUNT); - } - - private boolean isPlayerPosition(Point p) { - return (p.x == playerPosition.x && p.y == playerPosition.y); - } - - private boolean isTankPosition(Point p) { - for (int i = 0; i < enemyNumber; i++) { - if (p.x == enemyPositions[i].x && p.y == enemyPositions[i].y) - return (true); - } - return (false); - } - - private int isInline(Point p) { - // is the new position in the same row as the player? - if (Math.abs(p.x - playerPosition.x) < XAMOUNT) { - // see whether there is another enemy between this position and the player - if (playerPosition.y > p.y) { - for (int i = 0; i < enemyNumber; i++) { - if (p.x == enemyPositions[i].x && p.y < enemyPositions[i].y) - return (X); - } - } else { // playerPosition y < p.y - for (int i = 0; i < enemyNumber; i++) { - if (p.x == enemyPositions[i].x && p.y > enemyPositions[i].y) - return (X); - } - } - } else if (Math.abs(p.y - playerPosition.y) < YAMOUNT) { - // see whether there is another enemy between this position and the player - if (playerPosition.x > p.x) { - for (int i = 0; i < enemyNumber; i++) { - if (p.y == enemyPositions[i].y && p.x < enemyPositions[i].x) - return (Y); - } - } else { // playerPosition x < p.x - for (int i = 0; i < enemyNumber; i++) { - if (p.y == enemyPositions[i].y && p.x > enemyPositions[i].x) - return (Y); - } - } - } - return (NOT); - } - - private boolean isPitPosition(Point p) { - for (int i = 0; i < pitNumber; i++) { - if (p.x == pitPositions[i].x && p.y == pitPositions[i].y) - return (true); - } - return (false); - } - - private Point moveCloser(int enemyNo, Point original, Point target) { - Point result = new Point(original); - int inlineType = isInline(original); - // allowed to move EITHER X or Y but not both - if (Math.random() >= 0.5) { - // move in X direction - if (inlineType != X) { - if (original.x < target.x) { - result.x = original.x + (XAMOUNT / 2); - goRight(enemyNo); - } else if (original.x > target.x) { - result.x = original.x - (XAMOUNT / 2); - goLeft(enemyNo); - } - } - } else { - // move in Y direction - if (inlineType != Y) { - if (original.y < target.y) { - result.y = original.y + (YAMOUNT / 2); - goDown(enemyNo); - } else if (original.y > target.y) { - result.y = original.y - (YAMOUNT / 2); - goUp(enemyNo); - } - } - } - /* - * if (isTankPosition(result)) { if (isTankPosition(new Point(result.x, - * original.y))) { if (isTankPosition(new Point(original.x, result.y))) result = - * original; else result = new Point(original.x, result.y); } else result = new - * Point(result.x, original.y); } - */ - inlineType = isInline(result); - if (inlineType == X) { - // fire along the X axis - } else if (inlineType == Y) { - // fire along the Y axis - } - return (result); - } - - /* - * private int randomMove() { // return + or - value (randomly) if - * (Math.random() >= 0.5) return(24); else return(-24); } - */ - - // this class will use just the key pressed event - @Override - public void keyPressed(KeyEvent e) { - if (ingame) { - if (!((e.getKeyCode() == KeyEvent.VK_DOWN && playerPosition.y >= (BOTTOMEDGE - YAMOUNT)) - || (e.getKeyCode() == KeyEvent.VK_UP && playerPosition.y <= (TOPEDGE + YAMOUNT)) - || (e.getKeyCode() == KeyEvent.VK_LEFT && playerPosition.x <= (LEFTEDGE + XAMOUNT)) - || (e.getKeyCode() == KeyEvent.VK_RIGHT && playerPosition.x >= (RIGHTEDGE - XAMOUNT)))) { - // valid move: move the player and then move the enemies - if (e.getKeyCode() == KeyEvent.VK_DOWN) { - playerPosition.y += YAMOUNT; - goDown(); - } else if (e.getKeyCode() == KeyEvent.VK_UP) { - playerPosition.y -= YAMOUNT; - goUp(); - } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { - playerPosition.x -= XAMOUNT; - goLeft(); - } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { - playerPosition.x += XAMOUNT; - goRight(); - } - if (isTankPosition(playerPosition)) { - System.out.println("The Player ran into an enemy!! Press the Enter key to restart the level"); - ingame = false; - } - if (isPitPosition(playerPosition)) { - System.out.println("The Player ran into a pit!! Press the Enter key to restart the level"); - ingame = false; - } - area.repaint(); - } // if valid key press - } else if (e.getKeyCode() == KeyEvent.VK_ENTER) { - doLevel(level++); - } - } - - @Override - public void run() { - while (true) { - if (juststarted) { - try { - Thread.sleep(750); - } catch (Exception e) { - } - juststarted = false; - } - try { - Thread.sleep(DELAY); - } catch (InterruptedException e) { - } - if (ingame) { - // for each enemy, move the enemy closer to the player - for (int i = 0; i < enemyPositions.length; i++) { - if (!deadTank(enemyPositions[i])) { - enemyPositions[i] = moveCloser(i, enemyPositions[i], playerPosition); - } - // if there is a pit at that position, fall into it and decrement count of - // enemies - // and set that enemy's position to -1, -1 - if (isPitPosition(enemyPositions[i])) { - System.out.println("an enemy fell into a pit"); - explosionx = enemyPositions[i].x; - explosiony = enemyPositions[i].y; - - enemyPositions[i] = new Point(-1, -1); - enemiesRemaining--; - System.out.println(enemyNumber - enemiesRemaining + " down, " + enemiesRemaining + " to go..."); - } - // if player is caught by an enemy or all enemies are gone, end the game - if (isPlayerPosition(enemyPositions[i])) { - System.out.println( - "\"Mmm! Brains...\". The Player is dead. Press the Enter key to restart the level"); - level--; // because it will be incremented in a minute and we want to stay on the same - // 'level' - ingame = false; - } - } - if (enemiesRemaining == 0) { - System.out.println( - "All the enemies are gone -- you won!! Press the Enter key to start the next level"); - enemyNumber++; - if (pitNumber > 2) - pitNumber--; - ingame = false; - } else - area.repaint(); - } - } - } - - private boolean deadTank(Point p) { - return (p.x == -1 && p.y == -1); - } - - @Override - public void keyReleased(KeyEvent e) { - } - - @Override - public void keyTyped(KeyEvent e) { - } -} diff --git a/Zombie/src/Zombie.java b/Zombie/src/Zombie.java @@ -0,0 +1,304 @@ + +/* Copyright (c) M Percival 2002 */ +/* Zombie game Created October 2002 */ + +import java.awt.Color; +import java.awt.Point; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; + +import javax.swing.JFrame; + +public class Zombie extends JFrame implements KeyListener, Runnable { + private static final long serialVersionUID = 8654912377879331966L; + // all member variables 'static' because shared with the zombie action thread + private static ZombieArea area; + private static boolean ingame = false; + private boolean juststarted = false; + private static int level = 1; + private static int zombiesRemaining; + protected static Point[] zombiePositions; + protected static Point playerPosition; + protected static Point[] pitPositions; + private static Thread zombies; + + protected static int pitNumber = 15; + protected static int zombieNumber = 10; + protected static int RIGHTEDGE = 1200; + protected static final int LEFTEDGE = 0; + protected static final int TOPEDGE = 0; + protected static int BOTTOMEDGE = 1000; + protected static int XAMOUNT = 5; + protected static int YAMOUNT = 5; + private static final int X = 1; + private static final int Y = 2; + private static final int NOT = 3; + private static final int DELAY = 125; + protected int explosionx = -1, explosiony = -1; + + public static void main(String[] args) { + Zombie Zombie = new Zombie(); + Zombie.setLayout(null); + Zombie.setBackground(Color.gray); + Zombie.setSize(RIGHTEDGE, BOTTOMEDGE); + + area = new ZombieArea(Zombie); + Zombie.add(area); + // RIGHTEDGE = getBounds().width - 1; + // BOTTOMEDGE = getBounds().height - 1; + XAMOUNT = 12; + YAMOUNT = 12; + Zombie.setVisible(true); + area.setBounds(0, 0, RIGHTEDGE, BOTTOMEDGE); + area.setVisible(true); + + Zombie.addKeyListener(Zombie); + area.addKeyListener(Zombie); + area.requestFocus(); + + zombies = new Thread(Zombie); + zombies.start(); + } + + public void doLevel(int level) { + // this runs one 'level' + // create arrays of pits and zombies here. + // Maybe each level will have different numbers? + juststarted = true; + Point temppoint; + pitPositions = new Point[pitNumber]; + zombiePositions = new Point[zombieNumber]; + for (int i = 0; i < zombieNumber; i++) + zombiePositions[i] = new Point(0, 0); + for (int i = 0; i < pitNumber; i++) + pitPositions[i] = new Point(0, 0); + + System.out.println("Started level " + level + ": " + zombieNumber + " zombies and " + pitNumber + " pits"); + + // randomly position 1 player, x zombies and y pits + playerPosition = randomPosition(); + + for (int i = 0; i < zombieNumber; i++) { + temppoint = randomPosition(); + while (isPlayerPosition(temppoint) || isZombiePosition(temppoint)) { + // don't position any zombie on the player or on top of another zombie + temppoint = randomPosition(); + } + zombiePositions[i] = temppoint; + } + + for (int i = 0; i < pitNumber; i++) { + temppoint = randomPosition(); + while (isPlayerPosition(temppoint) || isPitPosition(temppoint) || isZombiePosition(temppoint)) { + // don't position any zombie at the player, a zombie or another pit + temppoint = randomPosition(); + } + + pitPositions[i] = temppoint; + } + + zombiesRemaining = zombieNumber; + // paint the panel here + area.repaint(); + ingame = true; + } + + private Point randomPosition() { + return new Point((int) (Math.random() * RIGHTEDGE) / XAMOUNT * XAMOUNT, + (int) (Math.random() * BOTTOMEDGE) / YAMOUNT * YAMOUNT); + } + + private boolean isPlayerPosition(Point p) { + return (p.x == playerPosition.x && p.y == playerPosition.y); + } + + private boolean isZombiePosition(Point p) { + for (int i = 0; i < zombieNumber; i++) { + if (p.x == zombiePositions[i].x && p.y == zombiePositions[i].y) + return (true); + } + return (false); + } + + private int isInline(Point p) { + // is the new position in the same row as the player? + if (Math.abs(p.x - playerPosition.x) < XAMOUNT) { + // see whether there is another zombie between this position and the player + if (playerPosition.y > p.y) { + for (int i = 0; i < zombieNumber; i++) { + if (p.x == zombiePositions[i].x && p.y < zombiePositions[i].y) + return (X); + } + } else { // playerPosition y < p.y + for (int i = 0; i < zombieNumber; i++) { + if (p.x == zombiePositions[i].x && p.y > zombiePositions[i].y) + return (X); + } + } + } else if (Math.abs(p.y - playerPosition.y) < YAMOUNT) { + // see whether there is another zombie between this position and the player + if (playerPosition.x > p.x) { + for (int i = 0; i < zombieNumber; i++) { + if (p.y == zombiePositions[i].y && p.x < zombiePositions[i].x) + return (Y); + } + } else { // playerPosition x < p.x + for (int i = 0; i < zombieNumber; i++) { + if (p.y == zombiePositions[i].y && p.x > zombiePositions[i].x) + return (Y); + } + } + } + return (NOT); + } + + private boolean isPitPosition(Point p) { + for (int i = 0; i < pitNumber; i++) { + if (p.x == pitPositions[i].x && p.y == pitPositions[i].y) + return (true); + } + + return (false); + } + + private Point moveCloser(Point original, Point target) { + Point result = new Point(original); + int inlineType = isInline(original); + if (inlineType != X) { + if (original.x < target.x) + result.x = original.x + (XAMOUNT / 2); + else if (original.x > target.x) + result.x = original.x - (XAMOUNT / 2); + } else { + // move out of the Y alignment - randomly left or right + result.x += randomMove(); + } + if (inlineType != Y) { + if (original.y < target.y) + result.y = original.y + (YAMOUNT / 2); + else if (original.y > target.y) + result.y = original.y - (YAMOUNT / 2); + } else { + // move out of the Y alignment - randomly up or down + result.y += randomMove(); + } + if (isZombiePosition(result)) { + if (isZombiePosition(new Point(result.x, original.y))) { + if (isZombiePosition(new Point(original.x, result.y))) + result = original; + else + result = new Point(original.x, result.y); + } else + result = new Point(result.x, original.y); + } + return (result); + } + + private int randomMove() { + // return + or - value (randomly) + if (Math.random() >= 0.5) + return (24); + else + return (-24); + } + + // this class will use just the key pressed event + @Override + public void keyPressed(KeyEvent e) { + if (ingame) { + if (!((e.getKeyCode() == KeyEvent.VK_DOWN && playerPosition.y >= (BOTTOMEDGE - YAMOUNT)) + || (e.getKeyCode() == KeyEvent.VK_UP && playerPosition.y <= (TOPEDGE + YAMOUNT)) + || (e.getKeyCode() == KeyEvent.VK_LEFT && playerPosition.x <= (LEFTEDGE + XAMOUNT)) + || (e.getKeyCode() == KeyEvent.VK_RIGHT && playerPosition.x >= (RIGHTEDGE - XAMOUNT)))) { + // valid move: move the player and then move the zombies + if (e.getKeyCode() == KeyEvent.VK_DOWN) { + playerPosition.y += YAMOUNT; + } else if (e.getKeyCode() == KeyEvent.VK_UP) { + playerPosition.y -= YAMOUNT; + } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { + playerPosition.x -= XAMOUNT; + } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { + playerPosition.x += XAMOUNT; + } + if (isZombiePosition(playerPosition)) { + System.out.println("The Player ran into a zombie!! Press the Enter key to restart the level"); + ingame = false; + } + if (isPitPosition(playerPosition)) { + System.out.println("The Player ran into a pit!! Press the Enter key to restart the level"); + ingame = false; + } + area.repaint(); + } // if valid key press + } else if (e.getKeyCode() == KeyEvent.VK_ENTER) { + doLevel(level++); + } + } + + @Override + public void run() { + while (true) { + if (juststarted) { + try { + Thread.sleep(750); + } catch (Exception e) { + } + juststarted = false; + } + try { + Thread.sleep(DELAY); + } catch (InterruptedException e) { + } + if (ingame) { + // for each zombie, move the zombie closer to the player + for (int i = 0; i < zombiePositions.length; i++) { + if (!deadZombie(zombiePositions[i])) { + zombiePositions[i] = moveCloser(zombiePositions[i], playerPosition); + } + // if there is a pit at that position, fall into it and decrement count of + // zombies + // and set that zombie's position to -1, -1 + if (isPitPosition(zombiePositions[i])) { + System.out.println("A zombie fell into a pit"); + explosionx = zombiePositions[i].x; + explosiony = zombiePositions[i].y; + + zombiePositions[i] = new Point(-1, -1); + zombiesRemaining--; + System.out + .println(zombieNumber - zombiesRemaining + " down, " + zombiesRemaining + " to go..."); + } + // if player is caught by a zombie or all zombies are gone, end the game + if (isPlayerPosition(zombiePositions[i])) { + System.out.println( + "\"Mmm! Brains...\". The Player is dead. Press the Enter key to restart the level"); + level--; // because it will be incremented in a minute and we want to stay on the same + // 'level' + ingame = false; + } + } + if (zombiesRemaining == 0) { + System.out.println( + "All the zombies are gone -- you won!! Press the Enter key to start the next level"); + zombieNumber++; + if (pitNumber > 2) + pitNumber--; + ingame = false; + } else + area.repaint(); + } + } + } + + private boolean deadZombie(Point p) { + return (p.x == -1 && p.y == -1); + } + + @Override + public void keyReleased(KeyEvent e) { + } + + @Override + public void keyTyped(KeyEvent e) { + } +} diff --git a/Zombie/src/ZombieArea.java b/Zombie/src/ZombieArea.java @@ -11,13 +11,13 @@ import javax.swing.JPanel; public class ZombieArea extends JPanel implements ActionListener { private static final long serialVersionUID = 8492549939914174796L; - ZombieGame myApplet = null; + Zombie myApplet = null; Image zombieImage; Image personImage; Image pitImage; private Image explosion1, explosion2, explosion3; - public ZombieArea(ZombieGame parent) { + public ZombieArea(Zombie parent) { myApplet = parent; try { @@ -43,20 +43,20 @@ public class ZombieArea extends JPanel implements ActionListener { g.fillRect(0, 0, w, h); g.setColor(Color.black); - if (ZombieGame.playerPosition != null) { + if (Zombie.playerPosition != null) { // show the player //g.drawString("#", myApplet.playerPosition.x, myApplet.playerPosition.y); - g.drawImage(personImage, ZombieGame.playerPosition.x, ZombieGame.playerPosition.y,Color.gray, null); + g.drawImage(personImage, Zombie.playerPosition.x, Zombie.playerPosition.y,Color.gray, null); // show the pits - for (int i=0; i < ZombieGame.pitPositions.length; i++) { - g.drawImage(pitImage, ZombieGame.pitPositions[i].x, ZombieGame.pitPositions[i].y,Color.gray, null); + for (int i=0; i < Zombie.pitPositions.length; i++) { + g.drawImage(pitImage, Zombie.pitPositions[i].x, Zombie.pitPositions[i].y,Color.gray, null); } // show the zombies - for (int i=0; i < ZombieGame.zombiePositions.length; i++) { - if (ZombieGame.zombiePositions[i].x > -1) - g.drawImage(zombieImage, ZombieGame.zombiePositions[i].x, ZombieGame.zombiePositions[i].y,null); + for (int i=0; i < Zombie.zombiePositions.length; i++) { + if (Zombie.zombiePositions[i].x > -1) + g.drawImage(zombieImage, Zombie.zombiePositions[i].x, Zombie.zombiePositions[i].y,null); } if (myApplet.explosionx != -1) { diff --git a/Zombie/src/ZombieGame.java b/Zombie/src/ZombieGame.java @@ -1,304 +0,0 @@ - -/* Copyright (c) M Percival 2002 */ -/* Zombie game Created October 2002 */ - -import java.awt.Color; -import java.awt.Point; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; - -import javax.swing.JFrame; - -public class ZombieGame extends JFrame implements KeyListener, Runnable { - private static final long serialVersionUID = 8654912377879331966L; - // all member variables 'static' because shared with the zombie action thread - private static ZombieArea area; - private static boolean ingame = false; - private boolean juststarted = false; - private static int level = 1; - private static int zombiesRemaining; - protected static Point[] zombiePositions; - protected static Point playerPosition; - protected static Point[] pitPositions; - private static Thread zombies; - - protected static int pitNumber = 15; - protected static int zombieNumber = 10; - protected static int RIGHTEDGE = 1200; - protected static final int LEFTEDGE = 0; - protected static final int TOPEDGE = 0; - protected static int BOTTOMEDGE = 1000; - protected static int XAMOUNT = 5; - protected static int YAMOUNT = 5; - private static final int X = 1; - private static final int Y = 2; - private static final int NOT = 3; - private static final int DELAY = 125; - protected int explosionx = -1, explosiony = -1; - - public static void main(String[] args) { - ZombieGame zombieGame = new ZombieGame(); - zombieGame.setLayout(null); - zombieGame.setBackground(Color.gray); - zombieGame.setSize(RIGHTEDGE, BOTTOMEDGE); - - area = new ZombieArea(zombieGame); - zombieGame.add(area); - // RIGHTEDGE = getBounds().width - 1; - // BOTTOMEDGE = getBounds().height - 1; - XAMOUNT = 12; - YAMOUNT = 12; - zombieGame.setVisible(true); - area.setBounds(0, 0, RIGHTEDGE, BOTTOMEDGE); - area.setVisible(true); - - zombieGame.addKeyListener(zombieGame); - area.addKeyListener(zombieGame); - area.requestFocus(); - - zombies = new Thread(zombieGame); - zombies.start(); - } - - public void doLevel(int level) { - // this runs one 'level' - // create arrays of pits and zombies here. - // Maybe each level will have different numbers? - juststarted = true; - Point temppoint; - pitPositions = new Point[pitNumber]; - zombiePositions = new Point[zombieNumber]; - for (int i = 0; i < zombieNumber; i++) - zombiePositions[i] = new Point(0, 0); - for (int i = 0; i < pitNumber; i++) - pitPositions[i] = new Point(0, 0); - - System.out.println("Started level " + level + ": " + zombieNumber + " zombies and " + pitNumber + " pits"); - - // randomly position 1 player, x zombies and y pits - playerPosition = randomPosition(); - - for (int i = 0; i < zombieNumber; i++) { - temppoint = randomPosition(); - while (isPlayerPosition(temppoint) || isZombiePosition(temppoint)) { - // don't position any zombie on the player or on top of another zombie - temppoint = randomPosition(); - } - zombiePositions[i] = temppoint; - } - - for (int i = 0; i < pitNumber; i++) { - temppoint = randomPosition(); - while (isPlayerPosition(temppoint) || isPitPosition(temppoint) || isZombiePosition(temppoint)) { - // don't position any zombie at the player, a zombie or another pit - temppoint = randomPosition(); - } - - pitPositions[i] = temppoint; - } - - zombiesRemaining = zombieNumber; - // paint the panel here - area.repaint(); - ingame = true; - } - - private Point randomPosition() { - return new Point((int) (Math.random() * RIGHTEDGE) / XAMOUNT * XAMOUNT, - (int) (Math.random() * BOTTOMEDGE) / YAMOUNT * YAMOUNT); - } - - private boolean isPlayerPosition(Point p) { - return (p.x == playerPosition.x && p.y == playerPosition.y); - } - - private boolean isZombiePosition(Point p) { - for (int i = 0; i < zombieNumber; i++) { - if (p.x == zombiePositions[i].x && p.y == zombiePositions[i].y) - return (true); - } - return (false); - } - - private int isInline(Point p) { - // is the new position in the same row as the player? - if (Math.abs(p.x - playerPosition.x) < XAMOUNT) { - // see whether there is another zombie between this position and the player - if (playerPosition.y > p.y) { - for (int i = 0; i < zombieNumber; i++) { - if (p.x == zombiePositions[i].x && p.y < zombiePositions[i].y) - return (X); - } - } else { // playerPosition y < p.y - for (int i = 0; i < zombieNumber; i++) { - if (p.x == zombiePositions[i].x && p.y > zombiePositions[i].y) - return (X); - } - } - } else if (Math.abs(p.y - playerPosition.y) < YAMOUNT) { - // see whether there is another zombie between this position and the player - if (playerPosition.x > p.x) { - for (int i = 0; i < zombieNumber; i++) { - if (p.y == zombiePositions[i].y && p.x < zombiePositions[i].x) - return (Y); - } - } else { // playerPosition x < p.x - for (int i = 0; i < zombieNumber; i++) { - if (p.y == zombiePositions[i].y && p.x > zombiePositions[i].x) - return (Y); - } - } - } - return (NOT); - } - - private boolean isPitPosition(Point p) { - for (int i = 0; i < pitNumber; i++) { - if (p.x == pitPositions[i].x && p.y == pitPositions[i].y) - return (true); - } - - return (false); - } - - private Point moveCloser(Point original, Point target) { - Point result = new Point(original); - int inlineType = isInline(original); - if (inlineType != X) { - if (original.x < target.x) - result.x = original.x + (XAMOUNT / 2); - else if (original.x > target.x) - result.x = original.x - (XAMOUNT / 2); - } else { - // move out of the Y alignment - randomly left or right - result.x += randomMove(); - } - if (inlineType != Y) { - if (original.y < target.y) - result.y = original.y + (YAMOUNT / 2); - else if (original.y > target.y) - result.y = original.y - (YAMOUNT / 2); - } else { - // move out of the Y alignment - randomly up or down - result.y += randomMove(); - } - if (isZombiePosition(result)) { - if (isZombiePosition(new Point(result.x, original.y))) { - if (isZombiePosition(new Point(original.x, result.y))) - result = original; - else - result = new Point(original.x, result.y); - } else - result = new Point(result.x, original.y); - } - return (result); - } - - private int randomMove() { - // return + or - value (randomly) - if (Math.random() >= 0.5) - return (24); - else - return (-24); - } - - // this class will use just the key pressed event - @Override - public void keyPressed(KeyEvent e) { - if (ingame) { - if (!((e.getKeyCode() == KeyEvent.VK_DOWN && playerPosition.y >= (BOTTOMEDGE - YAMOUNT)) - || (e.getKeyCode() == KeyEvent.VK_UP && playerPosition.y <= (TOPEDGE + YAMOUNT)) - || (e.getKeyCode() == KeyEvent.VK_LEFT && playerPosition.x <= (LEFTEDGE + XAMOUNT)) - || (e.getKeyCode() == KeyEvent.VK_RIGHT && playerPosition.x >= (RIGHTEDGE - XAMOUNT)))) { - // valid move: move the player and then move the zombies - if (e.getKeyCode() == KeyEvent.VK_DOWN) { - playerPosition.y += YAMOUNT; - } else if (e.getKeyCode() == KeyEvent.VK_UP) { - playerPosition.y -= YAMOUNT; - } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { - playerPosition.x -= XAMOUNT; - } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { - playerPosition.x += XAMOUNT; - } - if (isZombiePosition(playerPosition)) { - System.out.println("The Player ran into a zombie!! Press the Enter key to restart the level"); - ingame = false; - } - if (isPitPosition(playerPosition)) { - System.out.println("The Player ran into a pit!! Press the Enter key to restart the level"); - ingame = false; - } - area.repaint(); - } // if valid key press - } else if (e.getKeyCode() == KeyEvent.VK_ENTER) { - doLevel(level++); - } - } - - @Override - public void run() { - while (true) { - if (juststarted) { - try { - Thread.sleep(750); - } catch (Exception e) { - } - juststarted = false; - } - try { - Thread.sleep(DELAY); - } catch (InterruptedException e) { - } - if (ingame) { - // for each zombie, move the zombie closer to the player - for (int i = 0; i < zombiePositions.length; i++) { - if (!deadZombie(zombiePositions[i])) { - zombiePositions[i] = moveCloser(zombiePositions[i], playerPosition); - } - // if there is a pit at that position, fall into it and decrement count of - // zombies - // and set that zombie's position to -1, -1 - if (isPitPosition(zombiePositions[i])) { - System.out.println("A zombie fell into a pit"); - explosionx = zombiePositions[i].x; - explosiony = zombiePositions[i].y; - - zombiePositions[i] = new Point(-1, -1); - zombiesRemaining--; - System.out - .println(zombieNumber - zombiesRemaining + " down, " + zombiesRemaining + " to go..."); - } - // if player is caught by a zombie or all zombies are gone, end the game - if (isPlayerPosition(zombiePositions[i])) { - System.out.println( - "\"Mmm! Brains...\". The Player is dead. Press the Enter key to restart the level"); - level--; // because it will be incremented in a minute and we want to stay on the same - // 'level' - ingame = false; - } - } - if (zombiesRemaining == 0) { - System.out.println( - "All the zombies are gone -- you won!! Press the Enter key to start the next level"); - zombieNumber++; - if (pitNumber > 2) - pitNumber--; - ingame = false; - } else - area.repaint(); - } - } - } - - private boolean deadZombie(Point p) { - return (p.x == -1 && p.y == -1); - } - - @Override - public void keyReleased(KeyEvent e) { - } - - @Override - public void keyTyped(KeyEvent e) { - } -}