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

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


derrendevil

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

Αν το (x,y) θεωρηθεί η αρχή του πλοίου, δεν χρειάζονται έλεγχοι για πάνω ή για αριστερά, μόνο για δεξιά ή κάτω. Η συνάρτηση είναι ήδη ποσταρισμένη και δοκιμασμένη, στον κώδικα που έχω δώσει στο IdeOne.com παραπάνω (με μόνη λεπτομέρεια πως ο πίνακας είναι μονοδιάστατος για μεγαλύτερη ευκολία χειρισμού)...

 

 

 

>
Bool ship_fits_ongrid( Ship *ship, Cell grid[ NCELLS ] )
{
       int n, endpos = INVALID;

       if ( !ship || !grid || !VALID_ID(ship->id) || !VALID_DIR(ship->dir) || !VALID_POS(ship->pos) )
               return FALSE;

       if ( ship->dir == HORZ )
       {
               endpos = ship->pos + ship->len - 1;
               if ( ship->pos / NCOLS != endpos / NCOLS )      /* START & END not in same row*/
                       return FALSE;

               for (n = ship->pos; n <= endpos; n++ )
                       if ( grid[ n ].shipId != WATER )
                               return FALSE;
       }

       else if ( ship->dir == VERT )
       {
               endpos = ship->pos + (ship->len-1) * NCOLS;
               if ( endpos / NCOLS > NCOLS-1 ) 				/* END goes beyond last row */
                       return FALSE;

               for (n=ship->pos; n <= endpos; n += NCOLS)
                       if ( grid[ n ].shipId != WATER )
                               return FALSE;
       }

       return TRUE;
}

 

 

 

Και όλα μαζί (έλεγχος και τοποθέτηση) είναι συνολικά 3 συναρτήσεις...

 

 

 

>
/* -------------------------------------------
*
* -------------------------------------------
*/
Bool ship_fits_ongrid( Ship *ship, Cell grid[ NCELLS ] )
{
int n, endpos = INVALID;

if ( !ship || !grid || !VALID_ID(ship->id) || !VALID_DIR(ship->dir) || !VALID_POS(ship->pos) )
	return FALSE;

if ( ship->dir == HORZ )
{
	endpos = ship->pos + ship->len - 1;
	if ( ship->pos / NCOLS != endpos / NCOLS )	/* START & END not in same row*/
		return FALSE;

	for (n = ship->pos; n <= endpos; n++ )
		if ( grid[ n ].shipId != WATER )
			return FALSE;
}

else if ( ship->dir == VERT )
{
	endpos = ship->pos + (ship->len-1) * NCOLS;
	if ( endpos / NCOLS > NCOLS-1 )			/* END goes beyond last row */
		return FALSE;

	for (n=ship->pos; n <= endpos; n += NCOLS)
		if ( grid[ n ].shipId != WATER )
			return FALSE;
}

return TRUE;
}

/* -------------------------------------------
*
* -------------------------------------------
*/
Bool ship_put_ongrid( Ship *ship, Cell grid[ NCELLS ] )
{
int n, endpos = INVALID;

if ( !ship || !grid || !VALID_ID(ship->id) || !VALID_DIR(ship->dir) || !VALID_POS(ship->pos) )
	return FALSE;

if ( ship->dir == HORZ )
{
	endpos = ship->pos + ship->len - 1;
	for (n = ship->pos; n <= endpos; n++ )
		grid[ n ].shipId = ship->id;
}
else if ( ship->dir == VERT )
{
	endpos = ship->pos + (ship->len-1) * NCOLS;
	for (n=ship->pos; n <= endpos; n += NCOLS)
		grid[ n ].shipId = ship->id;
}
return TRUE;
}

/* -------------------------------------------
*
* -------------------------------------------
*/
Bool ship_put_ongrid_randomly( Ship *ship, Cell grid[ NCELLS ] )
{
if ( !ship || !VALID_ID(ship->id) || !grid )
	return FALSE;

do {
	ship->pos = rand() % NCELLS;
	ship->dir = rand() % NDIRS;
} while ( !ship_fits_ongrid( ship, grid ) );

ship_put_ongrid( ship, grid );
printf( "Ship %d was put at pos %d (%d,%d) with direction %d\n",
	ship->id, ship->pos, (ship->pos / NCOLS), (ship->pos % NCOLS), ship->dir );

return TRUE;
}

 

 

που μπορούν να γίνουν 2 αν ο κώδικας της: ship_put_ongrid() ενσωματωθεί στον κώδικα της: ship_put_ongrid_randomly()... απλά είναι πιο ευέλικτο για μελλοντικές λειτουργίες με ξεχωριστή την: ship_put_ongrid().. π.χ. αν χρειαστεί να (επανα) τοποθετήσεις ένα πλοίο σε ήδη γνωστή θέση.

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

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

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

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

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

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

και αυτό επειδή στην προηγούμενη άσκηση η συνάρτηση τοποθέτησης πλοίων ήταν λάθος

με αποτέλεσμα το λάθος να μεταφέρεται και στην τωρινή άσκηση.

 

 

μια λύση θα μπορούσε να είναι η εξής

=====================================

-τοποθετείς για ευκολία από το μεγαλύτερο στο μικρότερο πλοίο

 

Για κάθε πλοίο

------------------

1)επιλέγεις τυχαία ένα κελί(χ,y)

2)επιλέγεις τυχαία μία φορά τοποθέτησης π.χ. 1=πάνω 2=κατω 3=αριστερα 4=δεξια

3)ελέγχεις αν χωράει στο τυχαιο κελι(χ,y) Αν δεν χωράει πας στο βήμα 1)

4)ελέγχεις αν ο χωρος που καταλαμβάνει είναι ελευθερος Αν δεν είναι ελεύθερος πας στο βήμα 1)

5)τοποθετείς το πλοίο στον πίνακα

Επόμενο πλοίο μέχρι να τα βάλεις όλα.

 

 

μια συνάρτηση ελέγχου μόνο για κατευθυνση προς τα πάνω θα μπορούσε να είναι

π.χ.έτσι

 

>
   Private Function shipFits(ByVal x As Integer, ByVal y As Integer, ByVal mikos As Integer, ByVal direction As Integer) As Boolean
       'direction---->  1=πάνω  2=κατω  3=αριστερα  4=δεξια
       'x=γραμμή αρχής πλοίου y=στήλη αρχής πλοίου
       Dim i As Integer
       If direction = 1 Then
           If (y - mikos + 1) < 0 Then Return False ' εκτος πίνακα
           For i = y To (y - mikos + 1)
               If Game(x, i) <> 0 Then Return False 'αν βρει τετράγωνο που δεν είναι ελευθερο
           Next
           Return True
       End If
..................
   End Function

 

 

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

 

καλή συνέχεια.

 

 

Εχω αρκετο καφε ακομα :P

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

Αν το (x,y) θεωρηθεί η αρχή του πλοίου, δεν χρειάζονται έλεγχοι για πάνω ή για αριστερά, μόνο για δεξιά ή κάτω.

 

διαφωνώ

 

ένα πλοίο έχει 2 άκρα (αρχή και τέλος)

αν ξέρουμε την αρχή και την διευθυνση χ ή y χρειαζόμαστε και την φορά π.χ. πάνω ή κάτω

 

>   ......Α...Τ    ή  ..Τ...Α....
        ^                 ^
        |                 |
     θέση χ,y           θέση χ,y

 

Εχω αρκετο καφε ακομα :P

 

 

καφέ έχεις , λύση έχεις?

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

διαφωνώ

 

ένα πλοίο έχει 2 άκρα (αρχή και τέλος)

αν ξέρουμε την αρχή και την διευθυνση χ ή y χρειαζόμαστε και την φορά π.χ. πάνω ή κάτω

Προφανώς χρειάζεται, όχι όμως κατεύθυνση αλλά προσανατολισμός: HORIZONTAL ή VERTICAL. Εφόσον θεωρούμε το (x,y) αρχή του πλοίου αρκεί να τεσκάρουμε μόνο μια κατεύθυνση για κάθε προσανατολισμό: δεξιά για τον HORZ ή κάτω για τον VERT.

 

EDIT:

 

>   ......Α...Τ    ή  ..Τ...Α....
		^         		^
		|         		|
     θέση χ,y   		θέση χ,y

 

Το ξέχασα στην προηγούμενη απάντηση: στη ναυμαχία οι 2 περιπτώσεις που δείχνει το σχήμα σου φίλε virxen είναι ταυτόσημες. Οπότε είναι περιττοί οι 2 έξτρα έλεγχοι για αριστερά ή για πάνω ;)

 

ΥΓ. Θα ήταν διαφορετικές αν π.χ. τα χτυπήματα έδιναν διαφορετικούς βαθμούς για κάθε ξεχωριστό τμήμα του πλοίου (π.χ. περισσότερους βαθμούς για την πλώρη από ότι την πρύμνη).

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

διαφωνώ

 

ένα πλοίο έχει 2 άκρα (αρχή και τέλος)

αν ξέρουμε την αρχή και την διευθυνση χ ή y χρειαζόμαστε και την φορά π.χ. πάνω ή κάτω

 

>   ......Α...Τ    ή  ..Τ...Α....
        ^                 ^
        |                 |
     θέση χ,y           θέση χ,y

 

 

 

 

καφέ έχεις , λύση έχεις?

Χαχαχαχαχαχχαα....αν και δεν ειμαι αισιοδοξος καποια στιγμη θα βρεθει... :P

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

Προφανώς χρειάζεται, όχι όμως κατεύθυνση αλλά προσανατολισμός: HORIZONTAL ή VERTICAL. Εφόσον θεωρούμε το (x,y) αρχή του πλοίου αρκεί να τεσκάρουμε μόνο μια κατεύθυνση για κάθε προσανατολισμό: δεξιά για τον HORZ ή κάτω για τον VERT.

 

Το ξέχασα στην προηγούμενη απάντηση: στη ναυμαχία οι 2 περιπτώσεις που δείχνει το σχήμα σου φίλε virxen είναι ταυτόσημες. Οπότε είναι περιττοί οι 2 έξτρα έλεγχοι για αριστερά ή για πάνω ;)

 

ΥΓ. Θα ήταν διαφορετικές αν π.χ. τα χτυπήματα έδιναν διαφορετικούς βαθμούς για κάθε ξεχωριστό τμήμα του πλοίου (π.χ. περισσότερους βαθμούς για την πλώρη από ότι την πρύμνη).

 

το δεξιά και το κάτω είναι αυθαίρετα,γιατί δηλαδή να μην είναι αριστερά και πάνω?

δες το σχήμα που επισυνάπτω καλύτερα.

post-172311-0-95366400-1325966812_thumb.jpg

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

το δεξιά και το κάτω είναι αυθαίρετα,γιατί δηλαδή να μην είναι αριστερά και πάνω?

δες το σχήμα που επισυνάπτω καλύτερα.

 

Αυθαίρετο είναι, ναι... για να γλιτώσουμε 2 περιττούς ελέγχους. Στο αριστερό πλοίο του σχήματός σου απλά θεωρείς το T ως Α και καθαρίζεις

 

Ουσιαστικά δεν αφήνουμε ποτέ να δημιουργηθεί πλοίο σαν το αριστερό του σχήματός σου, γιατί δεν έχει κανένα νόημα στην Ναυμαχία και σέρνει μαζί του 2 τελείως περιττούς ελέγχους (που μεταφράζονται σε πολύ περισσότερους για κάθε κελί που πρέπει να ελεγχθεί).Το επιτρέπουμε στην ίδια ακριβώς θέση με αυτό αλλά με την αρχή Α στα αριστερά ;)

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

Αυθαίρετο είναι, ναι... για να γλιτώσουμε 2 περιττούς ελέγχους. Στο αριστερό πλοίο του σχήματός σου απλά θεωρείς το T ως Α και καθαρίζεις

 

Ουσιαστικά δεν αφήνουμε ποτέ να δημιουργηθεί πλοίο σαν το αριστερό του σχήματός σου, γιατί δεν έχει κανένα νόημα στην Ναυμαχία και σέρνει μαζί του 2 τελείως περιττούς ελέγχους (που μεταφράζονται σε πολύ περισσότερους για κάθε κελί που πρέπει να ελεγχθεί).Το επιτρέπουμε στην ίδια ακριβώς θέση με αυτό αλλά με την αρχή Α στα αριστερά ;)

 

τεσπα δεν πρόκειται να τα βρούμε στο συγκεκριμμένο οπότε ας το αφήσουμε εδώ.

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

Μα δεν υπάρχει κάτι για να βρούμε. Γιατί να κάνεις έξτρα ελέγχους όταν ακριβώς η ίδια λειτουργικότητα επιτυγχάνεται με τους μισούς (και άρα με τον μισό κώδικα).

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

[..]Βασικα κατα την ταπεινη μου αποψη, οι απο πανω το πανε λαθος. Το κανουν τοσο πολυπλοκο που ουτε οι ιδιοι δεν θα το ελυναν.[..]

Εγώ πάντως το λύνω με Button arrays & Tags δίχως ιδιαίτερη πολυπλοκότητα.. (διάθεση δεν έχω να το προχωρήσω περισσότερο όμως -υπόψη έχει bugακια μέσα αλλά είναι αρκετό ως proof of concept, διότι πρόσφατα έγραψα ένα ανάλογο πρόγραμμα σε C & WinAPI και έτσι δεν βρίσκω περαιτέρω ενδιαφέρον).

 

 

post-41640-0-27207600-1325969726_thumb.jpg

 

 

Βέβαια κάθε άποψη είναι σεβαστή, φίλε παπι.

 

Καλή συνέχεια!!

:)

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

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

για δοσμένη θέση(x,y) και δοσμένη κατεύθυνση(direction) και μεγέθος(mikos)

 

 

>
.......
CONST UP = 1, DOWN = 2, LEFT_SIDE = 3, RIGHT_SIDE = 4,ROWS=11,COLS = 11
...........
   Private Function shipFits(ByVal x As Integer, ByVal y As Integer, ByVal mikos As Integer, ByVal direction As Integer) As Boolean
       
       Dim i As Integer
       If direction = LEFT_SIDE Then
           If (y - mikos + 1) < 0 Then Return False ' εκτος πίνακα
           For i = (y - mikos + 1) To y
               If Game(x, i) <> NO_SHIP Then Return False 'αν βρει τετράγωνο που δεν είναι ελευθερο
           Next
           Return True
       End If
       If direction = RIGHT_SIDE Then
           If (y + mikos - 1) > COLS - 1 Then Return False ' εκτος πίνακα
           For i = y To (y + mikos - 1)
               If Game(x, i) <> NO_SHIP Then Return False 'αν βρει τετράγωνο που δεν είναι ελευθερο
           Next
           Return True
       End If
       If direction = UP Then
           If (x - mikos + 1) < 0 Then Return False ' εκτος πίνακα
           For i = (x - mikos + 1) To x
               If Game(i, y) <> NO_SHIP Then Return False 'αν βρει τετράγωνο που δεν είναι ελευθερο
           Next
           Return True
       End If
       If direction = DOWN Then
           If (x + mikos - 1) > ROWS - 1 Then Return False ' εκτος πίνακα
           For i = x To (x + mikos - 1)
               If Game(i, y) <> NO_SHIP Then Return False 'αν βρει τετράγωνο που δεν είναι ελευθερο
           Next
           Return True
       End If
       Return False
   End Function

 

 

 

καλή συνέχεια στο υπόλοιπο

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

Ρε φίλε, κάτι τέτοια πετάς συχνά-πυκνά που όχι μόνο είναι απρόκλητα μειωτικά, αλλά είναι και τόσο άσχετα που ειλικρινά απορώ αν διαβάζεις πρώτα τι έχουν γράψει αυτοί "οι από πάνω" πριν πετάξεις την εξυπνάδα σου!

 

What the fuck ? ? ? ? ? ? confused.png

 

 

 

Διαβασα τα παραπανω και ναι διαφωνω. Σε εβρισα; Σε υποτιμησα; Τι μειωνεκτηματα και πρασινα αλογα; Για ριξε μια ματι εδω. ( /sarcasm ναι υπαρχει και στα φορουμ/ )

 

Α πουσε. ΝΑΙ ΔΙΑΦΩΝΩ να περσεις 243423423498732984379582374958 events απο εναν handler -παντοτε μιλωντας για το ΠΑΡΟΝ θεμα-.

 

 

 

 

ΥΓ: στο ΥΓ σου. Ποιο internal array; Ποιο state; Αν δεν καταλαβαινεις κατι μην απαντας.

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

...

ΥΓ: στο ΥΓ σου. Ποιο internal array; Ποιο state; Αν δεν καταλαβαινεις κατι μην απαντας.

 

Αυτό το internal array που ζητάει η εκφώνηση κι εσύ το αγνοείς επιδεικτικά στην και καλά μη-πολύπλοκη λύση σου. Του λες να πολυμορφίσει και να υπερφορτώσει απλώς και μόνο γα τα κουμπιά (τη στιγμή που το παλικάρι δυσκολεύεται ακόμα και να διαβάσει κώδικα που δεν έχει γράψει ο ίδιος)... εκείνο το TiExei στον κωδικά σου προφανώς προκύπτει από παρθενογένεση!

 

ΥΓ. Σου είναι τόσο δύσκολο να δώσεις τη λύση που νομίζεις καλύτερη χωρίς μιειωτικές αναφορές στις λύσεις των υπόλοιπων συμμετεχόντων στη κουβέντα. Εσύ δηλαδή για να καταλάβω την έχεις δει ο "μαμάω του προγραμματισμού" κι οι υπόλοιποι και δεν καταλαβαίνουμε και πρέπει να κάνουμε και μόκο από πάνω;

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

....... ΝΑΙ ΔΙΑΦΩΝΩ να περσεις 243423423498732984379582374958 events απο εναν handler -παντοτε μιλωντας για το ΠΑΡΟΝ θεμα-.

 

διαφωνεις δεν διαφωνείς αυτός είναι ο κώδικας που τους έχει δώσει ο καθηγητής τους οπότε για το

παρόν θέμα απλά το δέχεσαι.

 

Υ.Γ. ο event handler αφορά μόνο τα 121 κουμπιά της φόρμας οπότε το νούμερο που δίνεις είναι λίγο υπερβολικό

δεν βρίσκεις?

 

φιλικά,

virxen

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

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

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

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

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

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

Σύνδεση

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

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

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