sábado, 16 de outubro de 2010

Jogo "Adivinhe o Número" em Java

Olá, programadores iniciantes em Java!

Hoje vou apresentar a vocês o meu pequeno jogo de adivinhação chamado "Adivinhe o Número", um projeto extremamente simples em Java com código-fonte para você estudar.



Baixe o jogo clicando no link abaixo

*Arquivo .ZIP contendo o executável .JAR e o código-fonte .JAVA


http://www.4shared.com/file/mrRj2xV3/AdivinheNumero.html





Código-fonte completo


// Adivinhe o Número
// Fernando Aires Castello
// (Setembro/2009)

package sources;

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class Main extends JFrame {

// Componentes GUI
private JLabel guessLabel, triesLabel, scoreLabel, highScoreLabel;
private JTextField guessField, triesField,
scoreField, highScoreField;
private JButton startButton, giveUpButton;
private JTextArea outputArea;

// Fonte comum a todos os componentes de áreas de texto nessa GUI
private Font monospaced = new Font( "Monospaced", Font.PLAIN, 12 );

// Buffer de saída para as mensagens
private StringBuffer outputBuffer;

// Números
private int randomNumber = 0; // Número aleatório
private int tries = 0; // Tentativas do jogador
private int guess = 0; // Palpite do jogador
private int score = 0; // Pontuação
private int highScore = 0; // Pontuação máxima
private final int MIN = 1; // Menor número aleatório
private final int MAX = 100000; // Maior número aleatório

// Constantes
private final int HOT = 1; // Palpite quente!
private final int COLD = -1; // Palpite frio...

// Penalidade: este valor é descontado da pontuação
// a cada palpite errado
private final int PENALTY = 234;

// Construtor
public Main()
{
super("Adivinhe o Número");

Container c = getContentPane();
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

// Configura a aparência da GUI
setupLookAndFeel();

// O tratador de eventos é um objeto de uma classe interna
ActionHandler h = new ActionHandler();

// Painéis da GUI
JPanel north = new JPanel( new GridLayout( 2, 3, 10, 10 ) );
JPanel south = new JPanel( new FlowLayout( FlowLayout.CENTER ) );

// Inicializa e adiciona rótulos e campos de texto
// ao painel e adiciona o painel ao frame

guessLabel = new JLabel("Seu palpite");
triesLabel = new JLabel("Tentativas");
scoreLabel = new JLabel("Pontuação");
highScoreLabel = new JLabel("Maior recorde");
guessField = new JTextField(20);
guessField.setFont(monospaced);
guessField.addActionListener(h);
guessField.setEditable(false);
triesField = new JTextField(20);
triesField.setFont(monospaced);
triesField.setEditable(false);
scoreField = new JTextField(20);
scoreField.setFont(monospaced);
scoreField.setEditable(false);
highScoreField = new JTextField(20);
highScoreField.setFont(monospaced);
highScoreField.setEditable(false);
north.add(guessLabel);
north.add(triesLabel);
north.add(scoreLabel);
north.add(highScoreLabel);
north.add(guessField);
north.add(triesField);
north.add(scoreField);
north.add(highScoreField);
c.add(north, BorderLayout.NORTH);

// Inicializa área de saída das mensagens
outputArea = new JTextArea();
outputArea.setEditable(false);
outputArea.setFont(monospaced);
outputArea.setText("> Clique em 'Iniciar' para começar o jogo!");

// Inicializa barras de rolagem da área de saída e adiciona
// a área ao frame
JScrollPane scrollArea = new JScrollPane(outputArea);
c.add(scrollArea);

// Inicializando o buffer de saída das mensagens
outputBuffer = new StringBuffer();

// Inicializa e adiciona botões ao painel e adiciona ao frame
startButton = new JButton("Iniciar");
startButton.addActionListener(h);
giveUpButton = new JButton("Desistir");
giveUpButton.addActionListener(h);
giveUpButton.setEnabled(false);
south.add(startButton);
south.add(giveUpButton);
c.add(south, BorderLayout.SOUTH);

// Configura a exibição da GUI completa
setSize(500,300);
setLocation(350,300);
setVisible(true);

} // Fim do construtor Main

private class ActionHandler implements ActionListener {
public void actionPerformed( ActionEvent e )
{
if ( e.getSource() == startButton )
startGame();

if ( e.getSource() == guessField )
{
String guessStr = e.getActionCommand();

// Verifica se havia algo no campo de texto ou não
if ( guessStr.equals("") || guessStr == null )
return;

// Faz uma checagem quanto à validade do palpite
// Se houver algum caractere que não seja um número
// (isto é, um dígito), o programa acusa erro
char[] guessCharArray = guessStr.toCharArray();
char guessChar;

for ( int i = 0; i < guessCharArray.length; i++ )
{
guessChar = guessCharArray[i];
if ( !Character.isDigit(guessChar) )
{
guessField.setText("");
return;
}
}

guessField.setText("");
print( "Seu palpite foi: " + guessStr );
verifyGuess( guessStr );
}

if ( e.getSource() == giveUpButton )
giveUp();
}

} // Fim da classe interna ActionHandler

// Prepara um novo jogo
private void startGame()
{
tries = 0;
score = 10000;

startButton.setEnabled(false);
giveUpButton.setEnabled(true);
guessField.setEditable(true);
guessField.setText("");
triesField.setText( Integer.toString(tries) );
scoreField.setText( Integer.toString(score) );
highScoreField.setText( Integer.toString(highScore) );
outputArea.setText("");
outputArea.setBackground(Color.WHITE);
outputArea.setForeground(Color.BLACK);
outputBuffer = new StringBuffer();

randomNumber = getRandom(MIN, MAX);

print("Um número entre " + MIN + " e " + MAX + " foi sorteado.");
print("Você deve adivinhar qual é esse número.");
print("Digite seu palpite e pressione a tecla Enter...\n");
}

// Imprime uma mensagem na área de texto
private void print( String s )
{
outputBuffer.append( "> " + s + "\n" );
outputArea.setText( outputBuffer.toString() );
outputArea.setCaretPosition( outputBuffer.length() );
}

// Retorna um número aleatório dentro do intervalo especificado
private int getRandom(int minValue, int maxValue)
{
int rnd = minValue + (int) ( Math.random() * maxValue );
return rnd;
}

// Desiste do jogo
private void giveUp()
{
print("Você desistiu...");
print("O número sorteado era: " + randomNumber );
reset();
}

// Verifica se o palpite digitado está correto ou errado
private void verifyGuess( String g )
{
try {
guess = Integer.parseInt(g);
if ( guess > MAX )
throw new NumberFormatException();
}
catch (NumberFormatException e) {
print("Esse palpite é inválido! O palpite máximo é " + MAX);
guessField.setText("");
return;
}

tries++;
triesField.setText( Integer.toString(tries) );

if ( guess == randomNumber )
gameWon(); // Está correto
else
{
score -= PENALTY;
if ( score <= 0 )
score = 1;

scoreField.setText( Integer.toString(score) );
retry(); // Está errado
}
}

// Este método é invocado se o palpite está errado
private void retry()
{
if ( guess < (randomNumber / 2) || guess > (randomNumber * 2) )
{
print("Você errou. Seu palpite está longe...");
changeColors(COLD);
}
else
{
print("Você errou... mas seu palpite está perto!");
if ( guess < randomNumber )
print("Seu palpite ainda é baixo demais");
else
print("Seu palpite ainda é alto demais");

changeColors(HOT);
}
}

// Este método muda as cores do jogo para indicar se o palpite
// estava perto ou longe do número sorteado
private void changeColors(int coldOrHot)
{
if ( coldOrHot == HOT )
{
outputArea.setBackground( new Color( 255, 200, 200 ) );
outputArea.setForeground( new Color( 0, 0, 0 ) );
}
else
{
outputArea.setBackground( new Color( 200, 200, 255 ) );
outputArea.setForeground( new Color( 0, 0, 0 ) );
}
}

// Este método é chamado por verifyGuess()
// para indicar que o jogo foi ganho.
private void gameWon()
{
print("Você acertou o número e venceu esta jogada!");
print("Sua pontuação final foi de: " + score + " pontos.");

if ( score > highScore )
{
print("PARABÉNS! Sua pontuação é um novo recorde!");
highScore = score;
highScoreField.setText( Integer.toString(highScore) );
}

reset();
}

// Reinicia a GUI para o seu estado inicial
private void reset()
{
print("Clique em 'Iniciar' para jogar novamente");
guessField.setEditable(false);
giveUpButton.setEnabled(false);
startButton.setEnabled(true);
}

// Configura a aparência da GUI
private void setupLookAndFeel()
{
UIManager.LookAndFeelInfo[] looks;
looks = UIManager.getInstalledLookAndFeels();

try {
UIManager.setLookAndFeel( looks[3].getClassName() );
}
catch (Exception e) {
System.out.println(e);
}
}

// Método main
public static void main( String args[] )
{
Main jogo = new Main();
jogo.addWindowListener(
new WindowAdapter() {
@Override
public void windowClosing( WindowEvent e )
{
System.exit(0);
}
}
);
}
}
// Fim da classe Main




Espero que tenham gostado!