Salve.
sto avendo molta difficoltà a far partire un db in h2, vi allego l'errore che ottengo:
giu 16, 2022 11:51:19 AM com.amari.storyGame.DbGame <init>
SEVERE: null
org.h2.jdbc.JdbcSQLNonTransientConnectionException: Invalid database name: ".\fileDb\db\" [90138-200]
vi allego i moduli che utilizzano h2:
classe che gestisce il db:
package com.amari.storyGame;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author unipi
* Questa classe si occupa di gestire i dati delle stanze e degli oggetti
* presenti in gioco.
*
* le tabelle:
* -> stanza
* id | nomeStanza | desc | prospettiva
* -> oggetto
* id | nomeOggetto | desc
* -> npcs
* hp | nomeNpc | desc
*
* Creeremo un costruttore che avvia la connessione al db h2, e creeremo dei
* metodi per poter caricare gli statement sql per caricare e interrogare le tabelle.
* Il costruttore creato ha il compito di creare le tabelle e di popolarle.
*
*/
public final class DbGame {
/*
Query di creazione
*/
private static final String createStanza = "CREATE TABLE IF NOT EXISTS stanza ("
+ "id INT PRIMARY KEY NOT NULL, "
+ "nomeStanza VARCHAR (1024) NOT NULL, "
+ "desc TEXT NOT NULL, "
+ "prospettiva TEXT NOT NULL)";
private static final String createOggetto = "CREATE TABLE IF NOT EXISTS oggetto ("
+ "id INT PRIMARY KEY AUTOINCREMENT NOT NULL, "
+ "nomeOggetto VARCHAR (1024) NOT NULL, "
+ "desc TEXT NOT NULL)";
private static final String createNpcs = "CREATE TABLE IF NOT EXISTS npcs ("
+ "hp INT NOT NULL, "
+ "nomeNpc VARCHAR (1024) NOT NULL, "
+ "desc TEXT NOT NULL)";
public DbGame(Connection connessione){
//apertura della connessione
Properties credenzialiDb = new Properties();
credenzialiDb.setProperty("user", "amaro");
credenzialiDb.setProperty("password", "NonFottiConGliAmari");
try {
connessione = DriverManager.getConnection("jdbc:h2:./fileDb/db/", credenzialiDb);
//creazione tabelle
executeQuery(createStanza, connessione);
executeQuery(createOggetto, connessione);
executeQuery(createNpcs, connessione);
//popolamento tabelle
executeQueryInfile(connessione);
} catch (SQLException ex) {
Logger.getLogger(DbGame.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void executeQuery(String q, Connection c)
{
try {
try (Statement s = c.createStatement()) {
s.executeUpdate(q);
s.close();
}
} catch (SQLException ex) {
Logger.getLogger(DbGame.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void executeQueryInfile(Connection c)
{
String uploadStanza = "LOAD DATA LOCAL INFILE ./doc/fileDb/stanza.txt INTO TABLE stanza";
String uploadOggetto = "LOAD DATA LOCAL INFILE ./doc/fileDb/oggetto.txt INTO TABLE oggetto";
String uploadNpcs = "LOAD DATA LOCAL INFILE ./doc/fileDb/npcs.txt INTO TABLE npcs";
try {
try (Statement s = c.createStatement()) {
s.executeUpdate(uploadStanza);
s.executeUpdate(uploadOggetto);
s.executeUpdate(uploadNpcs);
s.close();
}
} catch (SQLException ex) {
Logger.getLogger(DbGame.class.getName()).log(Level.SEVERE, null, ex);
}
}
public ResultSet executeSelect(String q, Connection c, int index)
{
ResultSet r = null;
try {
try (PreparedStatement p = c.prepareStatement(q)) {
p.setInt(1, index);
r = p.executeQuery();
p.close();
}
} catch (SQLException ex) {
Logger.getLogger(DbGame.class.getName()).log(Level.SEVERE, null, ex);
}
return r;
}
//creare metodo di chiusura Connessione
public void closeConnection(Connection conn) throws SQLException{ conn.close();}
}
classe che usa il db:
package com.amari.storyGame;
import com.amari.type.Risposta;
import com.amari.type.Stanza;
import com.amari.command.CommandType;
import com.amari.command.Command;
import com.amari.type.Discorso;
import com.amari.type.Npc;
import com.amari.type.Oggetto;
import com.amari.engine.GameDescription;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
public class Amari extends GameDescription{
DbGame db;
Connection c;
/*
creazione preparedStatement
Query di selezione
*/
private static final String selectStanzaConstruct = "SELECT * FROM stanza WHERE id = ?";
@Override
public void init() throws SQLException {
db = new DbGame(c); //FIXME
ResultSet ris = null;
//Comandi
getProtagonista().setNome("Lello");
Command nord = new Command(CommandType.NORD, "nord");
nord.setAlias(new String[]{"n", "N", "Nord", "NORD"});
getCommands().add(nord);
Command inventory = new Command(CommandType.INVENTORY, "inventario");
inventory.setAlias(new String[]{"inv", "i", "I"});
getCommands().add(inventory);
Command sud = new Command(CommandType.SOUTH, "sud");
sud.setAlias(new String[]{"s", "S", "Sud", "SUD"});
getCommands().add(sud);
Command est = new Command(CommandType.EAST, "est");
est.setAlias(new String[]{"e", "E", "Est", "EST"});
getCommands().add(est);
Command ovest = new Command(CommandType.WEST, "ovest");
ovest.setAlias(new String[]{"o", "O", "Ovest", "OVEST"});
getCommands().add(ovest);
Command end = new Command(CommandType.END, "end");
end.setAlias(new String[]{"end", "fine", "esci","exit"});
getCommands().add(end);
Command look = new Command(CommandType.LOOK_AT, "osserva");
look.setAlias(new String[]{"guarda", "vedi", "descrivi"});
getCommands().add(look);
Command search = new Command(CommandType.SEARCH, "cerca");
search.setAlias(new String[]{"trova", "controlla"});
getCommands().add(search);
Command pickup = new Command(CommandType.PICK_UP, "raccogli");
pickup.setAlias(new String[]{"prendi", "pick", "prendere"});
getCommands().add(pickup);
Command open = new Command(CommandType.OPEN, "apri");
open.setAlias(new String[]{});
getCommands().add(open);
Command push = new Command(CommandType.PUSH, "premi");
push.setAlias(new String[]{"spingi","attiva"});
getCommands().add(push);
Command talk = new Command(CommandType.TALK, "parla");
talk.setAlias(new String[]{"Parla","PARLA"});
getCommands().add(talk);
Command equip = new Command(CommandType.EQUIP, "equipaggia");
equip.setAlias(new String[]{"equip"});
getCommands().add(equip);
Command stats = new Command(CommandType.STATS, "statistica");
stats.setAlias(new String[]{"stat", "stats", "statistiche", "vita", "info", "informazioni"});
getCommands().add(stats);
Command attack = new Command(CommandType.ATTACK, "attacca");
attack.setAlias(new String[]{"attack", "combatti"});
getCommands().add(attack);
Command eat = new Command(CommandType.EAT, "mangia");
eat.setAlias(new String[]{"eat", "bevi", "assumi"});
getCommands().add(eat);
Command use = new Command(CommandType.USE, "usa");
use.setAlias(new String[]{"indossa", "vesti", "use"});
getCommands().add(use);
Command throww = new Command(CommandType.THROW, "butta");
throww.setAlias(new String[]{"getta", "cestina", "elimina", "rimuovi"});
getCommands().add(throww);
//Stanze livello 1
ris = db.executeSelect(selectStanzaConstruct, c, 0);
Stanza entrylevel = new Stanza(ris.getInt(1), ris.getString(2), ris.getString(3));
entrylevel.setProspettiva(ris.getString(4));
ris = db.executeSelect(selectStanzaConstruct, c, 1);
Stanza entry_corridoio = new Stanza(ris.getInt(1), ris.getString(2), ris.getString(3));
entry_corridoio.setProspettiva(ris.getString(4));
ris = db.executeSelect(selectStanzaConstruct, c, 2);
Stanza corridoio_est = new Stanza(ris.getInt(1), ris.getString(2), ris.getString(3));
entry_corridoio.setProspettiva(ris.getString(4));
ris = db.executeSelect(selectStanzaConstruct, c, 3);
Stanza atrio_ovest = new Stanza(ris.getInt(1), ris.getString(2), ris.getString(3));
atrio_ovest.setProspettiva(ris.getString(4));
ris = db.executeSelect(selectStanzaConstruct, c, 4);
Stanza corridoio_nord = new Stanza(ris.getInt(1), ris.getString(2), ris.getString(3));
corridoio_nord.setProspettiva(ris.getString(4));
ris = db.executeSelect(selectStanzaConstruct, c, 5);
Stanza corridoio_ovest = new Stanza(ris.getInt(1), ris.getString(2), ris.getString(3));
corridoio_ovest.setProspettiva(ris.getString(4));
ris = db.executeSelect(selectStanzaConstruct, c, 6);
Stanza entry_campus = new Stanza(ris.getInt(1), ris.getString(2), ris.getString(3));
entry_campus.setProspettiva(ris.getString(4));
ris = db.executeSelect(selectStanzaConstruct, c, 7);
Stanza campus_ovest = new Stanza(ris.getInt(1), ris.getString(2), ris.getString(3));
campus_ovest.setProspettiva(ris.getString(4));
ris = db.executeSelect(selectStanzaConstruct, c, 8);
Stanza campus_nord = new Stanza(ris.getInt(1), ris.getString(2), ris.getString(3));
campus_nord.setProspettiva(ris.getString(4));
ris = db.executeSelect(selectStanzaConstruct, c, 9);
Stanza campus_est = new Stanza(ris.getInt(1), ris.getString(2), ris.getString(3));
campus_est.setProspettiva(ris.getString(4));
ris = db.executeSelect(selectStanzaConstruct, c, 10);
Stanza dib_est = new Stanza(ris.getInt(1), ris.getString(2), ris.getString(3));
dib_est.setProspettiva(ris.getString(4));
ris = db.executeSelect(selectStanzaConstruct, c, 11);
Stanza dib_ovest = new Stanza(ris.getInt(1), ris.getString(2), ris.getString(3));
dib_ovest.setProspettiva(ris.getString(4));
//Stanbze livello 2
Stanza startlevel = new Stanza(12, "Ufficio Comandante", "Ti trovi all'interno dell'ufficio del tuo comandante, ti sta spiegando la tattica di guerra");
startlevel.setProspettiva("""
Ti trovi all'interno dell'ufficio del comandante. Hai dinanzi a te una cassa. Magari potrebbe esser utile scoprire cose vi è all'interno.
Inoltre dietro di te è presente una porta.
""");
Stanza entry_trincea = new Stanza(13 , "Ingresso trincea", "Ti trovi all'interno della trincea.");
entry_trincea.setProspettiva("""
Sei nel mezzo di un campo di battaglia, intorno a te solo morte e distruzione. Sei in compagnia degli amari.
""");
Stanza trincea_empty = new Stanza(14 , "Vicolo cieco" , "Ti trovi nel mezzo di un vicolo senza la possibilità di proseguire");
trincea_empty.setProspettiva("""
Dinanzi a te non c'è nulla, ti ritrovi solo a combattere con un alieno.
""");
Stanza trincea_addestramento = new Stanza(15 , "Campo di addestramento" , "Questo è un campo di addestamento");
trincea_addestramento.setProspettiva("""
Ti trovi in un campo di addestramento, e dinanzi vedi il sergente mimmo Glatone insieme ad un gruppo di soldati.
Il sergente ha il compito di far esercitare i soldati a lanciare le granate.
""");
Stanza trincea_orda = new Stanza(16 , "Ingresso del campo di addestramento" , "Ti trovi al di fuori del campo di addestramento");
trincea_orda.setProspettiva("""
Hai appena completato il tuo addestramento. Esci dal campo e ti rendi conto che questo è sotto attacco da un'orda di alieni.
DEVI DIFENDERLO A TUTTU I COSTI!
""");
Stanza ospedale_campo = new Stanza(17 , "Ospedale da campo" , "Ti ritrovi all'interno dell'ospedale da campo allestito per i feriti di guerra");
ospedale_campo.setProspettiva("""
All'interno del campo noti tutti i soldati feriti, e noti una cassa che al momento non puoi aprire!
""");
Stanza ospedale_nord = new Stanza(18 , "Ospedale" , "Ospedale a Nord");
ospedale_nord.setProspettiva("""
Ti ritrovi nell'ala nord dell'ospedale e noti la presenza di un gruppo di alieni, che girano nei corridoi.
""");
Stanza intermezzo = new Stanza(19 , "Intermezzo" , "Zona morta");
intermezzo.setProspettiva("""
Ti ritrovi in una zona di guerra appena bombardata. Sono tutti morti, ma riesci a udire il lamento di un soldato alleato.
""");
Stanza intermezzo_est = new Stanza(20 , "Intermezzo" , "Intermezzo a est");
intermezzo_est.setProspettiva("""
Continuando la tua missione, arrivi in una zona molto tranquilla, sembra quasi intatta. Mentre controlli in giro,
ti ritrovi in un bombardamento. Riesci però a salvarti . Al tuo risveglio un tuo compagno ti aiuta a rialzarti e ti offre una razione K.
""");
Stanza end_trincea = new Stanza(21 , "Trincea" , "Fine della trincea");
end_trincea.setProspettiva("""
Subito dopo il bombardamento, è tutto distrutto. Sei solo. Ma devi portare a termine la missione. Mentre continui a camminare per la tua strada
un alieno sopravvisuto ti attacca di sorpresa e c'è un solo modo per liberati di lui.
""");
//Stanza livello 3
Stanza fuori_trincea = new Stanza(22 , "Trincea" , "Fuori dalla trincea");
fuori_trincea.setProspettiva("""
Sei appena uscito dalla trincea e ti ritrovi a pochi passi dalla nave aliena. Un alieno sopravvissuto ti attacca
devi liberartene per portare a termine la missione.
""");
Stanza nave_aliena = new Stanza(23 , "Nave" , "Nave aliena");
nave_aliena.setProspettiva("""
Sei a pochi passi dalla nave aliena, ti manca poco per completare la missione per la quale sei stato scelto
hai un solo colpo a disposizione per colpire la nave e farla esplodere.
""");
Stanza fine_gioco = new Stanza(24 , "Gioco" , "Fine del gioco");
fine_gioco.setProspettiva("""
Frank accenna un mezzo sorriso. Sapeva infondo che sarebbe finita così. Giulio dopo aver spaccato in due un alieno e con la sua testa in mano sorride e sa che comunque dovrà darsi da fare nel trovare un lavoro perché ora che sarà tutto da ricostruire si ritroverà senza una lira.
Pier invece porta un elmetto militare da guerra con sopra il simbolo della pace.
""");
//Aggiunta stanze livello 1
getStanza().add(entrylevel);
getStanza().add(entry_corridoio);
getStanza().add(corridoio_est);
getStanza().add(corridoio_ovest);
getStanza().add(corridoio_nord);
getStanza().add(atrio_ovest);
getStanza().add(entry_campus);
getStanza().add(campus_ovest);
getStanza().add(campus_est);
getStanza().add(campus_nord);
getStanza().add(dib_est);
getStanza().add(dib_ovest);
//Aggiunta stanza livello 2
getStanza().add(startlevel);
getStanza().add(entry_trincea);
getStanza().add(trincea_empty);
getStanza().add(trincea_addestramento);
getStanza().add(trincea_orda);
getStanza().add(ospedale_campo);
getStanza().add(ospedale_nord);
getStanza().add(intermezzo);
getStanza().add(intermezzo_est);
getStanza().add(end_trincea);
//Aggiunta stanze livello 3
getStanza().add(fuori_trincea);
getStanza().add(nave_aliena); //non so se è necessaria una mappa nel livello 3, in quanto ci sono molti dialoghi (stile filmato).
getStanza().add(fine_gioco);
//creazione mappa livello1
entrylevel.setNord(entry_corridoio);
entry_corridoio.setEst(corridoio_est);
entry_corridoio.setSud(entrylevel);
entry_corridoio.setOvest(corridoio_ovest);
entry_corridoio.setNord(corridoio_nord);
corridoio_est.setOvest(atrio_ovest);
corridoio_est.setNord(entry_campus);
corridoio_est.setSud(entry_corridoio);
corridoio_ovest.setSud(entry_corridoio);
corridoio_nord.setSud(entry_corridoio);
atrio_ovest.setSud(corridoio_est);
entry_campus.setNord(campus_nord);
entry_campus.setOvest(campus_ovest);
entry_campus.setEst(campus_est);
campus_nord.setSud(entry_campus);
campus_ovest.setSud(entry_campus);
campus_est.setOvest(dib_ovest);
campus_est.setEst(dib_est);
dib_est.setSud(campus_est);
dib_ovest.setSud(campus_est);
//creazione mappa livello 2
startlevel.setNord(entry_trincea);
entry_trincea.setNord(trincea_empty);
entry_trincea.setOvest(trincea_addestramento);
trincea_empty.setSud(entry_trincea);
trincea_addestramento.setSud(entry_trincea);
trincea_addestramento.setNord(trincea_orda);
trincea_orda.setSud(trincea_addestramento);
trincea_orda.setEst(ospedale_campo);
ospedale_campo.setOvest(intermezzo);
ospedale_campo.setNord(ospedale_nord);
ospedale_nord.setSud(ospedale_campo);
intermezzo.setEst(intermezzo_est);
intermezzo_est.setNord(end_trincea);
//oggetti
Oggetto letter = new Oggetto(1, "lettera", "Askfhak shfak hskfhkaaff sfaagfege ... E' una lettera incomprensibile.");
getListaOggetti().add(letter);
Oggetto mela = new Oggetto(4, "mela", "Restituisce 20 hp.");
mela.setCurabile(true);
mela.setCura(20);
getListaOggetti().add(mela);
Oggetto potion = new Oggetto(6, "pozione", "Restituisce 50 hp.");
potion.setCurabile(true);
potion.setCura(50);
getListaOggetti().add(potion);
Oggetto spada = new Oggetto(3, "spada", "Sembra abbastanza affilata..");
spada.setArma(true);
spada.setPotenza(40);
getListaOggetti().add(spada);
Oggetto zanne = new Oggetto(5, "zanne", "Zanne di lupo");
zanne.setArma(false);
zanne.setPotenza(15);
getListaOggetti().add(zanne);
Oggetto broken_spada = new Oggetto(7, "spada_rotta", "Non molto affilata...contro qualche animale dovrebbe comunque andare bene");
broken_spada.setArma(true);
broken_spada.setPotenza(20);
getListaOggetti().add(broken_spada);
Oggetto club = new Oggetto(8, "mazza", "Una mazza, efficace contro le persone");
club.setArma(true);
club.setPotenza(25);
getListaOggetti().add(club);
Oggetto super_spada = new Oggetto(9, "super_spada", "E' una delle spade più forti che esistano");
super_spada.setArma(true);
super_spada.setPotenza(55);
getListaOggetti().add(super_spada);
Oggetto key = new Oggetto(10, "chiave", "Utile per aprire qualche cassa..");
getListaOggetti().add(key);
Oggetto w_clothes = new Oggetto(11, "vestiti", "Vestiti pesanti da lavoratore. Fornisce 15 punti di armatura.");
w_clothes.setArmatura(true);
w_clothes.setProtezione(15);
getListaOggetti().add(w_clothes);
Oggetto light_armor = new Oggetto(12, "armatura_leggera", "Armatura leggera consumata. Fornisce 35 punti di armatura.");
light_armor.setArmatura(true);
light_armor.setProtezione(35);
getListaOggetti().add(light_armor);
Oggetto heavy_armor = new Oggetto(13, "armatura", "Armatura molto resistente. Fornisce 70 punti di armatura.");
heavy_armor.setArmatura(true);
heavy_armor.setProtezione(70);
getListaOggetti().add(heavy_armor);
Oggetto cassa = new Oggetto (2, "cassa", "Potrà contenere sicuramente qualcosa..");
cassa.setPrendibile(false);
cassa.setapribile(false);
cassa.setOpenWith(key);
cassa.setIsCest(true);
cassa.getListaOggetti().add(letter);
cassa.getListaOggetti().add(potion);
getListaOggetti().add(cassa);
Oggetto key_b = new Oggetto(14, "chiavello", "Utile per aprire qualche lucchetto..");
getListaOggetti().add(key_b);
Oggetto armadio = new Oggetto (15, "armadio", "Potrà contenere sicuramente qualcosa..");
armadio.setPrendibile(false);
armadio.setapribile(false);
armadio.setOpenWith(key_b);
armadio.setIsCest(true);
armadio.getListaOggetti().add(heavy_armor);
armadio.getListaOggetti().add(super_spada);
getListaOggetti().add(armadio);
//NPC HELPER
Npc helper = new Npc(100, "helper", "Sono qui a spiegarti le basi del gioco!");
Discorso talk1 = new Discorso();
Discorso talk2 = new Discorso();
Risposta answer = new Risposta();
talk1.setDiscorso("Hai bisogno di aiuto?");
answer.setRisposta("Che comandi posso usare?");
answer.setRispostaConcat(talk2);
talk1.getRisp().add(answer);
answer = new Risposta();
talk2.setDiscorso("Questi sono i comandi che puoi usare: \n-parla (nome): per parlare con un npc \n-attacca (nome): per attaccare un npc \n-osserva: descrive la stanza corrente \n-cerca: lista di oggetti o npc presenti nella stanza \n-nord,sud,ovest,est: navigazione \n-inventario: mostra inventario \n-stats: mostra statistiche giocatore \n-equip (nome arma): per equipaggiare un'arma \n-prendi: raccogliere oggetto \n-apri: aprire oggetto");
answer.setRisposta("Grazie!");
answer.setRispostaConcat(talk1);
talk2.getRisp().add(answer);
talk2 = new Discorso();
answer = new Risposta();
answer.setRisposta("Cosa bisogna fare?");
answer.setRispostaConcat(talk2);
talk1.getRisp().add(answer);
answer = new Risposta();
talk2.setDiscorso("Devi arrivare alla fine per vincere.");
answer.setRisposta("Ho capito!");
answer.setRispostaConcat(talk1);
talk2.getRisp().add(answer);
commonDialog(talk1, helper);
helper.setTalk(talk1); //Set di dialogo iniziale
helper.setSpeakable(true);
getNpcList().add(helper);
//Fine NPC HELPER
//partenza stanza
setStanzaCorrente(entrylevel);
}
private static void commonDialog(Discorso talk1, Npc npc) {
Discorso talk2 = new Discorso();
Risposta answer = new Risposta();
answer.setRisposta("Chi sei?");
answer.setRispostaConcat(talk2);
talk1.getRisp().add(answer);
answer = new Risposta();
talk2.setDiscorso(npc.getDesc());
answer.setRisposta("Ho capito!");
answer.setRispostaConcat(talk1);
talk2.getRisp().add(answer);
answer = new Risposta();
answer.setRisposta("Fine");
//answer.setTriggerReference(() -> System.out.println("Prova delle lambda expression"));
talk1.getRisp().add(answer);
}
public boolean isWin(){
boolean win = false;
List<Npc> boss = getNpcList().stream()
.filter(item -> item.getNome().equals("boss"))
.filter(item -> item.getHp() > 0)
.collect(Collectors.toList());
if(boss.isEmpty()){
win = true;
System.out.println("Hai vinto!");
}
return win;
}
public boolean isLose(){
boolean lose = false;
if(getProtagonista().getHp() <= 0){
lose = true;
System.out.println("Sei morto!");
}
return lose;
}
}
vi ringrazio ragazzi!