Newer
Older
hanabi / src / game / SwingGame.java
package game;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import card.Card;
import player.AbstractPlayer;
import player.SwingPlayer;

public class SwingGame extends AbstractGame {
	//UI STUFF
	JFrame mainFrame;
	JPanel gamePanel;
	JPanel hintPanel;
	JPanel thunderPanel;
	JPanel buttonPanel;
	JPanel deckPanel;
	JLabel[][] deckUI;
	JButton colorButton;
	JButton valueButton;
	JButton nextMove;
	JButton placeCardButton;
	JButton trashCardButton;
	JLabel[] hintUI;
	JLabel[] thunderUI;
	JPanel[] playersUI;
	
	public static void main(String[] args){
		SwingGame game = new SwingGame();
		game.getPlayer(game.currentPlayer).deactiveCards();
		game.printMessage("Player " + game.currentPlayer + "'s turn", 2);
	}

	@Override
	protected void createPlayers(){
		super.createPlayers();
		for(int i=0; i<NR_PLAYERS; ++i){
			players[i] = new SwingPlayer(CARDS_PER_PLAYER, this, i);
		}
	}

	@Override
	protected void createUI() {
		mainFrame = new JFrame("Hanabi");
		mainFrame.setSize(1000, 650);
		mainFrame.setLocation(0, 0);
		mainFrame.setLayout(new BorderLayout());
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		mainFrame.getContentPane().setBackground(Color.black);
		mainFrame.setVisible(true);
		gamePanel = new JPanel();
		gamePanel.setLayout(new BoxLayout(gamePanel, BoxLayout.Y_AXIS));
		GridLayout deckLayout = new GridLayout(COLORS, 5);
		deckPanel = new JPanel(deckLayout);
		deckPanel.setBackground(Color.black);
		deckUI = new JLabel[COLORS][5];
		for(int i=0; i<COLORS; ++i){
			for(int j=0; j<5; ++j){
				JLabel tmp = new JLabel("Not set");
				tmp.setBackground(Color.black);
				tmp.setForeground(Color.white);
				tmp.setFont(font);
				deckUI[i][j] = tmp;
				deckPanel.add(deckUI[i][j]);
			}
		}
		hintPanel = new JPanel();
		thunderPanel = new JPanel();
		buttonPanel = new JPanel();
		colorButton = new JButton("Color");
		valueButton = new JButton("Value");
		nextMove = new JButton("Next");
		placeCardButton = new JButton("Place");
		trashCardButton = new JButton("Trash");
		colorButton.setFont(font);
		valueButton.setFont(font);
		nextMove.setFont(font);
		placeCardButton.setFont(font);
		trashCardButton.setFont(font);
		buttonPanel.add(colorButton);
		buttonPanel.add(valueButton);
		buttonPanel.add(nextMove);
		buttonPanel.add(placeCardButton);
		buttonPanel.add(trashCardButton);
		mainFrame.add(gamePanel, BorderLayout.CENTER);
		gamePanel.add(hintPanel);
		gamePanel.add(thunderPanel);
		gamePanel.add(buttonPanel);
		gamePanel.add(deckPanel);
		hintUI = new JLabel[MAX_HINTS];
		for(int i=0; i<MAX_HINTS; ++i){
			JLabel tmp = new JLabel();
			tmp.setText("1");
			tmp.setBackground(Color.white);
			tmp.setName("Hint_" + i);
			tmp.setFont(font);
			hintPanel.add(tmp);
			hintUI[i] = tmp;			
		}
		thunderUI = new JLabel[MAX_THUNDERS];
		for(int i=0;i<MAX_THUNDERS; ++i){
			JLabel tmp = new JLabel();
			tmp.setText("0");
			tmp.setBackground(Color.white);
			tmp.setName("Thunder_" + i);
			tmp.setFont(font);
			thunderPanel.add(tmp);
			thunderUI[i] = tmp;
		}
		colorButton.addMouseListener(new MouseListener(){			
			@Override
			public void mouseReleased(MouseEvent e) {
				if(!hintAvailable()){
					printMessage("No hints left!", 0);
					return;
				}
				if(selectedCards > 0){
					printMessage("Please deselect all cards first", 0);
					return;
				}
				useColor = true;
				useValue = false;
				placeCard = false;
				trashCard = false;
			}			
			@Override
			public void mousePressed(MouseEvent e) {
			}			
			@Override
			public void mouseExited(MouseEvent e) {
			}			
			@Override
			public void mouseEntered(MouseEvent e) {
			}			
			@Override
			public void mouseClicked(MouseEvent e) {
			}
		});
		valueButton.addMouseListener(new MouseListener(){			
			@Override
			public void mouseReleased(MouseEvent e) {
				if(!hintAvailable()){
					printMessage("No hints left!", 0);
					return;
				}
				if(selectedCards > 0){
					printMessage("Please deselect all cards first", 0);
					return;
				}
				useValue = true;
				useColor = false;
				placeCard = false;
				trashCard = false;
			}			
			@Override
			public void mousePressed(MouseEvent e) {
			}			
			@Override
			public void mouseExited(MouseEvent e) {
			}			
			@Override
			public void mouseEntered(MouseEvent e) {
			}			
			@Override
			public void mouseClicked(MouseEvent e) {
			}
		});
		nextMove.addMouseListener(new MouseListener(){			
			@Override
			public void mouseReleased(MouseEvent e) {
				if(!checkValidMove()){
					printMessage("Please select all cards of the selected color/value", 0);
					return;
				}
				int selCardIndex = 0;
				for(int i=0; i<CARDS_PER_PLAYER; ++i){
					SwingPlayer sp = (SwingPlayer) players[selectedPlayer];
					JLabel card = sp.getUiCard(i);
					String from = "(from Player " + currentPlayer + ")";
					if(card.getBackground() == Color.pink){
						selCardIndex = i;
						card.setBackground(Color.black);
						if(useColor){
							String color = "- " + Card.intColorToText(chosenColor);
							sp.setCardInfo(i, sp.getCardInfo(i) + color + " " + from + "\n");
						} else if(useValue){
							String value = "- is " + chosenValue;
							sp.setCardInfo(i, sp.getCardInfo(i) + value + " " + from + "\n");
						}
					} else {
						if(useColor){
							String color = "- not " + Card.intColorToText(chosenColor);
							sp.setCardInfo(i, sp.getCardInfo(i) + color + " " + from + "\n");
						} else if(useValue){
							String value = "- is not " + chosenValue;
							sp.setCardInfo(i, sp.getCardInfo(i) + value + " " + from + "\n");
						}
					}
				}
				if(useColor || useValue){
					hintUI[hints-1].setText("0");
					hints--;
				} else if(trashCard){
					moveCardToTrash(selCardIndex);
					if(hints != MAX_HINTS){
						hintUI[hints].setText("1");
						hints++;
						if(hints > MAX_HINTS) hints = MAX_HINTS;
					}
				} else if(placeCard){
					Card c = players[currentPlayer].getCard(selCardIndex);
					int color = c.getColorInt();
					int value = c.getValue();
					int deckValue = deckCounter[color] + 1;
					if(deckValue == value){ //place card possible
						deckCounter[color]++;
						deck[color][value-1] = c;
						deckUI[color][value-1].setText(value + "");
						deckUI[color][value-1].setForeground(c.getColor());
						setWonOrLost();
					} else { //card too high or too low
						thunderUI[thunders++].setText("1");
						moveCardToTrash(selCardIndex);
						setWonOrLost();
						if(lost) return;
					}
					//dealCard(selCardIndex, currentPlayer);
					updateCards(selCardIndex);
				}
				players[currentPlayer].activeCards();
				printMessage("Player " + currentPlayer + " has finished his move!", 2);
				currentPlayer++;
				if(currentPlayer == NR_PLAYERS) currentPlayer = 0;
				players[currentPlayer].deactiveCards();
				resetMoveValues();
				//System.out.println(CARDS_IN_DECK + " cards left.");
				//System.out.println(trash.size() + " cards in trash");
				//System.out.println("Player " + currentPlayer + "'s turn");
			}			
			@Override
			public void mousePressed(MouseEvent e) {
			}			
			@Override
			public void mouseExited(MouseEvent e) {
			}			
			@Override
			public void mouseEntered(MouseEvent e) {
			}			
			@Override
			public void mouseClicked(MouseEvent e) {
			}
		});
		trashCardButton.addMouseListener(new MouseListener(){			
			@Override
			public void mouseReleased(MouseEvent e) {
				if(selectedCards > 0){
					printMessage("Please deselect all cards first", 0);
					return;
				}
				useColor = false;
				useValue = false;
				placeCard = false;
				trashCard = true;
			}			
			@Override
			public void mousePressed(MouseEvent e) {
			}			
			@Override
			public void mouseExited(MouseEvent e) {
			}			
			@Override
			public void mouseEntered(MouseEvent e) {
			}			
			@Override
			public void mouseClicked(MouseEvent e) {
			}
		});
		placeCardButton.addMouseListener(new MouseListener(){			
			@Override
			public void mouseReleased(MouseEvent e) {
				if(selectedCards > 0){
					printMessage("Please deselect all cards first", 0);
					return;
				}
				useColor = false;
				useValue = false;
				placeCard = true;
				trashCard = false;
			}			
			@Override
			public void mousePressed(MouseEvent e) {
			}			
			@Override
			public void mouseExited(MouseEvent e) {
			}			
			@Override
			public void mouseEntered(MouseEvent e) {
			}			
			@Override
			public void mouseClicked(MouseEvent e) {
			}
		});
	}
	
	@Override
	protected void dealCards(){
		super.dealCards();
		/*
		 * PLAYER 0: SOUTH
		 * PLAYER 1: EAST
		 * PLAYER 2: NORTH
		 * PLAYER 3: WEST
		 */
		for(int i=0; i<NR_PLAYERS; ++i){
			JPanel playerContainer = ((SwingPlayer) players[i]).getContainer();
			BoxLayout containerLayout = null;
			String playerSide = null;
			switch(i){
			case 0:
				playerSide = BorderLayout.SOUTH;
				containerLayout = new BoxLayout(playerContainer, BoxLayout.X_AXIS);
				break;
			case 1:
				playerSide = BorderLayout.EAST;
				containerLayout = new BoxLayout(playerContainer, BoxLayout.Y_AXIS);
				break;
			case 2:
				playerSide = BorderLayout.NORTH;
				containerLayout = new BoxLayout(playerContainer, BoxLayout.X_AXIS);
				break;
			case 3:
				if(NR_PLAYERS == 5){
					playerSide = BorderLayout.NORTH;
					containerLayout = new BoxLayout(playerContainer, BoxLayout.X_AXIS);
				}
				else{
					playerSide = BorderLayout.WEST;
					containerLayout = new BoxLayout(playerContainer, BoxLayout.Y_AXIS);
				}
				break;
			case 4:
				playerSide = BorderLayout.WEST;
				containerLayout = new BoxLayout(playerContainer, BoxLayout.Y_AXIS);
				break;
			}
			playerContainer.setLayout(containerLayout);
			playerContainer.setBackground(Color.black);
			for(int j=0; j<CARDS_PER_PLAYER; ++j){
				AbstractPlayer curr = players[i];
				curr.setName(j, i + "_card" + j);
				curr.setSize(j, 50, 50);
			}
			mainFrame.add(playerContainer, playerSide);
		}
	}

	@Override
	protected void setNoCard(int index) {
		SwingPlayer card = (SwingPlayer) players[currentPlayer];
		card.setColor(index, 255, 122, 0);
		card.setText(index, "No Cards left");
		card.unsetListeners(index);
	}

	@Override
	public void loadFont() {
		font = new Font("Shanghai", Font.PLAIN, fontSize);
	}

	@Override
	public void printMessage(String msg, int type) {
		String title = "";
		switch(type){
		case 0:
			type = JOptionPane.ERROR_MESSAGE;
			title = "Error";
			break;
		case 1:
			type = JOptionPane.WARNING_MESSAGE;
			title = "Warning";
			break;
		case 2:
			type = JOptionPane.INFORMATION_MESSAGE;
			title = "Information";
			break;
		case 3:
			type = JOptionPane.QUESTION_MESSAGE;
			title = "Question";
			break;
		}
		JOptionPane.showMessageDialog(mainFrame,
		    msg,
		    title,
		    type);
	}
}