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
Nenhuma postagem.
Nenhuma postagem.

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
♟ 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