Newsgroup: it.comp.java
Titolo: Problemi con le variabili

Sto creando un applet java da inserire in un sito in fase di sviluppo.
Questa applet non è nient'altro che un gioco di esplorazione di una
foresta.
La foresta è essenzialmente un array bidimensionale.
Purtroppo nella funzione che si occupa dell'inizializzazione della mappa
e quindi del riempimento dell'array in fase di compilazione mi viene
segnalato un errore di "possibile perdita di precisione".
Come posso fare per risolvere questi errori? (12)
Io ho usato in tutto il programma dei tipi di variabili piccoli per
ridurre la memoria utilizzata dal programma in esecuzione.
Qui di seguito scrivo il programma java, che se volete potete anche
riutilizzare per vostri scopi.
Vi ringrazio preventivamente dell'aiuto.
Andrea Romagnoli.
// Librerie
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.sql.*;
import javax.swing.*;
// Classe principale
public class Esplora extends javax.swing.JApplet{
  // Dichiarazione degli oggetti
  JButton BNord = new JButton();
  JButton BEst = new JButton();
  JButton BOvest = new JButton();
  JButton BSud = new JButton();
  JPanel Sfondo = new JPanel();
  TextArea VisualizzaMsg = new
java.awt.TextArea("",0,0,TextArea.SCROLLBARS_NONE);
  Image Immagine[] = new Image[7];
  Graphics2D VisualizzaObj;
  // Dichiarazione delle variabili
  short mappa[][];
  byte colonna;
  byte riga;
  String utente;
  boolean abilitazioni[4];
  // Main
  public void init(){
    setLayout(null);
    setBackground(Color.black);
    setSize(500,300);
    BNord.setLabel("Nord");
    add(BNord);
    BNord.setBackground(Color.orange);
    BNord.setBounds(225,12,50,20);
    BOvest.setLabel("Ovest");
    add(BOvest);
    BOvest.setBackground(Color.green);
    BOvest.setBounds(12,140,50,20);
    BEst.setLabel("Est");
    add(BEst);
    BEst.setBackground(Color.pink);
    BEst.setBounds(444,264,50,20);
    BSud.setLabel("Sud");
    add(BSud);
    BSud.setBackground(Color.cyan);
    BSud.setBounds(225,264,50,20);
    Sfondo.setLayout(null);
    add(Sfondo);
    Sfondo.setBounds(72,36,360,216);
    VisualizzaMsg.setText("Inoltrati nella foresta");
    Sfondo.add(VisualizzaMsg);
    VisualizzaMsg.setForeground(Color.green);
    VisualizzaMsg.setBounds(12,0,336,48);
    VisualizzaObj.setColor(Color.black);
    Sfondo.add(VisualizzaObj);
    VisualizzaObj.fillRect(132,96,100,100);
    utente = getParameter("nick");
    inizializza();
  }
  private void inizializza(){
    short mappa[][] = new short[65][65];
    colonna = 33;
    riga = 1;
    String immagini[] = {"diamante.gif","rubino.gif","smeraldo.gif",
                         "soldi.gif","pozione.gif","serpenti.gif",
                         "ambra.gif"};
    Toolkit kit = Toolkit.getDefaultToolkit();
    for(byte i=0;i<7;i++){
      Immagine[i] = kit.getImage(immagini[i]);
    }
    for(byte c=1;c<64;c++){
      for(byte r=1;r<64;r++){
        mappa[c][r] = (Math.random() + (Math.random() / 10)) * 100 ;
      }
    }
    for(byte c=0;c<65;c++){
      mappa[c][0] = -1;
      mappa[c][64] = -1;
    }
    for(byte r=0;r<65;r++){
      mappa[0][r] = -1;
      mappa[64][r] = -1;
    }
    for(byte i=0;i<4;i++){
      abilitazioni[i] = true;
    }
  }
  private void esci(){
    BNord.setEnabled(false);
    BSud.setEnabled(false);
    BOvest.setEnabled(false);
    BEst.setEnabled(false);
  }
  private void nordsud(byte nr, boolean bottone, boolean chiamante){
    if(mappa[colonna][riga+(nr*2)] == -1){
      if(!bottone)
        BNord.setEnabled(false);
        abilitazioni[0] = false;
      if(bottone)
        BSud.setEnabled(false);
        abilitazioni[1] = false;
    }else{
      if(!chiamante)
        cerca();
    }
  }
  private void ovestest(byte nc, boolean bottone, boolean chiamante){
    if(mappa[colonna+(nc*2)][riga] == -1){
      if(!bottone){
        BOvest.setEnabled(false);
        abilitazioni[2] = false;}
       if(bottone){
        BEst.setEnabled(false);
        abilitazioni[3] = false;}
    }else{
      if(!chiamante)
        cerca();
    }
  }
  public void mouseClicked(java.awt.event.MouseEvent event){
    Object oggetto = event.getSource();
    if(oggetto == BNord){
      nordsud((byte)-1,false,false);
      if(!abilitazioni[1] == false){
        BSud.setEnabled(true);
        abilitazioni[1] = true;
      }
      riga--;
    }else if(oggetto == BOvest){
      ovestest((byte)-1,false,false);
      if(!abilitazioni[3]){
        BEst.setEnabled(true);
        abilitazioni[3] = true;}
       colonna--;
    }else if(oggetto == BEst){
      ovestest((byte)1,true,false);
      if(!abilitazioni[2]){
        BOvest.setEnabled(true);
        abilitazioni[2] = true;}
       colonna++;
    }else if(oggetto == BSud){
      nordsud((byte)1,true,false);
      if(!abilitazioni[0]){
        BNord.setEnabled(true);
        abilitazioni[0] = true:}
      riga++;
    }
  }
  private short archivia(String azione, short valore1){
    String query;
    String collegamento = "jdbc:odbc:etrurianet.mdb";
    short salute;
    ResultSet interroga;
    ResultSet inserisci;
    try{
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      Connection connessione =
DriverManager.getConnection(collegamento,"","");
      Statement stat = connessione.createStatement();
      if(azione == "salute"){
        query = "SELECT salute FROM utente WHERE nick = '"+utente+"';";
        interroga = stat.executeQuery(query);
        if((salute + valore1) > 1000){
          valore1 = 1000 - salute;
        }
        query = "UPDATE utente SET salute = salute + "+valore1+" WHERE
nick = '"+utente+"';";
        inserisci = stat.executeQuery(query);
      }else if(azione == "intimidazioni"){
        esci();
      }else if(azione == "scudi"){
        query = "UPDATE utente SET moneta = moneta + "+valore1+" WHERE
nick = '"+utente+"';";
        inserisci = stat.executeQuery(query);
      }else if((azione == "diamante") || (azione == "rubino") || (azione
== "smeraldo") || (azione == "ambra")){
        query = "SELECT quantita FROM averi WHERE proprietario =
'"+utente+"' AND descrizione = '"+azione+"';";
        interroga = stat.executeQuery(query);
        if(interroga != ""){
          query = "UPDATE averi SET quantita = quantita + 1 WHERE
proprietario = '"+utente+"' AND descrizione = '"+azione+"';";
          inserisci = stat.executeQuery(query);
        }else{
          query = "INSERT INTO averi (proprietario, descrizione, valore,
quantita) VALUES ('"+utente+"','"+azione+"',"+valore1+",1)";
          inserisci = stat.executeQuery(query);
        }
      }
    }catch(SQLException s){
      System.out.println("Errore SQL: "+s.toString()+"
"+s.getErrorCode()+" "+s.getSQLState());
      esci();
    }
  }
  private void cerca(){
    byte img;
    byte pietra;
    String ritrovamento;
    String risultato;
    short valore;
    switch(mappa[colonna][riga]){
      case 0:
        pietra = (byte) (Math.random() * 10) / 3;
        if(pietra == 1){
          ritrovamento = "Hai trovato un rubino.";
          risultato = "rubino";
          valore = 2000;
          img = 1;
        }else{
          ritrovamento = "Qui ci sono solo alberi, continua a cercare.";
          risultato = "";
          valore = 0;
          img = 10;
        }
      break;
      case 5:
        pietra = (byte) (Math.random() * 10) / 2;
        if(pietra == 3){
          ritrovamento = "Hai trovato un diamante.";
          risultato = "diamante";
          valore = 4000;
          img = 0;
        }else{
          ritrovamento = "Qui non c'e' nulla, continua a cercare.";
          risultato = "";
          valore = 0;
          img = 10;
        }
      break;
      case 9:
        pietra = (byte) (Math.random() * 10) / 5;
        if(pietra == 0){
          ritrovamento = "Hai trovato uno smeraldo.";
          risultato = "smeraldo";
          valore = 800;
          img = 2;
        }else{
          ritrovamento = "Qui non c'e' nulla, continua a cercare.";
          risultato = "";
          valore = 0;
          img = 10;
        }
      break;
      case 24:
        ritrovamento = "Hai trovato una borsa con 50 scudi.";
        risultato = "scudi";
        valore = 50;
        img = 3;
      break;
      case 46:
        ritrovamento = "Hai trovato una borsa con 30 scudi.";
        risultato = "scudi";
        valore = 30;
        img = 3;
      break;
      case 47:
        ritrovamento = "Hai trovato una borsa con 30 scudi.";
        risultato = "scudi";
        valore = 30;
        img = 3;
      break;
      case 54:
        ritrovamento = "Hai trovato una borsa con 10 scudi.";
        risultato = "scudi";
        valore = 10;
        img = 3;
      break;
      case 57:
        ritrovamento = "Hai trovato una borsa con 10 scudi.";
        risultato = "scudi";
        valore = 10;
        img = 3;
      break;
      case 59:
        ritrovamento = "Hai trovato una borsa con 10 scudi.";
        risultato = "scudi";
        valore = 10;
        img = 3;
      break;
      case 75:
        ritrovamento = "Sei inciampato, perdi 5 punti salute.";
        risultato = "salute";
        valore = -5;
        img = 7;
      break;
      case 76:
        ritrovamento = "Sei inciampato, perdi 5 punti salute.";
        risultato = "salute";
        valore = -5;
        img = 7;
      break;
      case 79:
        ritrovamento = "Sei inciampato, perdi 5 punti salute.";
        risultato = "salute";
        valore = -5;
        img = 7;
      break;
      case 94:
        ritrovamento = "Hai trovato una fonte d'acqua limpida, guadagni
4 punti salute.";
        risultato = "salute";
        valore = 4;
        img = 8;
      break;
      case 95:
        ritrovamento = "Hai trovato una fonte d'acqua limpida, guadagni
4 punti salute.";
        risultato = "salute";
        valore = 4;
        img = 8;
      break;
      case 103:
        ritrovamento = "Hai trovato una serpe che ti ha morso, perdi 10
punti salute.";
        risultato = "salute";
        valore = -10;
        img = 5;
      break;
      case 107:
        ritrovamento = "Hai trovato una serpe che ti ha morso, perdi 10
punti salute.";
        risultato = "salute";
        valore = -10;
        img = 5;
      break;
      case 115:
        ritrovamento = "Hai trovato una gemma d'ambra.";
        risultato = "ambra";
        valore = 200;
        img = 6;
      break;
      case 122:
        ritrovamento = "...";
        risultato = "intimidazioni";
        valore = 0;
        img = 9;
      break;
      case 143:
        ritrovamento = "...";
        risultato = "intimidazioni";
        valore = 0;
        img = 9;
      break;
      case 144:
        ritrovamento = "...";
        risultato = "salute";
        valore = -20;
        colonna = (byte) ((Math.random() * 10) + 1) * 5;
        riga = (byte) ((Math.random() * 10) + 1) * 5;
        nordsud((byte)-1,false,true);
        nordsud((byte)1,true,true);
        ovestest((byte)-1,false,true);
        ovestest((byte)1,true,true);
        img = 9;
      break;
      case 148:
        ritrovamento = "....";
        risultato = "salute";
        valore = 50;
        img = 4;
      break;
      default:
        ritrovamento = "Non hai trovato nulla, continua a cercare.";
        risultato = "";
        valore = 0;
        img = 10;
      break;
    }
    archivia(risultato,valore);
    VisualizzaMsg.setText(ritrovamento);
    VisualizzaObj.drawImage(Immagine[img],0,0,this);
  }
}

Purtroppo ci sono alcune difficoltà coi numeri di riga visto che il mio
newsreader spezza le linee dove pare a lui; comunque grosso modo le
correzioni sono queste:
riga 26: boolean[] abilitazioni;
riga 152: abilitazioni[0]=true;
riga 76: mappa[c][r] = (short)((Math.random() + (Math.random() / 10)) *
100);
riga 172: valore1 = (short)(1000 - salute);
riga 206: pietra = (byte) ((Math.random() * 10) / 3);
riga 221: pietra = (byte) ((Math.random() * 10) / 3);
riga 348: colonna = (byte) (((Math.random() * 10) + 1) * 5);
riga 349: riga = (byte) (((Math.random() * 10) + 1) * 5);
alla 76 e alla 172 ti sei proprio dimenticato il cast.
alle 206, 221, 248 e 349 hai fatto il cast sul numero casuale poi hai
moltiplicato o diviso per un int ; devi mettere tutte le operazioni in
parentesi e fare il cast sulla parentesi.
Rimangono due errori alla 57 ed alla 184 ma sono di altra natura ed è un po
lunga per me correggerli.
Consiglio: leggi qualcosa sul cast esplicito, ed i sorgenti così lunghi
mandali in mail come allegato a chi te li chiede..
Ciao,
Maurizio.