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

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

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

Καλησπέρα,

 

πωρώθηκα πρόσφατα με το 2048 και σκέφτηκα με τις λίγες γνώσεις C που έχω και συμπληρώντας τα δύσκολα (χρωματιστό κείμενο, διάβασμα arrow keys) με κώδικα που βρίσκω στο google να γράψω ένα απλό προγραμματάκι με το DevC++ που να παίζει σε κονσόλα εκτυπώνοντας κέιμενο.

 

Έχω γράψει σχεδόν όλο τον κώδικα. Αυτό που λέιπει είναι οι υπολογισμοί που κάνει το παιχνιδι σε κάθε μια από τις 4 κινήσεις (πάνω κατω αριστερά δεξιά) διαβάζοντας τα βελάκια. Για την ακρίβεια, ξεκίνησα γράφοντας τον κώδικα για το "πανω" και το πρόγραμμα δεν αντιδρά. Πατώντας τα άλλα τρια βελάκια που δεν κάνουν τίποτα προς το παρόν το προγραμμα προχωρά κανονικά και βάζει νέο αριθμό στον πίνακα.

 

Παραθέτω τον κώδικα εδώ: https://github.com/johnnytifosi/2048/blob/master/main.c

το επίμαχο σημείο είναι στις γραμμές 118-147, μπορεί όμως να πέφτει και σε infinite loop από την γεννήτρια τυχαίων αριθμών ψάχνοντας νέο άδειο κελί. επλίζω ότι ο σχολιασμός του κώδικα είναι επαρκής, έτσι κι αλλιώς είναι αρκετά σύντομος. Οποιαδήποτε βοήθεια είναι ευπρόσδεκτη.

 

edit: συγγνώμη για το διπλό θέμα. ας σβηστεί από τους mods

Επεξ/σία από johnny.tifosi
  • Απαντ. 272
  • Δημ.
  • Τελ. απάντηση

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

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

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

Δημοσ.

void print(int x) {
HANDLE hConsole;
    int k;
if (x==0) {
k=15;}
else if (x==2) {
k=112;}
else if (x==4) {
k=48;}
else if (x==8) {
k=32;}
else if (x==16) {
k=208;}
else if (x==32) {
k=192;}
else if (x==64) {
k=64;}
else {
k=224;}
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, k);
    if (x<10) {
     printf(" %d ",x);}
    else if (x<100) {
     printf(" %d ",x);}
    else if (x<1000) {
     printf(" %d ",x);}
    else {
     printf(" %d",x);}
    SetConsoleTextAttribute(hConsole, 7);
}
 

για κάποιο λογο ολα αυτα τα magic numbers μεσα στα if else μου φαινονται άσχημα. 

Δημοσ.
  Στις 19/6/2014 στις 1:11 ΜΜ, johnny.tifosi είπε

Καλησπέρα,

 

πωρώθηκα πρόσφατα με το 2048 και σκέφτηκα με τις λίγες γνώσεις C που έχω και συμπληρώντας τα δύσκολα (χρωματιστό κείμενο, διάβασμα arrow keys) με κώδικα που βρίσκω στο google να γράψω ένα απλό προγραμματάκι με το DevC++ που να παίζει σε κονσόλα εκτυπώνοντας κέιμενο.

 

Έχω γράψει σχεδόν όλο τον κώδικα. Αυτό που λέιπει είναι οι υπολογισμοί που κάνει το παιχνιδι σε κάθε μια από τις 4 κινήσεις (πάνω κατω αριστερά δεξιά) διαβάζοντας τα βελάκια. Για την ακρίβεια, ξεκίνησα γράφοντας τον κώδικα για το "πανω" και το πρόγραμμα δεν αντιδρά. Πατώντας τα άλλα τρια βελάκια που δεν κάνουν τίποτα προς το παρόν το προγραμμα προχωρά κανονικά και βάζει νέο αριθμό στον πίνακα.

 

Παραθέτω τον κώδικα εδώ: https://github.com/johnnytifosi/2048/blob/master/main.c

το επίμαχο σημείο είναι στις γραμμές 118-147, μπορεί όμως να πέφτει και σε infinite loop από την γεννήτρια τυχαίων αριθμών ψάχνοντας νέο άδειο κελί. επλίζω ότι ο σχολιασμός του κώδικα είναι επαρκής, έτσι κι αλλιώς είναι αρκετά σύντομος. Οποιαδήποτε βοήθεια είναι ευπρόσδεκτη.

 

edit: συγγνώμη για το διπλό θέμα. ας σβηστεί από τους mods

Το πρόβλημα φαίνεται να είναι πως δεν καθαρίζεις τον temp πριν από κάθε iteration στήλης. Με ένα memset(temp, 0, size * sizeof(int) ); δείχνει πως έστρωσε.

 

Πέρα από αυτό, μου βγήκαν λιγάκι τα μάτια για να διαβάσω τον κώδικά σου (έως πολύ :P). Και τα σχόλια δεν θα έλεγα ότι βοήθησαν ιδιαίτερα. Χρειάστηκε να καθαρογράψω αρκετό από την κώδικά σου μέχρι να βγάλω άκρη.

 

Anyway, αφού έβγαλα άκρη τελικά, ψιλο-πορώθηκα και το συνέχισα λιγάκι.

 

Κώδικας: 2048.c

 

  Εμφάνιση κρυμμένου περιεχομένου

 

Τα getch() και cls() τα χρησιμοποιώ από ένα πρόχειρο 2ο αρχείο που το λέω my.c, και τα πήρα σχεδόν copy & paste από ένα cross-platform console user interface που είχα φτιάξει παλαιότερα σε C++ (δεν το έχω ολοκληρώσει)...

 

Κώδικας: my.h

 

  Εμφάνιση κρυμμένου περιεχομένου

 

Κώδικας: my.c

 

  Εμφάνιση κρυμμένου περιεχομένου

 

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

 

Τέλος, για να κάνεις και το τελευταίο κομμάτι που έχει μείνει (δηλαδή τα χρώματα) cross-platform, μπορείς αν θέλεις να χρησιμοποιήσεις ένα απλό στη χρήση σχετικό user-interface, που είχα φτιάξει αποκλειστικά στον προεπεξεργαστή της C.

 

Μπορείς να βρεις εδώ την έκδοση 1.03, αλλά είχα κάνει και έκδοση 1.04(h2)-alpha που δεν την κυκλοφόρησα (το λινκ σε πάει στην online τεκμηρίωσή της, αλλά αν τη θέλεις πες μου να σου την στείλω με p.m.)

 

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

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

Ευχαριστώ για τις απαντήσεις.

1. Τα μαγικά νούμερα είναι από τα λίγα πράγματα που είναι σίγουρα σωστά. Είναι απλοί κωδικοί για χρώματα.

 

2. Όντως το κύριο πρόβλημα ήταν ότι ξέχασα να αρχικοποιήσω τον temp με μηδενικά και η συναρτηση insert επεφτε σε infinite loop. διόρθωσα και λίγα πράγματα στην λογική ακόμη και τα ξαναανέβασα στο αρχικό λινκ του github. Βεβαια το παιχνίδι ακόμη δεν δουλεύει σωστά (βάζει πάνω από έναν νέους αριθμούς σε κάποιους γύρους, δέχεται άκυρες κινήσεις κλπ) αλλά δείχνει κάποιες σωστές αντιδράσεις. όταν βρω χρόνο θα διαβάσω τον κώδικά σου migf1.Τα χρώματα είχα διαβάσει ότι ισχύουν μόνο για windows, θα διαβάσω αυτά που μου έστειλες αν και δεν με πολυενδιαφέρει πολύ το cross-platform του θέματος. Το πολύ πολύ αν ένας φίλος μου έχει όρεξη μπορεί να του το δώσω να το δουλέψει σε android.

 

edit: νομίζω ότι έχω διορθώσει πλέον όλα τα bugs. ορίστε και μια έτοιμη έκδοση για άμεσο κάψιμο!

2048.zipFetching info...

Επεξ/σία από johnny.tifosi
  • Like 4
Δημοσ.

Ωραίο, δειχνει να δουλευει σωστα. Μια απορία εχω - πως γινεται το .exe που δινεις να ειναι 400ΚΒ, ενώ αυτο που εκανα εγω compile με το gcc να ειναι 90ΚΒ;

Δημοσ.
  Στις 20/6/2014 στις 2:14 ΜΜ, bnvdarklord είπε

Ωραίο, δειχνει να δουλευει σωστα. Μια απορία εχω - πως γινεται το .exe που δινεις να ειναι 400ΚΒ, ενώ αυτο που εκανα εγω compile με το gcc να ειναι 90ΚΒ;

Δεν έχω ιδέα :)

Δημοσ.
  Στις 20/6/2014 στις 2:14 ΜΜ, bnvdarklord είπε

Ωραίο, δειχνει να δουλευει σωστα. Μια απορία εχω - πως γινεται το .exe που δινεις να ειναι 400ΚΒ, ενώ αυτο που εκανα εγω compile με το gcc να ειναι 90ΚΒ;

 

Διαφορετικα compile parameters? Πιθανη εκδοχη..Πχ σε ιδιο προγραμμα gcc μπλα μπλα με gcc -std=c99 αλλαζει τα πραγματα

Δημοσ.
  Στις 20/6/2014 στις 2:32 ΜΜ, Anubis13 είπε

Διαφορετικα compile parameters? Πιθανη εκδοχη..Πχ σε ιδιο προγραμμα gcc μπλα μπλα με gcc -std=c99 αλλαζει τα πραγματα

Επίσης οι πολλές βελτιστοποιήσεις compilers αυξάνουν το μέγεθος κατά πολύ.

Δημοσ.
  Στις 20/6/2014 στις 2:32 ΜΜ, Anubis13 είπε

Διαφορετικα compile parameters? Πιθανη εκδοχη..Πχ σε ιδιο προγραμμα gcc μπλα μπλα με gcc -std=c99 αλλαζει τα πραγματα

Τόσο μεγάλη διαφορά όμως; Με c99 δεν κανει compile, και με -O1 ή -Ο2 το μεγεθος αλλάζει ελάχιστα.

 

Μπορει να έχει σχέση η έκδοση του gcc; Εγω έχω την 4.8.1.

Δημοσ.

@tifosi: Ωραίος. Αν ευκαιρήσω αργότερα, θα δω μήπως το ντύσω με x-platform χρώματα και του βάλω να κρατάει και best-score.

 

@bnvdarklord: Δοκίμασε να βάλεις -s flag στον gcc (κάνει strip τα symbols από το εκτελέσιμο). Επιπρόσθετα, μπορείς να δοκιμάσεις και -Os flag (optimize for size).

  • Like 2
Δημοσ.

Λοιπόν, κάτι έκανα. Μου βγήκε λίγο μεγάλο βέβαια, αλλά δεν βαριέσαι...

 

post-38307-0-77910000-1403493165_thumb.png

 

Download: 2048.zip (κώδικας και 32μπιτο εκτελέσιμο Windows).

 

Για όσους ασχοληθούν, ο κώδικας αποτελείται από τα εξής αρχεία:

main.c      (the main program)
tui.c/tui.h (text-user-interface of the game)
con_color.h (my preprocessor interface for console colored output)
my.c/my.h   (primitive x-platform console/terminal utility funcs)
common.h    (defs & types common to the prog and its text ui)
Το main.c περιέχει το κυρίως πρόγραμμα, το tui.c περιέχει ότι σχετίζεται με το text-user-interface, και το common.h περιέχει κοινούς τους τύπους & σταθερές.

 

Το my.c είναι μια λίγο πιο εμπλουτισμένη έκδοση από αυτήν που είχα δώσει σε προηγούμενο πόστ, για τη διαχείριση του κέρσορα, κλπ στην κονσόλα, και είναι πλήρως αυτόνομο. Θεωρητικά είναι cross-platform, αλλά το δοκίμασα μονάχα σε Windows (αν έχετε πρόβλημα σε *nix, πείτε μου και θα δω τι μπορώ να κάνω).

 

Το con_color.h (και το συνοδευτικό con_color_private.h) είναι επίσης αυτόνομο, και ασχολείται με τα χρώματα της κονσόλας/τερματικού. Αυτό είναι δοκιμασμένα cross-platform (btw είναι καινούρια έκδοση, που δεν την έχω στο site μου).

 

Πάνω σε αυτά τα δυο "πατάει" το tui.c, με σκοπό να τα κρύψει από το main.c.

 

Για να κάνετε compile τον κώδικα, θέλετε C99. Βάλτε όλα αρχεία σε έναν φάκελο και με gcc δώστε:

gcc -std=c99 -O2 -s my.c tui.c main.c
Για άλλους compilers, φτιάξτε ένα project, προσθέστε του τα παραπάνω αρχεία και ενεργοποιήστε την C99 υποστήριξη.

 

Ο κώδικας έχει παρά πολλά σχόλια, αλλά δεν είμαι 100% σίγουρος πως δεν περιέχει bugs. Τον έγραψα εν μέσω αγώνων μουντιάλ, οπότε δείξτε επιείκεια :lol: Αλγοριθμικά δεν ασχολήθηκα, πέρα από το να δομήσω τον αλγόριθμο του φίλου tifosi σε μικρότερες συναρτήσεις και να τις προσαρμόσω στον δικό μου κώδικα (τώρα, αν έχω κάνει καμιά πατάτα, θα δείξει).

 

Btw, ο κώδικας είναι τελείως free... κάντε τον ότι νομίζετε (εκτός από το να τον παρουσιάσετε σαν δικό σας :P). Αν βρείτε τίποτα bugs, σφυρίξτε τα εδώ στο νήμα να τα δούμε.

 

Have fun & keep in touch :P

 

 

  Εμφάνιση κρυμμένου περιεχομένου

 

  • Like 5
Δημοσ.

Ο καλά εισαι.... Αλγερια χθές και μετα Πορτογαλία... αν και Πορτογαλια με πηρε ο ύπνος ειδα μονο 1 ημιχρονο. Στο στοιχημα πιάνω το Χ της Ελλάδας το οβερ της Κολομβιας και χάνω την Αγγλία :o 

 

Χθες δεν έπαιξα καν πολυ επικινδυνα παιχνιδια.

Δημοσ.
  Στις 22/6/2014 στις 12:04 ΜΜ, migf1 είπε

@bnvdarklord: Δοκίμασε να βάλεις -s flag στον gcc (κάνει strip τα symbols από το εκτελέσιμο). Επιπρόσθετα, μπορείς να δοκιμάσεις και -Os flag (optimize for size).

Κάτι αλλο θα "φταίει", γιατι με το -s μειώνεται ακόμα περισσότερο στα 20KB. Χρήσιμο flag, αν και φαντάζομαι θα έχει καποια drawbacks.

Δημοσ.
  Στις 23/6/2014 στις 11:14 ΠΜ, bnvdarklord είπε

Κάτι αλλο θα "φταίει", γιατι με το -s μειώνεται ακόμα περισσότερο στα 20KB. Χρήσιμο flag, αν και φαντάζομαι θα έχει καποια drawbacks.

Αυτό δεν ήταν το ζητούμενο; Να μειωθεί δηλαδή το μέγεθος του εκτελέσιμου, ή κατάλαβα λάθος;

Δημοσ.
  Στις 23/6/2014 στις 12:01 ΜΜ, migf1 είπε

Αυτό δεν ήταν το ζητούμενο; Να μειωθεί δηλαδή το μέγεθος του εκτελέσιμου, ή κατάλαβα λάθος;

Αυτο που αναρωτήθηκα ειναι πως γινεται το εκτελέσιμο του OP να ειναι 400KB, ενω το δικο μου, με οτι flag δοκιμασα να ειναι παντα λιγοτερο απο 100ΚΒ. Μπορεί άλλος compiler να παράγει τοσο μεγαλύτερο exe;

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

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

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

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

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

Σύνδεση

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

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

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