Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [JAVA] Problema array e sostituzione elementi

    Salve a tutti!

    Ho un problema con un'array (bidimensionale), dentro la quale vorrei sostituire/aggiungere due elementi.
    L'array si chiama "data" ed è 10x10.
    Ho provato ad operare così:

    codice:
    private void MuoviActionPerformed(java.awt.event.ActionEvent evt) {
    
    for (int i = 0; i < data.length; i++) {
                for (int j = 0; j < data.length; j++) {
                    if (data[i][j].equals("X")) {
                        data[i][j] = "";
                        data[i][j+1] = "X"; // sposto sopra
                    } else if (data[i][j].equals("O")) {
                        data[i][j] = "";
                        data[x][y] = "O"; // x e y sono numeri random da 1 a 10
                    }
                }
            }
    
        }
    
    }
    E' collegata ad una jTable e dovrebbe aggiornarsi dopo la pressione di quel tasto, comunque, a parte questo,
    come potete vedere, metto i due cicli in modo da scansionare la matrice e che, quando arriva all'elemento "X" lo sposti di una casella sopra (e quindi l'ho tradotto con il "cancella dov'era e riscrivi la nuova posizione").
    Mentre, se il ciclo trova "O" allora lo sposta in modo casuale.

    Appena premo il bottone mi da questo errore:

    codice:
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 10
    Ringrazio tutti anticipatamente.
    Saluti.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Problema array e sostituzione elementi

    Originariamente inviato da myttex
    codice:
    for (int i = 0; i < data.length; i++) {
                for (int j = 0; j < data.length; j++) {
    data.length è il numero di righe, se sai appunto che è 10 x 10, il numero di righe è appropriato anche come numero di colonne. Pertanto fin qui gli indici sono ok.

    Originariamente inviato da myttex
    codice:
                        data[i][j+1] = "X"; // sposto sopra
    In realtà non sposti sopra ma di una colonna a destra. Ma se j è l'ultimo indice di colonna possibile (9), ovviamente non puoi usare 10!

    Originariamente inviato da myttex
    codice:
                        data[x][y] = "O"; // x e y sono numeri random da 1 a 10
    Gli indici vanno solo da 0 a 9 compresi. Non 10.

    Ripensa la logica di queste assegnazioni.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ciao!
    Innanzi tutto, grazie mille per la risposta, che mi ha chiarito il dubbio

    Ripensandoci, pero', quell'algoritmo è stato un po' ridondante, quindi ho modificato così:
    (dove x,y sono numeri random (creati con java.util.Random) e r,r2 sono sempre num. random da -1 a +1)

    codice:
    //pulsante per andare a nord (sopra di una casella)
    
     try {
            data[y][x] = "";
            data[y-1][x] = "X";
            
            data[y1][x1] = "";
            data[y1+r][x1+r2] = "O";
            
        } catch(ArrayIndexOutOfBoundsException ex) { 
            
            JOptionPane.showMessageDialog(null, "Non puoi andare a Nord, mi dispiace. Riprova!", "Attenzione!" , JOptionPane.WARNING_MESSAGE); 
    
            data[y][x] = "X";
            data[y-1][x] = "";
            data[y1][x1] = "O";
            data[y+r][x1+r2] = "";
    
        }
    Ecco, adesso la domanda (forse banale ) è: come posso fare in modo da aggiornare tutte le volte il num. random "x,y" e quindi farlo cambiare ad ogni pressione di quel pulsante?

    Grazie mille,
    saluti.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da myttex
    codice:
            data[y][x] = "";
            data[y-1][x] = "X";
            
            data[y1][x1] = "";
            data[y1+r][x1+r2] = "O";
    Innanzitutto deduco che stai facendo i 4 casi distinti per le 4 direzioni. Non si vede il resto del tuo codice ma se stai "replicando" questo codice per i 4 casi semplicemente cambiando qualcosina (es. - o +), allora non stai facendo una buona cosa. Cerca di "fattorizzare" meglio il codice.

    Originariamente inviato da myttex
    } catch(ArrayIndexOutOfBoundsException ex) {

    JOptionPane.showMessageDialog(null, "Non puoi andare a Nord, mi dispiace. Riprova!", "Attenzione!" , JOptionPane.WARNING_MESSAGE);
    Il controllo che l'utente non può andare in una certa direzione, dovrebbe essere fatto con della tua logica di test, non semplicemente accettando e aspettando che lanci ArrayIndexOutOfBoundsException.

    Il tuo codice non dovrebbe lanciare mai ArrayIndexOutOfBoundsException. Se per caso dovesse capitare, allora sarebbe il segnale che c'è un tuo "baco" nel programma.

    Originariamente inviato da myttex
    Ecco, adesso la domanda (forse banale ) è: come posso fare in modo da aggiornare tutte le volte il num. random "x,y" e quindi farlo cambiare ad ogni pressione di quel pulsante?
    Qui non ho ben capito il dubbio. Hai un Random che tieni da qualche parte, ad esempio come variabile di istanza? Usalo per estrarre un valore casuale nel range che ti serve.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Wow, che velocità!

    Allora, chiarisco qualche cosa

    1) Nella prima parte del codice non metto 4 casi distinti, ma è un unico caso per andare SOLO a nord.
    Infatti prende la variabile data[y][x] (cioè, la stringa "X" con posizione casuale), la cancella e la riscrive una casella sopra.

    2) per quanto riguarda il try/catch, non capisco perchè non posso usare quell'eccezione, d'altra parte, l'unico modo nel quale non posso andare a nord è quando sono fuori campo, e, quindi, appunto, quando si verifica quell'eccezione lì!
    Poi, vabè, il dubbio non è quello, ci ritornero' dopo con calma

    3)
    Qui non ho ben capito il dubbio. Hai un Random che tieni da qualche parte, ad esempio come variabile di istanza? Usalo per estrarre un valore casuale nel range che ti serve.
    Ecco, mi spiego meglio.
    Allora, io ho quel pulsante, quando lo clicco esegue quel codice e aggiorna anche una jTable a cui è collegato (jTable1.setModel(...)). Il brutto pero' è che, se lo premo piu' di una volta, dalla seconda in poi non succede piu' nulla.
    Credo sia dovuto al fatto che non 'aggiorna' e cambia i numeri random precedentemente dichiarati (x,y).
    Come posso ovviare al problema?

    Grazie mille, anche della disponibilita'.
    Saluti!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da myttex
    1) Nella prima parte del codice non metto 4 casi distinti, ma è un unico caso per andare SOLO a nord.
    Non ho detto che in quel pezzo che ho quotato tratti i 4 casi ... ho solo chiesto se per caso quel codice l'hai replicato più volte nel sorgente (e cambiando magari solo qualcosina) per trattare le altre direzioni.

    Originariamente inviato da myttex
    2) per quanto riguarda il try/catch, non capisco perchè non posso usare quell'eccezione
    Questioni "concettuali", l'ho spiegato brevemente prima.

    Originariamente inviato da myttex
    d'altra parte, l'unico modo nel quale non posso andare a nord è quando sono fuori campo, e, quindi, appunto, quando si verifica quell'eccezione lì!
    Testa prima questa situazione, ripeto non aspettarti l'eccezione.

    Originariamente inviato da myttex
    Credo sia dovuto al fatto che non 'aggiorna' e cambia i numeri random precedentemente dichiarati (x,y).
    Ma io non so dove li hai dichiarati e soprattutto come/quando hai assegnato ad essi dei valori. Devi tenerti il Random da qualche parte e riassegnare a x/y dei valori casuali ogni volta che ti servono.
    Se l'hai fatto solo una-tantum, ovviamente non cambiano più.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Sì, beh... sì, faccio tutti i casi diversi, non saprei come fare altrimenti.
    Tanto, anche se faccio un metodo, dovrei rifare lo stesso i casi separati

    Comunque, io le variabili random, come ho gia' detto, le ho dichiarate prima dell'evento click (e sono x,y, x1,y1 => num. random da 1 a 10)

    nell'evento del bottone come posso fare in modo tale da avere: ogni click => nuovi num.?

    Dovrei dichiarare altri 2 numeri random all'interno dell'evento? O cos'altro?

    Grazie,
    saluti.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da myttex
    Sì, beh... sì, faccio tutti i casi diversi, non saprei come fare altrimenti.
    Tanto, anche se faccio un metodo, dovrei rifare lo stesso i casi separati
    C'è sicuramente il modo per minimizzare il codice separando quello che cambia da quello che non cambia nei tuoi 4 casi. Ma devi dedurlo tu .... io non ho una visione complessiva di quello che devi fare/hai fatto tu finora.

    Originariamente inviato da myttex
    nell'evento del bottone come posso fare in modo tale da avere: ogni click => nuovi num.?
    Ma io continuo a non capire il tuo dubbio. Posso anche non sapere dove hai dichiarato quelle variabili, ma ti dico semplicemente che se vuoi avere nuovi numeri casuali ... usa un oggetto Random. Ce l'avrai no, da qualche parte? Usa i suoi metodi e assegna a quelle variabili dei nuovi valori.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Ma io continuo a non capire il tuo dubbio. Posso anche non sapere dove hai dichiarato quelle variabili, ma ti dico semplicemente che se vuoi avere nuovi numeri casuali ... usa un oggetto Random. Ce l'avrai no, da qualche parte? Usa i suoi metodi e assegna a quelle variabili dei nuovi valori.
    E' quello il punto! Ad ogni click del tasto COME faccio ad assegnare a quelle variabili dei nuovi valori?

    Metti caso abbia:
    codice:
     Random rand = new Random()
    int y = rand.nextInt(10);  
    int x = rand.nextInt(10);
    
    private void BottoneActionPerformed(java.awt.event.ActionEvent evt) {
          data[x][y] = "prova" //se voglio cambiare ad ogni click quell'x e y come posso fare?
    }

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da myttex
    Metti caso abbia:
    codice:
     Random rand = new Random()
    int y = rand.nextInt(10);  
    int x = rand.nextInt(10);
    
    private void BottoneActionPerformed(java.awt.event.ActionEvent evt) {
          data[x][y] = "prova" //se voglio cambiare ad ogni click quell'x e y come posso fare?
    }
    'rand' è una variabile di "istanza"? Ok ..... sposta le due assegnazioni a x/y nel metodo di action performed.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.