migf1 Δημοσ. 7 Ιανουαρίου 2012 Δημοσ. 7 Ιανουαρίου 2012 Αν το (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().. π.χ. αν χρειαστεί να (επανα) τοποθετήσεις ένα πλοίο σε ήδη γνωστή θέση.
derrendevil Δημοσ. 7 Ιανουαρίου 2012 Μέλος Δημοσ. 7 Ιανουαρίου 2012 το μόνο δύσκολο που έχει η άσκηση είναι η τοποθέτηση των πλοίων και αυτό επειδή στην προηγούμενη άσκηση η συνάρτηση τοποθέτησης πλοίων ήταν λάθος με αποτέλεσμα το λάθος να μεταφέρεται και στην τωρινή άσκηση. μια λύση θα μπορούσε να είναι η εξής ===================================== -τοποθετείς για ευκολία από το μεγαλύτερο στο μικρότερο πλοίο Για κάθε πλοίο ------------------ 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 συνέχισε την πιο πάνω συνάρτηση για όλες τις κατευθύνσεις και στείλε τον κώδικα σου εδώ για διορθώσεις καλή συνέχεια. Εχω αρκετο καφε ακομα
virxen75 Δημοσ. 7 Ιανουαρίου 2012 Δημοσ. 7 Ιανουαρίου 2012 Αν το (x,y) θεωρηθεί η αρχή του πλοίου, δεν χρειάζονται έλεγχοι για πάνω ή για αριστερά, μόνο για δεξιά ή κάτω. διαφωνώ ένα πλοίο έχει 2 άκρα (αρχή και τέλος) αν ξέρουμε την αρχή και την διευθυνση χ ή y χρειαζόμαστε και την φορά π.χ. πάνω ή κάτω > ......Α...Τ ή ..Τ...Α.... ^ ^ | | θέση χ,y θέση χ,y Εχω αρκετο καφε ακομα καφέ έχεις , λύση έχεις?
migf1 Δημοσ. 7 Ιανουαρίου 2012 Δημοσ. 7 Ιανουαρίου 2012 διαφωνώ ένα πλοίο έχει 2 άκρα (αρχή και τέλος) αν ξέρουμε την αρχή και την διευθυνση χ ή y χρειαζόμαστε και την φορά π.χ. πάνω ή κάτω Προφανώς χρειάζεται, όχι όμως κατεύθυνση αλλά προσανατολισμός: HORIZONTAL ή VERTICAL. Εφόσον θεωρούμε το (x,y) αρχή του πλοίου αρκεί να τεσκάρουμε μόνο μια κατεύθυνση για κάθε προσανατολισμό: δεξιά για τον HORZ ή κάτω για τον VERT. EDIT: > ......Α...Τ ή ..Τ...Α.... ^ ^ | | θέση χ,y θέση χ,y Το ξέχασα στην προηγούμενη απάντηση: στη ναυμαχία οι 2 περιπτώσεις που δείχνει το σχήμα σου φίλε virxen είναι ταυτόσημες. Οπότε είναι περιττοί οι 2 έξτρα έλεγχοι για αριστερά ή για πάνω ΥΓ. Θα ήταν διαφορετικές αν π.χ. τα χτυπήματα έδιναν διαφορετικούς βαθμούς για κάθε ξεχωριστό τμήμα του πλοίου (π.χ. περισσότερους βαθμούς για την πλώρη από ότι την πρύμνη).
derrendevil Δημοσ. 7 Ιανουαρίου 2012 Μέλος Δημοσ. 7 Ιανουαρίου 2012 διαφωνώ ένα πλοίο έχει 2 άκρα (αρχή και τέλος) αν ξέρουμε την αρχή και την διευθυνση χ ή y χρειαζόμαστε και την φορά π.χ. πάνω ή κάτω > ......Α...Τ ή ..Τ...Α.... ^ ^ | | θέση χ,y θέση χ,y καφέ έχεις , λύση έχεις? Χαχαχαχαχαχχαα....αν και δεν ειμαι αισιοδοξος καποια στιγμη θα βρεθει...
virxen75 Δημοσ. 7 Ιανουαρίου 2012 Δημοσ. 7 Ιανουαρίου 2012 Προφανώς χρειάζεται, όχι όμως κατεύθυνση αλλά προσανατολισμός: HORIZONTAL ή VERTICAL. Εφόσον θεωρούμε το (x,y) αρχή του πλοίου αρκεί να τεσκάρουμε μόνο μια κατεύθυνση για κάθε προσανατολισμό: δεξιά για τον HORZ ή κάτω για τον VERT. Το ξέχασα στην προηγούμενη απάντηση: στη ναυμαχία οι 2 περιπτώσεις που δείχνει το σχήμα σου φίλε virxen είναι ταυτόσημες. Οπότε είναι περιττοί οι 2 έξτρα έλεγχοι για αριστερά ή για πάνω ΥΓ. Θα ήταν διαφορετικές αν π.χ. τα χτυπήματα έδιναν διαφορετικούς βαθμούς για κάθε ξεχωριστό τμήμα του πλοίου (π.χ. περισσότερους βαθμούς για την πλώρη από ότι την πρύμνη). το δεξιά και το κάτω είναι αυθαίρετα,γιατί δηλαδή να μην είναι αριστερά και πάνω? δες το σχήμα που επισυνάπτω καλύτερα.
migf1 Δημοσ. 7 Ιανουαρίου 2012 Δημοσ. 7 Ιανουαρίου 2012 το δεξιά και το κάτω είναι αυθαίρετα,γιατί δηλαδή να μην είναι αριστερά και πάνω? δες το σχήμα που επισυνάπτω καλύτερα. Αυθαίρετο είναι, ναι... για να γλιτώσουμε 2 περιττούς ελέγχους. Στο αριστερό πλοίο του σχήματός σου απλά θεωρείς το T ως Α και καθαρίζεις Ουσιαστικά δεν αφήνουμε ποτέ να δημιουργηθεί πλοίο σαν το αριστερό του σχήματός σου, γιατί δεν έχει κανένα νόημα στην Ναυμαχία και σέρνει μαζί του 2 τελείως περιττούς ελέγχους (που μεταφράζονται σε πολύ περισσότερους για κάθε κελί που πρέπει να ελεγχθεί).Το επιτρέπουμε στην ίδια ακριβώς θέση με αυτό αλλά με την αρχή Α στα αριστερά
virxen75 Δημοσ. 7 Ιανουαρίου 2012 Δημοσ. 7 Ιανουαρίου 2012 Αυθαίρετο είναι, ναι... για να γλιτώσουμε 2 περιττούς ελέγχους. Στο αριστερό πλοίο του σχήματός σου απλά θεωρείς το T ως Α και καθαρίζεις Ουσιαστικά δεν αφήνουμε ποτέ να δημιουργηθεί πλοίο σαν το αριστερό του σχήματός σου, γιατί δεν έχει κανένα νόημα στην Ναυμαχία και σέρνει μαζί του 2 τελείως περιττούς ελέγχους (που μεταφράζονται σε πολύ περισσότερους για κάθε κελί που πρέπει να ελεγχθεί).Το επιτρέπουμε στην ίδια ακριβώς θέση με αυτό αλλά με την αρχή Α στα αριστερά τεσπα δεν πρόκειται να τα βρούμε στο συγκεκριμμένο οπότε ας το αφήσουμε εδώ.
migf1 Δημοσ. 7 Ιανουαρίου 2012 Δημοσ. 7 Ιανουαρίου 2012 Μα δεν υπάρχει κάτι για να βρούμε. Γιατί να κάνεις έξτρα ελέγχους όταν ακριβώς η ίδια λειτουργικότητα επιτυγχάνεται με τους μισούς (και άρα με τον μισό κώδικα).
Directx Δημοσ. 7 Ιανουαρίου 2012 Δημοσ. 7 Ιανουαρίου 2012 [..]Βασικα κατα την ταπεινη μου αποψη, οι απο πανω το πανε λαθος. Το κανουν τοσο πολυπλοκο που ουτε οι ιδιοι δεν θα το ελυναν.[..] Εγώ πάντως το λύνω με Button arrays & Tags δίχως ιδιαίτερη πολυπλοκότητα.. (διάθεση δεν έχω να το προχωρήσω περισσότερο όμως -υπόψη έχει bugακια μέσα αλλά είναι αρκετό ως proof of concept, διότι πρόσφατα έγραψα ένα ανάλογο πρόγραμμα σε C & WinAPI και έτσι δεν βρίσκω περαιτέρω ενδιαφέρον). Βέβαια κάθε άποψη είναι σεβαστή, φίλε παπι. Καλή συνέχεια!!
virxen75 Δημοσ. 7 Ιανουαρίου 2012 Δημοσ. 7 Ιανουαρίου 2012 εδώ είναι ο έλεγχος του αν χωράει ή όχι ένα πλοίο στον πίνακα μας για δοσμένη θέση(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 καλή συνέχεια στο υπόλοιπο
παπι Δημοσ. 8 Ιανουαρίου 2012 Δημοσ. 8 Ιανουαρίου 2012 Ρε φίλε, κάτι τέτοια πετάς συχνά-πυκνά που όχι μόνο είναι απρόκλητα μειωτικά, αλλά είναι και τόσο άσχετα που ειλικρινά απορώ αν διαβάζεις πρώτα τι έχουν γράψει αυτοί "οι από πάνω" πριν πετάξεις την εξυπνάδα σου! What the fuck ? ? ? ? ? ? Διαβασα τα παραπανω και ναι διαφωνω. Σε εβρισα; Σε υποτιμησα; Τι μειωνεκτηματα και πρασινα αλογα; Για ριξε μια ματι εδω. ( /sarcasm ναι υπαρχει και στα φορουμ/ ) Α πουσε. ΝΑΙ ΔΙΑΦΩΝΩ να περσεις 243423423498732984379582374958 events απο εναν handler -παντοτε μιλωντας για το ΠΑΡΟΝ θεμα-. ΥΓ: στο ΥΓ σου. Ποιο internal array; Ποιο state; Αν δεν καταλαβαινεις κατι μην απαντας.
migf1 Δημοσ. 8 Ιανουαρίου 2012 Δημοσ. 8 Ιανουαρίου 2012 ... ΥΓ: στο ΥΓ σου. Ποιο internal array; Ποιο state; Αν δεν καταλαβαινεις κατι μην απαντας. Αυτό το internal array που ζητάει η εκφώνηση κι εσύ το αγνοείς επιδεικτικά στην και καλά μη-πολύπλοκη λύση σου. Του λες να πολυμορφίσει και να υπερφορτώσει απλώς και μόνο γα τα κουμπιά (τη στιγμή που το παλικάρι δυσκολεύεται ακόμα και να διαβάσει κώδικα που δεν έχει γράψει ο ίδιος)... εκείνο το TiExei στον κωδικά σου προφανώς προκύπτει από παρθενογένεση! ΥΓ. Σου είναι τόσο δύσκολο να δώσεις τη λύση που νομίζεις καλύτερη χωρίς μιειωτικές αναφορές στις λύσεις των υπόλοιπων συμμετεχόντων στη κουβέντα. Εσύ δηλαδή για να καταλάβω την έχεις δει ο "μαμάω του προγραμματισμού" κι οι υπόλοιποι και δεν καταλαβαίνουμε και πρέπει να κάνουμε και μόκο από πάνω;
virxen75 Δημοσ. 8 Ιανουαρίου 2012 Δημοσ. 8 Ιανουαρίου 2012 ....... ΝΑΙ ΔΙΑΦΩΝΩ να περσεις 243423423498732984379582374958 events απο εναν handler -παντοτε μιλωντας για το ΠΑΡΟΝ θεμα-. διαφωνεις δεν διαφωνείς αυτός είναι ο κώδικας που τους έχει δώσει ο καθηγητής τους οπότε για το παρόν θέμα απλά το δέχεσαι. Υ.Γ. ο event handler αφορά μόνο τα 121 κουμπιά της φόρμας οπότε το νούμερο που δίνεις είναι λίγο υπερβολικό δεν βρίσκεις? φιλικά, virxen
geo1st487 Δημοσ. 10 Ιανουαρίου 2012 Δημοσ. 10 Ιανουαρίου 2012 Οταν γινει η ναυμαχια φτιαξε και μια monopoly οπως φαινεται στο παρακατω βιντεο http://www.youtube.com/watch?v=rmHMWvz97YI
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα