Προς το περιεχόμενο

Ναυμαχια σε VB Form


derrendevil

Προτεινόμενες αναρτήσεις

Χρειαζομαι βοηθεια για μια εργασια σε VB form για το παιχνιδι της ναυμαχιας.Δεν μπορω να φτιαξω ενα καλο αλγοριθμο για την τοποθετηση των πλοιον σε εναν πινακα 10*10.Οποιος εχει καποια γνωμη καλοδεχουμενη.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 59
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσιευμένες Εικόνες

Το θέμα είχε συζητηθεί αναλυτικά (και με κώδικα σε άλλη γλώσσα όμως) εδώ, ρίξε μια ματιά.

 

Υ.Γ.

Μιας και εξ αφορμής του παραπάνω θέματος (το link του οποίου σου έδωσα) είπα να γράψω και εγώ μια ναυμαχία (αλλά σε C & WinAPI) από εκείνες που παίζεις όμως μόνος σου δίχως AI, για τα κομμάτια επέλεγα τυχαίες θέσεις αφού εξασφάλιζα ότι η κάθε θέση όπου θα ξεκινούσα να βάζω το πρώτο κομμάτι κάθε πλοίου (και με βάση την κατεύθυνση του -οριζόντια ή κάθετη) θα χωρούσε συνολικά όλα τα κομμάτια του δίχως να ξεφεύγει οποιοδήποτε από αυτά εκτός των διαστάσεων του πίνακα και ότι σε όλες τις κατευθύνσεις γύρο από κάθε κομμάτι του δεν θα έπρεπε να υπάρχει άλλο κομμάτι ξένου πλοίου (αυτούς τους κανόνες είχα βρει για αυτή την μορφή της ατομικής Ναυμαχίας σε κάποιο site όταν το κοίταξα)..

 

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το συγκεκριμενο παιχνιδι που θελω να φτιαξω ειναι σε Windows forms application,καθε κελι ειναι ενα button αυτο με προβλιματιζει ,το πως θα συνδιασω τις βολες με τα button και η τυχαια τοποθετηση των πλοιον ... :(

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Με VB .NET δεν ασχολούμαι, αλλά θα μπορούσες να ταυτίσεις την ομάδα των πλήκτρων σου με έναν πίνακα ισάριθμων διαστάσεων ώστε να απλοποιήσεις την διαχείριση του ζητήματος.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σε ότι αφορά την τοποθέτηση των πλοίων, για καθένα από αυτά χρειάζεσαι τουλάχιστον 4 πληροφορίες (πεδία):

  • τύπος πλοίου ( ship.id )
  • μήκος ( ship.len... σε κελιά )
  • κατεύθυνση (ship.dir... οριζόντια ή κάθετα )
  • θέση ( ship.pos ... σε ποιο κελί του πλέγματος είναι τοποθετημένο)

Θεωρώντας πως η θέση εκφράζει την αρχή του πλοίου, χρειάζεσαι μια συνάρτηση η οποία θα παίρνει σαν ορίσματα π.χ. το πλέγμα και το πλοίο, θα ελέγχει αν ο συγκεκριμένος τύπος πλοίου χωράει ή όχι (στη θέση και στην κατεύθυνση που περιέχει μέσα του) και θα επιστρέφει TRUE ή FALSE.

 

Π.χ...

 

>
boolean ship_fits_ongrid( ship, grid );

(το ship θα πρέπει ήδη να περιέχει σεταρισμένες τις πληροφορίες του, έτσι ώστε όταν περαστεί στη συνάρτηση να τις χρησιμοποιήσει για να κάνεις τους απαιτούμενους ελέγχους)

 

Καλό θα ήταν η συνάρτηση αυτή να ελέγχει όχι απλά αν χωράει το πλοίο στο πλέγμα αλλά και ότι δεν πέφτει πάνω σε άλλο, ήδη τοποθετημένο, πλοίο. Αυτό το τελευταίο επιτυγχάνεται, αν π.χ. στο κάθε κελί του πλέγματός σου κρατάς ένα πεδίο ( grid.shipId ) η τιμή του οποίου θα είναι το ship.id του πλοίου, μέρος του οποίου βρίσκεται σε αυτό το κελί (ή κάποια τιμή άκυρη ως shipId αν το κελί είναι κενό). Μπορείς να κρατάς κι άλλες πληροφορίες στη δομή του κελιού, αν π.χ. περιέχει νερό, ή/και αν είναι βομβαρδισμένο ή όχι.

 

Πρέπει να κάτσεις πρώτα με χαρτί και μολύβι να οργανώσεις το τι χρειάζεσαι και πως θα το υλοποιήσεις, και μετά να αρχίσεις να γράφεις κώδικα.

 

EDIT:

 

Μια συνάρτηση υψηλότερου επιπέδου θα μπορούσε να είναι κάποια σαν την παρακάτω...

 

>
boolean ship_put_ongrid_randomly( ship, grid );

η οποία θα δοκιμάζει να τοποθετήσει σε τυχαίες θέσεις του πλέγματος το ship, καλώντας την προηγούμενη συνάρτηση, θα ενημερώνει το σχετικό πεδίο του ship (ship.pos), θα ενημερώνει το σχετικό πεδίο του κελιού (grid.shipId = ship.id) και θα επιστρέφει TRUE αν το πλοίο τοποθετήθηκε επιτυχώς.

 

Σε περίπτωση που το πλοίο δεν τοποθετήθηκε επιτυχώς πουθενά, θα ενημερώνει το πεδίο ship.pos με τιμή "μη τοποθέτησης" και θα επιστρέφει FALSE... π.χ. αν το πλέγμα σου είναι 10x10 = 100 κελιά, τα μη τοποθετημένα πλοία μπορούν να έχουν την τιμή -1 στο πεδίο ship.pos.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Θα τα δοκιμασω να δω αν θα βγει κατι,αν και μου φαινεται καπως περιπλοκο αυτο το προγραμμα,ευχαριστω παντος για τη βοηθεια σας :)

 

Γιατί σου φαίνεται περίπλοκο; Βασικά δεν μας έχεις δώσει εκφώνηση ούτε μας έχεις πει πόσο καιρό σας έδωσε για αυτή την εργασία, Ούτε ξέρουμε σε τι επίπεδο βρίσκεστε, οπότε προτείνουμε πράγματα από τη δική μας εμπειρία.

 

Τώρα, η συσχέτιση των γραφικών κελιών με τα κελιά του εσωτερικού πλέγματος του παιχνιδιού, όπως σου είπε και ο φίλος DirectX είναι ο συνηθισμένος τρόπος διαχείρισης τέτοιων θεμάτων.

 

VB δεν ξέρω, Win32 έχω να πιάσω πάααρα πολύ καιρό, ενώ με .net έχω ελάχιστη εμπειρία, αλλά στη πλειοψηφία των GUI όταν ο χρήστης κάνει κλικ σε ένα γραφικό στοιχείο, το API σου επιστρέφει ένα συγκεκριμένο event. Ανάλογα με τον τύπο που έχεις ορίσει στο κάθε γραφικό σου στοιχείο, το event που προέρχεται από αυτό μπορεί να περιέχει και τις συντετατεγμένες στις οποίες έγινε το κλικ.

 

Αυτές οι συντεταγμένες μπορείς να είναι είτε εκφρασμένες ως απόλυτοι αριθμοί σε σχέση με την τρέχουσα ανάλυση της οθόνης, αλλά συνήθως είναι εκφρασμένες σε σχέση με τον γονέα του γραφικού στοιχείου (relative coordinates), ξεκινώντας από το 0,0 για την πάνω αριστερή γωνία.

 

Καλείσαι λοιπόν αυτές τις συντεταγμένες να τις μετατρέψεις σε κατάλληλο index-number, που θα εκφράζει τη θέση του συγκεκριμένου κελιού μέσα στο πλέγμα του παιχνιδιού. Υποθέτοντας λοιπόν πως το γραφικό σου στοιχείο δεν έχει padding, margin, κλπ (αν έχει θα πρέπει να τα αφαιρέσεις από τον υπολογισμό σου) και πως το κάθε κελί ως γραφικό στοιχείο το έχεις π.χ. σε διάσταση 30x30 pixels, και πως το πλέγμα σου είναι 10x10 κελιά, τότε ο τύπος που χρειάζεσαι είναι ο παρακάτω:

 

>
	row = event->x / 30;  col = event->y / 30;
	pos = col * 10 + row;

(όπου row, col προσωρινές μεταβλητές για τον υπολογισμό της γραμμής και της στήλης του κλικαρισμένου κελιού στο GUI, όπου event->x, event->y οι relative συντεταγμένες που σου επιστρέφει το event και όπου pos η θέση του κελιού στο παιχνιδι)

 

Το παραπάνω είναι από τον κώδικα της τρίλιζας που έχω ποστάρει εδώ (είναι σε C και GTK+2).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Περιγραφή

post-228997-0-91563300-1325774396_thumb.jpg

Η εφαρμογή που θα αναπτύξετε αποτελεί συνέχεια της 2ης Εργαστηριακής Άσκησης (παιχνίδι «ΝΑΥΜΑΧΙΑ»). Θα πρέπει να μετατρέψετε τη λύση που αναπτύξατε σε μη γραφικό περιβάλλον (δηλαδή μια λύση - εφαρμογή τύπου Console Application) σε μια λύση που θα εκμεταλλεύεται το γραφικό περιβάλλον & τα έτοιμα αντικείμενα που προσφέρει η γλώσσα προγραμματισμού γιαυτόν τον σκοπό, δηλαδή να αναπτύξετε την ίδια εφαρμογή ως μια εφαρμογή τύπου Windows Forms Application.

 

Μπορείτε να ακολουθήσετε το παρακάτω σενάριο:

Η εφαρμογή κατά την εκκίνηση θα εμφανίζει φόρμα όπως φαίνεται στην επόμενη εικόνα με 11x11=121 αντικείμενα τύπου Button. Τα αντικείμενα buttons μπορείτε να τα τοποθετήσετε σε πίνακα (βλ. τον πίνακα Game από την 2η εργαστηριακή άσκηση). Πως θα καταγράψετε ότι ένα αντικείμενo button κρύβει/παριστάνει πλοίο ή θάλασσα; Είναι ένα πρόβλημα στο οποίο θα πρέπει να δώσετε λύση. Όταν θα εμφανίζεται η παρακάτω φόρμα θα πρέπει ο αλγόριθμός σας να έχει τοποθετήσει όλα τα πλοία στις θέσεις τους:

 

Κάθε φορά που ο παίκτης-χρήστης κάνει «κλικ» σε ένα button θα πρέπει αυτό αφενός να απενεργοποιείται (ιδιότητα enabled), αφετέρου να σημειώνεται με κάποιον τρόπο και μάλιστα διαφορετικό αν το button παριστάνει θάλασσα ή πλοίο. Για παράδειγμα, μπορείτε να αλλάζετε το χρώμα υποβάθρου (ιδιότητα backcolor) και να εμφανίζεται με κόκκινο χρώμα αν υπάρχει πλοίο και με μπλέ χρώμα αν υπάρχει θάλασσα. Επίσης, στο παράθυρο της φόρμας μπορείτε να εμφανίζετε το «Σύνολο πόντων» καθώς και ο «Αριθμός προσπαθειών» που απομένουν. Δείτε τις επόμενες εικόνες:

 

Όταν ο χρήστης εξαντλήσει τον επιτρεπόμενο αριθμό προσπαθειών το πρόγραμμα φανερώνει τις θέσεις όλων των πλοίων και απενεργοποιεί τα buttons. Στην επόμενη εικόνα φαίνονται οι θέσεις των 5 πλοίων που είχαν τοποθετηθεί (2 πλοία που καλύπτουν 2-θέσεις, 2 πλοία που καλύπτουν 3-θέσεις και 1 πλοίο που καλύπτει 4-θέσεις). Ο χρήστης είχε δικαίωμα για 11 βολές και ευστόχησε στις 4 πετυχαίνοντας το πλοίο με αριθμό 5.

 

Για να μην κατασκευάζετε 121 αντικείμενα τύπου button με το χέρι σας δίνουμε μια Windows Forms Application (δείτε τον αντίστοιχο σύνδεσμο) η οποία κατά την εκκίνηση δημιουργεί με δυναμικό τρόπο τα αντικείμενα αυτά. Δεν είστε υποχρεωμένοι να κάνετε χρήση του συγκεκριμένου κώδικα, όμως, όσοι τον χρησιμοποιήσετε θα ωφεληθείτε σημαντικά στην επίλυση της άσκησης. Να κάνετε πολλές δοκιμές στον έτοιμο κώδικα πριν τον χρησιμοποιήσετε για να μπορέσετε να τον κατανοήσετε πλήρως.

 

Παραδοτέα

Η άσκηση θα παραδοθεί με ηλεκτρονικό τρόπο στις 11 Ιανουαρίου 2012 (δε θα δοθεί καμία παράταση) στέλνοντας με e-mail ΜΟΝΟ το/τα αρχείο/α κώδικα Form ή Module στον εργαστηριακό σας καθηγητή. Μπορείτε επίσης να συμπιέσετε (μορφή zip ή rar) και να αποστείλετε ολόκληρο τον φάκελο της εφαρμογής σας (για να μπορέσει να περάσει από τον mail server). Η άσκηση θα εξεταστεί και θα παρουσιαστεί στην τάξη στις 13 Ιανουαρίου 2012. Κάθε ομάδα θα έχει 10 λεπτά στη διάθεσή της να παρουσιάσει στην τάξη τη λύση που έδωσε και στη συνέχεια να δεχθεί ερωτήσεις.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ωραία, ισχύουν ατόφια όσα σου έχω γράψει μέχρι τώρα ;)

 

EDIT:

 

Μου ήρθε μια αναλαμπή από τα παλιά!

 

Αν το θυμάμαι σωστά (και) σε Win32 API έχεις τη δυνατότητα να ταξινομήσεις τα γραφικά στοιχεία μέσα στον γονέα τους. Κατά 99% ο κώδικας που γράφεις που σας έχει δώσει για τη φόρμα, δημιουργεί τα κουμπιά ταξινομημένα, χρησιμοποιώντας κάποιο loop με μετρητή που αυξάνεται κατά 1 για κάθε νέο στοιχείο που δημιουργεί. Πιθανότατα ο μετρητής αυτός θα ξεκινάει από 0, και επίσης πιθανότατα το ID του κάθε στοιχείου που δημιουργεί το βάζει ίσο με την τιμή του μετρητή.

 

Σε αυτή την περίπτωση τα πράγματα απλοποιούνται δραματικά, αφού πλέον το ID κάθε γραφικού κουμπιού βρίσκεται σε 1 προς 1 συσχέτιση με τις θέσεις του πλέγματος σου. Έτσι κι αλλιώς, αν επίσης δεν με προδίδει η μνήμη μου, σε Win32 API (υποθέτω συνεπώς και σε .net) τα button δεν επιστρέφουν συντεταγμένες του ποντικιού. Επιστρέφουν όμως το ID του κουμπιού (που έγινε triggered).

 

Οπότε "καθάρισες" από αυτό ;)

 

Τσέκαρε στην τεκμηρίωση του .net αν όντως επιστρέφει ID το κλικ πάνω σε κουμπί. Επίσης τσέκαρε αν το ID που επιστρέφεται από το 1ο κουμπί βρίκσεται σε αριθμητική συνέχεια με το ID του γονέα του (του table δηλαδή). Αν τα θυμάμαι σωστά, έτσι συμβαίνει.

 

Αν δηλαδή το table στη φόρμα έχει ID 34 το 1ο παιδί του (button) θα έχει 35, το 2ο 36, κλπ. Οπότε απλά αφαιρείς από το ID του επιστρεφόμενου κουμπιού το ID του γονέα-table και έχεις έτσι τη θέση του κλικαρισμένου κουμπιού στον πλέγμα του παιχνιδιού σου.

 

EDIT-2:

 

Άκυρο, δεν χρειάζεσαι καν το ID του γονέα. Από κάθε επιστρεφόμενο ID κουμπιού θα αφαιρείς το ID του 1ου κουμπιού (με την προϋπόθεση που είπαμε, πως είναι ταξινομημένα με IDs αυξανόμενα κατά 1 για το καθένα).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ευχαριστω για την πολυτιμη βοηθεια...θα τα δοκιμασω να δω αν θα πετυχω κατι :).

 

Ευχαριστω για την πολυτιμη βοηθεια...θα τα δοκιμασω να δω αν θα πετυχω κατι :).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Public Class Form1

'Ο Πίνακας Game υλοποιεί όλη τη λογική του παιχνιδιού της Ναυμαχίας

Dim Game(10, 10) As SByte

'Ο Πίνακας btnGame περιλαμβάνει τα αντικείμενα τύπου Button

'που "οπτικοποιούν" τον πίνακα Game του παιχνιδιού στη φόρμα

Dim btnGame(10, 10) As Button

Dim voles As Byte 'Ο αριθμός των βολών

Dim score, trials As Byte 'H 1η μεταβλητή κρατά το σκορ ενώ η 2η τις προσπάθειες

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

'Δημιουργεί τα 121 buttons της φόρμας με ΔΥΝΑΜΙΚΟ τρόπο

Dim i, j As Byte 'Δείκτες για τις θέσεις i,j του πίνακα

For i = 0 To 10

Call generateButton(i, 0) 'Δημιουργεί το 1o button κάθε γραμμής - btnGame(i,0)

For j = 1 To 10

Call generateButton(i, j) 'Δημιουργεί τα υπόλοιπα button κάθε γραμμής btnGame(i,j)

Next

Next

 

'Οι παρακάτω 3 μικρορυθμίσεις εξασφαλίζουν το σωστό πλάτος & ύψος της φόρμας

Me.Width = btnGame(0, 10).Left + btnGame(0, 10).Width + 8

Me.Height = btnGame(10, 0).Top + btnGame(10, 0).Height + 40

Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedSingle

'Τώρα τοποθετείστε τα πλοία σας στον πίνακα Game σύμφωνα με το δικό σας αλγόριθμο

End Sub

 

Private Sub generateButton(ByVal x As Byte, ByVal y As Byte)

'Δημιουργούμε ένα αντικείμενο τύπου button στη θέση btnGame(x, y) του πίνακα btnGame

btnGame(x, y) = New Button

'Δίνουμε (αυθαίρετα) πλάτος και ύψος 50 pixels

btnGame(x, y).Width = 50

btnGame(x, y).Height = 50

'Το TabIndex δίνει τη σειρά που θα έχει το button οταν θα πατάμε το tab

'Με αυτό τον τρόπο κρατάμε την y συντεταγμένη στο ίδιο το button

btnGame(x, y).TabIndex = y

'Αν πρόκειται για το 1ο button της 1ης γραμμής του δίνουμε απόσταση από Top=0

'Αν πρόκειται για το 1ο button άλλης γραμμής του δίνουμε Top

' όσο το Top του button που βρίσκεται από πάνω του + το ύψος του από πάνω του

'Από αριστερά η απόσταση φυσικά θα είναι 0

If y = 0 Then

If x = 0 Then btnGame(x, 0).Top = 0 Else btnGame(x, 0).Top = btnGame(x - 1, 0).Top + btnGame(x - 1, 0).Height

btnGame(x, 0).Left = 0

Else

'Τα υπόλοιπα buttons θα έχουν Left όσο και το διπλανό τους + το πλάτος του διπλανού τους

btnGame(x, y).Left = btnGame(x, y - 1).Left + btnGame(x, y - 1).Width

'θα απέχουν δε από την κορυφή (top) το ίδιο με το διπλανό τους

btnGame(x, y).Top = btnGame(x, y - 1).Top

End If

'Εδώ ζητάμε με τη μέθοδο Add της κλάσης Controls να δημιουργήσει το button btnGame(x, y)

Me.Controls.Add(btnGame(x, y))

'ΠΟΛΥ ΣΗΜΑΝΤΙΚΟ!! Εδώ ορίζουμε με ΔΥΝΑΜΙΚΟ ΤΡΟΠΟ τον χειριστή click για το νέο αυτό button

' που δημιουργήσαμε. Ορίζουμε τον "MyClickHandler" ως τέτοιο χειριστή.

' ΑΡΑ ολα τα btnGame(x, y) θα έχουν τον ίδιο χειριστή click με όνομα MyClickHandler

AddHandler btnGame(x, y).Click, AddressOf MyClickHandler

End Sub

 

Private Sub MyClickHandler(ByVal sender As System.Object, ByVal e As System.EventArgs)

'Είναι ο χειριστής του συμβάντος click όλων των buttons btnGame(i, j)

'Οταν κάνουμε click σε button το πρόγραμμα βρίσκει τις συντεταγμένες (i,j)

' για να ελέγξει την αντίστοιχη τιμή του πίνακα Game

For i = 0 To 10

For j = 0 To 10

If Game(i, j) = 2 Then

Beep()

sender.backcolor = Color.Red 'δείχνουμε με κόκκινο τις εύστοχες βολές

 

Else

sender.backcolor = Color.Blue

'δείχνουμε με Blue τις άστοχεολές

End If

Next

Next

 

End Sub

 

End Class

 

Ριξε μια ματια ,προσπαθησα εχτες αυτο που μου ειπες αλλα δεν μου εβγαινε ισως δεν το εχω καταλαβει εγω καλα...δεν ξερω.Δες το μια.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αυτό κάνω τώρα, αλλά δεν ξέρω VB... κοιτάω να βρω που και πως δημιουργεί τα κουμπιά για να δω αν τους βάζει ID (προς το παρόν δεν βλέπω να βάζει IDs, αλλά ίσως μπαίνουν αυτόματα).

 

Κάνε ένα κόπο, κάνε edit το κώδικα παραπάνω και βάλε τον μέσα σε [ code] κώδικας [/ code] (χωρίς κενά στις αγκύλες) για να μπορεί να διαβαστεί ανθρώπινα. Κάνε τον copy & paste από το vb/vbs αρχείο πριν βάλεις τα tags, για να διατηρηθεί και η στοίχισή του.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

>Public Class Form1
   'Ο Πίνακας Game υλοποιεί όλη τη λογική του παιχνιδιού της Ναυμαχίας
   Dim Game(10, 10) As SByte
   'Ο Πίνακας btnGame περιλαμβάνει τα αντικείμενα τύπου Button 
   'που "οπτικοποιούν" τον πίνακα Game του παιχνιδιού στη φόρμα
   Dim btnGame(10, 10) As Button
   Dim voles As Byte 'Ο αριθμός των βολών 
   Dim score, trials As Byte 'H 1η μεταβλητή κρατά το σκορ ενώ η 2η τις προσπάθειες
   Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
       'Δημιουργεί τα 121 buttons της φόρμας με ΔΥΝΑΜΙΚΟ τρόπο
       Dim i, j As Byte 'Δείκτες για τις θέσεις i,j του πίνακα
       For i = 0 To 10
           Call generateButton(i, 0) 'Δημιουργεί το 1o button κάθε γραμμής - btnGame(i,0)
           For j = 1 To 10
               Call generateButton(i, j) 'Δημιουργεί τα υπόλοιπα button κάθε γραμμής btnGame(i,j)
           Next
       Next

       'Οι παρακάτω 3 μικρορυθμίσεις εξασφαλίζουν το σωστό πλάτος & ύψος της φόρμας
       Me.Width = btnGame(0, 10).Left + btnGame(0, 10).Width + 8
       Me.Height = btnGame(10, 0).Top + btnGame(10, 0).Height + 40
       Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedSingle
       'Τώρα τοποθετείστε τα πλοία σας στον πίνακα Game σύμφωνα με το δικό σας αλγόριθμο
   End Sub

   Private Sub generateButton(ByVal x As Byte, ByVal y As Byte)
       'Δημιουργούμε ένα αντικείμενο τύπου button στη θέση btnGame(x, y) του πίνακα btnGame
       btnGame(x, y) = New Button
       'Δίνουμε (αυθαίρετα) πλάτος και ύψος 50 pixels
       btnGame(x, y).Width = 50
       btnGame(x, y).Height = 50
       'Το TabIndex δίνει τη σειρά που θα έχει το button οταν θα πατάμε το tab
       'Με αυτό τον τρόπο κρατάμε την y συντεταγμένη στο ίδιο το button
       btnGame(x, y).TabIndex = y
       'Αν πρόκειται για το 1ο button της 1ης γραμμής του δίνουμε απόσταση από Top=0
       'Αν πρόκειται για το 1ο button άλλης γραμμής του δίνουμε Top 
       ' όσο το Top του button που βρίσκεται από πάνω του + το ύψος του από πάνω του 
       'Από αριστερά η απόσταση φυσικά θα είναι 0
       If y = 0 Then
           If x = 0 Then btnGame(x, 0).Top = 0 Else btnGame(x, 0).Top = btnGame(x - 1, 0).Top + btnGame(x - 1, 0).Height
           btnGame(x, 0).Left = 0
       Else
           'Τα υπόλοιπα buttons θα έχουν Left όσο και το διπλανό τους + το πλάτος του διπλανού τους
           btnGame(x, y).Left = btnGame(x, y - 1).Left + btnGame(x, y - 1).Width
           'θα απέχουν δε από την κορυφή (top) το ίδιο με το διπλανό τους
           btnGame(x, y).Top = btnGame(x, y - 1).Top
       End If
       'Εδώ ζητάμε με τη μέθοδο Add της κλάσης Controls να δημιουργήσει το button btnGame(x, y)
       Me.Controls.Add(btnGame(x, y))
       'ΠΟΛΥ ΣΗΜΑΝΤΙΚΟ!! Εδώ ορίζουμε με ΔΥΝΑΜΙΚΟ ΤΡΟΠΟ τον χειριστή click για το νέο αυτό button
       ' που δημιουργήσαμε. Ορίζουμε τον "MyClickHandler" ως τέτοιο χειριστή.
       ' ΑΡΑ ολα τα btnGame(x, y) θα έχουν τον ίδιο χειριστή click με όνομα MyClickHandler
       AddHandler btnGame(x, y).Click, AddressOf MyClickHandler
   End Sub

   Private Sub MyClickHandler(ByVal sender As System.Object, ByVal e As System.EventArgs)
       'Είναι ο χειριστής του συμβάντος click όλων των buttons btnGame(i, j)
       'Οταν κάνουμε click σε button το πρόγραμμα βρίσκει τις συντεταγμένες (i,j)
       ' για να ελέγξει την αντίστοιχη τιμή του πίνακα Game
       For i = 0 To 10
           For j = 0 To 10
               If Game(i, j) = 2 Then
                   Beep()
                   sender.backcolor = Color.Red 'δείχνουμε με κόκκινο τις εύστοχες βολές

               Else
                   sender.backcolor = Color.Blue
                   'δείχνουμε με Blue τις άστοχεολές
               End If
           Next
       Next

   End Sub
   
End Class

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Από ότι διαβάζω στα σχόλια, παίζει με συντεταγμένες τελικά και μάλιστα σου έχει και τον κώδικα που χειρίζεται κλικ σε κουμπιά (MyClickHandler). Βέβαια δεν καταλαβαίνω πως τις μετατρέπει, προφανώς επειδή αφενός δεν ξέρω VB κι αφετέρου επειδή δεν έχω κοιτάξει διεξοδικά τον κώδικα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...