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

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


derrendevil

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

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

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

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

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

Εννοώ τις συντεταγμένες του κάθε κουμπιού. Από ότι καταλαβαίνω από τα σχόλια, το κάθε κουμπί κρατάει τη σειρά που κατέχει μέσα στον πίνακα στο: button.TabIndex.

 

Αυτό που δεν καταλαβαίνω είναι πως μετατρέπει το κλικ ενός κουμπιού στον btnGame σε index numbers του Game. Αυτή η δουλειά κανονικά γίνεται μέσα στον κώδικα της MyClickHandler, αλλά αδυνατώ να εντοπίσω στον κώδικα εάν και πως το κάνει. Αντίθετα βλέπω πως σε κάθε μεμονωμένο κλικ πάει και σκανάρει όλο τον πίνακα Game, θεωρώντας πως είναι ήδη ενημερωμένος ως προς τις τιμές που περιέχουν τα κελιά του, και καταλαβαίνω πως όσα κελιά του Game έχουν την τιμή 2 θεωρούνται βομβαρδισμένα και τα χρωματίζει κόκκινα, αλλιώς μπλε.

 

Να υποθέσω πως περιμένει από εσάς να γράψετε τα κομμάτια που λείπουν, ε; :)

 

Λοιπόν, αν το button.TabIndex λειτουργεί όντως ως ID, περιέχοντας δηλαδή τον αύξοντα αριθμό του κάθε κουμπιού σε μια συνεχόμενη, αυξητικά συνεχόμενη σειρά από κουμπιά (ξεκινώντας από το 0), τότε ο τύπος για να το μετατρέψεις σε i,,j είναι ο παρακάτω:

 

>
i = TabIndex / NCOLS
j = TabIndex % NCOLS

όπου NCOLS το πλήθος των στηλών στον πίνακά σου (11 για σένα σε αυτή την εργασία).

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

Δημοσ. (επεξεργασμένο)

Εννοώ τις συντεταγμένες του κάθε κουμπιού. Από ότι καταλαβαίνω από τα σχόλια, το κάθε κουμπί κρατάει τη σειρά που κατέχει μέσα στον πίνακα στο: button.TabIndex.

 

Αυτό που δεν καταλαβαίνω είναι πως μετατρέπει το κλικ ενός κουμπιού στον btnGame σε index numbers του Game. Αυτή η δουλειά κανονικά γίνεται μέσα στον κώδικα της MyClickHandler, αλλά αδυνατώ να εντοπίσω στον κώδικα εάν και πως το κάνει. Αντίθετα βλέπω πως σε κάθε μεμονωμένο κλικ πάει και σκανάρει όλο τον πίνακα Game, θεωρώντας πως είναι ήδη ενημερωμένος ως προς τις τιμές που περιέχουν τα κελιά του, και καταλαβαίνω πως όσα κελιά του Game έχουν την τιμή 2 θεωρούνται βομβαρδισμένα και τα χρωματίζει κόκκινα, αλλιώς μπλε.

 

Να υποθέσω πως περιμένει από εσάς να γράψετε τα κομμάτια που λείπουν, ε; :)

 

Λοιπόν, αν το button.TabIndex λειτουργεί όντως ως ID, περιέχοντας δηλαδή τον αύξοντα αριθμό του κάθε κουμπιού σε μια συνεχόμενη, αυξητικά συνεχόμενη σειρά από κουμπιά (ξεκινώντας από το 0), τότε ο τύπος για να το μετατρέψεις σε i,,j είναι ο παρακάτω:

 

>
i = TabIndex / NCOLS
j = TabIndex % NCOLS

όπου NCOLS το πλήθος των στηλών στον πίνακά σου (11 για σένα σε αυτή την εργασία).

 

το tabindex δεν δουλευει ως ID

δίνει την θέση του κάθε κουμπιού στην γραμμή που ανήκει (τιμές 0-10)

και όχι στον πίνακα συνολικά

 

αν θες να λειτουργήσει σαν index κάνε την πιο κάτω αλλαγή

 

EDIT(απλούστερα)

 

 

>
........
   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 = x * 11 + y  '<---------- αλλαγή 
..................

 

 

και τέλος η νέα συνάρτηση με βάση το tabindex γίνεται

>
   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
       Dim i, j As Integer
       i = Int(sender.TabIndex / 11)
       j = sender.TabIndex Mod 11
       If Game(i, j) = 2 Then
           Beep()
           sender.backcolor = Color.Red 'δείχνουμε με κόκκινο τις εύστοχες βολές
       Else
           sender.backcolor = Color.Blue
           'δείχνουμε με Blue τις άστοχεολές
       End If
       'Next
       'Next

   End Sub

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

Ωραίος :)

 

Πάντως παιδιά είμαι 99% σίγουρος πως σε Win32 API τα γραφικά στοιχεία έχουν ID, το οποίο το περνάς στη ρουτίνα δημιουργίας όταν δημιουργείς το στοιχείο δυναμικά (ή το ορίζεις αν φτιάχνεις τα γραφικά στοιχεία με resource editor). Αν όχι ID, τότε το λεγόμενο handle του εκάστοτε γραφικού στοιχείου (που βασικά από ότι θυμάμαι όλα είναι window-hanldes έτσι κι αλλιώς). Απλώς δεν θυμάμαι αν το ID και το handle είναι το ίδιο πράγμα ή όχι.

 

Κάποιος με φρέσκια εμπειρία σε Win32 Programming θα είναι πολύ πιο κατατοπιστικός από μένα. Τώρα το τι γίνεται μέσω του .net δεν ξέρω... στον κώδικα πάντως δεν είδα τίποτα από αυτά.

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

Ωραίος :)

 

Πάντως παιδιά είμαι 99% σίγουρος πως σε Win32 API τα γραφικά στοιχεία έχουν ID, το οποίο το περνάς στη ρουτίνα δημιουργίας όταν δημιουργείς το στοιχείο δυναμικά (ή το ορίζεις αν φτιάχνεις τα γραφικά στοιχεία με resource editor). Αν όχι ID, τότε το λεγόμενο handle του εκάστοτε γραφικού στοιχείου (που βασικά από ότι θυμάμαι όλα είναι window-hanldes έτσι κι αλλιώς). Απλώς δεν θυμάμαι αν το ID και το handle είναι το ίδιο πράγμα ή όχι.

 

Κάποιος με φρέσκια εμπειρία σε Win32 Programming θα είναι πολύ πιο κατατοπιστικός από μένα. Τώρα το τι γίνεται μέσω του .net δεν ξέρω... στον κώδικα πάντως δεν είδα τίποτα από αυτά.

 

 

>
   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
       Dim a As Button
       a = sender
       MsgBox(a.Handle)'  <-----------------------εδώ σου τυπώνει το handle
       Dim i, j As Integer
       i = Int(sender.TabIndex / 11)
       j = sender.TabIndex Mod 11
       If Game(i, j) = 2 Then
           Beep()
           sender.backcolor = Color.Red 'δείχνουμε με κόκκινο τις εύστοχες βολές
       Else
           sender.backcolor = Color.Blue
           'δείχνουμε με Blue τις άστοχεολές
       End If
       'Next
       'Next

   End Sub

 

με την πιο πάνω αλλαγή πατώντας σε ένα κουμπί σου δίνει το handle που αναφέρεις

αλλά είναι μία ιδιότητα readonly.

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

Λοιπόν, ως συνήθως "google is our firiend": http://msdn.microsof...v=vs.85%29.aspx

 

Το παραπάνω είναι η ρουτίνα δημιουργίας ενός παραθύρου (και τα buttons παράθυρα είναι)... το όρισμα HMENU είναι βασικά το ID που λέγαμε. Ακολουθεί κι ένα ακόμα παράδειγμα (τα enum στην αρχή είναι όλα ID γραφικών στοιχείων που χρησιμοποιούνται στη συνέχεια): http://www.cplusplus...m/windows/3933/

 

EDIT:

 

Μαζί γράφαμε φίλε hello virxen. Τελικά είναι άλλο το ID κι άλλο το handle... περνάς το ID στην ρουτίνα και σου επιστρέφει το handle :)

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

handler ειναι το hwnd του control, μεσου αυτου στελνουμε msg στο control

id ειναι το ονομα του control

Γενικα το συστημα στο winapi ειναι απλο. Εχεις μια συναρτηση που λαμβανει ολα τα events (winproc) και τα χωριζεις με βαση msg->id->notify1->notify2->..

 

Σε .net αυτα δεν υπαρχουν (τουλαχιστον δεν τα βλεπουμε), επισης ολα τα events εχουν την δικια τους συναρτηση. Το ρολο του id παιζει το property Name, το TabIndex ειναι αυτο που λεει (με ποια σειρα θα πηδας τα controls με το πατημα του tab)

 

Αν θελεις κατι παραπανω απο την κλαση button τοτε φτιαχνεις μια αλλη κλαση που θα εχει βαση το button και βαζεις οτι θλει η ψυχη σου.

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

Ωραία, οπότε τώρα πρέπει να είναι πιο ξεκαθαρισμένα τα πράγματα για τον ts.

 

Την κάνω από τη δουλειά για σπίτι, αλλά του έχω κι εγώ ένα... δωράκι: http://ideone.com/wNdre

 

Είναι ένα ολοκληρωμένο πρόγραμμα σε C (υπό την έννοια ότι τρέχει όπως είναι με ένα απλό compile) το οποίο παρουσιάζει με κώδικα αυτά που του έγραφα στην 1η σελίδα. Είναι πολύ πιο απλοποιημένος ο κώδικας συγκριτικά με την κανονική Ναυμαχία στο άλλο νήμα που τον έχουμε παραπέμψει, έτσι ώστε να μπορεί να βγάλει άκρη.

 

Ο κώδικας τοποθετεί τυχαία μια Ναυαρχίδα (μήκους 5 κελιών) κι ένα Αντιτορπιλικό (μήκους 4 κελιών) σε ένα grid 11x11, χωρίς φυσικά να επιτρέπει να πέσει το ένα πάνω στο άλλο. Δεν αφήνει όμως υποχρεωτικό κενό ανάμεσα στα 2 πλοία (μπορεί να πέσουν το ένα ακριβώς δίπλα στο άλλο)... για τέτοια μπορεί να δει τον κανονικό κώδικα (το εν λόγω βρίσκεται στο αρχείο: ship.c, και συγκεκριμένα στη συνάρτηση: shiptype_fits_at_gloc().

 

Το link παραπάνω παραπέμπει στον απλό κώδικα (έχω συμπεριλάβει αρκετά macros & constants στην αρχή, για βασικό error-checking, αλλά πιστεύω δεν προβληματίζουν στην ανάγνωση... ίσως διευκολύνουν κιόλας). Στο τέλος της σελίδας στο IdeOne φαίνεται ένα sample output του κώδικα.

 

Το grid είναι ΜΟΝΟΔΙΑΣΤΑΤΟΣ πίνακας, για να διευκολύνεται η παραγωγή τυχαίων θέσεων πάνω του (διευκολύνονται κι άλλα πράγματα) και όποτε χρειάζεται να γίνει μετατροπή μιας θέσης: pos σε row, col βγαίνει από τους τύπους:

 

>
 row = pos / NCOLS;
 col = pos % NCOLS;

Το ανάποδο μπορεί να επιτευχθεί με...

 

>
 pos = row * NCOLS + col;

 

ΥΓ. Αν ο C compiler σας δεν είναι C99 aware, απλά σβήστε τα: ".field=" στην αρχικοποίηση των πλοίων, στον ορισμό τους στην main... δηλαδή αφήστε σκέτες τις τιμές της αρχικοποίησης (τα άφησα για να είναι λιγάκι πιο ευανάγνωστος ο κώδικας σε όσους δεν είναι εξοικειωμένοι με τη C ).

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

Σε .NET μπορείς να διασυνδέσεις εσύ αν το επιθυμείς ένα κοντρολ (για παράδειγμα ένα Button) με οποιοδήποτε αντικείμενο ή τιμή μέσο του .Tag member.

 

Πχ:

>
button1.Tag = 1;
MessageBox.Show(button1.Tag.ToString());

Υπό συνθήκες αυτή η δυνατότητα είναι εξαιρετικά χρήσιμη, με ανάλογο τρόπο μπορείς να κάνεις το ίδιο και στην VCL (C++ Builder/Delphi) μέσο του ομώνυμου ->Tag member.

 

Πχ.

>
Button1->Tag = 1;
ShowMessage(Button1->Tag);

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

Δεν βγαζω ακρη γαμωτο :( ...ειναι τοσο δυσκολο οσο μου φαινεται?

 

Ποιο από όλα σου φαίνεται δύσκολο; Το GUI κομμάτι ή το εσωτερικό κομμάτι (ή και τα δυο :lol:);

 

ΥΓ. Αν δεν έχεις ασχοληθεί ξανά, όντως δεν είναι εύκολο. Σε γενικές γραμμές όμως δεν είναι δύσκολο.

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

:(

 

Ποιο από όλα σου φαίνεται δύσκολο; Το GUI κομμάτι ή το εσωτερικό κομμάτι (ή και τα δυο :lol:);

 

ΥΓ. Αν δεν έχεις ασχοληθεί ξανά, όντως δεν είναι εύκολο. Σε γενικές γραμμές όμως δεν είναι δύσκολο.

 

Για αυτο μου φαινεται δυσκολο ...δεν εχω ασχοληθει πολυ με προγραμματισμο...

 

Ποιο από όλα σου φαίνεται δύσκολο; Το GUI κομμάτι ή το εσωτερικό κομμάτι (ή και τα δυο :lol:);

 

ΥΓ. Αν δεν έχεις ασχοληθεί ξανά, όντως δεν είναι εύκολο. Σε γενικές γραμμές όμως δεν είναι δύσκολο.

 

Για αυτο μου φαινεται δυσκολο ...δεν εχω ασχοληθει πολυ με προγραμματισμο...

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

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

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

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

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

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

Σύνδεση

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

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

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