Xadrez Quântico
XADREZ QUÂNTICO
♟ Xadrez Quântico
🎯 Turno: Brancas
Peça selecionada: Nenhuma
🎲
Resultado: —
Peça: —
💡
Clique em uma peça para selecionar
♟ Xadrez Quântico
🎯 Turno: Brancas
Peça selecionada: Nenhuma
🎲
Resultado: —
Peça: —
💡
Clique em uma peça para selecionar
XADREZ QUÂNTICO
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
/**
* Xadrez Quântico - Simulador de Tabuleiro
* Baseado no livro de Valdemir Costa
* Versão Java Swing
*/
public class XadrezQuantico extends JFrame {
// ============================================================
// CONSTANTES
// ============================================================
private static final int TAMANHO_CELULA = 70;
private static final int TAMANHO_TABULEIRO = 8;
private enum TipoPeca {
REI, RAINHA, TORRE, BISPO, CAVALO, PEÃO
}
private enum CorPeca {
BRANCO, PRETO
}
private static class Peca {
TipoPeca tipo;
CorPeca cor;
Peca(TipoPeca tipo, CorPeca cor) {
this.tipo = tipo;
this.cor = cor;
}
}
// Mapeamento de Unicode para as peças
private static final Map UNICODE_PECAS = new HashMap<>();
static {
UNICODE_PECAS.put("BRANCO-REI", "♔");
UNICODE_PECAS.put("BRANCO-RAINHA", "♕");
UNICODE_PECAS.put("BRANCO-TORRE", "♖");
UNICODE_PECAS.put("BRANCO-BISPO", "♗");
UNICODE_PECAS.put("BRANCO-CAVALO", "♘");
UNICODE_PECAS.put("BRANCO-PEÃO", "♙");
UNICODE_PECAS.put("PRETO-REI", "♚");
UNICODE_PECAS.put("PRETO-RAINHA", "♛");
UNICODE_PECAS.put("PRETO-TORRE", "♜");
UNICODE_PECAS.put("PRETO-BISPO", "♝");
UNICODE_PECAS.put("PRETO-CAVALO", "♞");
UNICODE_PECAS.put("PRETO-PEÃO", "♟");
}
private static final Map DADO_MAPA = new HashMap<>();
static {
DADO_MAPA.put(1, TipoPeca.PEÃO);
DADO_MAPA.put(2, TipoPeca.CAVALO);
DADO_MAPA.put(3, TipoPeca.BISPO);
DADO_MAPA.put(4, TipoPeca.TORRE);
DADO_MAPA.put(5, TipoPeca.RAINHA);
DADO_MAPA.put(6, TipoPeca.REI);
}
private static final Map NOMES_PECAS = new HashMap<>();
static {
NOMES_PECAS.put(TipoPeca.REI, "Rei");
NOMES_PECAS.put(TipoPeca.RAINHA, "Rainha");
NOMES_PECAS.put(TipoPeca.TORRE, "Torre");
NOMES_PECAS.put(TipoPeca.BISPO, "Bispo");
NOMES_PECAS.put(TipoPeca.CAVALO, "Cavalo");
NOMES_PECAS.put(TipoPeca.PEÃO, "Peão");
}
// ============================================================
// ESTADO DO JOGO
// ============================================================
private Peca[][] tabuleiro;
private CorPeca turno = CorPeca.BRANCO;
private Point selecionado = null;
private int ultimoDado = 0;
private boolean animando = false;
// ============================================================
// COMPONENTES DA INTERFACE
// ============================================================
private JPanel painelTabuleiro;
private JLabel labelTurno;
private JLabel labelStatus;
private JLabel labelPecaSelecionada;
private JLabel labelDado;
private JLabel labelResultado;
private JLabel labelPecaDado;
private JButton botaoRolar;
private JButton botaoLimpar;
private JButton botaoNovo;
private Timer timerAnimacao;
// ============================================================
// CONSTRUTOR
// ============================================================
public XadrezQuantico() {
setTitle("♟ Xadrez Quântico");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout(10, 10));
getContentPane().setBackground(new Color(15, 26, 46));
// Cria os componentes
criarCabecalho();
criarTabuleiro();
criarPainelInferior();
criarStatus();
// Inicializa o jogo
resetarJogo();
setSize(700, 750);
setLocationRelativeTo(null);
setResizable(false);
setVisible(true);
}
// ============================================================
// CRIAÇÃO DOS COMPONENTES
// ============================================================
private void criarCabecalho() {
JPanel cabecalho = new JPanel(new BorderLayout());
cabecalho.setBackground(new Color(15, 26, 46));
cabecalho.setBorder(BorderFactory.createEmptyBorder(10, 15, 10, 15));
JLabel titulo = new JLabel("♟ Xadrez Quântico");
titulo.setFont(new Font("Segoe UI", Font.BOLD, 22));
titulo.setForeground(new Color(232, 213, 181));
labelTurno = new JLabel("🎯 Turno: Brancas");
labelTurno.setFont(new Font("Segoe UI", Font.PLAIN, 14));
labelTurno.setForeground(new Color(200, 180, 160));
labelTurno.setBackground(new Color(31, 51, 73));
labelTurno.setOpaque(true);
labelTurno.setBorder(BorderFactory.createEmptyBorder(5, 15, 5, 15));
cabecalho.add(titulo, BorderLayout.WEST);
cabecalho.add(labelTurno, BorderLayout.EAST);
add(cabecalho, BorderLayout.NORTH);
}
private void criarTabuleiro() {
painelTabuleiro = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
desenharTabuleiro(g);
}
};
painelTabuleiro.setPreferredSize(new Dimension(
TAMANHO_CELULA * TAMANHO_TABULEIRO + 20,
TAMANHO_CELULA * TAMANHO_TABULEIRO + 20
));
painelTabuleiro.setBackground(new Color(26, 42, 58));
painelTabuleiro.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
painelTabuleiro.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (animando) return;
int col = (e.getX() - 10) / TAMANHO_CELULA;
int row = (e.getY() - 10) / TAMANHO_CELULA;
if (row >= 0 && row < TAMANHO_TABULEIRO && col >= 0 && col < TAMANHO_TABULEIRO) {
cliqueTabuleiro(row, col);
}
}
});
add(painelTabuleiro, BorderLayout.CENTER);
}
private void criarPainelInferior() {
JPanel painelInferior = new JPanel();
painelInferior.setLayout(new BoxLayout(painelInferior, BoxLayout.Y_AXIS));
painelInferior.setBackground(new Color(15, 26, 46));
painelInferior.setBorder(BorderFactory.createEmptyBorder(10, 15, 10, 15));
// Peça selecionada
JPanel painelSelecao = new JPanel(new FlowLayout(FlowLayout.CENTER));
painelSelecao.setBackground(new Color(15, 26, 46));
JLabel label = new JLabel("Peça selecionada: ");
label.setForeground(new Color(184, 155, 122));
labelPecaSelecionada = new JLabel("Nenhuma");
labelPecaSelecionada.setForeground(new Color(247, 212, 74));
labelPecaSelecionada.setFont(new Font("Segoe UI", Font.BOLD, 14));
painelSelecao.add(label);
painelSelecao.add(labelPecaSelecionada);
painelInferior.add(painelSelecao);
// Painel de dados e botões
JPanel painelControles = new JPanel(new FlowLayout(FlowLayout.CENTER, 15, 10));
painelControles.setBackground(new Color(15, 26, 46));
// Dado
JPanel painelDado = new JPanel();
painelDado.setBackground(new Color(22, 40, 55));
painelDado.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(new Color(61, 95, 122), 1),
BorderFactory.createEmptyBorder(10, 20, 10, 20)
));
painelDado.setLayout(new BoxLayout(painelDado, BoxLayout.X_AXIS));
labelDado = new JLabel("🎲");
labelDado.setFont(new Font("Segoe UI", Font.PLAIN, 32));
labelDado.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 15));
painelDado.add(labelDado);
JPanel painelInfoDado = new JPanel();
painelInfoDado.setLayout(new BoxLayout(painelInfoDado, BoxLayout.Y_AXIS));
painelInfoDado.setBackground(new Color(22, 40, 55));
JLabel labelResultadoTxt = new JLabel("Resultado:");
labelResultadoTxt.setForeground(new Color(201, 181, 151));
labelResultadoTxt.setFont(new Font("Segoe UI", Font.PLAIN, 12));
painelInfoDado.add(labelResultadoTxt);
labelResultado = new JLabel("—");
labelResultado.setForeground(new Color(247, 212, 74));
labelResultado.setFont(new Font("Segoe UI", Font.BOLD, 18));
painelInfoDado.add(labelResultado);
painelDado.add(painelInfoDado);
painelControles.add(painelDado);
// Botões
JPanel painelBotoes = new JPanel(new GridLayout(2, 2, 8, 8));
painelBotoes.setBackground(new Color(15, 26, 46));
botaoRolar = criarBotao("🎲 Rolar Dado", new Color(201, 159, 107), new Color(122, 95, 58));
botaoLimpar = criarBotao("↺ Limpar", new Color(62, 90, 117), new Color(28, 45, 63));
botaoNovo = criarBotao("♟ Novo", new Color(106, 58, 58), new Color(58, 26, 26));
painelBotoes.add(botaoRolar);
painelBotoes.add(botaoLimpar);
painelBotoes.add(botaoNovo);
painelControles.add(painelBotoes);
painelInferior.add(painelControles);
add(painelInferior, BorderLayout.SOUTH);
}
private JButton criarBotao(String texto, Color corFundo, Color corBorda) {
JButton botao = new JButton(texto);
botao.setBackground(corFundo);
botao.setForeground(Color.WHITE);
botao.setFont(new Font("Segoe UI", Font.BOLD, 12));
botao.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createMatteBorder(0, 0, 3, 0, corBorda),
BorderFactory.createEmptyBorder(10, 20, 10, 20)
));
botao.setFocusPainted(false);
botao.setCursor(new Cursor(Cursor.HAND_CURSOR));
// Efeito de clique
botao.addMouseListener(new java.awt.event.MouseAdapter() {
@Override
public void mousePressed(java.awt.event.MouseEvent e) {
botao.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createMatteBorder(0, 0, 1, 0, corBorda),
BorderFactory.createEmptyBorder(12, 20, 8, 20)
));
}
@Override
public void mouseReleased(java.awt.event.MouseEvent e) {
botao.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createMatteBorder(0, 0, 3, 0, corBorda),
BorderFactory.createEmptyBorder(10, 20, 10, 20)
));
}
});
return botao;
}
private void criarStatus() {
JPanel painelStatus = new JPanel(new FlowLayout(FlowLayout.CENTER));
painelStatus.setBackground(new Color(12, 27, 39));
painelStatus.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createMatteBorder(0, 4, 0, 0, new Color(201, 159, 107)),
BorderFactory.createEmptyBorder(10, 15, 10, 15)
));
labelStatus = new JLabel("💡 Clique em uma peça para selecionar");
labelStatus.setForeground(new Color(201, 181, 151));
labelStatus.setFont(new Font("Segoe UI", Font.PLAIN, 13));
painelStatus.add(labelStatus);
add(painelStatus, BorderLayout.AFTER_LAST_LINE);
}
// ============================================================
// LÓGICA DO JOGO
// ============================================================
private void iniciarTabuleiro() {
TipoPeca[] fileiraTras = {
TipoPeca.TORRE, TipoPeca.CAVALO, TipoPeca.BISPO, TipoPeca.RAINHA,
TipoPeca.REI, TipoPeca.BISPO, TipoPeca.CAVALO, TipoPeca.TORRE
};
tabuleiro = new Peca[TAMANHO_TABULEIRO][TAMANHO_TABULEIRO];
for (int c = 0; c < TAMANHO_TABULEIRO; c++) {
tabuleiro[0][c] = new Peca(fileiraTras[c], CorPeca.PRETO);
tabuleiro[1][c] = new Peca(TipoPeca.PEÃO, CorPeca.PRETO);
tabuleiro[6][c] = new Peca(TipoPeca.PEÃO, CorPeca.BRANCO);
tabuleiro[7][c] = new Peca(fileiraTras[c], CorPeca.BRANCO);
}
}
private void resetarJogo() {
iniciarTabuleiro();
turno = CorPeca.BRANCO;
selecionado = null;
ultimoDado = 0;
animando = false;
labelTurno.setText("🎯 Turno: Brancas");
labelPecaSelecionada.setText("Nenhuma");
labelResultado.setText("—");
labelDado.setText("🎲");
labelStatus.setText("💡 Clique em uma peça para selecionar");
botaoRolar.setEnabled(true);
botaoLimpar.setEnabled(true);
botaoNovo.setEnabled(true);
painelTabuleiro.repaint();
}
private void cliqueTabuleiro(int row, int col) {
if (animando) return;
Peca peca = tabuleiro[row][col];
if (peca != null && peca.cor == turno) {
selecionado = new Point(col, row);
String nome = NOMES_PECAS.get(peca.tipo);
labelPecaSelecionada.setText(nome + " (" + (peca.cor == CorPeca.BRANCO ? "♔" : "♚") + ")");
labelStatus.setText("✅ Peça selecionada: " + nome + ". Role o dado!");
painelTabuleiro.repaint();
return;
}
selecionado = null;
labelPecaSelecionada.setText("Nenhuma");
labelStatus.setText("⚠️ Selecione uma peça da sua cor.");
painelTabuleiro.repaint();
}
private void rolarDado() {
if (animando) return;
if (selecionado == null) {
labelStatus.setText("⚠️ Selecione uma peça primeiro!");
return;
}
int row = selecionado.y;
int col = selecionado.x;
Peca peca = tabuleiro[row][col];
if (peca == null) {
labelStatus.setText("⚠️ Peça inválida!");
return;
}
// Gera valor aleatório
Random rand = new Random();
int valor = rand.nextInt(6) + 1;
ultimoDado = valor;
// Anima o dado
botaoRolar.setEnabled(false);
animando = true;
// Simula animação com Timer
final int[] contador = {0};
timerAnimacao = new Timer(80, e -> {
contador[0]++;
if (contador[0] <= 8) {
int num = rand.nextInt(6) + 1;
labelDado.setText(String.valueOf(num));
labelResultado.setText(String.valueOf(num));
} else {
((Timer)e.getSource()).stop();
aplicarTransformacao(valor);
}
});
timerAnimacao.start();
}
private void aplicarTransformacao(int valor) {
int row = selecionado.y;
int col = selecionado.x;
Peca peca = tabuleiro[row][col];
TipoPeca novoTipo = DADO_MAPA.get(valor);
TipoPeca tipoAntigo = peca.tipo;
String nomeAntigo = NOMES_PECAS.get(tipoAntigo);
String nomeNovo = NOMES_PECAS.get(novoTipo);
// Aplica transformação
tabuleiro[row][col] = new Peca(novoTipo, peca.cor);
// Atualiza display
labelDado.setText(String.valueOf(valor));
labelResultado.setText(String.valueOf(valor));
labelStatus.setText("✨ " + nomeAntigo + " → " + nomeNovo);
// Muda o turno
turno = (turno == CorPeca.BRANCO) ? CorPeca.PRETO : CorPeca.BRANCO;
labelTurno.setText("🎯 Turno: " + (turno == CorPeca.BRANCO ? "Brancas" : "Pretas"));
// Atualiza peça selecionada
String displayNome = NOMES_PECAS.get(tabuleiro[row][col].tipo);
labelPecaSelecionada.setText(displayNome + " (" + (peca.cor == CorPeca.BRANCO ? "♔" : "♚") + ")");
// Redesenha
painelTabuleiro.repaint();
// Limpa seleção após 1 segundo
Timer timer = new Timer(1000, e -> {
selecionado = null;
labelPecaSelecionada.setText("Nenhuma");
labelStatus.setText("✅ Transformado para " + nomeNovo + ". Turno das " +
(turno == CorPeca.BRANCO ? "Brancas" : "Pretas"));
animando = false;
botaoRolar.setEnabled(true);
painelTabuleiro.repaint();
});
timer.setRepeats(false);
timer.start();
}
// ============================================================
// DESENHO DO TABULEIRO
// ============================================================
private void desenharTabuleiro(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int offset = 10;
// Desenha as casas
for (int r = 0; r < TAMANHO_TABULEIRO; r++) {
for (int c = 0; c < TAMANHO_TABULEIRO; c++) {
int x = offset + c * TAMANHO_CELULA;
int y = offset + r * TAMANHO_CELULA;
// Cor da casa
boolean clara = (r + c) % 2 == 0;
g2d.setColor(clara ? new Color(232, 213, 181) : new Color(177, 139, 106));
g2d.fillRect(x, y, TAMANHO_CELULA, TAMANHO_CELULA);
}
}
// Zonas de ataque (transparentes)
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.08f));
g2d.setColor(new Color(102, 179, 255));
g2d.fillRect(offset, offset, TAMANHO_CELULA * 8, TAMANHO_CELULA * 4);
g2d.setColor(new Color(255, 217, 102));
g2d.fillRect(offset, offset + TAMANHO_CELULA * 4, TAMANHO_CELULA * 8, TAMANHO_CELULA * 4);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
// Linha divisória
g2d.setColor(new Color(255, 215, 0, 64));
g2d.setStroke(new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{6, 6}, 0));
g2d.drawLine(offset, offset + TAMANHO_CELULA * 4,
offset + TAMANHO_CELULA * 8, offset + TAMANHO_CELULA * 4);
g2d.setStroke(new BasicStroke(1));
// Desenha as peças
for (int r = 0; r < TAMANHO_TABULEIRO; r++) {
for (int c = 0; c < TAMANHO_TABULEIRO; c++) {
Peca peca = tabuleiro[r][c];
if (peca != null) {
int x = offset + c * TAMANHO_CELULA + TAMANHO_CELULA / 2;
int y = offset + r * TAMANHO_CELULA + TAMANHO_CELULA / 2 + 4;
String key = peca.cor.name() + "-" + peca.tipo.name();
String unicode = UNICODE_PECAS.getOrDefault(key, "?");
g2d.setFont(new Font("Segoe UI", Font.PLAIN, (int)(TAMANHO_CELULA * 0.65)));
g2d.setColor(peca.cor == CorPeca.BRANCO ? new Color(245, 240, 232) : new Color(26, 26, 26));
// Sombra
g2d.setColor(new Color(0, 0, 0, 100));
g2d.drawString(unicode, x + 2, y + 2);
// Texto principal
g2d.setColor(peca.cor == CorPeca.BRANCO ? new Color(245, 240, 232) : new Color(26, 26, 26));
g2d.drawString(unicode, x, y);
}
}
}
// Destaque da seleção
if (selecionado != null) {
int x = offset + selecionado.x * TAMANHO_CELULA;
int y = offset + selecionado.y * TAMANHO_CELULA;
g2d.setColor(new Color(247, 212, 74, 100));
g2d.setStroke(new BasicStroke(4));
g2d.drawRoundRect(x + 3, y + 3, TAMANHO_CELULA - 6, TAMANHO_CELULA - 6, 8, 8);
g2d.setStroke(new BasicStroke(1));
// Brilho
g2d.setColor(new Color(247, 212, 74, 50));
g2d.drawRoundRect(x + 1, y + 1, TAMANHO_CELULA - 2, TAMANHO_CELULA - 2, 10, 10);
}
}
// ============================================================
// EVENTOS DOS BOTÕES
// ============================================================
private void configurarEventos() {
botaoRolar.addActionListener(e -> rolarDado());
botaoLimpar.addActionListener(e -> {
if (animando) return;
selecionado = null;
labelPecaSelecionada.setText("Nenhuma");
labelStatus.setText("↺ Seleção limpa. Escolha uma peça.");
painelTabuleiro.repaint();
});
botaoNovo.addActionListener(e -> {
if (animando) return;
resetarJogo();
labelStatus.setText("🔄 Novo jogo! Selecione uma peça.");
});
}
// ============================================================
// MAIN
// ============================================================
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
XadrezQuantico jogo = new XadrezQuantico();
jogo.configurarEventos();
});
}
}
XADREZ QUÂNTICO
Xadrez Quântico
!doctype>
♟ Xadrez Quântico
Nova Fronteira da Estratégia
🔮 Turno: Brancas
Selecione uma peça, depois role o dado.
🎲 —
Peça: —
🏆 Rating Quântico RQ
🌀 Você (Brancas)
1420
⚡ IA (Pretas)
1380
🎯 Desafiante
—
⚔️ Em jogo