Joguinho da velha com swing

Ola turma !fiz esse básico programinha do jogo da velha como exercício com swing e awt. Queria
colocar um fundo no JFrame ,ja vi várias soluções aqui mesmo mas nenhuma dá certo.Se alguém tiver alguma sujestão para dar uma melhorada na gráfica é bem vinda!!


package jogostabuleirosswing;

 


 import java.awt.*;  
 import java.awt.event.*;  
 import java.util.*;  

 import javax.swing.*;  
   
 class JTabuleiro extends JFrame implements ActionListener{  
 static int i=1;  
 ESTADOJOGO estado;  
 Maquina maquina;//classe interna  
 Image img;   
 JPanel paineltabuleiro,painelnomejogadorH,painelnomejogadorMaquina,painelbutton;  
 JButton but_novamente;  
 JLabel lab_jogador,lab_maquina;  
 Color color;  
   
 JButton button[]={new JButton(),new JButton(),new JButton(),new JButton(),new JButton(),new JButton(),new JButton(),new JButton(),new JButton()};  
 static int array_jogadas[][]={ {0,1,2} , {0,3,6}, {0,4,8}, {3,4,5}, {6,7,8}, {1,4,7}, {2,5,8}, {2,4,6}};  
 static String str_homemsimbolo;  
     
 public JTabuleiro(String s){  
     super("JOGO DA VELHA");  
     str_homemsimbolo=s;  
     inicializatabu();  
     evento();  
       
   }  
   
   
   
 public void inicializatabu(){  
 // ao acabar o jogo voltar a cor novamente        
     color=button[0].getBackground();  
     maquina=new Maquina();//classe interna  
   
   //possibilitar decidir as coordenadas dos varios componentes que irao ser inseridas  
           Container cp=getContentPane();  
           cp.setBackground(Color.cyan);  
           cp.setLayout(null);  
          
    //painel para colocar o nome do Homem   
     
        painelnomejogadorH=new JPanel();  
        painelnomejogadorH.setLayout(new GridLayout(2,0));  
        painelnomejogadorH.setBackground(Color.cyan);  
        painelnomejogadorH.setSize(150,25);  
        painelnomejogadorH.setLocation(10,10);   
        lab_jogador=new JLabel("Nome jogador: "+Jogo.nomejogador);  
        painelnomejogadorH.add(lab_jogador);  
          
 //  //painel para colocar o nome da maquina  
        painelnomejogadorMaquina=new JPanel();  
        painelnomejogadorMaquina.setLayout(new GridLayout(2,0));  
        painelnomejogadorMaquina.setBackground(Color.cyan);  
        painelnomejogadorMaquina.setSize(150,25);  
        painelnomejogadorMaquina.setLocation(200,10);  
        lab_maquina=new JLabel("Nome maquina: "+maquina.nomemaquina);  
        painelnomejogadorMaquina.add(lab_maquina);  
 // //painel para colocar o button para possibilitar novas jogadas  
        painelbutton=new JPanel();  
        painelbutton.setBackground(Color.cyan);  
        painelbutton.setSize(350,30);  
        painelbutton.setLocation(20,300);  
        but_novamente=new JButton("ok");  
        painelbutton.setLayout(new FlowLayout());  
        painelbutton.add(new JLabel("Quer jogar novamente?Aperte aqui"));  
        painelbutton.add(but_novamente);  
    //criando painel para tabuleiro   
        paineltabuleiro=new JPanel();  
        paineltabuleiro.setLayout(new GridLayout(3,3));  
        paineltabuleiro.setSize(150,150);  
        paineltabuleiro.setLocation(100,80);////centraliza no JFrame!!!  
        for(int i=0;i < button.length;i++){//insere buttons no painel  
           paineltabuleiro.add(button[i]);  
         }  
           
          cp.add(paineltabuleiro);  
          cp.add(painelnomejogadorH);  
          cp.add(painelnomejogadorMaquina);  
          cp.add(painelbutton);  
          setVisible(true);  
          setSize(400,400);//tamanho JFrame  
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
        
 }  
 public void evento(){  
   
        for(int i=0;i<button.length;i++){  
            button[i].addActionListener(this);  
        }  
    but_novamente.addActionListener(this);  
   
 }    
 public boolean  verificaButton(JButton button){  
      if((button.getText().equalsIgnoreCase("X")== false)&& (button.getText().equalsIgnoreCase("0")== false)){  
       return true;  
       }else return false;  
 }   
   
   
 public void actionPerformed(ActionEvent e) {  
               int i= Math.abs(Jogo.vezH-Jogo.vezM);  
                      
                       if(i == 0 && estado == ESTADOJOGO.START){  
                           verificaEstadoJogo();  
                                        for(int k=0;k < button.length;k++){  
                                               if(e.getSource() == button[k] && verificaButton(button[k])){  
                                                    
                                                button[k].setText(str_homemsimbolo);  
                                                  
                                               Jogo.vezH++;  
                                                maquina.evento_maquina();  
                                              }  
                                        }  
                        }  
             if(but_novamente == e.getSource()&& estado == ESTADOJOGO.GAMEOVER){  
                   for(int k=0;k<button.length;k++){  
                       button[k].setText("");  
                       button[k].setBackground(color);  
                   }  
                   estado =ESTADOJOGO.START;    
                   Jogo.vezH=0;  
                   Jogo.vezM=0;  
                    
             
             }else  if(but_novamente == e.getSource()&& estado == ESTADOJOGO.START)  
               JOptionPane.showMessageDialog(null,"O jogo nao acabou,mas tu e\'s chato!");     
                     
             
 }  
   public void verificaEstadoJogo() {  
   boolean x = false,y = false;  
     int co=0;  
     Color r=new Color(100);  
     for(int i=0; i < array_jogadas.length; i++){  
               if(button[array_jogadas[i][0]].getText().equalsIgnoreCase("X")&&( button[array_jogadas[i][1]].getText().equalsIgnoreCase("X")) &&( button[array_jogadas[i][2]].getText().equalsIgnoreCase("X"))  ){  
                     x=true;  
                 button[array_jogadas[i][0]].setBackground(r.RED); button[array_jogadas[i][1]].setBackground(r.RED); button[array_jogadas[i][2]].setBackground(r.RED);   
                }else if(button[array_jogadas[i][0]].getText().equalsIgnoreCase("0")&&( button[array_jogadas[i][1]].getText().equalsIgnoreCase("0")) &&( button[array_jogadas[i][2]].getText().equalsIgnoreCase("0"))  ){  
                     y=true;  
                   button[array_jogadas[i][0]].setBackground(r.RED); button[array_jogadas[i][1]].setBackground(r.RED); button[array_jogadas[i][2]].setBackground(r.RED);   
                }    
      }  
                       if(x == true){  
                    estado=ESTADOJOGO.GAMEOVER;  
                    Jogo.vezH+=2;  
                   
                     JOptionPane.showMessageDialog(null," "+MENSAGENS.GANHOU.mensagem());  
                   }else if(y == true){  
                    JOptionPane.showMessageDialog(null," "+MENSAGENS.PERDEU.mensagem());  
                      estado=ESTADOJOGO.GAMEOVER;  
                      Jogo.vezM+=3;  
                   
                   }               
                     
             
   
       
     for(int i=0;i < button.length;i++)//verifica se esta cheio de simbolos  
     if(verificaButton(button[i])== false)co++;  
        
             if(co == 9 && estado == ESTADOJOGO.START){            
          
                estado = ESTADOJOGO.GAMEOVER;
                JOptionPane.showMessageDialog(null, "EMPATE");
               
         
            
             }  
       
       
       
       
   }  
   
   
     class Maquina{  
      ArrayList<Integer> lis_coordenadas;  
      ArrayList<Tab> lis_tab;  
      String str_maquinasimbolo;  
      String nomemaquina="Terrivel";   
      int resposta;  
       Maquina(){  
              if(str_homemsimbolo.equalsIgnoreCase("X"))  
                    str_maquinasimbolo="0";  
             else  
              str_maquinasimbolo="X";  
       }  
         
   
          
       ArrayList CriaLista(){  
       int tamanho=0;  
       lis_coordenadas=new ArrayList<Integer>();  
       lis_tab=new ArrayList<Tab>();  
               for(int i=0; i < button.length;i++){//procura saber qts nullos tem para saber o tamanho  
                    if( !button[i].getText().equalsIgnoreCase("X") && !button[i].getText().equalsIgnoreCase("0") ){  
                        tamanho++;  
                        lis_coordenadas.add(i);  
                    }  
                }  
                for(int y=0;y< tamanho;y++){//sabendo o tamanho cria a lista de tabuleiro  
                   Tab tab=new Tab(str_maquinasimbolo);  
                   tab.clonar(button);//clonando os tabuleiros para criar a lista  
                   tab.insere(lis_coordenadas.get(y));//insere os simobolos da maquina  
                   lis_tab.add(y,tab);//criado a lista de tabuleiros  
             }  
       
       
        return null;   
       }  
      int buscaMelhorValor(){  
          int max,coordenada=0;  
            Tab tab=lis_tab.get(0);  
            max=tab.resultadoavaliacao;  
            coordenada=tab.jogadapossivel;  
           for(int i=1;i<lis_tab.size();i++){  
               tab=lis_tab.get(i);  
               if(max <= tab.resultadoavaliacao){  
                  max=tab.resultadoavaliacao;   
                  coordenada=tab.jogadapossivel;  
               }  
                    
           }  
               
       return coordenada;  
      }      
        
                
        
      public  void evento_maquina() {  
      verificaEstadoJogo();  
         if( estado == ESTADOJOGO.START)  
          CriaLista();  
      int coordenada=buscaMelhorValor();  
       if(estado == ESTADOJOGO.START ){  
                 if(Jogo.vezH >= 1){//primeira jogada do homen  
                    button[coordenada].setText(str_maquinasimbolo);   
                    verificaEstadoJogo();  
                    Jogo.vezM++;  
                 }   
       }  
      }  
         
       
         
   }  
   
 }     
 enum ESTADOJOGO{GAMEOVER,START,PAUSE}  
 enum MENSAGENS{GANHOU{  
         @Override  
 public String mensagem(){  
     int i=(int)(Math.random() *(ganhando.length));   
        
      return ganhando[i];}  
   
 },PERDEU{  
      @Override  
 public String mensagem(){  
     int i=(int)(Math.random() *(perdendo.length));   
        
      return perdendo[i];}  
   
   
 };  
 String ganhando[]={"Parabens!!Mas cuidado mae, pode ser sorte"," ,Legal vc ganhou!"," ,Parabens !mas a maquina poderia estar cansada... ","Parabens voce se garantiu ","Legal vc ganhou","you win","Parabens e\' isso ai "," mandou bem!!"};  
 String perdendo[]={"ai.. ai.. ai.. não leve a mal mas ja pensou outro jogo?","A maquina e\' um osso duro meu amigo","Tente novamente, pode ser que teras mais sorte","Relaxe e respire fundo acontece com todo mundo"};  
 public String mensagem(){  
      return null;  
 }  
 }  
   
 public class Jogo {  
     static int vezH,vezM;  
     JTabuleiro tab;  
     static String nomejogador;  
       
       
     Jogo(JTabuleiro j){  
      tab=j;  
     tab.estado=ESTADOJOGO.START;  
   
     }  
     
     
     public  static void main(String...a){  
       Jogo.nomejogador=JOptionPane.showInputDialog(null," Digite seu nome ");  
           JTabuleiro t=new JTabuleiro("X");
           t.setSize(400,400);//tamanho JFrame  
           t.setVisible(true);  
        
           t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
       new Jogo(t);  
           
           
     }  
   }   
 class Tab{  
     String tab_array[];  
     String str_simboloM;  
     int jogadapossivel;  
     int resultadoavaliacao;  
     int mtxPossibilidades[][]={{12,36,48},{2,47},{1,46,58},{6,45},{35,17,26,8},{28,34},{3,42,78},{14,68},{4,25,67}};  
   
      Tab(String simb){  
        tab_array=new String[9];   
        str_simboloM=simb;  
      }  
      void setJogada(int x){  
          jogadapossivel=x;  
      }  
      
      void Imprimir(){  
          for(String st:tab_array){  
            System.out.println(st);    
          }  
         System.out.println("--");   
      }  
        
        
      void clonar(JButton[] button){  
        for(int i=0; i < button.length;i++){  
                     if( button[i].getText().equalsIgnoreCase("X"))  
                        tab_array[i]="X";         
                     else if(button[i].getText().equalsIgnoreCase("0") )  
                         tab_array[i]="0";   
                      else  
                        tab_array[i]="null";  
        }   
     }  
      void calcularPossiParaMaquina(){  
        int spacolivreM=0,spacolivreH=0;  
      for(int k=0; k < mtxPossibilidades[jogadapossivel].length;k++){  
      if(tab_array[mtxPossibilidades[jogadapossivel][k]/10].equalsIgnoreCase(JTabuleiro.str_homemsimbolo)&& tab_array[mtxPossibilidades[jogadapossivel][k]%10].equalsIgnoreCase(JTabuleiro.str_homemsimbolo)){ spacolivreM=10;}  
        }  
       for(int i=0; i < JTabuleiro.array_jogadas.length;i++){  
           if(tab_array[JTabuleiro.array_jogadas[i][0]].equalsIgnoreCase("null") &&tab_array[JTabuleiro.array_jogadas[i][1]].equalsIgnoreCase("null")&&tab_array[JTabuleiro.array_jogadas[i][2]].equalsIgnoreCase("null")     ){  
              spacolivreM++;spacolivreH++;  
            }  
            if(tab_array[JTabuleiro.array_jogadas[i][0]].equalsIgnoreCase( str_simboloM) &&tab_array[JTabuleiro.array_jogadas[i][1]].equalsIgnoreCase("null")&&tab_array[JTabuleiro.array_jogadas[i][2]].equalsIgnoreCase("null")     ){  
              spacolivreM++;  
             }else if(tab_array[JTabuleiro.array_jogadas[i][0]].equalsIgnoreCase("null") &&tab_array[JTabuleiro.array_jogadas[i][1]].equalsIgnoreCase(str_simboloM)&&tab_array[JTabuleiro.array_jogadas[i][2]].equalsIgnoreCase("null")     ){  
              spacolivreM++;  
             }else if(tab_array[JTabuleiro.array_jogadas[i][0]].equalsIgnoreCase("null") &&tab_array[JTabuleiro.array_jogadas[i][1]].equalsIgnoreCase("null")&&tab_array[JTabuleiro.array_jogadas[i][2]].equalsIgnoreCase(str_simboloM)     ){  
              spacolivreM++;  
             }else if(tab_array[JTabuleiro.array_jogadas[i][0]].equalsIgnoreCase(str_simboloM) &&tab_array[JTabuleiro.array_jogadas[i][1]].equalsIgnoreCase(str_simboloM)&&tab_array[JTabuleiro.array_jogadas[i][2]].equalsIgnoreCase("null")     ){  
              spacolivreM++;  
             }else if(tab_array[JTabuleiro.array_jogadas[i][0]].equalsIgnoreCase(str_simboloM) &&tab_array[JTabuleiro.array_jogadas[i][1]].equalsIgnoreCase("null")&&tab_array[JTabuleiro.array_jogadas[i][2]].equalsIgnoreCase(str_simboloM)     ){  
              spacolivreM++;  
             }else if(tab_array[JTabuleiro.array_jogadas[i][0]].equalsIgnoreCase("null") &&tab_array[JTabuleiro.array_jogadas[i][1]].equalsIgnoreCase(str_simboloM)&&tab_array[JTabuleiro.array_jogadas[i][2]].equalsIgnoreCase(str_simboloM)     ){  
              spacolivreM++;  
             }else if(tab_array[JTabuleiro.array_jogadas[i][0]].equalsIgnoreCase(str_simboloM) &&tab_array[JTabuleiro.array_jogadas[i][1]].equalsIgnoreCase(str_simboloM)&&tab_array[JTabuleiro.array_jogadas[i][2]].equalsIgnoreCase(str_simboloM)     ){  
              spacolivreM=60;  
              JOptionPane.showMessageDialog(null," "+MENSAGENSARCASTICA.PERDEU.mensagem());  
                
             }  
           
 //*********texte para saber as linhas diagonais e colunas do homen**************************************************************  
            if(tab_array[JTabuleiro.array_jogadas[i][0]].equalsIgnoreCase(JTabuleiro.str_homemsimbolo) &&tab_array[JTabuleiro.array_jogadas[i][1]].equalsIgnoreCase("null")&&tab_array[JTabuleiro.array_jogadas[i][2]].equalsIgnoreCase("null")     ){  
              spacolivreH++;  
             }else if(tab_array[JTabuleiro.array_jogadas[i][0]].equalsIgnoreCase("null") &&tab_array[JTabuleiro.array_jogadas[i][1]].equalsIgnoreCase(JTabuleiro.str_homemsimbolo)&&tab_array[JTabuleiro.array_jogadas[i][2]].equalsIgnoreCase("null")     ){  
              spacolivreH++;  
             }else if(tab_array[JTabuleiro.array_jogadas[i][0]].equalsIgnoreCase("null") &&tab_array[JTabuleiro.array_jogadas[i][1]].equalsIgnoreCase("null")&&tab_array[JTabuleiro.array_jogadas[i][2]].equalsIgnoreCase(JTabuleiro.str_homemsimbolo)     ){  
              spacolivreH++;  
             }else if(tab_array[JTabuleiro.array_jogadas[i][0]].equalsIgnoreCase(JTabuleiro.str_homemsimbolo) &&tab_array[JTabuleiro.array_jogadas[i][1]].equalsIgnoreCase(JTabuleiro.str_homemsimbolo)&&tab_array[JTabuleiro.array_jogadas[i][2]].equalsIgnoreCase("null")     ){  
              spacolivreH++;  
             }else if(tab_array[JTabuleiro.array_jogadas[i][0]].equalsIgnoreCase(JTabuleiro.str_homemsimbolo) &&tab_array[JTabuleiro.array_jogadas[i][1]].equalsIgnoreCase("null")&&tab_array[JTabuleiro.array_jogadas[i][2]].equalsIgnoreCase(JTabuleiro.str_homemsimbolo)     ){  
              spacolivreH++;  
             }else if(tab_array[JTabuleiro.array_jogadas[i][0]].equalsIgnoreCase("null") &&tab_array[JTabuleiro.array_jogadas[i][1]].equalsIgnoreCase(JTabuleiro.str_homemsimbolo)&&tab_array[JTabuleiro.array_jogadas[i][2]].equalsIgnoreCase(JTabuleiro.str_homemsimbolo)     ){  
              spacolivreH++;  
             }  
               
             
        }  
         if(tab_array[0].equalsIgnoreCase(JTabuleiro.str_homemsimbolo) &&tab_array[6].equalsIgnoreCase(str_simboloM)&& jogadapossivel ==7     ){  
              spacolivreM=40;  
         }else if(tab_array[0].equalsIgnoreCase(JTabuleiro.str_homemsimbolo) &&tab_array[8].equalsIgnoreCase(JTabuleiro.str_homemsimbolo)&& jogadapossivel ==7     ){  
              spacolivreM=40;  
        }else if(tab_array[0].equalsIgnoreCase(JTabuleiro.str_homemsimbolo) &&tab_array[2].equalsIgnoreCase(JTabuleiro.str_homemsimbolo)&& tab_array[6].equalsIgnoreCase(str_simboloM)&&jogadapossivel ==1     ){  
              spacolivreM=40;  
        }else if(tab_array[1].equalsIgnoreCase(JTabuleiro.str_homemsimbolo) &&tab_array[3].equalsIgnoreCase(JTabuleiro.str_homemsimbolo)&& !tab_array[0].equalsIgnoreCase(str_simboloM) && !tab_array[0].equalsIgnoreCase(JTabuleiro.str_homemsimbolo)&& jogadapossivel ==7     ){  
              spacolivreM=40;  
              jogadapossivel=0;
         }else if (tab_array[2].equalsIgnoreCase(JTabuleiro.str_homemsimbolo) &&tab_array[6].equalsIgnoreCase(JTabuleiro.str_homemsimbolo)&& jogadapossivel ==7     ){  
              spacolivreM=40; 
              jogadapossivel=7;
         }
        resultadoavaliacao=spacolivreM-spacolivreH;  
     }  
      void insere(int i){  
          setJogada(i);  
          tab_array[i]=str_simboloM;  
           calcularPossiParaMaquina();  
      }  
 }  
   
 enum MENSAGENSARCASTICA{PERDEU{  
      
 public String mensagem(){  
     int i=(int)(Math.random() *(ganhando.length));   
        
      return ganhando[i];}  
   
   
 };  
   
 String ganhando[]={"Perdeu Play Boy!!","Seria bom se vc pudesse mudar de ideía ne?Mas agora,voce  vai perder..ahaha","Realmente essa voce vai dançar","Poxa acho que vou ganhar","Se tivesse apostado dinheiro eu teria ganhado","Qualquer tentativa é inútil,essa voce perdeu","uhmmmm   obrigado agora vou ganhar","Ola que presente!!muito obrigado ","Abandone suas esperanças"};  
 public String mensagem(){  
      return null;  
 }  
 }     

agora acho que ninguém ganha dele ehehe

Quando eu fiz um Jogo da velha eu desenhava tudo com o Java2D através de linhas e o Oval para o circulo.

Não é difíçil, mas não sei que tipo de visual que voce quer.

O melhor modo é carregar uma BufferedImage depois sobreescrever ométodo paintComponent do seu JPanel do tabuleiro para renderizar a imagem.

[quote=Mark_Ameba]Quando eu fiz um Jogo da velha eu desenhava tudo com o Java2D através de linhas e o Oval para o circulo.

Não é difíçil, mas não sei que tipo de visual que voce quer.

O melhor modo é carregar uma BufferedImage depois sobreescrever ométodo paintComponent do seu JPanel do tabuleiro para renderizar a imagem.[/quote]
blz,na verdade queria mudar o fundo que é cor cyan ,tipo colocar uma imagem qualquer mais simpática só para dar uma melhora no visual.Pelo visto tenho terei mesmo que usar BufferedImage mas nao sei bem como,realmente não entendi a explicação de muitos por aqui no guj.
O tabuleiro em si foi construido encima de um JPanel que fica no JFrame, logo acho que tenho mesmo é inserir uma imagem no JFrame não é?
valeu mesmo assim pela ideía!

Eu fiz um joguinho desse tb pra treinar swing.

O que eu fiz foi criar um JFrame principal com 6 JPanels uma pra cada jogada. Quando o usuario clica em algum dos JFrames verifica se eh X ou 0 e desenha usando drawLine pra fazer o X e o drawOval pra fazer a 0.

Se vc quiser eu te passo o codigo e o jar pra vc dar uma olhada.
Me manda um msg com o seu email se vc quiser. (e pra todos que quiserem tb)

//Daniel

Boa noite colegas !

[b]windsofhell:[/b

Se importa de me mandar ?
joseedmilson@gmail.com

Valeu !

[]s

Ola, postei os links pro jogo no meu blog.

http://windsofhell.blogspot.com/

Valeu

//Daniel

Muito bom!Quando eu dominar o basicão do swing e awt vou para o 2D!!A propósito tentou ganhar da máquina no meu? :smiley:

Opa, acabei de rodar, ficou bem legal o seu game. Curti!

hahah nem consegui ganhar da maquina :smiley:

Cara, só dá empate!!! :smiley: !!Mas ficou legal!!show de bola!!Parabéns!!