Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Il nuovo Deebot X12 OmniCyclone abbina un sistema di raccolta dello sporco senza sacchetto, un rullo di lavaggio esteso e la tecnologia FocusJet per intervenire più efficacemente sulle macchie più persistenti. Un robot completo e preciso che aiuta a tenere puliti i pavimenti di casa con il minimo sforzo
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2 implementa un mocio a nastro che esegue una pulizia dettagliata del pavimento di casa, in abbinamento ad un potente motore di aspirazione della polvere: un prodotto ideale per gestire in autonomia e con grande efficacia le necessità di pulizia dei pavimenti di casa
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-05-2012, 16:39   #1
maxxpower
Senior Member
 
L'Avatar di maxxpower
 
Iscritto dal: Oct 2005
Città: Artena (RM) Squadra:Juventus F.C.
Messaggi: 1943
[JAVA]Utilizzare oggetti solo in presenza di un altro.

Buonasera a tutti,

Perdonatemi per il titolo lungo ma ho cercato di essere il più esplicito possibile.

Sto lavorando ad un progettino per il mio corso di java che consiste in una sorta di avventura grafica (molto approssimativa) in cui un personaggio passa di stanza in stanza trovando degli oggetti che può utilizzare (sfruttandone i vari metodi quindi);

L'unico mio dilemma è che da specifiche del progetto alcuni oggetti,ad esempio una Porta, possono essere utilizzati (per esempio aperti,visto come metodo apri()) della porta,solo in presenza di un altro oggetto di tipo Chiave ad esempio.


Ho pensato ad una soluzione del genere:

Codice:
public class Porta implements Openable,Examinable {

	
	protected long keyval=321456L;
	protected boolean isOpen = false;

	@Override
	public void apri(Usable u) throws WrongKeyException{

		if (u instanceof Key && ((Key) u).keyval==this.keyval) {

		
			
			if (isOpen) {

				return;
			}

			isOpen = true;

		}
		
		throw new WrongKeyException();

	}

	@Override
	public void chiudi() {

		isOpen = false;

	}
	
	@Override
	public String esamina(){
		
		return "Questa è una porta!";
		
	}

	@Override
	public void apri() {
		// TODO Auto-generated method stub
		
	}

}

Potrebbe funzionare? Considerate che l'eventuale personaggio sostanzialmente potrà effettuare le azioni presenti negli oggetti del gioco (richiamandone quindi i metodi),ed avrà un inventario, in cui dovrà esserci ovviamente una chiave.
__________________
|Antec DF35|Corsair HX620w|Intel i7 [email protected]|AC Freezer Xtreme|Asus P6T dlx|3x2gb Apacher 2000mhz|Gigabyte GTX660 OC 2GB|Crucial M4 128gb|Empire Ps-2120d|
DAW:|Corsair CX430|Phenom II x4 955BE @3.8ghz vdefault|CM Hyper412S|Asus M4A89GTD-Pro|4x2gb Corsair|Gainward HD4670 512MB|2x500gb Seagate|M-Audio Delta 1010lt|
maxxpower è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2012, 17:43   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
E' corretto gestire la cosa con un'eccezione, nel senso che logicamente non fa una piega; l'eccezione è il prodotto del mancato verificarsi di una condizione per cause non controllabili nell'ambito in cui la condizione è richiesta: la porta sa che si apre con una chiave ma non ha modo di sapere perché la chiave sia sbagliata quindi ripassa la palla al chiamante, sperando che lui possa farci qualcosa.

C'è un problema di verificabilità nel momento in cui il metodo apri dichiara di accettare uno Usable e genera un'unica eccezione per due casi diversi: uno quando lo Usable non sia un Key e uno quando lo Usable sia un Key ma della specie sbagliata.

L'intoppo sta nel fatto che se per una svista logica il tuo codice dovesse passare uno Usable che non sia un Key otterresti un errore uguale al caso, diverso, in cui sia un Key ma non quello giusto. E' una di quelle cose che in fase di debug ti fa restare perplesso (del genere "oh, son sicuro che la chiave è giusta, come mai spari l'eccezione..." e poi scopri che il problema è che la chiave giusta non era mai passata al metodo apri).

Non è sbagliato lo Usable (chi mi dice che la porta non sia apribile con un "grimaldello del nano trallallà"), è il rilascio dell'eccezione che dovrebbe essere il più specifico possibile.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2012, 19:29   #3
maxxpower
Senior Member
 
L'Avatar di maxxpower
 
Iscritto dal: Oct 2005
Città: Artena (RM) Squadra:Juventus F.C.
Messaggi: 1943
Perfetto, grazie mille per il consiglio.

un chiarimento: avendo specificato nel "super-metodo" dell'interfaccia apri(usable u) throws Exception posso aggiungere un'altra eccezione a quella già dichirata nella signature giusto,lanciandola con un ulteriore controllo sul keyvalue?


secondo chiarimento: il codice è logicamente compatibile con quello che cerco?

Ovvero che per aprire una porta ho bisogno di una chiave che il personaggio ha in un inventario. Quello che non mi torna in ciò che ho scritto è come riuscire a togliere la chiave dall'inventario( e questo è facile) e poi graficamente (con un Jbutton) passare quella chiave come parametro al metodo apri della porta.

spero di essermi spiegato.

grazie di cuore per l'aiuto,purtroppo sto imparando ancora..
__________________
|Antec DF35|Corsair HX620w|Intel i7 [email protected]|AC Freezer Xtreme|Asus P6T dlx|3x2gb Apacher 2000mhz|Gigabyte GTX660 OC 2GB|Crucial M4 128gb|Empire Ps-2120d|
DAW:|Corsair CX430|Phenom II x4 955BE @3.8ghz vdefault|CM Hyper412S|Asus M4A89GTD-Pro|4x2gb Corsair|Gainward HD4670 512MB|2x500gb Seagate|M-Audio Delta 1010lt|
maxxpower è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2012, 20:39   #4
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Io metterei come tipo di ritorno della funzione apri() un boolean e poi ritornerei vero o falso per segnalare se la porta si è aperta o meno. Il lancio di una eccezione dovrebbe significare qualcosa di assurdo che la funzione non sa o non può gestire.

Poi fa attenzione che dopo isOpen = true; ci va un return per uscire dalla funzione. Altrimenti tutte le volte che la porta si apre viene lanciata anche l'eccezione WrongKeyException;
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2012, 21:05   #5
maxxpower
Senior Member
 
L'Avatar di maxxpower
 
Iscritto dal: Oct 2005
Città: Artena (RM) Squadra:Juventus F.C.
Messaggi: 1943
Quote:
Originariamente inviato da VICIUS Guarda i messaggi
Io metterei come tipo di ritorno della funzione apri() un boolean e poi ritornerei vero o falso per segnalare se la porta si è aperta o meno. Il lancio di una eccezione dovrebbe significare qualcosa di assurdo che la funzione non sa o non può gestire.

Poi fa attenzione che dopo isOpen = true; ci va un return per uscire dalla funzione. Altrimenti tutte le volte che la porta si apre viene lanciata anche l'eccezione WrongKeyException;
non converrebbe tornare un messaggio a quel punto?


cmq correggo subito il return..hai ragione..
__________________
|Antec DF35|Corsair HX620w|Intel i7 [email protected]|AC Freezer Xtreme|Asus P6T dlx|3x2gb Apacher 2000mhz|Gigabyte GTX660 OC 2GB|Crucial M4 128gb|Empire Ps-2120d|
DAW:|Corsair CX430|Phenom II x4 955BE @3.8ghz vdefault|CM Hyper412S|Asus M4A89GTD-Pro|4x2gb Corsair|Gainward HD4670 512MB|2x500gb Seagate|M-Audio Delta 1010lt|
maxxpower è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2012, 21:34   #6
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da maxxpower Guarda i messaggi
non converrebbe tornare un messaggio a quel punto?
Cosa intendi di preciso per messaggio?
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2012, 22:13   #7
maxxpower
Senior Member
 
L'Avatar di maxxpower
 
Iscritto dal: Oct 2005
Città: Artena (RM) Squadra:Juventus F.C.
Messaggi: 1943
Una stringa. Che contenga ad esmepio "la porta è stata aperta!"

un boolean forse non è molto utile da questo punto di vista;anche se magari,visto che avrò bisogno di una gestione grafica forse è più facile da utilizzare di una stringa.
__________________
|Antec DF35|Corsair HX620w|Intel i7 [email protected]|AC Freezer Xtreme|Asus P6T dlx|3x2gb Apacher 2000mhz|Gigabyte GTX660 OC 2GB|Crucial M4 128gb|Empire Ps-2120d|
DAW:|Corsair CX430|Phenom II x4 955BE @3.8ghz vdefault|CM Hyper412S|Asus M4A89GTD-Pro|4x2gb Corsair|Gainward HD4670 512MB|2x500gb Seagate|M-Audio Delta 1010lt|
maxxpower è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2012, 23:51   #8
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Non vanno bene nè il booleano nè la stringa: in Java si usano le eccezioni esattamente per il caso di specie. Usare il valore restituito sarebbe sbagliato nello stesso senso in cui in italiano è sbagliato usare il presente quando ci va il congiuntivo: il senso si capisce ma c'è qualcosa che non va.

Se il metodo è "apri" e la porta non si apre è chiaro che s'è verificata un'eccezione. Se "apri" ma non si apre e non rilascia un'eccezione allora non è più "apri" ma "provaAdAprire", che è tutta un'altra cosa.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2012, 08:31   #9
maxxpower
Senior Member
 
L'Avatar di maxxpower
 
Iscritto dal: Oct 2005
Città: Artena (RM) Squadra:Juventus F.C.
Messaggi: 1943
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Non vanno bene nè il booleano nè la stringa: in Java si usano le eccezioni esattamente per il caso di specie. Usare il valore restituito sarebbe sbagliato nello stesso senso in cui in italiano è sbagliato usare il presente quando ci va il congiuntivo: il senso si capisce ma c'è qualcosa che non va.

Se il metodo è "apri" e la porta non si apre è chiaro che s'è verificata un'eccezione. Se "apri" ma non si apre e non rilascia un'eccezione allora non è più "apri" ma "provaAdAprire", che è tutta un'altra cosa.

Perfetto. Allora adesso aggiungo l'ulteriore eccezione per il Keyval Errato della chiave.

Il mio dubbio resta sempre se sto agendo correttamente per quanto riguarda la clausola del progetto che dice "alcuni oggetti possono essere usati con altri, come una chiave su una porta o una gettone telefonico su una cabina"

Nella classe key così come ho scritto ora non avrei bisogno di nulla...forse solo di un metodo usa...che magari prenda in input una Porta p su cui richiamare il metodo apri(this)?
__________________
|Antec DF35|Corsair HX620w|Intel i7 [email protected]|AC Freezer Xtreme|Asus P6T dlx|3x2gb Apacher 2000mhz|Gigabyte GTX660 OC 2GB|Crucial M4 128gb|Empire Ps-2120d|
DAW:|Corsair CX430|Phenom II x4 955BE @3.8ghz vdefault|CM Hyper412S|Asus M4A89GTD-Pro|4x2gb Corsair|Gainward HD4670 512MB|2x500gb Seagate|M-Audio Delta 1010lt|
maxxpower è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2012, 09:00   #10
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Per risolvere il problema devi considerare la questione in un contesto più ampio del semplice rapporto chiave-porta. Se ci limitiamo a quello infatti esistono una pluralità di soluzioni equivalente e la decisione circa quale sia preferibile è arbitraria.

Ti servono più informazioni per decidere e quelle informazioni le ricavi dai meccanismi più generali del programma.

Ad esempio, come fa il tuo programma a decidere che l'utente sta cercando di aprire una porta?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2012, 14:06   #11
maxxpower
Senior Member
 
L'Avatar di maxxpower
 
Iscritto dal: Oct 2005
Città: Artena (RM) Squadra:Juventus F.C.
Messaggi: 1943
Il progetto prevede una GUI in cui il personaggio principale del gioco è interpretato da me stesso...all'interno della stanza ho un certo numero di oggetti di diverso tipo e con diverse azioni che posso fare su di essi...come ad esempio la porta e la chiave..ma c'è anche un baule per dire..o un passaggio segreto,tutti gli oggetti hanno dei metodi..ovvero possono essere esaminati,utilizzati,aperti/chiusi,spenti/accesi

Il personaggio può compiere alcune azioni precise...che sono corrispondenti ai metodi degli oggetti...con qualche extra come l'azione parla..

quindi dovrei tramite gui cliccare sull'oggetto porta..che mi darà alcuni comandi...ad esempio apri...

spero di essermi spiegato.

Grazie veramente di cuore per l'aiuto..
__________________
|Antec DF35|Corsair HX620w|Intel i7 [email protected]|AC Freezer Xtreme|Asus P6T dlx|3x2gb Apacher 2000mhz|Gigabyte GTX660 OC 2GB|Crucial M4 128gb|Empire Ps-2120d|
DAW:|Corsair CX430|Phenom II x4 955BE @3.8ghz vdefault|CM Hyper412S|Asus M4A89GTD-Pro|4x2gb Corsair|Gainward HD4670 512MB|2x500gb Seagate|M-Audio Delta 1010lt|
maxxpower è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2012, 17:11   #12
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
E' una descrizione "sociologica" ma a noi ne servirebbe una più misurabile - in fondo dobbiamo farci un programma .

Prova ad immaginare il programma dal punto di vista delle attività, del "ciò che capita", quando l'utente interagisce con un oggetto. Diamo quindi per scontato che il meccanismo di interazione sia già definito.

il giocatore interagisce con un oggetto. Questo "evento", a chi è notificato? Che informazioni deve portarsi dietro per poter essere gestito? Come è gestito?

Esempio di un possibile ragionamento, una speculazione su come potrebbero andare le cose:

il programma rileva, in qualche modo, l'interazione dell'utente con l'oggetto X
l'interazione è notificata al "modulo di gestione delle interazioni" M.
M ricava X dalla notifica
Da X, M prende la lista di azioni possibili, le mostra all'utente e attende una risposta
Ricevuta la risposta R, M esegue l'azione R.A su X

Funzionerebbe? Diciamo che X è una Porta R è "Apri" e R.A corrisponde all'invocazione del metodo "apri" sull'oggetto Porta.

Ci sarebbe un intoppo, giusto? La porta ha bisogno di una chiave.

Generalizzando, le azioni che io posso dover eseguire su un oggetto X in base ad una risposta R (cioè alla scelta di un'azione A esebuigile sull'oggetto con cui interagisco) possono richiedere degli argomenti.

Da dove li piglio? Funzionerebbe se introducessimo una seconda fase dopo la scelta della risposta:

Da X, M prende la lista di azioni possibili, le mostra all'utente e attende una risposta
Ricevuta la risposta R, ottengo l'argomento P per l'esecuzione dell'azione R.A dall'applicazione di R.A.B all'inventario dell'utente ed eseguo R.A(P, X)

Funziona stavolta?

interazione -> porta
scegli azione -> Porta.AzioneApri
scegli argomento -> chiave = Porta.AzioneApri.argomento(inventario)
esegui azione -> Porta.AzioneApri.esegui(porta, chiave)

E' chiaro che qui all'interno di "esegui" troveremmo scritto qualcosa tipo:

porta.apri(chiave)

e non ci sarebbe la necessità di avere un metodo chiave.usa(porta) che dica poi... porta.apri(chiave), sarebbe una ripetizione.

In questa particolare configurazione, il metodo "usa" di chiave non serve. Ma questa configurazione è idonea a gestire il sistema di interazione tra elementi che serve al tuo programma?

Eh eh, bisogna vedere. Quali altri tipi di elementi che interagiscono tra loro avresti? Funzionerebbe il sistema anche con quelli?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet Ecovacs Deebot X12 OmniCyclone: lava grazie a Fo...
Narwal Flow 2: la pulizia di casa con un mocio a nastro Narwal Flow 2: la pulizia di casa con un mocio a...
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Claude Desktop e la modifica silenziosa ...
Blue Origin ha mostrato gli interni del ...
Linux alla pari di Windows in gioco: con...
Il rientro del secondo stadio del razzo ...
Il controller ufficiale Microsoft per Xb...
DJI Power 1000 Mini: la power station da...
IT Wallet sempre più aperto: in a...
Samsung pronta alla svolta: il Galaxy S2...
Segway Navimow i206 AWD, il robot taglia...
Zeekr 7GT debutta in Italia alla Milano ...
Ubisoft in difficoltà: Splinter C...
Tesla Cybertruck, numeri che fanno discu...
Intel Arc G3 Extreme: fino a 80W di pote...
SteelSeries Aerox 3 Wireless Gen 2 recen...
Tesla nel deserto senza batteria: il via...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:03.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v