Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - gioco battaglia navale
Forum - C# / VB.NET - gioco battaglia navale

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 19:04
Sabato, 14/12/2013
Vorrei provare a fare il gioco di battaglia navale con la windows form, però non so bene come fare.

Innanzi tutto vorrei chiedervi: nel gioco di battaglia navale, come potrei usare l'ereditarietà?

Creo la classe madre Nave, che poi si specializza in: Sottomarini, Incrociatori, Portaerei, ecc...; però non so quali attributi dare alla classe madre e alle classi derivate.

Come potrei fare?

Poi un altro dubbio che ho è:come faccio a creare la tabella dove ci andranno le immagini delle navi?


Grazie  mille in anticipo

PM Quote
Avatar
amreo (Normal User)
Pro


Messaggi: 93
Iscritto: 18/03/2013

Segnala al moderatore
Postato alle 21:29
Sabato, 14/12/2013
Puoi farlo usando GDI+ e i metodi draw/fill di Graphics.
all' inizio dichiari una variabile Graphics globale.
e esegui l'istruzione Form.Creategraphics()

poi ogni volta che lo schema di gioco viene aggiornato(spostamento,fuoco,caduta,...) ridisegni il form.

invece per le navi farei cosi

Classe Principale Nave

creerei metodi e proprietà overridable

come codice faccio questo esempio
fatto velocemente a mano
Codice sorgente - presumibilmente VB.NET

  1. Class MustInherits Navone
  2.        Overridable Property Lenght() As Int32 'Va bene anche byte, tanto il massimo è 5
  3.        Overridable Sub DrawMe(byref G as graphics)
  4.        End Sub
  5.        Overridable Property Direction() as Dir 'Dir è un enum con Verticale e Orrizontale
  6. 'Ecc
  7. End Class


PM Quote
Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 22:56
Sabato, 14/12/2013
Allora, due cose devo dirti:
1)io di quelle cose della grafica non le ho mai usate, e non so come funzionano :(
   per la grafica pensavo di fare una semplice del tipo: metto come oggetto ad esempio una listView(o una griglia di qualche tipo) e poi faccio comparire le X quando viene colpita una nave.

2)mi daresti più dettagli per l'ereditarietà? la classe madre è Nave, che ha come attributo nome e lunghezza; le classi derivate sono: Portaerei, Incrociatori, Torpediniere, Sommergibili; ma che attributo li do a tutte queste? Li lascio sempre nome e lunghezza come la classe madre?

PM Quote
Avatar
amreo (Normal User)
Pro


Messaggi: 93
Iscritto: 18/03/2013

Segnala al moderatore
Postato alle 11:27
Domenica, 15/12/2013
Non preoccuparti per GDI+, sono facili da usare e le trovi in System.Window.Form e System.Drawing.

ti faccio un codice d'  esempio per la nave madre

Codice sorgente - presumibilmente VB.NET

  1. ''' <summary>
  2. ''' La classe Madre Navone, può essere usato solo per eredità
  3. ''' </summary>
  4. ''' <remarks>MustInherits Obbliga il Programmatore a non usarlo come tipo di dato es</remarks>
  5. ''' Es: Dim Nav As new Navone  : SBAGLIATO, Non può essere usato come tipo di dato
  6. Public MustInherit Class Navone
  7.  
  8.     ''' <summary>
  9.     ''' Nome della nave
  10.     ''' </summary>
  11.     Public Overridable Property Nome() As String
  12.  
  13.     ''' <summary>
  14.     ''' Punto dove si trova la nave,corrisponde in alto a sinistra
  15.     ''' </summary>
  16.     Public Overridable Property Locazione() As Point
  17.  
  18.     ''' <summary>
  19.     ''' Immagine della nave verticale, grande 32 e 32*Lenght, verra disegnato questo se la direzione della nave è verticale
  20.     ''' </summary>
  21.     ''' <remarks>Se non vuoi usare immagini già preparate, puoi disegnare tranquillamente con fill e Draw</remarks>
  22.     Public Overridable Property DrawingBitmapVert() As Bitmap
  23.  
  24.     ''' <summary>
  25.     ''' Immagine della nave orrizontale, grande 32*Lenght e 32, verra disegnato questo se la direzione della nave è orrizontale
  26.     ''' </summary>
  27.     ''' <remarks>Se non vuoi usare immagini già preparate, puoi disegnare tranquillamente con fill e Draw</remarks>
  28.     Public Overridable Property DrawingBitmapOrr() As Bitmap
  29.  
  30.     ''' <summary>
  31.     ''' Questa è la lunghezza della nave
  32.     ''' </summary>
  33.     Public Overridable Property Lenght() As Byte
  34.  
  35.     ''' <summary>
  36.     ''' Direzione della nave, può essere Orrizontale o Verticale
  37.     ''' </summary>
  38.     Public Overridable Property Dir() As Direction
  39.  
  40.     ''' <summary>
  41.     ''' Disegna la nave su G,senza spaccature
  42.     ''' </summary>
  43.     ''' <remarks>Ho messo Overridable anche se non è necessario</remarks>
  44.     Public Overridable Sub DrawMe(ByRef G As Graphics)
  45.         'In base alla direzione disegna la nave
  46.         If Dir = Direction.Orrizontale Then
  47.             G.DrawImage(DrawingBitmapOrr, Locazione)
  48.         Else
  49.             G.DrawImage(DrawingBitmapVert, Locazione)
  50.         End If
  51.     End Sub
  52.  
  53.     ''' <summary>
  54.     ''' Disegna la nave su G,con spaccature
  55.     ''' </summary>
  56.     ''' <remarks>Ho messo Overridable anche se non è necessario</remarks>
  57.     Public Overridable Sub DrawMeWthSp(ByRef G As Graphics)
  58.         'In base alla direzione disegna la nave
  59.         If Dir = Direction.Orrizontale Then
  60.             G.DrawImage(DrawingBitmapOrr, Locazione.X * 32, Locazione.Y * 32)
  61.         Else
  62.             G.DrawImage(DrawingBitmapVert, Locazione.X * 32, Locazione.Y * 32)
  63.         End If
  64.         'Disegna le spaccature, Gira tutti gli elementi di _SP e disegna se sono spaccati
  65.         REM questa parte di codice è un po confusionale
  66.         For index As Byte = 0 To Lenght - 1 'Lenght meno 1 perchè gli array che contengono x elementi (es 3) vanno da 0 a x-1 (0;1;2), perciò non togliere -1 per evitare IndexOutException
  67.             If SpaccP(index) = True Then
  68.                 If Dir = Direction.Orrizontale Then
  69.                     'Disegna il segno che indica che la nave è spaccata, come la croce
  70.                     'Prima linea
  71.                     '*
  72.                     '  *
  73.                     '    *
  74.                     G.DrawLine(Pens.Red, (Locazione.X * 32 + index * 32), (Locazione.Y * 32), ((Locazione.X + 1) * 32 + index * 32), ((Locazione.Y + 1) * 32))
  75.  
  76.                     'Seconda linea
  77.                     '    *
  78.                     '  *
  79.                     '*    
  80.                     G.DrawLine(Pens.Red, ((Locazione.X + 1) * 32 + index * 32), (Locazione.Y * 32), ((Locazione.X) * 32 + index * 32), ((Locazione.Y + 1) * 32))
  81.                 ElseIf Dir = Direction.Orrizontale Then
  82.                     'Disegna il segno che indica che la nave è spaccata, come la croce
  83.                     'Prima linea
  84.                     '*
  85.                     '  *
  86.                     '    *
  87.                     G.DrawLine(Pens.Red, (Locazione.X * 32), (Locazione.Y * 32 + index * 32), ((Locazione.X + 1) * 32), ((Locazione.Y + 1) * 32 + index * 32))
  88.  
  89.                     'Seconda linea
  90.                     '    *
  91.                     '  *
  92.                     '*    
  93.                     G.DrawLine(Pens.Red, ((Locazione.X + 1) * 32), (Locazione.Y * 32 + index * 32), (Locazione.X * 32), ((Locazione.Y + 1) + index * 32))
  94.                 End If
  95.             End If
  96.         Next
  97.  
  98.     End Sub
  99.  
  100.     Private _SP(Lenght - 1) As Boolean
  101.     ''' <summary>
  102.     ''' Indica i punti spaccati
  103.     ''' </summary>
  104.     ''' <remarks>True se il punto dell' indice è spaccato</remarks>
  105.     Public Overridable Property SpaccP(Index As Byte) As Boolean
  106.         Get
  107.             Return _SP(Index)
  108.         End Get
  109.         Set(value As Boolean)
  110.             _SP(Index) = value
  111.         End Set
  112.     End Property
  113.  
  114.     ''' <summary>
  115.     ''' Crea una nuova nave
  116.     ''' </summary>
  117.     ''' <remarks>New non è overridable</remarks>
  118.     Public Sub New(X As Byte, y As Byte)
  119.         Me.Locazione = New Point(X, y)
  120.         EliminaSpaccature()
  121.     End Sub
  122.  
  123.     ''' <summary>
  124.     ''' Elimina le spaccature della nave
  125.     ''' </summary>
  126.     Public Overridable Sub EliminaSpaccature()
  127.         'elimina tutte le spaccature ridichiarando SP
  128.         ReDim _SP(Lenght - 1)
  129.     End Sub
  130.  
  131.     ''' <summary>
  132.     ''' Controlla se la nave è stata colpita, se si modifica SpaccP
  133.     ''' </summary>
  134.     Public Overridable Function CheckSpaccatura(ByVal P As Point) As Boolean
  135.         'Controlla se la nave è stata colpita
  136.         If Dir = Direction.Orrizontale Then
  137.             If P.Y = Locazione.Y Then
  138.                 If P.X >= Locazione.X And P.X <= Locazione.X + Lenght Then
  139.                     Dim Index As Byte = P.X - Locazione.X
  140.                     SpaccP(Index) = True
  141.                     Return True
  142.                 Else
  143.                     Return False
  144.                 End If
  145.             Else
  146.                 Return False
  147.             End If
  148.         Else 'Dir = verticale
  149.             If P.X = Locazione.X Then
  150.                 If P.Y >= Locazione.Y And P.Y <= Locazione.Y + Lenght Then
  151.                     Dim Index As Byte = P.Y - Locazione.Y
  152.                     SpaccP(Index) = True
  153.                     Return True
  154.                 Else
  155.                     Return False
  156.                 End If
  157.             Else 'Dir = verticale
  158.                 Return False
  159.             End If
  160.         End If
  161.  
  162.     End Function
  163.  
  164.  
  165. End Class
  166.  
  167. ''' <summary>
  168. ''' Elenco di possibili direzioni
  169. ''' </summary>
  170. Public Enum Direction
  171.     Orrizontale = 0
  172.     Verticale = 1
  173. End Enum




invece qui c'è un esempio di eredità qui

Codice sorgente - presumibilmente VB.NET

  1. ''' <summary>
  2. ''' Nave Es
  3. ''' </summary>
  4. Public Class Naves
  5.     Inherits Navone
  6.  
  7.     Public Overrides ReadOnly Property Nome As String
  8.         Get
  9.             Return "NAVES"
  10.         End Get
  11.     End Property
  12.     Public Overrides ReadOnly Property Lenght As Byte
  13.         Get
  14.             Return 5
  15.         End Get
  16.     End Property
  17.     Sub New(x As Byte, y As Byte)
  18.         MyBase.New(x, y)
  19.     End Sub
  20.  
  21.     Public Overrides Property DrawingBitmapOrr As System.Drawing.Bitmap
  22.         Get
  23.             'Immagine contenuta nei resources, per aggiungere basta che clicci MyProject-->Risorse-->AggiungiRisorsa-->Aggiungi File esistente
  24.             Return My.Resources.NavesO
  25.         End Get
  26.         Set(value As System.Drawing.Bitmap)
  27.             MyBase.DrawingBitmapOrr = value
  28.         End Set
  29.     End Property
  30.  
  31. End Class



Modifica i valori facendo a caso tuo

Per quanto riguardi le dichiarazioni delle navi fai una funzione simile a questa
Codice sorgente - presumibilmente VB.NET

  1. 'Liste di navi
  2.     Public NL As List(Of Navone)
  3.     Sub InitNL()
  4.         NL.Add(New Naves(10, 10))
  5.         NL.Add(New Incrociatore(4, 5))
  6.         'ecc
  7.         'puoi aggiungere alla lista qualsiasi oggetto che eredita da navone
  8.     End Sub




Per la grafica fai una funzione simile a questa
Codice sorgente - presumibilmente VB.NET

  1. 'Grafica
  2.     Public G As Graphics
  3.  
  4.     Sub Draw()
  5.         For y = 0 To 8 - 1 '8 è il numero di colonne e trasverse
  6.             For x = 0 To 8 - 1
  7.                 G.FillRectangle(Brushes.CornflowerBlue, x * 32, y * 32, 32, 32)
  8.                 G.DrawRectangle(Pens.Blue, x * 32, y * 32, 32, 32)
  9.             Next
  10.         Next
  11.         For Each N As Navone In NL
  12.             N.DrawMeWthSp(G)
  13.         Next
  14.     End Sub



e infine all'evento load del form aggiungi
Codice sorgente - presumibilmente VB.NET

  1. Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
  2.         InitNL()
  3.         G = panel1.createGraphics
  4.     End Sub




ti ho suggerito tutto, comunque l'ereditarietà è quando la classe figlia eredita tutti gli oggetti della classe madre e può aggiungere altro e sovrascrivere.


NB: puoi dichiarare una classe figlia anche usando la base della madre, cioè
Dim Nav As Navona = New Naviglia(5,6)

Però puoi usare solo gli oggetti presenti in Navona e non le funzioni aggiuntive di Naviglia, però gli Overrides si
Capit :D?



PM Quote
Avatar
tuttodiMC (Normal User)
Expert


Messaggi: 327
Iscritto: 29/10/2012

Segnala al moderatore
Postato alle 14:55
Domenica, 15/12/2013
Dice stai commettendo un errore. Se proprio vuoi utilizzare l'ereditarietà non puoi implementare Nave come una classe perché non esistono navi standard. Dovresti implementarla come interfaccia da cui poi erediteranno i singoli tipi di navi, che si adatteranno ai metodi e alle proprietà indicate nell'interfaccia. Inoltre secondo me ti conviene creare un progetto in cui siano presenti più classi madre con le relative classi derivate, in modo da evidenziare la classificazione.

PM Quote
Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 19:59
Domenica, 15/12/2013
Allora, devo dire una cosa importante:

Amreo, io ti ringrazio un miliardo di volte per tutto l'aiuto che mi stai dando, ma c'è un però: del codice che hai scritto ci sono varie cose che non capisco e che (sfortunatamente per me :(  ;) non ho tempo di imparare al volo.

Quindi io direi che abbandono il progetto battaglia navale, vista la difficoltà (o per lo meno è difficile per me :(  ;)

E vi chiederei se mi potreste aiutare a trovare un altra idea progetto: i requisiti minimi sono che sia possibile usare l'ereditarietà e il polimorfismo.

Ricordate però una cosa: io non sono un esperto :( quindi non mi proponete cose troppo complicate


Grazie mille ancora per l'aiuto a tutti quanti :)

PM Quote
Avatar
amreo (Normal User)
Pro


Messaggi: 93
Iscritto: 18/03/2013

Segnala al moderatore
Postato alle 14:37
Lunedì, 16/12/2013
a dire vero neanchio sono esperto, avrò circa la tua stessa eta.

devi perforza usare un progetto window form? o va bene anche libreria di classe

PM Quote
Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 16:58
Lunedì, 16/12/2013
Io preferire  fare un progetto usando le windows form (giusto per fare un pochino l'interfaccia grafica con dei semplici bottini e text box qua e la; non voglio fare la VERA grafica come per i video-giochi)
Però mi potrebbe andare bene anche fare un programma da riga di comando.


Mi era venuta in mente questa idea (anche un po banale): fare una specie di gestore aziendale, dove faccio inserire, modificare, eliminare un dipendente; e anche una specie di libro paga dove segnare entrate e uscite e cose varie. Così mi viene bene il fatto dell'ereditarietà: Persona -> Dipendente, Datore (o cose del genere).


Però c'è un piccolo dettaglio: io di ragioneria ne so poca sinceramente, e avrei quindi bisogno che mi diceste voi cosa ci andrebbe in un programma del genere (ad es. come fare i vari calcoli da ragioniere e i vari importi)

PM Quote
Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 18:44
Domenica, 29/12/2013
Secondo voi se volessi provare a fare il gioco del monopoli senza grafica, andrebbe bene?

O mi consigliate di farlo per forza con la grafica?


Sennò per caso vi viene in mente qualcosa da fare qualcos'altro?

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo