Jogo de damas

Ola a todos!O que a turma me aconselharia para criar um jogo de dama?Avisando que não tenho forte conhecimento gráfico em Java!! :lol:Queria algo simples, tipo uma estrutura para fazer um tabuleiro mas que ficasse dentro de um JFrame!! :wink:

Pra começar você precisa praticar exemplos mais tranquilos
da parte gráfica . . .

alguns exemplos da classe swing e um pouco de Java 2d
quando estudei estes assuntos comecei pelo livro do Deitel
ajudou bem a ter uma noção geral.

fiz uma calculadora e um pequeno cadastro de e-mails e ramais.
acho que se aplica bem ao jogo de tabuleiro.

Não se aplica tão bem porque será necessário definir os componentes visuais que compõem o jogo de damas ( peças, tabuleiro ) e a forma como esses componentes interagem entre si. Creio que será necessário construir classes que herdem de JComponent, e nesse caso conhecimentos em Java2D ajuda muito na implementação visual desses componentes.

Neste link tem um exemplo de criação de um novo componente desktop:

http://www.onjava.com/pub/a/onjava/2004/08/11/desktop.html

Abraços

Bom obrigado amigão!Agora to um dúvida besta, como faço para colocar no meio de um JFrame uma sequência de componentes que estão em um JPanel??tentei criar um JPanel
com 9 buttons e coloca-lo no centro do JFrame mas o JPanel em questão com os 9 buttons ocupa todo o JFrame! :frowning:
valeu!

já pensou em fazer a parte grafica toda em flash interageindo com a lógica em java?

pra joguinhos visuais eu não tenho paciencia pra programar em java.

mas se ainda assim tiver interesse em algo simples, vai ter que estudar sobre paint(), repaint(), graphics, mouseadapter, etc…

tá ai… animei com isso. vo criar algo agora e posto daqui um tempo.

minha dica é usar o Graphics.
é bem simples, mas terá bons resultados.

tenta implementar algo com mouse adapter por exemplo.
dentro da acao do mouse, chama o repaint para que ele pega as novas posições das pecas e plot no panel


 * Dama.java
 *
 * Created on 29 de Março de 2008, 02:34
 */

package damas;
import javax.swing.*;
import java.awt.Graphics;
import java.awt.Color;

/**
 *
 * @author  luiz
 */
public class Dama extends javax.swing.JFrame {
    
    /** Creates new form Dama */
    public Dama() {
        initComponents();
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">
    private void initComponents() {
        tabuleiro = new JPanel()
        {
            private int raio;
            private int raioM;
            //diferenca
            private int d;
            public void paint( Graphics g)
            {
                raio = this.getWidth()/8;
                raioM = (int)(raio*0.8);
                d = (int)((raio - raioM)/2);
                boolean cor = false;
                for( int y=0; y<8; y++ )
                {
                    for( int x=0; x<8; x++ )
                    {
                        if( cor==false )
                        {
                            g.setColor(Color.GREEN);
                        }
                        else
                        {
                            g.setColor(Color.WHITE);
                        }
                        g.fillRect(x*raio, y*raio, x*raio+raio, y*raio+raio);
                        cor=!cor;
                    }
                    cor=!cor;
                }

                for( int y=0; y<8; y++ )
                {
                    for( int x=0; x<8; x++ )
                    {
                        g.setColor(Color.BLACK);
                        g.drawRect(x*raio, y*raio, x*raio+raio, y*raio+raio);
                    }
                }

                pintaPecas( g );
            }

            private void pintaPecas( Graphics g )
            {
                // pegar posicao de cada peça.
                // classe logica aparte...
                preta( g, 0, 0);
                preta( g, 1, 1);
                branca( g, 3, 3);
            }

            private void preta( Graphics g, int x, int y)
            {
                g.setColor(Color.BLACK);
                g.fillOval(x*raio+d, y*raio+d, raioM, raioM );
                g.setColor(Color.WHITE);
                g.drawOval(x*raio+d, y*raio+d, raioM, raioM );
            }

            private void branca( Graphics g, int x, int y)
            {
                g.setColor(Color.WHITE);
                g.fillOval(x*raio+d, y*raio+d, raioM, raioM );

                g.setColor(Color.BLACK);
                g.drawOval(x*raio+d, y*raio+d, raioM, raioM );
            }
        };

        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();

        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setResizable(false);
        tabuleiro.setLayout(null);

        tabuleiro.setBackground(new java.awt.Color(255, 255, 255));
        tabuleiro.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        getContentPane().add(tabuleiro, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 300, 300));

        jMenu1.setText("Menu");
        jMenuBar1.add(jMenu1);

        setJMenuBar(jMenuBar1);

        pack();
    }
    // </editor-fold>
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Dama().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JPanel tabuleiro;
    // End of variables declaration
    
}

Muito interessante o código postado pelo Luiz.

Porém, seria ideal que as peças estendessem JComponent, para facilitar a interação com elas através do sistema de eventos do Swing.
Por exemplo, quando as peças já estivessem prontas, o código seria mais ou menos assim:

[code]// Apenas uma peça, só pra ilustrar
public class Damas extends JFrame {
private JPanel tabuleiro;
private Peca peca;

public Damas() {
    // Cor é um enumeration
    peca =new Peca(Cor.VERMELHO);
    peca.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            // Lógica para clicar em uma peça.
            // Isso pode ficar em outra classe, já que a lógica deve ser
            // a mesma para todas as peças.
        }
    });
    // Veja que o tabuleiro é apenas um JPanel com 8 x 8 casas
    tabuleiro = new JPanel(new GridLayout(8, 8));
    tabuleiro.add(peca);

    // ...
}

}[/code]Acho que fica interessante assim.

[quote=Luiz Augusto Prado]minha dica é usar o Graphics.
é bem simples, mas terá bons resultados.[/quote]

Eu concordo com você, essa é a alternativa que dá um resultado visualmente muito bonito.
Mas não é a mais fácil de fazer, já que no caso do jogo da velha vc pode usar os botões do Swing diretamente.

De qualquer forma, é a que deixa o jogo mais divertido, e é a que eu recomendaria também.

Agora, seu código tem dois erros clássicos:

  1. No Swing, você deve sobrescrever o método paintComponent, não o método paint, caso ele exista (é o caso do seu JPanel);
  2. Você não pode alterar o estado do objeto Graphics recebido como parâmetro. Ou seja, na primeira linha você deve fazer:

E na última linha do método:

Ferir essa regra 2 pode fazer com que sua aplicação inteira tenha um comportamento estranho. E se você não estiver ligado disso, fica meio inexplicável, já que sua lógica em si não terá erros.

Legal ViniGodoy!

Eu não sabia dessa.
Vou ficar atento a isso.
obrigado pela dica!
vou testar agora

Vivendo e aprendendo.

seu JPanel ficaria assim então:

new JPanel()
{
    private int raio;
    private int raioM;
    //diferenca
    private int d;
    public void paintComponent( Graphics G) 
    {
        Graphics2D g = (Graphics2D) G.create();
        raio = this.getWidth()/8;    
        raioM = (int)(raio*0.8);
        d = (int)((raio - raioM)/2);
        boolean cor = false;
        for( int y=0; y<8; y++ )
        {
            for( int x=0; x<8; x++ )
            {
                if( cor==false )
                {
                    g.setColor(Color.GREEN);
                }
                else
                {
                    g.setColor(Color.WHITE);
                }
                g.fillRect(x*raio, y*raio, x*raio+raio, y*raio+raio);
                cor=!cor;
            }
            cor=!cor;
        }    
        
        
        for( int y=0; y<8; y++ )
        {
            for( int x=0; x<8; x++ )
            {
                g.setColor(Color.BLACK);
                g.drawRect(x*raio, y*raio, x*raio+raio, y*raio+raio);
            }
        } 
        
        
        pintaPecas( g );
        g.dispose();
    }
    
    private void pintaPecas( Graphics g )
    {
        // pegar posicao de cada peça.
        // classe logica aparte...   
        preta( g, 0, 0);
        preta( g, 1, 1);
        branca( g, 3, 3);
    }
    
    private void preta( Graphics g, int x, int y)
    {
        g.setColor(Color.GRAY);
        g.fillOval(x*raio+d, y*raio+d, raioM, raioM );
        g.setColor(Color.BLACK);
        g.drawOval(x*raio+d, y*raio+d, raioM, raioM );
        g.drawOval(x*raio+d+5, y*raio+d+5, raioM-10, raioM-10 );
    }
    
    private void branca( Graphics g, int x, int y)
    {
        g.setColor(Color.WHITE);
        g.fillOval(x*raio+d, y*raio+d, raioM, raioM );
        
        g.setColor(Color.GRAY);
        g.drawOval(x*raio+d, y*raio+d, raioM, raioM );
        g.drawOval(x*raio+d+5, y*raio+d+5, raioM-10, raioM-10 );
    }
};

:wink:[quote=Luiz Augusto Prado]seu JPanel ficaria assim então:

[code]
new JPanel()
{
private int raio;
private int raioM;
//diferenca
private int d;
public void paintComponent( Graphics G)
{
Graphics2D g = (Graphics2D) G.create();
raio = this.getWidth()/8;
raioM = (int)(raio0.8);
d = (int)((raio - raioM)/2);
boolean cor = false;
for( int y=0; y<8; y++ )
{
for( int x=0; x<8; x++ )
{
if( cor==false )
{
g.setColor(Color.GREEN);
}
else
{
g.setColor(Color.WHITE);
}
g.fillRect(x
raio, yraio, xraio+raio, y*raio+raio);
cor=!cor;
}
cor=!cor;
}

    for( int y=0; y<8; y++ )
    {
        for( int x=0; x<8; x++ )
        {
            g.setColor(Color.BLACK);
            g.drawRect(x*raio, y*raio, x*raio+raio, y*raio+raio);
        }
    } 
    
    
    pintaPecas( g );
    g.dispose();
}

private void pintaPecas( Graphics g )
{
    // pegar posicao de cada peça.
    // classe logica aparte...   
    preta( g, 0, 0);
    preta( g, 1, 1);
    branca( g, 3, 3);
}

private void preta( Graphics g, int x, int y)
{
    g.setColor(Color.GRAY);
    g.fillOval(x*raio+d, y*raio+d, raioM, raioM );
    g.setColor(Color.BLACK);
    g.drawOval(x*raio+d, y*raio+d, raioM, raioM );
    g.drawOval(x*raio+d+5, y*raio+d+5, raioM-10, raioM-10 );
}

private void branca( Graphics g, int x, int y)
{
    g.setColor(Color.WHITE);
    g.fillOval(x*raio+d, y*raio+d, raioM, raioM );
    
    g.setColor(Color.GRAY);
    g.drawOval(x*raio+d, y*raio+d, raioM, raioM );
    g.drawOval(x*raio+d+5, y*raio+d+5, raioM-10, raioM-10 );
}

};
[/code][/quote]

Rapaz desculpas pela demora em responder mais muito obrigado!!Vou começar por ai,mas agora to em periodo de prova e nao vai dar!Mas qd acaber vou botar a mão na massa!!!

ok turma solucionei a parte gráfica,mas agora fiquei com uma dúvida.
Para controlar as movimentações das peças é melhor gerenciar com uma matriz do tipo String que represente o tabuleiro ou realmente manipular diretamente com o tabuleiro recem criado?
O que é melhor e mais eficiente?Considerando que para o tabuleiro usei uma matriz de buttons setados com as imagens correspondentes em jpg.Sei que é uma solução trivial mas tenho mais interesse na I.A
valeu galera !Qualquer opinião é bem vinda! :lol:

Para implementar a IA do jogo de damas, você pode estudar o algoritmo Minimax e suas otimizações ( por exemplo, alfa-beta pruning ). No Google você encontra muitos exemplos de código e muito material sobre esse algoritmo ( inclusive estudos sobre sua aplicação no jogo de damas - e em vários outros jogos de tabuleiro ).

Para não ficar muito “robozinho”, você também pode adicionar erros acidentais e perfis na sua IA.

Por exemplo, uma criança escolheria jogadas piores (provavelmente, analisando um único nível da árvore), um perfil agressivo poderia priorizar comer peças, enquanto o “profissional” seria o algoritmo na sua máxima expressão. Isso torna o jogo mais humanístico… e mais agradável, já que ninguém quer jogar sabendo que vai perder.

Tentei adapta o codigo passado nesse topico para o programa q estou fazendo para a faculdade e nao funcionou.

Não estou conseguindo compila porque algumas classes estão dando alguns erros.

pintaPecas( g );
g.dispose();

Graphics2D g = (Graphics2D) G.create();

Por favor queria ajuda pra compila!

Eu gostaria de fazer um jogo de resta um e estou com dificuldades, alguem poderia me ajudar??

:stuck_out_tongue:

Nós podemos ajudar sim… poste o que voce já fez e o que voce tem duvida que temos prazer em responder.

ok

fiz duas classes: a tabuleiro(inicia o tabuleiro e adiciona as pecas) e casa(inicia casa e ve se ta cheia ou vazia)
agora quero criar as pecas mas nao estou conseguindo… eu estava querendo fazer em java fx… procurei uns tutoriais mas nao entendi… segue abaixo as 2 classes:

package projeto_resta_um;

import projeto_resta_um.Casa;

/**
 *
 * @author Uso Geral
 */
public class Casa {

    public Casa(){
    if Casa = null
            println("casa vazia");
    else println("casa cheia");

    }

    private void println(String string) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

e

package projeto_resta_um;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Uso Geral
 */
public class Tabuleiro {

    private List<Casa> pecas;

    public Tabuleiro(){
    pecas new ArrayList<Casa>();
    criarTodasPecas();
    }

    public void setPecas(List<Casa> p) {
        pecas = p;
    }

    public List<Casa> getPecas() {
        return pecas;
    }

    public void add(Casa p) {

        if (!pecas.contains(p)){
            pecas.add(p)


        pecas.add(a5);
        pecas.add(a4);
        pecas.add(a3);
        pecas.add(b5);
        pecas.add(b4);
        pecas.add(b3);
        pecas.add(c5);
        pecas.add(c4);
        pecas.add(c3);
        pecas.add(d1);
        pecas.add(d2);
        pecas.add(d3);


        pecas.add(d4);
        pecas.add(d5);
        pecas.add(d6);
        pecas.add(d7);
        pecas.add(d8);
        pecas.add(d9);
        pecas.add(e1);
        pecas.add(e2);
        pecas.add(e3);
        pecas.add(e4);
        pecas.add(e5);

        pecas.add(e6);
        pecas.add(e7);
        pecas.add(e8);
        pecas.add(e9);
        pecas.add(f1);
        pecas.add(f2);
        pecas.add(f3);
        pecas.add(f4);
        pecas.add(f5);
        pecas.add(f6);
        pecas.add(f7);
        pecas.add(f8);
        pecas.add(f9);

        pecas.add(g5);
        pecas.add(g4);
        pecas.add(g3);
        pecas.add(h5);
        pecas.add(h4);
        pecas.add(h3);
        pecas.add(i5);
        pecas.add(i4);
        pecas.add(i3);

    }
}
    private void criarTodasPecas() {
        throw new UnsupportedOperationException("Not yet implemented");
    }
    

}

ta ai… se alguem puder me ajudar… quero criar as pecas e se alguem axar algum erro no codigo pode dar um tok ai… vlw

descobri que preciso criar uma variavel q referencia a peca… oq que eu nao criei ainda… mas nao consegui cria-la da erros e tal… sera q alguem poderia criar a variavel das pecas coloca-las no codigo e postar ai??

obgd