// DadosMelhorado.java
// Jogo de dados (craps) que permite apostas

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DadosMelhorado extends JApplet implements ActionListener {
   
	// constantes para status do jogo
	final int WON = 0, LOST = 1, CONTINUE = 2;
	
	// outras utilizadas no programa
	boolean firstRoll = true; 	// true se for a primeira rolagem
	int sumOfDice = 0;			// soma dos dados
	int myPoint = 0;	// pontos se não ganhar/perder na 1ª rolagem
	int gameStatus = CONTINUE;	// o jogo não acabou ainda
	int bankBalance = 1000; // dinheiro inicial
	int aposta = 0; // valor da aposta
	
	// componentes da interface gráfica com o usuário
	JLabel die1Label, die2Label, sumLabel, pointLabel, wagerLabel;
	JTextField firstDie, secondDie, wager, sum, point;
	JButton roll;
	
	// configura os componentes da interface gráfica com o usuário
	public void init ()
	{
		Container c = getContentPane ();
		c.setLayout ( new FlowLayout() );
		
		die1Label = new JLabel ( "Dice 1" );
		c.add ( die1Label );
		firstDie = new JTextField ( 10 );
		firstDie.setEditable ( false );
		c.add ( firstDie );
		
		die2Label = new JLabel ( "Dice 2" );
		c.add ( die2Label );
		secondDie = new JTextField ( 10 );
		secondDie.setEditable ( false );
		c.add ( secondDie );
		
		sumLabel = new JLabel ( "Sum is" );
		c.add ( sumLabel );
		sum = new JTextField ( 10 );
		sum.setEditable ( false );
		c.add ( sum );
		
		pointLabel = new JLabel ( "Point is" );
		c.add ( pointLabel );
		point = new JTextField ( 10 );
		point.setEditable ( false );
		c.add ( point );
		
		wagerLabel = new JLabel ( "Aposta: $" );
		c.add ( wagerLabel );
		wager = new JTextField ( 10 );
		wager.addActionListener ( this );
		c.add ( wager );
		
		
		roll = new JButton ( "Roll Dice" );
		roll.addActionListener ( this );
		c.add ( roll );
	}
	
	// método play executando quando botão é pressionado
	public void actionPerformed ( ActionEvent e )
	{
		if (( e.getSource() == roll ) && ( e.getSource () == wagerLabel )){
				if ( aposta <= bankBalance ){
					aposta = Integer.parseInt ( wager.getText () );
					play ();
				}
				else
					showStatus ( "Insira uma aposta válida" );
		}
	}
	
	// processa uma rolagem dos dados
	public void play()
	{
		if ( firstRoll ) {
			sumOfDice = rollDice ();
			
			switch ( sumOfDice) {
				case 7: case 11:			// ganha na primeira rolagem
					gameStatus = WON;
					bankBalance += aposta;
					point.setText ( "" );	// limpa campo de texto da pontuação
					break;
				case 2: case 3:	case 12:	// perde na primeira rolagem
					gameStatus = LOST;
					bankBalance -= aposta;
					point.setText ( "" );	// limpa campo de texto da pontuação
					break;
				default:					// armazena a pontuação
					gameStatus = CONTINUE;
					myPoint = sumOfDice;
					point.setText ( Integer.toString ( myPoint ) );
					firstRoll = false;
					break;
		}
		
	}
   		else {
   			sumOfDice = rollDice ();
   			
   			if ( sumOfDice == myPoint ){	// vitória por pontuação
   				gameStatus = WON;
   				bankBalance += aposta;
   			}
   			else
   				if ( sumOfDice == 7 ){		// derrota por rolar 7
   					gameStatus = LOST;
   					bankBalance -= aposta;
   				}
   	  }
   	  
   	  if ( gameStatus == CONTINUE )
   	  	showStatus ( "Roll again." );
   	  else {
   	  	if ( gameStatus == WON )
   	  		showStatus ( "Player wins. " +
   	  			"Click Roll Dice to play again." );
   	  	else
   	  		showStatus ( "Player loses. " +
   	  			"Click Roll Dice do play again." );
   	  			
   	  	firstRoll = true;
   	  	
   	  }
	}
	
	// rola os dados
	public int rollDice ()
	{
		int die1, die2, workSum;
		
		die1 = 1 + ( int ) ( Math.random() * 6 );
		die2 = 1 + ( int ) ( Math.random() * 6 );
		workSum = die1 + die2;
		
		firstDie.setText( Integer.toString( die1 ) );
		secondDie.setText( Integer.toString( die2 ) );
		sum.setText ( Integer.toString ( workSum) );
		
		return workSum;
	}
}