Interface.java
Home Up BelotConstants.java Card.java CardImage.java Cards.java Game.java Interface.java Player.java RunInfo.java

 

 

import java.awt.*;
import java.net.*;
import java.awt.event.*; 
import java.applet.*;   
public class Interface extends Applet 
	implements ActionListener,          // Button
	           ItemListener,            // Choice
			   MouseListener,           // Mouse
			   BelotConstants
{
	public void init ()
	{
		MediaTracker tracker = new MediaTracker(this);
		int trackerID = 1;
		URL url = getCodeBase();
		String imageName;
		Image image;
		String suits [] = {"c", "d", "h", "s"};
		String ranks [] = {"8", "9", "t", "j", "q", "k", "a"};
		Font f = new Font("SansSerif", Font.BOLD, 14);
		belotGame = new Game();
		setMessages("Welcome", "to Belot!");
		setLayout(null);
		setBackground(new Color(0, 220, 220));  // light blue
		setForeground(Color.black);
		fm = getGraphics().getFontMetrics(f);
		height = getSize().height;
		width = getSize().width;
		for (int s = 0; s < suits.length; s++)
		{
			for (int r = 0; r < ranks.length; r++)
			{
				imageName = ranks[r] + suits[s] + ".gif";
				image = getImage (url, imageName);
				tracker.addImage (image, trackerID);
				trackerID++;
				belotGame.getBelotCards().getCard(s*ranks.length+r).setImage(image);
			}
		}
		imageName = "cardback.gif";
		cardBackImage = getImage(url, imageName);
		tracker.addImage(cardBackImage, trackerID);
		try { tracker.waitForAll(); }
		catch (InterruptedException e) {}
		cards = new CardImage[CARDS_IN_HAND];
		for (int i = 0; i < CARDS_IN_HAND; i++)
		{
			cards[i] = new CardImage(1, i + 1, cardBackImage, height, width);
		}
		cardOne = new CardImage(0, 1, cardBackImage, height, width);
		cardTwo = new CardImage(0, 2, cardBackImage, height, width);
		cardThree = new CardImage (0, 6, cardBackImage, height, width);
		addMouseListener(this);
		joinButton = makeButton("Join", 2, 1);
		joinButton.setVisible(true);
		wait1Button = makeButton("Wait1", 2, 1);
		wait2Button = makeButton("Wait2", 2, 1);
		wait3Button = makeButton("Wait3", 2, 1);
		wait4Button = makeButton("Wait4", 2, 1);
		wait5Button = makeButton("Wait5", 2, 1);
		wait6Button = makeButton("Wait6", 2, 1);
		wait7Button = makeButton("Wait7", 2, 1);
		wait8Button = makeButton("Wait8", 2, 1);
		rulesButton = makeButton("Rules", 2, 4);
		rulesButton.setVisible(true);
		acceptTrumpChoice = new Choice();
		acceptTrumpChoice.add ("Accept Trump");
		acceptTrumpChoice.add ("Dont Accept");
		add (acceptTrumpChoice);
		placeComponent(acceptTrumpChoice, 2, 1);
		acceptTrumpChoice.setVisible(false);
		acceptTrumpChoice.addItemListener(this);
		callTrumpChoice = new Choice();
		callTrumpChoice.add("Clubs");
		callTrumpChoice.add("Diamonds");
		callTrumpChoice.add("Hearts");
		callTrumpChoice.add("Spades");
		callTrumpChoice.add("Nothing");
		callTrumpChoice.add("Everything");
		callTrumpChoice.add("Pass");
		add (callTrumpChoice);
		placeComponent(callTrumpChoice, 2, 1);
		callTrumpChoice.setVisible(false);
		callTrumpChoice.addItemListener(this);
	}
	private Button makeButton(String name, int row, int col)
	{
		Button tempButton = new Button(name);
		add (tempButton);
		placeComponent (tempButton, row, col);
		tempButton.setVisible(false);
		tempButton.addActionListener(this);
		return tempButton;
	}
	public void paint (Graphics g)
	{
		for (int i = 1; i <= 2; i++)
			g.drawLine(0, i * height / NUMBER_ROWS, width, 
							i * height / NUMBER_ROWS);
		for (int i = 1; i <= 9; i++)
			g.drawLine(i * width / NUMBER_COLUMNS, 0, 
							i * width / NUMBER_COLUMNS, height);
		displayStrings(0, 0, "Your", "Play");
		displayStrings(0, 3, "Opponent's", "Play");
		displayStrings(0, 5, "Flipped", "Card");
		displayStrings(0, 8, "Trump:", "Caller:", "Dealer:");
		displayStrings(0, 9, belotGame.getTrump(), belotGame.getCaller(), belotGame.getDealer());
		displayStrings(1, 0, "Your", "Hand");
		displayStrings(2, 6, "You:", "Opponent:");
		displayStringsTop(2, 7, "Raw", "Score");
		displayStringsTop(2, 8, "Game", "Points");
		displayStringsTop(2, 9, "Total", "Points");
		displayStrings(2, 2, message1, message2);
		displayStrings(2,7,Integer.toString(belotGame.getPlayer(PLAYER_1).getRawPoints()),
			Integer.toString(belotGame.getPlayer(PLAYER_2).getRawPoints()));
		displayStrings(2,8,Integer.toString(belotGame.getPlayer(PLAYER_1).getGamePoints()),
			Integer.toString(belotGame.getPlayer(PLAYER_2).getGamePoints()));
		displayStrings(2,9,Integer.toString(belotGame.getPlayer(PLAYER_1).getTotalPoints()),
			Integer.toString(belotGame.getPlayer(PLAYER_2).getTotalPoints()));
		for (int i = 0; i < belotGame.getNumberCards(); i++)
		{
			cards[i].setImage(belotGame.getPlayer(PLAYER_1).getCard(i).getImage());
			displayCard(cards[i]);
		}
		displayCard(cardOne);
		displayCard(cardTwo);
		if (belotGame.getNumberCards() > 0)
			cardThree.setImage(belotGame.getFlippedCard().getImage());
		else
			cardThree.setImage(cardBackImage);
		displayCard(cardThree);
	}
	public void trumpIsKnown()
	{
		belotGame.finishDealing();
		belotGame.scoreBonuses();
		belotGame.startPlay();
		trickLeader = belotGame.getWhoseTurn();
		playSequence();
	}
		
	public void playSequence()
	{
		for (int i = 0; i < CARDS_IN_HAND; i++)
		{
			cards[i].setDisplay(true);
		}
		cardOne.setImage(cardBackImage);
		cardTwo.setImage(cardBackImage);
		if (belotGame.getNumberCards() == 0)
		{
			belotGame.finishPlay();
			wait8Button.setVisible(true);
			setMessages("Wait for", "Final Scoring");
		}
		else if (trickLeader == PLAYER_2) 
		{
			wait6Button.setVisible(true);
			setMessages("Wait for", "Other Play");
		}
		else
		{
			clickableImages = true;
			setMessages("Select", "Card!");
		}
	}
	public void mousePressed (MouseEvent evt)
	{
		int x = evt.getX();
		int y = evt.getY();
		for (int i = 0; i < belotGame.getNumberCards(); i++)
		{
			if ((cards[i].inImage(x,y) == true) && clickableImages)
			{
				Card playerCard = belotGame.getPlayer(PLAYER_1).getCard(i);
				if ((trickLeader == PLAYER_1) ||
					(belotGame.checkLegalPlay(playerCard, opponentCard, PLAYER_1)))
				{
					cardOne.setImage(cards[i].getImage());
					clickableImages = false;
					belotGame.assignPlayerCard(belotGame.getPlayer(PLAYER_1).getCard(i));
					wait7Button.setVisible(true);
					setMessages("Wait for", "Scoring");
					if (trickLeader == PLAYER_1)
					{
						opponentCard = belotGame.getComputerFollow();
						cardTwo.setImage(opponentCard.getImage());
					}
					cards[i].setDisplay(false);
					repaint();
				}
			}
		}
	}
	public void mouseClicked (MouseEvent evt) {}
	public void mouseReleased (MouseEvent evt) {}
	public void mouseEntered (MouseEvent evt) {}
	public void mouseExited (MouseEvent evt) {}
	public void itemStateChanged (ItemEvent evt)
	{
		if (evt.getStateChange() == ItemEvent.SELECTED)
		{
			String arg = (String) evt.getItem();
			if (arg.equals ("Accept Trump"))
			{		
				belotGame.callTrump(belotGame.getFlippedCard().getSuit(), PLAYER_1);
				acceptTrumpChoice.setVisible(false);
				wait5Button.setVisible(true);
				setMessages("Wait for", "Final Deal");
			}
			else if (arg.equals ("Dont Accept"))
			{
				acceptTrumpChoice.setVisible(false);
				if (dealer == PLAYER_2)
				{
					wait3Button.setVisible(true);
					setMessages("Wait for", "Other Bid");
				}
				else
				{
					wait4Button.setVisible(true);
					setMessages("Wait for", "Other Bid");
				}
			}
			else if ((arg.equals("Clubs")) || (arg.equals("Diamonds")) ||
				     (arg.equals("Hearts")) || (arg.equals("Spades")) ||
					 (arg.equals("Nothing")) || (arg.equals("Everything")))
			{
				int suit = UNKNOWN;
				if (arg.equals("Clubs")) suit = CLUBS;   
				else if (arg.equals("Diamonds")) suit = DIAMONDS;
				else if (arg.equals("Hearts")) suit = HEARTS;
				else if (arg.equals("Spades")) suit = SPADES;
				else if (arg.equals("Nothing")) suit = NOTHING;
				else if (arg.equals("Everything")) suit = EVERYTHING;
				belotGame.callTrump(suit, PLAYER_1);
				callTrumpChoice.setVisible(false);
				wait5Button.setVisible(true);
				setMessages("Wait for", "Final Deal");
			}
			else if (arg.equals("Pass"))
			{
				callTrumpChoice.setVisible(false);
				if (dealer == PLAYER_2)
				{
					wait4Button.setVisible(true);
					setMessages("Wait for", "Other Bid");
				}
				else
				{
					belotGame.selectDealer();
					belotGame.setNumberCards(0);
					wait2Button.setVisible(true);
					setMessages("Passed Out", "Redeal");
				}
			}
		}
		repaint();
	}
	public void actionPerformed(ActionEvent evt)
	{
		String arg = evt.getActionCommand();
		
		if (arg.equals("Join"))   // change name
		{				
			belotGame.getPlayer(PLAYER_1).setTotalPoints(0);
			belotGame.getPlayer(PLAYER_2).setTotalPoints(0);
			belotGame.getPlayer(PLAYER_1).resetHand();
			belotGame.getPlayer(PLAYER_2).resetHand();
			joinButton.setVisible(false);
			rulesButton.setVisible(false);
			wait1Button.setVisible(true);
			setMessages("Wait for", "Opponent");
		}
		else if (arg.equals("Rules"))
		{
			URL url = null;
			try 
			{
				url = new URL("http://cs.montana.edu/~paxton/tutorial/belot.htm");
			}
			catch (MalformedURLException e) {}
			getAppletContext().showDocument(url);
		}
		else if (arg.equals("Wait1"))
		{
			belotGame.selectDealer();
			wait1Button.setVisible(false);
			wait2Button.setVisible(true);
			setMessages("Wait for", "Deal");
		}
		else if (arg.equals("Wait2"))
		{			
			belotGame.dealFiveCards();
			dealer = belotGame.getDealerNumber();
			wait2Button.setVisible(false);
			if (dealer == PLAYER_2)
			{
				acceptTrumpChoice.setVisible(true);
				setMessages("Make a", "Bid");
			}
			else
			{
				wait3Button.setVisible(true);
				setMessages("Wait for", "Other Bid");
			}
		}
		else if (arg.equals("Wait3"))
		{	
			wait3Button.setVisible(false);
			if (dealer == PLAYER_2)
			{
				callTrumpChoice.setVisible(true);
				setMessages("Make a", "Bid");
			}
			else
			{
				acceptTrumpChoice.setVisible(true);
				setMessages("Make a", "Bid");
			}
		}
		else if (arg.equals("Wait4"))
		{				
			wait4Button.setVisible(false);
			if (dealer == PLAYER_2)
			{
				belotGame.callTrump(SPADES, PLAYER_2);  
				wait5Button.setVisible(true);
				setMessages("Wait for", "Final Deal");
			}
			else
			{
				callTrumpChoice.setVisible(true);
				setMessages("Make a", "Bid");
			}
		}
		else if (arg.equals("Wait5"))
		{
			wait5Button.setVisible(false);
			trumpIsKnown();
		}
		else if (arg.equals("Wait6"))
		{
			wait6Button.setVisible(false);
			if (trickLeader == PLAYER_2)  
			{
				opponentCard = belotGame.getComputerLead();
				clickableImages=true;
				setMessages("Select", "Card!");
				cardTwo.setImage(opponentCard.getImage());
			}
		}
		else if (arg.equals("Wait7"))
		{
			wait7Button.setVisible(false);
			belotGame.determineWinner();
			trickLeader = belotGame.getWhoseTurn();
			playSequence();			
		}
		else if (arg.equals("Wait8"))
		{
			wait8Button.setVisible(false);
			belotGame.calculateScores();
			int scorePlayer = belotGame.getPlayer(PLAYER_1).getTotalPoints();
			int scoreOpponent = belotGame.getPlayer(PLAYER_2).getTotalPoints();
			if ((scorePlayer >= POINTS_TO_WIN) || 
				(scoreOpponent >= POINTS_TO_WIN))
			{				
				joinButton.setVisible(true);
				if (scorePlayer > scoreOpponent)
				{
					setMessages("You", "Win!");
				}
				else if (scoreOpponent > scorePlayer)
				{
					setMessages("You", "Lose!");
				}
				else
				{
					setMessages("You", "Tied!");
				}
			}
			else
			{
				belotGame.selectDealer();
				wait2Button.setVisible(true);
				setMessages("Wait for", "Deal");
			}
		}
		repaint();
	}
	public void setMessages(String m1, String m2)
	{
		message1 = m1;
		message2 = m2;
	}
	public void placeComponent (Component component, int row, int column)
	{
		int x = column * width / NUMBER_COLUMNS;
		int y = row * height / NUMBER_ROWS;
		component.setBounds(x + 10, y + 10, width/NUMBER_COLUMNS - 20, 
								height/NUMBER_ROWS - 20);
	}
	void displayString(int row, int column, int whichOne,
		               int howMany, String text)
	{
		Graphics g = getGraphics();
		int x = column * width / NUMBER_COLUMNS;
		int y = row * height / NUMBER_ROWS;
		int yGap = ((height / NUMBER_ROWS) - (fm.getHeight() * howMany) - 
			           (howMany - 1)*(height/NUMBER_ROWS/20)) / 2;
		x += (width/NUMBER_COLUMNS - fm.stringWidth(text)) / 2;   // center horizontally
		y += yGap + fm.getHeight()*whichOne + (height/NUMBER_ROWS/20*(whichOne - 1));
		g.drawString(text, x, y);
	}
	void displayStringTop(int row, int column, int whichOne, String text)
	{
		Graphics g = getGraphics();
		int x = column * width / NUMBER_COLUMNS;
		x += (width/NUMBER_COLUMNS - fm.stringWidth(text)) / 2;
		int y = row * height / NUMBER_ROWS + whichOne * fm.getHeight();
		g.drawString(text, x, y);
	}
	void displayStrings (int row, int column, String text1, String text2)
	{
		displayString(row, column, 1, 2, text1);
		displayString(row, column, 2, 2, text2);
	}
	void displayStrings (int row, int column, String text1, 
							String text2, String text3)
	{
		displayString(row, column, 1, 3, text1);
		displayString(row, column, 2, 3, text2);
		displayString(row, column, 3, 3, text3);
	}
	void displayStringsTop (int row, int column, String text1, String text2)
	{
		displayStringTop(row, column, 1, text1);
		displayStringTop(row, column, 2, text2);
	}
	// how to move this to CardImage????
	void displayCard (CardImage card)
	{
		if (card.getDisplay() == true)
		{
			// vs. getGraphics().drawImage...
			getGraphics().drawImage(card.getImage(), card.getTopLeftX(), 
				card.getTopLeftY(), card.getXExpanse(), card.getYExpanse(), this);
		}
	}
	private Button joinButton;
	private Button wait1Button;
	private Button wait2Button;
	private Button wait3Button;
	private Button wait4Button;
	private Button wait5Button;
	private Button wait6Button;
	private Button wait7Button;
	private Button wait8Button;  // deal
	private Button rulesButton;
	private Choice acceptTrumpChoice;
	private Choice callTrumpChoice;
	private CardImage cards [];
	private CardImage cardOne;
	private CardImage cardTwo;
	private CardImage cardThree;
	private Card opponentCard;
	private Image cardBackImage;
	
	private Game belotGame;
	private boolean clickableImages;
	private int dealer;
	private int trickLeader;
	private int height;   // height of applet
	private int width;    // width of applet
	private String message1;
	private String message2;
	private FontMetrics fm; 
}