Galera, estou criando um projeto de jogo da velha.
Nesse projeto existe o arquivo JogoDaVelha.java onde tem o construtor e os metodos.
Existe o arquivo TesteJogo.java onde executo o codigo.
Criei um tabuleiro utilizando swing.
O tabuleiro foi criado a partir de um for dentro de outro for, utilizando uma matriz de JLabels. Utilizei o swing tambem para deixar cm uma carinha legal. Ao executa-lo, ao clicar em alguma das celulas, apresenta o seguinte erro. Se alguem puder me dar uma luz fico muito grata.
Exception in thread “AWT-EventQueue-0” java.lang.ArrayIndexOutOfBoundsException: -1
at JogoDaVelha.jogarJogador(JogoDaVelha.java:94)
at Tabuleiro$2.mouseClicked(Tabuleiro.java:127)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDisp*atchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)[Link do projeto completo](https://github.com/raissahonorato/jogodavelha/tree/master/JogoDaVelha/src)
Bom dia Raissa_Honorato, exatamente o que o amigo @Vinicius_Salles esta ressaltando, você esta acessando uma posição 54 por exemplo de um array que so tem 53 posições. Um erro muito comum é declarar um array com tamanho 50 por exemplo e esquecer que o indice começa em Zero(0) e vai até 49.
Esse erro é provavel que voce ache em JogoDaVelha.java linha 94 ou em Tabuleiro.java linha 127
Eu percebi que os arquivos estao enxergando a matriz da seguinte forma como mostra a imagem, por isso as posicoes nao batem na hora da execução. Se eu fizer um Tabuleiro via swing independente do arquivo JogoDaVelha, nao da problema nenhum, justamente pq nao da choque com a matriz do outro arquivo.
Entenda, se o jogador ta selecionando a posição 1,1 você deve marcar a posição 0,0 da matriz.
Porque Array na maioria das linguagens começam na posição 0,0.
É exatamente isso, @Raissa_Honorato. Isso acontece porque o Java (de modo geral) é zero-based, o que significa que a primeira posição da estrutura de dados é o zero. Assim sendo, sua matriz (na memória) tem essas posições:
0 1 2
0 | |
1 | |
2 | |
E você está enxergando dessa forma:
1 2 3
1 | |
2 | |
3 | |
Pro usuário final, a segunda forma é o que ele verá, mas “debaixo dos panos” se usa a primeira forma.
Obrigada pelas dicas, me ajudaram bastante. Tenho so mais uma duvida, mas nao envolve o Swing do projeto. Na hora de imprimir a matriz, antes de colocar os valores “X” e “O”, aparece “null”, como posso substituir o null por um espaço em branco? Segue imagem e o for que utilizei pra criar a matriz.! Ah, é em string a matriz [
teste lógico ? executa se for verdadeiro : executa se for falso;
Seguindo o exemplo que escrevi, eu testo se a matriz na posição [i][j] é diferente de nulo, caso seja, então eu exibo o valor contido na posição, caso contrário exibo somente o espaço em branco.
Operador ternário é bem simples de compreender a sintaxe e de usar, geralmente ele é bastante usado em situações simples como a sua, com ele evitamos de ter um if/else para resolver o problema, diminuímos a quantidade de código e aumentamos a praticidade.
Espero que tenha compreendido, qualquer dúvida que surja é só perguntar!
Acho que seria válido aqui você dar uma breve explicação da linha para ela, cara. Operador ternário foge da realidade do ensino básico do Java, e como você é o autor da resposta, fica válido. Só uma opinião, claro…
Sem problemas, sua opinião é bem válida!
As vezes faço por hábito colocar somente o código e esquecer de dar uma breve explicação por sempre pensar que é algo muito simples (na minha visão)!
Pessoal, desculpa mais uma vez aperriar voces, olha só.
Meu tabuleiro (a parte grafica) esta enxergando a matriz de uma forma diferente da matriz do console como mostra a imagem. É a unica coisa que falta para completar o projeto. Considerando que o [i] é a linha e o [j] a coluna, na matriz desenhada, ele le o contrario, ao invez de [ i ][ j ] ele lê [ j ] [ i ]. Nao consigo entender o por que ele enxerga dessa forma.