/******************************************************************************* ** ** ** @author: Thanius ** ** @version: 1.0.0 ** ** ** ** @info: The Game File ** ** ** *******************************************************************************/ package bomberman; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.ArrayList; import javax.swing.JPanel; public class Game extends JPanel implements Runnable, KeyListener { private static final long serialVersionUID = 1L; private Player user; private Level map; private ArrayList bricksUndestroyable, bricksDestroyable; private ArrayList bombs; private BufferedImage image; private Graphics second; private Font font; private String userAction, userOption, level; private boolean running; public Game() throws IOException { InitGame(); } private void InitGame() throws IOException { running = true; userAction = "none"; userOption = "none"; level = "map1"; map = new Level(level); bricksUndestroyable = map.GetBricksUndestroyable(); bricksDestroyable = map.GetBricksDestroyable(); user = new Player(69, 69); bombs = new ArrayList<>(); for(int i = 0; i < user.GetBombs(); i++) { bombs.add(new Bomb()); bombs.get(i).SetBricks(bricksUndestroyable, bricksDestroyable); bombs.get(i).SetPower(user.GetPower()); } addKeyListener(this); Thread thread = new Thread(this); thread.setName("Bomberman"); thread.start(); } /******************************************************************************* ** ** ** O V E R R I D E S ** ** ** *******************************************************************************/ @Override public void run() { while(running) { LevelUpdate(); PlayerUpdate(); BombUpdate(); repaint(); try { Thread.sleep(10); } catch(InterruptedException ex) { } } } @Override public void paint(Graphics g) { LevelSprites(g); BombSprites(g); PlayerSprites(g); } @Override public void update(Graphics g) { if(image == null) { image = (BufferedImage) createImage(this.getWidth(), this.getHeight()); second = image.getGraphics(); } second.setColor(getBackground()); second.fillRect(0, 0, getWidth(), getHeight()); second.setColor(getForeground()); paint(second); g.drawImage(image, 0, 0, this); } @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { switch(e.getKeyCode()) { case KeyEvent.VK_LEFT: if(user.GetAlive()) { user.MoveX(-user.GetSpeed()); userAction = "left"; } break; case KeyEvent.VK_RIGHT: if(user.GetAlive()) { user.MoveX(user.GetSpeed()); userAction = "right"; } break; case KeyEvent.VK_UP: if(user.GetAlive()) { user.MoveY(-user.GetSpeed()); userAction = "up"; } break; case KeyEvent.VK_DOWN: if(user.GetAlive()) { user.MoveY(user.GetSpeed()); userAction = "down"; } break; case KeyEvent.VK_H: userOption = "help"; break; case KeyEvent.VK_S: break; case KeyEvent.VK_ESCAPE: System.exit(0); break; } } @Override public void keyReleased(KeyEvent e) { switch(e.getKeyCode()) { case KeyEvent.VK_LEFT: if(user.GetAlive()) { user.SetCurrentFrame(user.GetLeft1()); userAction = "none"; } break; case KeyEvent.VK_RIGHT: if(user.GetAlive()) { user.SetCurrentFrame(user.GetRight1()); userAction = "none"; } break; case KeyEvent.VK_UP: if(user.GetAlive()) { user.SetCurrentFrame(user.GetUp1()); userAction = "none"; } break; case KeyEvent.VK_DOWN: if(user.GetAlive()) { user.SetCurrentFrame(user.GetDown1()); userAction = "none"; } break; case KeyEvent.VK_D: DropBomb(); break; case KeyEvent.VK_H: userOption = "none"; break; case KeyEvent.VK_S: user.SetLives(-1); userAction = "die"; user.SetOldTime(System.currentTimeMillis()); break; } } /******************************************************************************* ** ** ** P A I N T I N G S ** ** ** *******************************************************************************/ private void LevelSprites(Graphics g) { g.drawImage(map.GetBGImage(), 0, 0, this); for(int i = 0; i < bricksUndestroyable.size(); i++) { g.drawImage(bricksUndestroyable.get(i).GetImage(), bricksUndestroyable.get(i).GetX(), bricksUndestroyable.get(i).GetY(), this); } for(int i = 0; i < bricksDestroyable.size(); i++) { g.drawImage(bricksDestroyable.get(i).GetImage(), bricksDestroyable.get(i).GetX(), bricksDestroyable.get(i).GetY(), this); } font = new Font(null, Font.BOLD, 15); g.setFont(font); g.setColor(Color.ORANGE); g.drawString(map.GetMapName(), 365, 23); } private void PlayerSprites(Graphics g) { int bombImgDistance = 20; int powerImgDistance = 20; int livesImgDistance = 20; font = new Font(null, Font.BOLD, 15); g.setFont(font); g.setColor(Color.ORANGE); g.drawString("Score: " + user.GetScore(), 681, 23); if(!user.GetDied()) g.drawImage(user.GetCurrentFrame(), user.GetX(), user.GetY(), this); for(int i = 0; i < user.GetBombs(); i++) { g.drawImage(user.GetBombImage(), 95 + bombImgDistance, 10, this); bombImgDistance += 20; } for(int i = 0; i < user.GetPower(); i++) { g.drawImage(user.GetPowerImage(), 205 + powerImgDistance, 10, this); powerImgDistance += 20; } for(int i = 0; i < user.GetLives(); i++) { g.drawImage(user.GetLiveImage(), -15 + livesImgDistance, 10, this); livesImgDistance += 20; } if(userOption.equalsIgnoreCase("help")) { font = new Font(Font.SANS_SERIF, Font.BOLD, 15); g.setFont(font); g.setColor(Color.BLACK); g.drawString("Help", 375, 87); g.drawString("Arrow Left", 300, 117); g.drawString("= Move Left", 397, 117); g.drawString("Arrow Right", 300, 137); g.drawString("= Move Right", 397, 137); g.drawString("Arrow Up", 300, 157); g.drawString("= Move Up", 397, 157); g.drawString("Arrow Down", 300, 177); g.drawString("= Move Down", 397, 177); g.drawString("Space", 300, 197); g.drawString("= Drop Bomb", 397, 197); g.drawString("ESC", 300, 217); g.drawString("= Exit Game", 397, 217); } if(!user.GetAlive()) { font = new Font(null, Font.BOLD, 55); g.setFont(font); g.drawString("GAME OVER", 250, 250); font = new Font(null, Font.BOLD, 15); g.setFont(font); g.drawString("Press Enter to Restart or ESC to Exit the Game", 250, 310); } } private void BombSprites(Graphics g) { for(int i = 0; i < bombs.size(); i++) { if(bombs.get(i).Dropped()) g.drawImage(bombs.get(i).GetCurrentFrame(), bombs.get(i).GetX(), bombs.get(i).GetY(), this); } } /******************************************************************************* ** ** ** G A M E L O G I C S ** ** ** *******************************************************************************/ private void LevelUpdate() { int size = user.GetBombs(); switch(size) { case 1: bricksDestroyable = bombs.get(0).GetDestroyableBricks(); break; case 2: if(bombs.get(0).GetDestroyableBricks().size() < bombs.get(1).GetDestroyableBricks().size()) { bricksDestroyable = bombs.get(0).GetDestroyableBricks(); bombs.get(1).SetDestroyableBricks(bricksDestroyable); } if(bombs.get(1).GetDestroyableBricks().size() < bombs.get(0).GetDestroyableBricks().size()) { bricksDestroyable = bombs.get(1).GetDestroyableBricks(); bombs.get(0).SetDestroyableBricks(bricksDestroyable); } break; case 3: if(bombs.get(0).GetDestroyableBricks().size() < bombs.get(1).GetDestroyableBricks().size() && bombs.get(0).GetDestroyableBricks().size() < bombs.get(2).GetDestroyableBricks().size()) { bricksDestroyable = bombs.get(0).GetDestroyableBricks(); bombs.get(1).SetDestroyableBricks(bricksDestroyable); bombs.get(2).SetDestroyableBricks(bricksDestroyable); } if(bombs.get(1).GetDestroyableBricks().size() < bombs.get(0).GetDestroyableBricks().size() && bombs.get(1).GetDestroyableBricks().size() < bombs.get(2).GetDestroyableBricks().size()) { bricksDestroyable = bombs.get(1).GetDestroyableBricks(); bombs.get(0).SetDestroyableBricks(bricksDestroyable); bombs.get(2).SetDestroyableBricks(bricksDestroyable); } if(bombs.get(2).GetDestroyableBricks().size() < bombs.get(0).GetDestroyableBricks().size() && bombs.get(2).GetDestroyableBricks().size() < bombs.get(1).GetDestroyableBricks().size()) { bricksDestroyable = bombs.get(2).GetDestroyableBricks(); bombs.get(0).SetDestroyableBricks(bricksDestroyable); bombs.get(1).SetDestroyableBricks(bricksDestroyable); } break; case 4: if(bombs.get(0).GetDestroyableBricks().size() < bombs.get(1).GetDestroyableBricks().size() && bombs.get(0).GetDestroyableBricks().size() < bombs.get(2).GetDestroyableBricks().size() && bombs.get(0).GetDestroyableBricks().size() < bombs.get(3).GetDestroyableBricks().size()) { bricksDestroyable = bombs.get(0).GetDestroyableBricks(); bombs.get(1).SetDestroyableBricks(bricksDestroyable); bombs.get(2).SetDestroyableBricks(bricksDestroyable); bombs.get(3).SetDestroyableBricks(bricksDestroyable); } if(bombs.get(1).GetDestroyableBricks().size() < bombs.get(0).GetDestroyableBricks().size() && bombs.get(1).GetDestroyableBricks().size() < bombs.get(2).GetDestroyableBricks().size() && bombs.get(1).GetDestroyableBricks().size() < bombs.get(3).GetDestroyableBricks().size()) { bricksDestroyable = bombs.get(1).GetDestroyableBricks(); bombs.get(0).SetDestroyableBricks(bricksDestroyable); bombs.get(2).SetDestroyableBricks(bricksDestroyable); bombs.get(3).SetDestroyableBricks(bricksDestroyable); } if(bombs.get(2).GetDestroyableBricks().size() < bombs.get(0).GetDestroyableBricks().size() && bombs.get(2).GetDestroyableBricks().size() < bombs.get(1).GetDestroyableBricks().size() && bombs.get(2).GetDestroyableBricks().size() < bombs.get(3).GetDestroyableBricks().size()) { bricksDestroyable = bombs.get(2).GetDestroyableBricks(); bombs.get(0).SetDestroyableBricks(bricksDestroyable); bombs.get(1).SetDestroyableBricks(bricksDestroyable); bombs.get(3).SetDestroyableBricks(bricksDestroyable); } if(bombs.get(3).GetDestroyableBricks().size() < bombs.get(0).GetDestroyableBricks().size() && bombs.get(3).GetDestroyableBricks().size() < bombs.get(1).GetDestroyableBricks().size() && bombs.get(3).GetDestroyableBricks().size() < bombs.get(2).GetDestroyableBricks().size()) { bricksDestroyable = bombs.get(3).GetDestroyableBricks(); bombs.get(0).SetDestroyableBricks(bricksDestroyable); bombs.get(1).SetDestroyableBricks(bricksDestroyable); bombs.get(2).SetDestroyableBricks(bricksDestroyable); } break; case 5: if(bombs.get(0).GetDestroyableBricks().size() < bombs.get(1).GetDestroyableBricks().size() && bombs.get(0).GetDestroyableBricks().size() < bombs.get(2).GetDestroyableBricks().size() && bombs.get(0).GetDestroyableBricks().size() < bombs.get(3).GetDestroyableBricks().size() && bombs.get(0).GetDestroyableBricks().size() < bombs.get(4).GetDestroyableBricks().size()) { bricksDestroyable = bombs.get(0).GetDestroyableBricks(); bombs.get(1).SetDestroyableBricks(bricksDestroyable); bombs.get(2).SetDestroyableBricks(bricksDestroyable); bombs.get(3).SetDestroyableBricks(bricksDestroyable); bombs.get(4).SetDestroyableBricks(bricksDestroyable); } if(bombs.get(1).GetDestroyableBricks().size() < bombs.get(0).GetDestroyableBricks().size() && bombs.get(1).GetDestroyableBricks().size() < bombs.get(2).GetDestroyableBricks().size() && bombs.get(1).GetDestroyableBricks().size() < bombs.get(3).GetDestroyableBricks().size() && bombs.get(1).GetDestroyableBricks().size() < bombs.get(4).GetDestroyableBricks().size()) { bricksDestroyable = bombs.get(1).GetDestroyableBricks(); bombs.get(0).SetDestroyableBricks(bricksDestroyable); bombs.get(2).SetDestroyableBricks(bricksDestroyable); bombs.get(3).SetDestroyableBricks(bricksDestroyable); bombs.get(4).SetDestroyableBricks(bricksDestroyable); } if(bombs.get(2).GetDestroyableBricks().size() < bombs.get(0).GetDestroyableBricks().size() && bombs.get(2).GetDestroyableBricks().size() < bombs.get(1).GetDestroyableBricks().size() && bombs.get(2).GetDestroyableBricks().size() < bombs.get(3).GetDestroyableBricks().size() && bombs.get(2).GetDestroyableBricks().size() < bombs.get(4).GetDestroyableBricks().size()) { bricksDestroyable = bombs.get(2).GetDestroyableBricks(); bombs.get(0).SetDestroyableBricks(bricksDestroyable); bombs.get(1).SetDestroyableBricks(bricksDestroyable); bombs.get(3).SetDestroyableBricks(bricksDestroyable); bombs.get(4).SetDestroyableBricks(bricksDestroyable); } if(bombs.get(3).GetDestroyableBricks().size() < bombs.get(0).GetDestroyableBricks().size() && bombs.get(3).GetDestroyableBricks().size() < bombs.get(1).GetDestroyableBricks().size() && bombs.get(3).GetDestroyableBricks().size() < bombs.get(2).GetDestroyableBricks().size() && bombs.get(3).GetDestroyableBricks().size() < bombs.get(4).GetDestroyableBricks().size()) { bricksDestroyable = bombs.get(3).GetDestroyableBricks(); bombs.get(0).SetDestroyableBricks(bricksDestroyable); bombs.get(1).SetDestroyableBricks(bricksDestroyable); bombs.get(2).SetDestroyableBricks(bricksDestroyable); bombs.get(4).SetDestroyableBricks(bricksDestroyable); } if(bombs.get(4).GetDestroyableBricks().size() < bombs.get(0).GetDestroyableBricks().size() && bombs.get(4).GetDestroyableBricks().size() < bombs.get(1).GetDestroyableBricks().size() && bombs.get(4).GetDestroyableBricks().size() < bombs.get(2).GetDestroyableBricks().size() && bombs.get(4).GetDestroyableBricks().size() < bombs.get(3).GetDestroyableBricks().size()) { bricksDestroyable = bombs.get(4).GetDestroyableBricks(); bombs.get(0).SetDestroyableBricks(bricksDestroyable); bombs.get(1).SetDestroyableBricks(bricksDestroyable); bombs.get(2).SetDestroyableBricks(bricksDestroyable); bombs.get(3).SetDestroyableBricks(bricksDestroyable); } break; } } private void PlayerUpdate() { user.UserAnimation(userAction); user.SetArea(); PlayerCollision(userAction); // Bug Correction -> Outside if(user.GetX() < 45 || user.GetX() > 736) { user.SetX(69); user.SetY(69); } if(user.GetY() < 45 || user.GetY() > 515) { user.SetX(69); user.SetY(69); } } private void BombUpdate() { for(int i = 0; i < bombs.size(); i++) { if(bombs.get(i).Dropped()) { bombs.get(i).BombAnimation(); bombs.get(i).SetPower(user.GetPower()); bombs.get(i).SetUserLocation(user.GetArea()); } } } private void PlayerCollision(String direction) { switch(direction) { case "left": for(int i = 0; i < bricksUndestroyable.size(); i++) { if(user.GetArea().intersects(bricksUndestroyable.get(i).GetArea())) user.SetX(user.GetX() + user.GetSpeed() + 9); } for(int i = 0; i < bricksDestroyable.size(); i++) { if(user.GetArea().intersects(bricksDestroyable.get(i).GetArea())) user.SetX(user.GetX() + user.GetSpeed() + 9); } break; case "right": for(int i = 0; i < bricksUndestroyable.size(); i++) { if(user.GetArea().intersects(bricksUndestroyable.get(i).GetArea())) user.SetX(user.GetX() - user.GetSpeed() - 9); } for(int i = 0; i < bricksDestroyable.size(); i++) { if(user.GetArea().intersects(bricksDestroyable.get(i).GetArea())) user.SetX(user.GetX() - user.GetSpeed() - 9); } break; case "up": for(int i = 0; i < bricksUndestroyable.size(); i++) { if((user.GetArea()).intersects(bricksUndestroyable.get(i).GetArea())) user.SetY(user.GetY() + user.GetSpeed() + 9); } for(int i = 0; i < bricksDestroyable.size(); i++) { if((user.GetArea()).intersects(bricksDestroyable.get(i).GetArea())) user.SetY(user.GetY() + user.GetSpeed() + 9); } break; case "down": for(int i = 0; i < bricksUndestroyable.size(); i++) { if(user.GetArea().intersects(bricksUndestroyable.get(i).GetArea())) user.SetY(user.GetY() - user.GetSpeed() - 9); } for(int i = 0; i < bricksDestroyable.size(); i++) { if(user.GetArea().intersects(bricksDestroyable.get(i).GetArea())) user.SetY(user.GetY() - user.GetSpeed() - 9); } break; } /*for(int i = 0; i < bricksUndestroyable.size(); i++) { if(user.GetArea().intersects(bricksUndestroyable.get(i).GetArea())) { user.SetX(user.GetX() - 6); user.SetY(user.GetY() - 6); } }*/ } private void DropBomb() { for(int i = 0; i < bombs.size(); i++) { if(!bombs.get(i).Dropped()) { bombs.get(i).SetDropped(true); bombs.get(i).SetXY(user.GetX(), user.GetY() + 8); bombs.get(i).SetArea(bombs.get(i).GetX(), bombs.get(i).GetY()); break; } } } }