Desafio

Tapatan Screenshot  02

Desafio : Jogo Tapatan em Java

Alguém conhece o jogo Tapatan? Poucos conhecem.

O tapatan é jogado nas Filipinas. Com um tabuleiro e 6 peças (3 de cada cor). Os filipinos usam peças redondas especiais para esse jogo, três de madeira clara para um jogador, três de madeira escura para o outro.

OBJETIVO: Colocar suas peças em linha reta.

REGRAS:

1. Um jogador de cada vez coloca uma de suas peças num dos pontos vazios do tabuleiro, até que todas as suas peças sejam colocadas no tabuleiro.

2. O primeiro jogador mexe uma de suas peças para o ponto vazio mais próximo, em linha reta. Não pode pular peça, depois é a vez do segundo jogador, e assim continuam revezando.

3. Ganha quem conseguir primeiro uma linha de três peças, na diagonal, horizontal ou vertical.

4. Se nenhum jogador colocar três peças em linha e repetir a mesma jogada por três vezes, a partida termina empatada.

Que tal implementa-lo em Java? Bom o desafio está lançado, aqui vai umas das minha primeiras tentativas. Falta muito ainda o que fazer.

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.File;
import java.io.IOException;
import javax.swing.JLabel;

public class TapatanGUI extends JFrame implements MouseMotionListener,
MouseListener {

private static final long serialVersionUID = 1L;

private JPanel jContentPane = null;
private JButton jbt01 = null;
private JButton jbt02 = null;
private JButton jbt03 = null;
private JButton jbt04 = null;
private JButton jbt06 = null;
private JButton jbt05 = null;
private JLabel jlbTapatan = null;
private JLabel jlbTitulo = null;

int baseX = -1;
int baseY = -1;

// Identify sound effect file.
private final static File DROP_SOUND = new File("src/audio/drop.wav");

private JButton jbtSobre = null;
private JButton jbtSite = null;

private JButton getJbt01() {
if (jbt01 == null) {
ImageIcon vermelho = new ImageIcon(getClass().getResource(
"/imagens/dotred.png"));
jbt01 = new JButton(vermelho);
jbt01.setBounds(new Rectangle(706, 180, 55, 55));
jbt01.setCursor(new Cursor(Cursor.HAND_CURSOR));
jbt01.setContentAreaFilled(false);
jbt01.addMouseMotionListener(this);
jbt01.addMouseListener(this);
}
return jbt01;
}

private JButton getJbt02() {
if (jbt02 == null) {
ImageIcon vermelho = new ImageIcon(getClass().getResource(
"/imagens/dotred.png"));
jbt02 = new JButton(vermelho);
jbt02.setBounds(new Rectangle(706, 240, 55, 55));
jbt02.setCursor(new Cursor(Cursor.HAND_CURSOR));
jbt02.setContentAreaFilled(false);
jbt02.addMouseMotionListener(this);
jbt02.addMouseListener(this);
}
return jbt02;
}

private JButton getJbt03() {
if (jbt03 == null) {
ImageIcon vermelho = new ImageIcon(getClass().getResource(
"/imagens/dotred.png"));
jbt03 = new JButton(vermelho);
jbt03.setBounds(new Rectangle(706, 298, 55, 55));
jbt03.setCursor(new Cursor(Cursor.HAND_CURSOR));
jbt03.setContentAreaFilled(false);
jbt03.addMouseMotionListener(this);
jbt03.addMouseListener(this);
}
return jbt03;
}

private JButton getJbt04() {
if (jbt04 == null) {
ImageIcon azul = new ImageIcon(getClass().getResource(
"/imagens/dotblue.png"));
jbt04 = new JButton(azul);
jbt04.setBounds(new Rectangle(706, 358, 55, 55));
jbt04.setCursor(new Cursor(Cursor.HAND_CURSOR));
jbt04.setContentAreaFilled(false);
jbt04.addMouseMotionListener(this);
jbt04.addMouseListener(this);
}
return jbt04;
}

private JButton getJbt05() {
if (jbt05 == null) {
ImageIcon azul = new ImageIcon(getClass().getResource(
"/imagens/dotblue.png"));
jbt05 = new JButton(azul);
jbt05.setBounds(new Rectangle(706, 419, 55, 55));
jbt05.setCursor(new Cursor(Cursor.HAND_CURSOR));
jbt05.setContentAreaFilled(false);
jbt05.addMouseMotionListener(this);
jbt05.addMouseListener(this);
}
return jbt05;
}

private JButton getJbt06() {
if (jbt06 == null) {
ImageIcon azul = new ImageIcon(getClass().getResource(
"/imagens/dotblue.png"));
jbt06 = new JButton(azul);
jbt06.setBounds(new Rectangle(706, 480, 55, 55));
jbt06.setCursor(new Cursor(Cursor.HAND_CURSOR));
jbt06.setContentAreaFilled(false);
jbt06.addMouseMotionListener(this);
jbt06.addMouseListener(this);
}
return jbt06;
}

// COORDENADA X
// COORDENADA Y
// LARGURA = Width
// ALTURA = Height
public boolean colidir() {
if ((jbt01.getX() >= jbt02.getX() && jbt01.getX() <= jbt02.getX()
+ jbt02.getWidth())
&& (jbt01.getY() >= jbt02.getY() && jbt01.getY() <= jbt02
.getY() + jbt02.getHeight())) {

// Play drop sound (if available).
playSound(DROP_SOUND);

System.out
.println("colidiu.........................................01");
JOptionPane.showMessageDialog(null,
"Movimento ilegal 01!!! \n Tente outro.", "Tapatan",
JOptionPane.ERROR_MESSAGE);

return true;

} else if ((jbt01.getX() + jbt01.getWidth() >= jbt02.getX() && jbt01
.getX() + jbt01.getWidth() <= jbt02.getX() + jbt02.getWidth())
&& (jbt01.getY() >= jbt02.getY() && jbt01.getY() <= jbt02
.getY() + jbt02.getHeight())) {

// Play drop sound (if available).
playSound(DROP_SOUND);

System.out
.println("colidiu.........................................02");
JOptionPane.showMessageDialog(null,
"Movimento ilegal 02!!! \n Tente outro.", "Tapatan",
JOptionPane.ERROR_MESSAGE);

return true;

} else if ((jbt01.getX() >= jbt02.getX() && jbt01.getX() <= jbt02
.getX() + jbt02.getWidth())
&& (jbt01.getY() + jbt01.getHeight() >= jbt02.getY() && jbt01
.getY() + jbt01.getHeight() <= jbt02.getY()
+ jbt02.getHeight())) {

// Play drop sound (if available).
playSound(DROP_SOUND);

System.out
.println("colidiu.........................................03");
JOptionPane.showMessageDialog(null,
"Movimento ilegal 03!!! \n Tente outro.", "Tapatan",
JOptionPane.ERROR_MESSAGE);

return true;

} else if ((jbt01.getX() + jbt01.getWidth() >= jbt02.getX() && jbt01
.getX() + jbt01.getWidth() <= jbt02.getX() + jbt02.getWidth())
&& (jbt01.getY() + jbt01.getHeight() >= jbt02.getY() && jbt01
.getY() + jbt01.getHeight() <= jbt02.getY()
+ jbt02.getHeight())) {

// Play drop sound (if available).
playSound(DROP_SOUND);

System.out
.println("colidiu.........................................04");
JOptionPane.showMessageDialog(null,
"Movimento ilegal 04!!! \n Tente outro.", "Tapatan",
JOptionPane.ERROR_MESSAGE);

return true;

} else {
return false;
}
}

// I've created a playSound method that fully encapsulates the
// JavaSound logic needed to play the drop.wav file that accompanies
// this article. That method's source code appears below:
private static void playSound(File file) {

try {
// Get an AudioInputStream from the specified file (which must be a
// valid audio file, otherwise an UnsupportedAudioFileException
// object is thrown).
AudioInputStream ais = AudioSystem.getAudioInputStream(file);

// Get the AudioFormat for the sound data in the AudioInputStream.
AudioFormat af = ais.getFormat();

// Create a DataLine.Info object that describes the format for data
// to be output over a Line.
DataLine.Info dli = new DataLine.Info(SourceDataLine.class, af);

// Do any installed Mixers support the Line? If not, we cannot play
// a sound file.
if (AudioSystem.isLineSupported(dli)) {

// Obtain matching Line as a SourceDataLine (a Line to which
// sound data may be written).
SourceDataLine sdl = (SourceDataLine) AudioSystem.getLine(dli);

// Acquire system resources and make the SourceDataLine
// operational.
sdl.open(af);

// Initiate output over the SourceDataLine.
sdl.start();

// Size and create buffer for holding bytes read and written.
int frameSize = af.getFrameSize();
int bufferLenInFrames = sdl.getBufferSize() / 8;
int bufferLenInBytes = bufferLenInFrames * frameSize;
byte[] buffer = new byte[bufferLenInBytes];

// Read data from the AudioInputStream into the buffer and then
// copy that buffer's contents to the SourceDataLine.
int numBytesRead;
while ((numBytesRead = ais.read(buffer)) != -1)
sdl.write(buffer, 0, numBytesRead);
}
} catch (LineUnavailableException e) {
} catch (UnsupportedAudioFileException e) {
} catch (IOException e) {
}
}// End playSound Method

private JButton getJbtSobre() {
if (jbtSobre == null) {
ImageIcon sobre = new ImageIcon(getClass().getResource(
"/imagens/Sobre.png"));
jbtSobre = new JButton(sobre);
jbtSobre.setBounds(new Rectangle(744, 3, 45, 45));
jbtSobre.setToolTipText("Sobre");
jbtSobre.setCursor(new Cursor(Cursor.HAND_CURSOR));
// Cor de fundo igual ao JFrame
jbtSobre.setBackground(new Color(225, 225, 225));
jbtSobre.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {

Sobre sobre = new Sobre(null);
sobre.setVisible(true);
}
});
}
return jbtSobre;
}

private JButton getJbtSite() {
if (jbtSite == null) {
ImageIcon site = new ImageIcon(getClass().getResource(
"/imagens/Site.png"));
jbtSite = new JButton(site);
jbtSite.setBounds(new Rectangle(744, 620, 45, 45));
jbtSite.setToolTipText("https://isjavado.wordpress.com/");
jbtSite.setCursor(new Cursor(Cursor.HAND_CURSOR));
// Cor de fundo igual ao JFrame
jbtSite.setBackground(new Color(225, 225, 225));
jbtSite.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {

String url = "https://isjavado.wordpress.com/";
BareBonesBrowserLaunch.openURL(url);

}
});
}
return jbtSite;
}

public static void main(String[] args) {
// Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
TapatanGUI thisClass = new TapatanGUI();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}

public TapatanGUI() {
super();
initialize();
}

private void initialize() {
this.setSize(800, 700);
this.setContentPane(getJContentPane());
this.setTitle("Tapatan - J. Marcos B.");
// Tamanho fixo do programa, sem alteração
this.setResizable(false);
// Deixa o programa no meio da tela, centralizado
this.setLocationRelativeTo(null);
}

private JPanel getJContentPane() {
if (jContentPane == null) {
jlbTitulo = new JLabel();
jlbTitulo.setBounds(new Rectangle(295, 2, 159, 46));
jlbTitulo.setText("Tapatan");
jlbTitulo.setCursor(new Cursor(Cursor.HAND_CURSOR));
jlbTitulo.setHorizontalAlignment(SwingConstants.CENTER);
jlbTitulo.setFont(new Font("Arial", Font.BOLD, 38));
jlbTitulo.addMouseMotionListener(this);

ImageIcon tapatan = new ImageIcon(getClass().getResource(
"/imagens/Tapatan.png"));
jlbTapatan = new JLabel(tapatan);
jlbTapatan.setBounds(new Rectangle(48, 63, 655, 592));
// jlbTapatan.setText("JLabel");

jContentPane = new JPanel();
jContentPane.setLayout(null);
jContentPane.add(getJbt01(), null);
jContentPane.add(getJbt02(), null);
jContentPane.add(getJbt03(), null);
jContentPane.add(getJbt04(), null);
jContentPane.add(getJbt06(), null);
jContentPane.add(getJbt05(), null);
jContentPane.add(jlbTapatan, null);
jContentPane.add(jlbTitulo, null);
jContentPane.add(getJbtSobre(), null);
jContentPane.add(getJbtSite(), null);
}
return jContentPane;
}

@Override
public void mouseClicked(MouseEvent e) {
// Do nothing
}

@Override
public void mouseEntered(MouseEvent arg0) {
// Do nothing
}

@Override
public void mouseExited(MouseEvent arg0) {
// Do nothing
}

// Para colocar o componente arrastado na frente:
@Override
public void mousePressed(MouseEvent e) {
Component c = e.getComponent();
Container parent = c.getParent();
Component[] all = parent.getComponents();
for (int i = 0; i < all.length; i++) {
parent.remove(all[i]);
}
parent.add(c);
for (int i = 0; i < all.length; i++) {
if (all[i] != c) {
parent.add(all[i]);
}
}
this.baseX = e.getX();
this.baseY = e.getY();
}

@Override
public void mouseReleased(MouseEvent arg0) {
this.baseX = -1;
this.baseY = -1;
}

// Para evitar o arraste pra fora da janela:
@Override
public void mouseDragged(MouseEvent e) {
if ((this.baseX != -1) && (this.baseY != -1)) {
Component c = e.getComponent();
int x = c.getX() + e.getX() - this.baseX;
int y = c.getY() + e.getY() - this.baseY;
Container parent = c.getParent();
Dimension pSize = parent.getSize();
Rectangle cSize = c.getBounds();

x = Math.max(x, 0);
x = Math.min(x, pSize.width - cSize.width);
y = Math.max(y, 0);
y = Math.min(y, pSize.height - cSize.height);

c.setLocation(x, y);
c.getParent().repaint();
}

else {
// jlbTitulo Width = 159
jlbTitulo.setLocation(
(e.getX() + jlbTitulo.getBounds().x) - 159 / 2, 0);
}

colidir();
}

@Override
public void mouseMoved(MouseEvent e) {
// Do nothing
}

} // @jve:decl-index=0:visual-constraint="10,10"

Link para baixar o arquivo Tapatan Game.jar

http://www.4shared.com/file/BQwJHgi5/Tapatan_Game.html

Tapatan Screenshot  01

Quem aceitar o desafio mande o que fizer e eu vou postando aqui. Vou atualizando e atribuindo os creditos.

Anúncios

Deixe um comentário:

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s