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();
System.out.println("Player " + game.currentPlayer + "'s turn");
}
@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!", 1);
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!", 1);
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!", 1);
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(){
/*
* 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);
}
}