Class Gioco

java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--java.awt.Panel
                    |
                    +--java.applet.Applet
                          |
                          +--Gioco
All Implemented Interfaces:
javax.accessibility.Accessible, java.awt.image.ImageObserver, java.awt.MenuContainer, java.lang.Runnable, java.io.Serializable

public class Gioco
extends java.applet.Applet
implements java.lang.Runnable

A cura di Barbara Orsola.
Importiamo le classi che ci servono,non importiamo la classe java.lang.* in quanto e' sempre implicito!Quindi per String,Treatd non serve l'import.
Ho importato la classe @java.applet dove l'unica classe definita e' proprio Applet, quella da me utilizzata;questa e' una sottoclasse della classe Panel quindi le Applet sono contenitori anche loro!!!
Il Gioco oggetto genera la vita essenzialmente,un Gioco oggetto incapsula una griglia di celle(mondo),e cambia il suo stato nelle generazioni successive secondo le regole del gioco.
Ho elaborato una animazione per simulare l'evoluzione dei sistemi biologici. L'animazione procede come segue:

L'utente specifica:
_ la dimensione della scacchiera di gioco;
_ la posizione delle celle che `vivono' inizialmente:
_ cliccado sullo schermo per aggiungere o togliere celle;
_ scegliendo fra le configurazioni predefinite nell'apposito menu';
_ tramite il tasto "Random" che attiva la procedura di generazione casuale(in questo caso saranno generate 5 configurazioni autonome una per ogni griglia presente sullo schermo).

Si possono inoltrescegliere varie rappresentazioni,infatti l'utente tramite gli appositi pulsanti puo' decidere:
_il colore da attribuire alle celle in vita
_la velocita' di esecuzione(lenta,media,veloce);
_la configurazione del "bordo" del mondo;

Dopo aver scelto la configurazione voluta si puo' procedere in due modi:
_tramite il taso"Prossima" si possono visualizzare passo dopo passo le diverse situazioni evolutive;
_iniziare la simulazione(pulsante "Start") e in questo caso il computer aggiornera' la scacchiera creando e rimuovendo celle consecutivamente.


In entrambi i casi vengono rispettate le seguenti regole:
_ad ogni posizione vuota circondata esattamente da tre celle viene assegnata una cella (La nuova e `nasce')
_una posizione della scacchiera occupata da una cella conserva la cella solo se circondata esattamente da due altre celle. (Altrimenti la cella `muore' per 'solitudine' o per 'sovraffollamento'.)


In questa classe sono presenti due classi interne: una(SymAction) per gestire gli eventi sui bottoni,l'altra(SymItem) per gestire sempre gli eventi ma sui multychoice. La classe interna e' appunto definita in un'altra classe e si comporta propio come una classe normale pertanto si possono costruire oggetti ed invocare metodi l'unica differenza sta nel fatto che ai metodi della classe interna e' ocnsentito accedere alle variabili istanza private della classe esterna e se ne possono invocare i metodi.
Implementiamo l'interfaccia runnable per integrare il Thread nella classe principale. Lanciando tale classe(Gioco)si crea un oggetto che e' Runnable e il Thread dovra' essere lanciato esplicitamente tramite il comando .start(). Il metodo start() crea le risorse di sistema necessarie,'schedula' il Thread e chiama i metodi run del Thread.

Per maggiori spiegazioni sui Thread si puo' consultare il tutoriale Java al link: Per maggiori spiegazioni sui Thread si puo' consultare il tutoriale Java al link: C:\jdk1.3.1_02\Tutorial\essential\threads\definition.html.

See Also:
Runnable, CellSpace, Serialized Form

Nested Class Summary
 class Gioco.SymAction
          Questa classe provvede al monitoraggio delle azioni su bottoni e choice.
 class Gioco.SymItem
          Gli ItemEvent sono generati da componenti che implementano l'interfaccia ItemSelectable.
 
Field Summary
 java.awt.print.PageFormat f
          Serve per la formattazione della stampa
 java.net.URL theURL
          Serve per il link al Tutorial
 
Fields inherited from class java.awt.Component
BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
 
Fields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
 
Constructor Summary
Gioco()
           
 
Method Summary
 void drawShape(int shapeWidth, int shapeHeight, int[] shape)
          ..e se la configurazione e' troppo grande???.
 java.lang.String getAppletInfo()
          Alcune informazioni sull'Applet...
 java.lang.String[][] getParameterInfo()
          Diamo spiegazioni sui parametri principali dell'applet.
 void init()
          Inizializziamo l'applet.
 int leggiInt(java.lang.String msg)
          Provvede alla verifica dei dati immessi dall'utente.
 void run()
          Con questo metodo rendiamo il Thread runnable.
 void save()
          Quest metodo mi permette il salvataggio in formato .zip.
 void showGenerations()
          Mostriamo la numerazione delle configuazioni.
 void start2()
          Evitiamo la partenza immediata.
 void stop()
          Deprecated. gameThread.stop() e'sconsigliato interrompere un Thread tramite lo stop.
 
Methods inherited from class java.applet.Applet
destroy, getAccessibleContext, getAppletContext, getAudioClip, getAudioClip, getCodeBase, getDocumentBase, getImage, getImage, getLocale, getParameter, isActive, newAudioClip, play, play, resize, resize, setStub, showStatus, start
 
Methods inherited from class java.awt.Panel
addNotify
 
Methods inherited from class java.awt.Container
add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getInsets, getLayout, getListeners, getMaximumSize, getMinimumSize, getPreferredSize, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paint, paintComponents, paramString, preferredSize, print, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, removeNotify, setFocusCycleRoot, setFocusTraversalKeys, setFocusTraversalPolicy, setFont, setLayout, transferFocusBackward, transferFocusDownCycle, update, validate, validateTree
 
Methods inherited from class java.awt.Component
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, disable, disableEvents, dispatchEvent, enable, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphics, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocation, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMouseWheelListeners, getName, getParent, getPeer, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getToolkit, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, hide, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isOpaque, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, reshape, setBackground, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground, setIgnoreRepaint, setLocale, setLocation, setLocation, setName, setSize, setSize, setVisible, show, show, size, toString, transferFocus, transferFocusUpCycle
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

f

public java.awt.print.PageFormat f
Serve per la formattazione della stampa


theURL

public java.net.URL theURL
Serve per il link al Tutorial

Constructor Detail

Gioco

public Gioco()
Method Detail

init

public void init()
Inizializziamo l'applet. Questo e' il primo metodo chiamato dall'applet. In questo caso esegue nell'ordine i seguenti passi:
-Prima di tutto provvediamo al settaggio del colore dello sfondo tramite setBackground ed esiamo il parametro color
-Poi Acquisiamo i parametri relativi al mondo tramite getParameter
-Provvediamo poi a stabilire il collegamento al tutorial della Sun
-Creiamo a questo punto i componenti e li aggiungiamo al container:
-Posizioniamo gli Ascoltatori

Overrides:
init in class java.applet.Applet
Throws:
"MalformedURLException" - l'indirizzo URL e' sbagliato

start2

public void start2()
            throws java.lang.IllegalThreadStateException
Evitiamo la partenza immediata. Utilizziamo la classe @java.lang.thread creiamo un un nuovo Thread che puo' essere start() o stop():con start() il Thread diventa runnable infatto la Java Virutual Machime chiama automaticamente il metodo run().

java.lang.IllegalThreadStateException

stop

public void stop()
Deprecated. gameThread.stop() e'sconsigliato interrompere un Thread tramite lo stop.

Fermiamo l' applet. Determina il fermarsi dell'Applet ma viene utilizzato il metodo yeld() per far terminare gli altri thread in esecuzione

Overrides:
stop in class java.applet.Applet

run

public void run()
Con questo metodo rendiamo il Thread runnable. E' questo il metodo che rende il thread runnable.

Specified by:
run in interface java.lang.Runnable

getAppletInfo

public java.lang.String getAppletInfo()
Alcune informazioni sull'Applet... Definisce chi ha elaborato il progetto.

Overrides:
getAppletInfo in class java.applet.Applet

getParameterInfo

public java.lang.String[][] getParameterInfo()
Diamo spiegazioni sui parametri principali dell'applet. Vengono elencati i parametri dell'Applet.

Overrides:
getParameterInfo in class java.applet.Applet
Returns:
i parametri tipici dell'Applet

showGenerations

public void showGenerations()
Mostriamo la numerazione delle configuazioni. Con questo metodo abbiamo la posibilita' di visualizzare il numero di generazione attualmente in esecuzine.


drawShape

public void drawShape(int shapeWidth,
                      int shapeHeight,
                      int[] shape)
..e se la configurazione e' troppo grande???. Cosi' controlliamo di non andare fuori dal nostro mondo

Parameters:
shapeWidth - la larghezza della figura
shapeHeight - la lunghezza della figura
shape - la figura
Throws:
java.lang.IndexOutOfBoundsException - riscontra indicizzazione errata dell'array

leggiInt

public int leggiInt(java.lang.String msg)
Provvede alla verifica dei dati immessi dall'utente. Vogliamo rendere il programma piu' robusto monitorando il comportamento in presenza di eccezioni usando try..catch dove dopo try inseriamo l'istruzione che potrebbe generare eccezione.Le eccezioni vengono provate in ordine per cui bisogna ordinare le catch() in in modo che le eccezioni piu' generali siano alla fine altrimenti certe catch() diventano irragiungibili in quanto quelle piu' generali catturano tutto!! JOptionPane serve a costruire finestre:Il metodo showMessageDialog() e'un metodo statico che fa apparire la finestra!!

Parameters:
msg - il messaggio della finestra iterativa
Throws:
java.lang.NumberFormatException - L'applet aspettava un valore numerico che non ha avuto
IndexOutOfBoundException - errore nell'indice
java.lang.NullPointerException - un NullPointer significa che l'Applet sta cercando di manipolare qualcosa che dovrebbe esistere ma in realta' e' Null

save

public void save()
Quest metodo mi permette il salvataggio in formato .zip. Si generano comunque eccezioni in java.io.FilePermision dovute al fatto che una Applet.Se si aggiunge il comando acl.write=/tmp a ~/.hotjava/properties file, l'appletviewer sara' in grado di scrivere nella directory.Ma questo significa anche che,l' appletviewer sara' in grado di creare file nella directory /tmp y.Se invece si aggiunge la specifica del nome del file acl.write=/tmp/dirname/filename l'appletviewer sara' in grado di creare solo questo file specifico,e non altri file nella directory. Se pero' non si vuole che l'appletviewer permetta alle Applet di generare file nel nostro sistema non bisogna aggiungere le righe di comando sovra descritte a in ~/.hotjava/properties,




Questa la bacheca di Informatica Grafica, corso di laurea specialistica in Ing. Edile-architettura
by FdA
ultima modifica: 02/02/2005 11.30