public void StartGame() {
		try {
			numberOfGhosts = Integer.valueOf(numberOfGhostsTextArea.getText());
		} catch (Exception e) {
			JOptionPane
					.showMessageDialog(launcherFrame, "Invalid # of ghosts!");
			return;
		}

		Board board = game.getBoard();

		int maximumGhosts = board.ROWS * board.COLUMNS - 2 * board.ROWS - 2
				* (board.COLUMNS - 2) - 1;

		if (numberOfGhosts > maximumGhosts) {
			JOptionPane.showMessageDialog(launcherFrame,
					"The maximum # of ghosts is: " + maximumGhosts);
			return;
		}

		if (numberOfGhosts < 1) {
			JOptionPane.showMessageDialog(launcherFrame,
					"Need at least 1 ghost on the board");
			return;
		}

		Runnable r1 = new Runnable() {
			public void run() {
				game.Run(numberOfGhosts);
			}
		};

		Runnable r2 = new Runnable() {
			public void run() {

				Board board = game.getBoard();

				outputFrame = new JFrame("Ghost151 Simulation");
				outputFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

				Container contentPanel = outputFrame.getContentPane();
				contentPanel.setLayout(new GridBagLayout());

				GridBagConstraints constraints = new GridBagConstraints();

				constraints.gridx = 0;
				constraints.gridy = 0;
				outputGame = new JTextArea(board.ROWS + 3, board.COLUMNS);

				try {
					outputGame
							.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 14));
				} catch (Exception e) {
					System.out
							.println("WARNING: Monospace font not supported: "
									+ e);
				}
				outputGame.setText(game.rawData);
				outputGame.setForeground(Color.getHSBColor(225, 225, 225));
				outputGame.setBackground(Color.getHSBColor(328, 80, 0));
				contentPanel.add(outputGame, constraints);

				constraints.gridx = 0;
				constraints.gridy = 1;
				constraints.gridwidth = 2;
				constraints.fill = GridBagConstraints.HORIZONTAL;

				outputFrame.pack();
				outputFrame.setLocation(100, 0);
				outputFrame.setVisible(true);

				while (game.isRunning) {
					outputGame.setText(game.rawData);
					System.out.println(game.rawData);
					try {
						Thread.sleep(500);
					} catch (InterruptedException interruptedException) {
					}
				}
				outputGame.setText(game.rawData);
				outputGame.append(game.GetStatistics());
			}
		};

		Runnable r3 = new Runnable() {
			public void run() {
				AudioPlayer mgp = AudioPlayer.player;
				AudioStream bgm;
				AudioStream endGame;
				AudioData md;
				AudioData md2;
				ContinuousAudioDataStream loop = null;
				AudioDataStream deathSoundAudioDataStream = null;

				try {
					bgm = new AudioStream(new FileInputStream("siren.wav"));
					md = bgm.getData();
					loop = new ContinuousAudioDataStream(md);
				} catch (IOException error) {
				}

				try {
					endGame = new AudioStream(new FileInputStream("death.wav"));
					md2 = endGame.getData();
					deathSoundAudioDataStream = new AudioDataStream(md2);
				} catch (IOException error) {
				}

				while (game.isRunning) {
					mgp.start(loop);
				}
				mgp.stop(loop);
				mgp.start(deathSoundAudioDataStream);
			}
		};

		Thread thr1 = new Thread(r1);
		Thread thr2 = new Thread(r2);
		Thread thr3 = new Thread(r3);
		thr1.start();
		thr2.start();
		thr3.start();
	}