Package spaceinvaders

Source Code of spaceinvaders.Game_Board

package spaceinvaders;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Ellipse2D;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.Timer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
*
* @author Archangel
*/
public class Game_Board extends JPanel implements Runnable,
    MouseMotionListener, MouseListener {

  Random generator = new Random();
  private int selectValue;
  private Image player, alien, livesLabel, currentLives, bunker;
  private static final long serialVersionUID = 1L;
  private int direction = -10, x = 55, y = 50, gunX, bulletStop = 500,
      alienfireX, alienfireY, playerX, playerY = 500, scoreTracker = 0,
      moveValue = 1, incrementValue = 0, playerLivesX = 350,
      playerLivesY = 550, liveStatus, bunkerX = 100, level = 1, bg = 850,
      bgColor = 0, timerValue = 0, hsYVal = 335;
  private static int bunkerY = 380;
  private ArrayList<Alien> invaders;
  private ArrayList<Integer> highScores = new ArrayList<Integer>();
  private boolean fired = false, hit = false, alienfire = false,
      gameOn = false, gameOver = false, title = true, userHasHS = false,
      sound = true;
  private Defender newPlayer;
  private JLabel score = new JLabel();
  private JLabel playerScore = new JLabel();
  private JLabel highS = new JLabel();
  private JLabel titleWord = new JLabel();
  private JLabel startGame = new JLabel();
  private JLabel blank = new JLabel();
  private JLabel restartGame = new JLabel();
  private ArrayList<Bunker> bunkers = new ArrayList<Bunker>();
  private BufferedReader in;
  private BufferedWriter out;
  private ArrayList<Ellipse2D.Double> stars;
  private Timer blinkTimer;
  private Font startFont = new Font("Elephant", 1, 25);
  private Font TitleFont = new Font("Bodoni MT Black", 2, 70);
  private Clip clip, clip2;
  private AudioInputStream ais, ais2;
  private Sequencer musicPlayer;

  public Game_Board() throws LineUnavailableException,
      UnsupportedAudioFileException, IOException,
      InvalidMidiDataException, MidiUnavailableException {
    if (sound) {
      File url = new File("src/LaserBlaster.wav");
      File url2 = new File("src/explode.wav");
      clip = AudioSystem.getClip();
      ais = AudioSystem.getAudioInputStream(url);
      clip2 = AudioSystem.getClip();
      ais2 = AudioSystem.getAudioInputStream(url2);
      Sequence music = MidiSystem
          .getSequence(new File("src/StarWars.mid"));
      musicPlayer = MidiSystem.getSequencer();
      musicPlayer.setSequence(music);
      musicPlayer.open();
      musicPlayer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
      musicPlayer.start();
      clip.open(ais);
      clip2.open(ais2);
    }
    try {
      in = new BufferedReader(new FileReader("src/file.txt"));
      // System.out.println(in.readLine());
      String line = in.readLine();
      while (line != null) {
        // //////////////////////////////////////////////////////////////////////
        highScores.add((Integer) Integer.parseInt(line));
        line = in.readLine();
      }
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    InitializeBackground(bg);
    super.setBackground(Color.BLACK);
    blank.setFont(TitleFont);
    blank.setForeground(Color.BLACK);
    blank.setText(" A ");
    titleWord.setFont(TitleFont);
    titleWord.setForeground(Color.RED);
    titleWord.setText("SPACE INVADERS");
    startGame.setFont(startFont);
    startGame.setForeground(Color.WHITE);
    startGame.setText("Start Game");
    startGame.addMouseListener(this);
    super.add(blank);
    super.add(titleWord);
    super.add(startGame);
  }

  public void destroyTitle() {
    restartGame.removeMouseListener(this);
    startGame.removeMouseListener(this);
    super.remove(restartGame);
    super.remove(titleWord);
    super.remove(startGame);
    super.remove(blank);
  }

  public void destroyBar() {
    super.remove(score);
    super.remove(playerScore);
    super.remove(highS);
  }

  private void startGame() {
    userHasHS = false;
    gameOver = false;
    title = false;
    gameOn = true;
    destroyTitle();
    newPlayer = new Defender();
    invaders = new ArrayList<Alien>();
    InitializeBunkers();
    InitializeBackground(bg);
    IntializeAliens(level);
    IntializeHUD();
    super.addMouseMotionListener(this);
    super.addMouseListener(this);
    new Thread(this).start();
  }

  private void IntializeHUD() {
    Font scoreFont = new Font("Arial", 1, 20);
    score.setFont(scoreFont);
    score.setForeground(Color.WHITE);
    score.setText("SCORE:");
    playerScore.setFont(scoreFont);
    playerScore.setForeground(Color.RED);
    playerScore.setText(newPlayer.getScore());
    highS.setFont(scoreFont);
    highS.setForeground(Color.WHITE);
    highS.setText("        HIGH SCORE: " + highScores.get(0).intValue()
        + "           Level: " + level);
    super.add(score);
    super.add(playerScore);
    super.add(highS);
  }

  // Thanks warren!
  private void InitializeBackground(int i) {

    int amountStars = (820 * i) / 100;
    ArrayList<Ellipse2D.Double> tmp = new ArrayList<Ellipse2D.Double>();

    for (int count = 0; count < amountStars; count++)
      tmp.add(new Ellipse2D.Double((int) (Math.random() * 820) + 0,
          (int) (Math.random() * 850) + 0, 1, 1));

    stars = tmp;
  }

  private void InitializeBunkers() {
    int j;
    if(level < 3)
    {
      j = 1;
    }
    else if((level < 6) && (level > 2))
    {
      j = 2;
    }
    else
    {
      j = 3;
    }
    for (int i = 0; i < j; i++) {
      Bunker newBunker = new Bunker(bunkerX, bunkerY);
      bunkerX = bunkerX + 220;
      bunkers.add(newBunker);
    }
  }

  private void IntializeAliens(int lvl) {
    for (int k = 0; k < lvl; k++) {
      // 24 Invaders!
      for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
          Alien ainvader = new Alien(x, y);
          invaders.add(ainvader);
          x = x + 60;
        }
      }
      y = y + 30;
      x = 55;
    }
  }

  private void setDirection(int dirx) {
    this.direction = dirx;
  }

  @Override
  public void mouseMoved(MouseEvent e) {
    if (gameOn) {
      if (e.getX() > 732) {
        playerX = 732;
      } else if (e.getX() < 8) {
        playerX = 8;
      } else {
        playerX = e.getX();
      }
    }
  }

  @Override
  public void mouseDragged(MouseEvent e) {
  }

  @Override
  public void mousePressed(MouseEvent e) {
    if ((title) || (gameOver)) {
      startGame();
    }

  }

  @Override
  public void mouseReleased(MouseEvent e) {
  }

  @Override
  public void mouseEntered(MouseEvent e) {
  }

  @Override
  public void mouseExited(MouseEvent e) {
  }

  @Override
  public void mouseClicked(MouseEvent e) {
    if (gameOn) {
      if (fired == false) {
        if (sound) {
          clip.loop(0);
          clip.setMicrosecondPosition(0);
        }
        gunX = e.getX();
        fired = true;
        hit = false;
      }
    }

  }

  @Override
  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (timerValue >= 2) {
      blinkTimer.stop();
      timerValue = 0;
    }
    livesLabel = new ImageIcon("src/livesLabel.png").getImage();
    player = new ImageIcon("src/spacecraft.png").getImage();
    alien = new ImageIcon("src/alien.png").getImage();
    currentLives = new ImageIcon("src/playerLives.png").getImage();
    if (title) {
      drawBackground(g);
      g.setColor(Color.RED);
      g.setFont(startFont);
      g.drawString("Top Scores: ", 320, 300);
      g.setColor(Color.WHITE);
      for (int countx = 0; countx < highScores.size(); countx++) {
        g.drawString(" " + highScores.get(countx).intValue(), 320,
            hsYVal);
        hsYVal = hsYVal + 20;
      }
    }
    if (gameOn) {
      liveStatus = newPlayer.getLives();
      switch (liveStatus) {
      case (4):

        g.drawImage(currentLives, playerLivesX, playerLivesY, this);
        g.drawImage(currentLives, playerLivesX + 35, playerLivesY, this);
        g.drawImage(currentLives, playerLivesX + 70, playerLivesY, this);
        break;
      case (3):
        g.drawImage(currentLives, playerLivesX, playerLivesY, this);
        g.drawImage(currentLives, playerLivesX + 35, playerLivesY, this);
        break;
      case (2):
        g.drawImage(currentLives, playerLivesX, playerLivesY, this);
        break;
      }
      drawBackground(g);
      drawBunkers(g);
      drawPlayer(g);
      drawAlien(g);
      alienFire(g);
      g.setColor(Color.WHITE);
      g.fillRect(0, 540, 800, 5);
      g.drawImage(livesLabel, 550, 550, this);
      if (fired == true) {
        startGun(g);
      }
    }
    if (gameOver == true) {
      drawBackground(g);
      this.setBackground(Color.BLACK);
      g.setColor(Color.RED);
      g.setFont(startFont);
      g.drawString("GAME OVER", 255, 155);
      g.drawString("Please Click to Restart Game", 190, 255);
      if (userHasHS) {
        g.drawString("New Top Score! ", 155, 355);
        g.setColor(Color.WHITE);
        for (int countx = 0; countx < highScores.size(); countx++) {
          g.drawString(" " + highScores.get(countx).intValue(), 155,
              hsYVal);
          hsYVal = hsYVal + 20;
        }
      }
      for (int count = 0; count < highScores.size(); count++) {
        if (userHasHS == false) {
          if (Integer.parseInt(newPlayer.getScore()) > highScores
              .get(count).intValue()) {
            userHasHS = true;
            highScores.add(count,
                Integer.parseInt(newPlayer.getScore()));
            if (highScores.size() > 5) {
              highScores.remove(5);
            }
            // Write the top score to file!
            try {

              out = new BufferedWriter(new FileWriter(new File(
                  "src/file.txt")));
              for (int countx = 0; countx < highScores.size(); countx++) {
                out.write(""
                    + highScores.get(countx).intValue());
                out.newLine();
                out.flush();
              }
            } catch (IOException e) {
              System.out.println("There was a problem:" + e);
            }
            break;
          }
        }

      }
    }
  }

  public void drawBackground(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    Iterator<Ellipse2D.Double> itr = stars.iterator();
    while (itr.hasNext()) {
      Ellipse2D.Double star = itr.next();
      g2.draw(star);
    }
    for(int count = 0; count < stars.size(); count++){
           if(stars.get(count).y == 650)
             stars.get(count).y = 0;
           else
             stars.get(count).y++;
     }
  }

  public void drawBunkers(Graphics g) {
    Iterator<Bunker> itB = bunkers.iterator();
    while (itB.hasNext()) {
      Bunker newBunker = (Bunker) itB.next();
      if (newBunker.gethitNum() < 1) {
        itB.remove();
      }
      bunker = new ImageIcon(newBunker.getBunkerStatus()).getImage();
      g.drawImage(bunker, newBunker.getX(), 380, this);
    }
  }

  public void drawAlien(Graphics g) {
    Iterator<Alien> it = invaders.iterator();
    while (it.hasNext()) {
      Alien newinvader = (Alien) it.next();
      g.drawImage(alien, newinvader.getX(), newinvader.getY(), this);
    }
  }

  public void drawPlayer(Graphics g) {
    g.drawImage(player, playerX, 475, this);
  }

  public void startGun(Graphics g) {
    Iterator<Alien> it = invaders.iterator();
    Iterator<Bunker> itB = bunkers.iterator();
    while (it.hasNext() && fired == true && hit == false) {
      Alien newinvader = (Alien) it.next();
      // Checking if the bullet from player hits the alien
      if (((newinvader.getX() + 21) > gunX)
          && ((newinvader.getX() - 21) < gunX)
          && ((newinvader.getY() + 15) > bulletStop)
          && ((newinvader.getY() - 15) < bulletStop)) {
        if (incrementValue > 10) {
          moveValue = moveValue + 1;
          incrementValue = 0;
        } else {
          incrementValue++;
        }
        it.remove();
        removeBullet(g);
        checkStatus();
        // 32 represents the number of aliens
        scoreTracker = scoreTracker + (level * 2) + invaders.size() + 1;
        scoreTracker++;
        newPlayer.setScore(scoreTracker);
      }
    }
    while (itB.hasNext() && fired == true && hit == false) {
      Bunker bunker1 = (Bunker) itB.next();
      if ((bulletStop < (bunker1.getY() + 16))
          && (bulletStop > (bunker1.getY() - 16))
          && (gunX < (bunker1.getX() + 75))
          && (gunX > (bunker1.getX() - 23))) {
        bunker1.decrementhitNum();
        hit = true;
        fired = false;
      }
    }
    if ((fired == true) && (hit == false)) {
      g.drawRect(gunX + 23, bulletStop, 5, 5);
      g.setColor(Color.YELLOW);
      g.fillRect(gunX + 23, bulletStop, 5, 5);
      bulletStop = bulletStop - 5;
      if (bulletStop < 50) {
        removeBullet(g);
      }

    }
  }

  public void checkStatus() {
    Iterator<Alien> it = invaders.iterator();
    if (!it.hasNext()) {
      nextLevel(level);
    }
  }

  public void nextLevel(int i) {
    moveValue = 1;
    bunkerX = 100; // Reset bunker position to original
    cleanUp();
    incrementValue = 0;
    direction = -10;
    x = 55;
    y = 50;
    if (level > 10) {
      level = 10;
    } else {
      level = i + 1;
    }
    highS.setText("        HIGH SCORE: " + highScores.get(0).intValue()
        + "           Level: " + level);
    InitializeBunkers();
    IntializeAliens(level);
    this.repaint();
  }

  public void cleanUp() {
    Iterator<Bunker> itB = bunkers.iterator();
    while (itB.hasNext()) {
      itB.next();
      itB.remove();
    }
  }

  public void removeBullet(Graphics g) {
    g.dispose();
    hit = true;
    fired = false;
    bulletStop = 500;
  }

  public int moveDownRight() {
    Iterator<Alien> firstIterator = invaders.iterator();
    while (firstIterator.hasNext()) {
      Alien invader1 = (Alien) firstIterator.next();
      if (invader1.getY() > 320) {
        Iterator<Bunker> itB = bunkers.iterator();
        while (itB.hasNext()) {
          itB.next();
          itB.remove();
        }
      }
      if (invader1.getY() > 425) {
        gameOver();
      }
      invader1.setY(invader1.getY() + 1);
    }
    return (moveValue * -1);
  }

  public int moveDownLeft() {
    Iterator<Alien> secondIterator = invaders.iterator();
    while (secondIterator.hasNext()) {
      Alien invader2 = (Alien) secondIterator.next();
      if (invader2.getY() > 320) {
        Iterator<Bunker> itB = bunkers.iterator();
        while (itB.hasNext()) {
          itB.next();
          itB.remove();
        }
      }
      if (invader2.getY() > 420) {
        gameOver();
      }
      invader2.setY(invader2.getY() + 1);
    }
    return (moveValue);
  }

  public void blink() {
    timerValue++;
    if (bgColor == 0) {
      super.setBackground(Color.RED);
      bgColor = 1;
    } else {
      super.setBackground(Color.BLACK);
      bgColor = 0;
    }

  }

  public void alienFire(Graphics g) {
    if (alienfire == true) {
      if (alienfireY < 510) {
        // Check if the alien bullet hits the player
        if ((alienfireY < (playerY + 15))
            && (alienfireY > (playerY - 15))
            && (alienfireX > (playerX - 10))
            && (alienfireX < (playerX + 50))) {
          newPlayer.setLives(newPlayer.getLives() - 1);
          blinkTimer = new Timer(50, new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
              blink();
            }
          });
          if (sound) {
            clip2.loop(0);
            clip2.setMicrosecondPosition(0);
          }
          if (timerValue < 2) {
            blinkTimer.start();
          }
          if (newPlayer.getLives() <= 0) {
            gameOver();
          }
          alienfire = false;
        }
        // Bunker hit
        Iterator<Bunker> itb1 = bunkers.iterator();
        while (itb1.hasNext()) {
          Bunker bunker1 = (Bunker) itb1.next();
          if ((alienfireY < (bunker1.getY() + 39))
              && (alienfireY > (bunker1.getY() - 39))
              && (alienfireX < (bunker1.getX() + 98))
              && (alienfireX > (bunker1.getX()))) {
            bunker1.decrementhitNum();
            alienfire = false;
          }
        }
        g.drawRect(alienfireX, alienfireY, 5, 5);
        g.setColor(Color.YELLOW);
        g.fillRect(alienfireX, alienfireY, 5, 5);
        alienfireY = alienfireY + 2;
      } else {
        alienfire = false;
      }
    } else {
      Iterator<Alien> it1 = invaders.iterator();
      while (it1.hasNext()) {
        Alien invader1 = (Alien) it1.next();
        if (selectValue == invader1.getValue()) {
          alienfire = true;
          alienfireX = invader1.getX();
          alienfireY = invader1.getY();
          alienFire(g);
        }
      }
    }
  }

  public void moveAliens() {
    Iterator<Alien> it1 = invaders.iterator();
    while (it1.hasNext()) {
      Alien invader1 = (Alien) it1.next();
      int x = invader1.getX();

      if (x >= 800 - 30 && direction != -10) {
        setDirection(moveDownRight());
      }

      if (x <= 30 && direction != 10) {
        setDirection(moveDownLeft());
      }
    }
    Iterator<Alien> it = invaders.iterator();
    while (it.hasNext()) {
      Alien invader3 = (Alien) it.next();
      if (invader3.isVisible()) {
        invader3.act(direction);
      }
    }
  }

  public void restartGame() {
    cleanUp();
    resetVars();
    userHasHS = false;
    gameOver = false;
    title = false;
    gameOn = true;
    destroyTitle();
    newPlayer = new Defender();
    invaders = new ArrayList<Alien>();
    InitializeBunkers();
    InitializeBackground(bg);
    IntializeAliens(level);
    IntializeHUD();
  }

  public void resetVars() {
    cleanUp();
    destroyBar();
    direction = -10;
    timerValue = 0;
    incrementValue = 0;
    scoreTracker = 0;
    moveValue = 1;
    level = 1;
    bunkerX = 100;
    x = 55;
    y = 50;
    hsYVal = 375;
  }

  public void gameOver() {
    resetVars();
    blinkTimer.stop();
    gameOn = false;
    title = false;
    gameOver = true;
    restartGame.setFont(startFont);
    restartGame.setForeground(Color.WHITE);
    restartGame.setText(" ");
    restartGame.setLocation(250, 250);
    restartGame.addMouseListener(this);
    super.add(restartGame);
    this.repaint();
  }

  @Override
  public void run() {

    while (gameOn) {
      selectValue = generator.nextInt(250);
      this.repaint();
      moveAliens();
      newPlayer.setScore(scoreTracker++);
      playerScore.setText(newPlayer.getScore());

      try {
        Thread.sleep(15);
      } catch (InterruptedException ex) {
        Logger.getLogger(Game_Board.class.getName()).log(Level.SEVERE,
            null, ex);
      }
    }
  }

  public void setSoundOn() {
    sound = true;
    musicPlayer.start();
  }

  public void setSoundOff() {
    sound = false;
    musicPlayer.stop();
  }
}
TOP

Related Classes of spaceinvaders.Game_Board

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.