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

Παιχνίδι 2048 σε C


johnny.tifosi

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

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

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

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

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

Δηλαδή αν π.χ. βάλεις -g3 flag δεν σου ανεβάζει δραματικά το μέγεθος του εκτελέσιμου;

Επιτέλους :P ειχα δοκιμάσει το σκέτο -g που δεν αυξησε ιδιαίτερα το μέγεθος, δεν ήξερα όμως άλλα debug flags.

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

Επιτέλους :P ειχα δοκιμάσει το σκέτο -g που δεν αυξησε ιδιαίτερα το μέγεθος, δεν ήξερα όμως άλλα debug flags.

Βασικά σε Windows, ο mingw32 4.8.1 και χωρίς κανένα flag, μεγάλο εκτελέσιμο βγάζει. Ο mingw64-w32 4.8.3 χωρίς κανένα flag βγάζει πολύ μικρότερο εκτελέσιμο.

 

Τελικά δοκίμασε κανείς το game σε Linux/Unix/Mac να μου πει αν έχει κάνα πρόβλημα; Σκέφτομαι να του προσθέσω 2-3 πραγματάκια ακόμα.

 

Π.χ. board διάφορων μεγεθών. Κκαι τώρα αν πειράξετε τα 3 defines στο common.h μπορείτε να του αλλάξετε μέγεθος... π.χ. μπορείτε να βάλετε GRID_DIM 5 και να μικρύνεται τα TILE_W και TILE_H (για να μην πέφτει ο πίνακας πάνω στις οδηγίες. Αλλά για να γίνεται on-the-fly πρέπει το board να αλλάξει από στατικός 2δ πίνακας που είναι τώρα σε δυναμικό.

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

Τελικά δοκίμασε κανείς το game σε Linux/Unix/Mac να μου πει αν έχει κάνα πρόβλημα; Σκέφτομαι να του προσθέσω 2-3 πραγματάκια ακόμα.

Δεν το έψαξα καθόλου, μπορεί να χρειάζεται καμιά βιβλιοθήκη.

 

Πάντως σε fedora 20 x64 με gcc 4.8.2 έβγαλε 2-3 errors.

 

post-205103-0-02803800-1403556343_thumb.png

 

Αντίθετα με calng έγινε compile

 

post-205103-0-42224000-1403556481_thumb.png

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

Σε MacOSX 10.9.3 με clang χτυπάει:

 

>
delk@Pascal~/Downloads/2048cv/src$ clang -std=c99 -O2 -s my.c tui.c main.c
my.c:673:2: warning: implicit declaration of function 'va_start' is invalid in
      C99 [-Wimplicit-function-declaration]
        va_start( args, fmt );
        ^
my.c:676:2: warning: implicit declaration of function 'va_end' is invalid in C99
      [-Wimplicit-function-declaration]
        va_end( args );
        ^
2 warnings generated.
tui.c:47:22: warning: implicitly declaring library function 'calloc' with type
      'void *(unsigned long, unsigned long)'
        if ( NULL == (buf = calloc(1, bufsz)) ) {
                            ^
tui.c:47:22: note: please include the header <stdlib.h> or explicitly provide a
      declaration for 'calloc'
tui.c:63:9: warning: implicitly declaring library function 'realloc' with type
      'void *(void *, unsigned long)'
                try = realloc( buf, bufsz );
                      ^
tui.c:63:9: note: please include the header <stdlib.h> or explicitly provide a
      declaration for 'realloc'
tui.c:81:3: warning: implicit declaration of function 'free' is invalid in C99
      [-Wimplicit-function-declaration]
                free( buf );
                ^
tui.c:384:2: warning: implicit declaration of function 'va_start' is invalid in
      C99 [-Wimplicit-function-declaration]
        va_start( vargs, fmt );
        ^
tui.c:386:2: warning: implicit declaration of function 'va_end' is invalid in
      C99 [-Wimplicit-function-declaration]
        va_end( vargs );
        ^
5 warnings generated.
ld: warning: option -s is obsolete and being ignored
Undefined symbols for architecture x86_64:
  "_va_end", referenced from:
      _my_printfxy in my-3a109d.o
      _tui_printfxy in tui-5d9162.o
  "_va_start", referenced from:
      _my_printfxy in my-3a109d.o
      _tui_printfxy in tui-5d9162.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

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

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

Παιδιά ευχαριστώ πάρα πολύ για το feedback!

 

Προφανώς έχουν δίκιο οι compilers. Είχα ξεχάσει να κάνω διάφορα includes, αλλά ο mingw32 gcc σε Windows τα κάνει έτσι κι αλλιώς include implicitly (επειδή είναι στάνταρ βιβλιοθήκες). Το τσέκαρα σήμερα σε Ubuntu και τα είδα κι εγώ. Επίσης ένα άλλο πρόβλημα ήταν πως δεν του άρεσε η fileno(stdin/stdout) στο my.c ακόμα κι όταν έκανα define _POSIX_SOURCE (ίσως δεν το έβαλα σε σωστή σειρά όμως). Όπως και να 'χει, τα αντικατέστησα απευθείας με STDIN_FIELNO & STDOUT_FILENO, οπότε πάει κι αυτό.

 

Αν δεν σας κάνει κόπο, όταν βρείτε χρόνο κάντε άλλο ένα τεστ, κι αν είμαστε οκ να του βάλω 2-3 πραγματάκια που θέλω ακόμα (και να κάνω και λίγο καλύτερο de-coupling μεταξύ main.c και tui.c).

 

Download: 2048cv_v01b2.zip

Download: 2048cv_b01b1.zip

(κώδικας, και 32μπιτα εκτελέσιμα για Windows και για Cygwin).

 

Όπως έγραψα και σε προηγούμενο ποστ, αν αλλάξετε τα defines στο common.h και κάνετε recompile μπορείτε να παίξετε με διαφορετικά μεγέθη board. Δείτε το spoiler (για copy & paste)...

 

 

 

/* 2x2 */
#define GRID_DIM        2     /* grid's single dimension (it's a square) */
#define TILE_W          19    /* tile's drawing width */
#define TILE_H          10    /* tile's drawing height */

/* 3x3 */
#define GRID_DIM        3    /* grid's single dimension (it's a square) */
#define TILE_W          13   /* tile's drawing width */
#define TILE_H          6    /* tile's drawing height */

/* 4x4 (DEFAULT) */
#define GRID_DIM        4    /* grid's single dimension (it's a square) */
#define TILE_W          9    /* tile's drawing width */
#define TILE_H          5    /* tile's drawing height */

/* 5x5 */
#define GRID_DIM        5    /* grid's single dimension (it's a square) */
#define TILE_W          7    /* tile's drawing width */
#define TILE_H          3    /* tile's drawing height */

/* 6x6 */
#define GRID_DIM        6    /* grid's single dimension (it's a square) */
#define TILE_W          6    /* tile's drawing width */
#define TILE_H          3    /* tile's drawing height */

/* 7x7 */
#define GRID_DIM        7    /* grid's single dimension (it's a square) */
#define TILE_W          5    /* tile's drawing width */
#define TILE_H          1    /* tile's drawing height */

/* 8x8 */
#define GRID_DIM        8    /* grid's single dimension (it's a square) */
#define TILE_W          5    /* tile's drawing width */
#define TILE_H          1    /* tile's drawing height */

 

Και ένα screenshot από ταμπλό 6x6 (την εικόνα κατά λάθος την έχω ονομάσει 8x8), από την διορθωμένη έκδοση (άλλαξα λίγο και τα screen positions, γιατί η κονσόλα των Windows έχει από default 25 γραμμές, ενώ σε *nix έχει 24... btw, το παιχνίδι υποθέτει πως το παράθυρο της κονσόλας/τερματικού είναι τουλάχιστον 24x80). Οπότε δώστε μου αν είναι το οκ, να το συνεχίσω. Thanks!

 

post-38307-0-51934300-1403600984_thumb.png

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

Λοιπόν έχουμε και λέμε:

 

σε OSX 10.9.3 κάνει compile:

 

>delk@Pascal~/Downloads/2048cv$ clang -std=c99 -O2 -s my.c tui.c main.cld: warning: option -s is obsolete and being ignored

 

αλλά δείχνει χάλια και χωρίς χρώματα. Σε Ubuntu 12.04 και 14.04 είναι ΟΚ.

post-116013-0-42479300-1403611345_thumb.png

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

@Fuzzy:

 

Ευχαριστώ! Από το ss καταλαβαίνω πως το con_color.h απέτυχε να εντοπίσει την πλατφόρμα. Αυτές τις κάτω-παύλες που βλέπεις τις χρησιμοποιεί αντί για "μπογιά" όταν δεν έχει εντοπίσει πλατφόρμα ή/και color-mode.

 

Μπορείς να το επιβεβαιώσεις γράφοντας στην αρχή της main(), αμέσως μετά το tui_init() το παρακάτω:

	tui_init();
puts( CONSYS_GET_PLATFORM_LABEL() );
puts( CONSYS_GET_COLORMODE_LABEL() );
tui_press_a_key();
Λογικά θα πρέπει να σου τυπώσει "Unknown|DEFAULTED" (ή "Uknonwn|FORCED",όχι πολύ πολύ πιθανό) ως platfrom ή/και "NoColors|DEFAULTED" (ή "NoColors|FORCED", όχι πολύ πιθανό) ως color-mode.

 

Οπότε 2 τινά μπορώ να σκεφτώ ότι συμβαίνουν:

α) Ο compiler που χρησιμοποιείς δεν κάνει define τα directives __APPLE__ και __MACH

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

 

Αν έχεις όρεξη, μπορείς να δοκιμάσεις μια *ουστιά* που έχω βάλει στο con_color.h. Πήγαινε στο tui.h κι αμέσως πριν από το inclusion του con_color.h πρόσθεσε τις εξής 2 γραμμές:

...
#define CON_PLATFORM  CON_PLATFORM_UNIX
#define CON_COLORMODE CON_COLORMODE_ANSI
#include "con_color.h"
...
Έτσι του λες να μην προσπαθήσει να κάνει auto-detect αλλά να χρησιμοποιήσει αυτά που του λες. Εναλλακτικά μπορείς να τα δώσεις στη γραμμή εντολών του gcc με -D flag, δηλαδή:

gcc -std=c99 -DCON_PLATFORM_UNIX -DCON_COLORMODE_ANSI my.c tui.c main.c
Αν με αυτή την *ουστιά σου δουλέψει, τότε μάλλον ισχύει το α) από τα παραπάνω, οπότε ίσως πρέπει να γίνει compile με άλλον compiler. Το con_color.h κοιτάει για __APPLE__ και __MACH predefined directives που είναι νομίζω στάνταρ directives σε όλους τους compilers των Mac. Αν τα βρει, αντιμετωπίζει την πλατφόρμα σαν Unix (το OSX έχει Unix από κάτω) με ANSI colors support.

 

EDIT

 

Με ένα γρήγορο googling βρήκα διάφορα σαν κι αυτό: http://apple.stackexchange.com/a/125076

Οπότε αν καταλαβαίνω σωστά (και πέρα από τα predfined directives του compiler) πρέπει να ρυθμίσεις και το τερματικό να υποστηρίζει ANSI χρώματα (στο link μιλάνε για OSX 10.9.2 αλλά υποθέτω το ίδιο θα ισχύει και για 10.9.3

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

Το τερματικό είναι δηλωμένο σαν xterm-256color (οπότε είναι ΟΚ), για παράδειγμα αν δώσω ls -G εμφανίζει χρώματα κανονικά.

Βάζοντας τα directives στο clang:

 

>
delk@Pascal~/Downloads/2048cv$ gcc -std=c99 -DCON_PLATFORM_UNIX -DCON_COLORMODE_ANSI my.c tui.c main.c
In file included from tui.c:25:
In file included from ./tui.h:22:
./con_color.h:236:9: warning: 'CON_PLATFORM_UNIX' macro redefined
#define CON_PLATFORM_UNIX     3
        ^
<command line>:1:9: note: previous definition is here
#define CON_PLATFORM_UNIX 1
        ^
In file included from tui.c:25:
In file included from ./tui.h:22:
./con_color.h:339:9: warning: 'CON_COLORMODE_ANSI' macro redefined
#define CON_COLORMODE_ANSI      2
        ^
<command line>:2:9: note: previous definition is here
#define CON_COLORMODE_ANSI 1
        ^
2 warnings generated.
In file included from main.c:25:
In file included from ./tui.h:22:
./con_color.h:236:9: warning: 'CON_PLATFORM_UNIX' macro redefined
#define CON_PLATFORM_UNIX     3
        ^
<command line>:1:9: note: previous definition is here
#define CON_PLATFORM_UNIX 1
        ^
In file included from main.c:25:
In file included from ./tui.h:22:
./con_color.h:339:9: warning: 'CON_COLORMODE_ANSI' macro redefined
#define CON_COLORMODE_ANSI      2
        ^
<command line>:2:9: note: previous definition is here
#define CON_COLORMODE_ANSI 1
        ^
2 warnings generated.

 

Προσθέτοντας τα στο tui.h έχουμε χρώμα αλλά έχει πάρει λίγο σασί...!

post-116013-0-34778000-1403623502_thumb.png

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

Άρα λογικά δεν είναι θέμα ρύθμισης του τερματικού.

 

Αν δεν κάνεις define τίποτα και βάλεις στην main() μετά από το tui_init()...

	tui_init();
puts( CONSYS_GET_PLATFORM_LABEL() );
puts( CONSYS_GET_COLORMODE_LABEL() );
puts("press enter..."); while ('\n' != getchar());
τι σου δίνει στην έξοδο; UNKNOWN και στα 2 σου δίνει;

 

Btw, με τα -D έχει δίκιο που παραπονιέται, γιατί σου έδωσα εγώ λάθος γραμμή εντολών (κανονικά θέλει: gcc -DCON_PLATFORM=CON_PLATFORM_UNIX -DCON_COLORMODE=CON_COLORMODE_ANSI...). Για πες τι σου δίνουν τα puts() παραπάνω αν δεν κάνεις χειροκίνητο define πουθενά.

 

Αν παίρνεις UNKNOWN, βάλε ΠΡΙΝ από το tui_init() αυτό εδώ:

#ifdef __APPLE__
puts( "I'm an Apple" );
#endif
#ifdef __MACH
puts( "I'm a Macintosh" );
#endif
puts("press enter..."); while ('\n' != getchar());
	tui_init();
...
Αν δεν σου δώσει έξοδο:

I'm an Apple

I'm a Macintosh

 

Τότε υπάρχει θέμα με τον clang (δεν ορίζει κάποιο ή κανένα από τα στάνταρ predefined directives για Mac).

 

Πάντως από το 2ο ss (και από το 1ο βασικά) βλέπω πως υπάρχει θέμα στις αλλαγές γραμμών. Η αλήθεια είναι πως στον κώδικα έχω απλά '\n' αλλά υποτίθεται πως μετατρέπονται αυτόματα από τον compiler στα EOL της εκάστοτε πλατφόρμας (οι Mac έχουν '\r', τα *unix έχουν '\n' και τα Windows έχουν '\r\n'... αλλά υποτίθεται πως αυτά τα αναλαμβάνει ο compiler).

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

Άρα λογικά δεν είναι θέμα ρύθμισης του τερματικού.

 

Αν δεν κάνεις define τίποτα και βάλεις στην main() μετά από το tui_init()...

	tui_init();
puts( CONSYS_GET_PLATFORM_LABEL() );
puts( CONSYS_GET_COLORMODE_LABEL() );
puts("press enter..."); while ('\n' != getchar());
τι σου δίνει στην έξοδο; UNKNOWN και στα 2 σου δίνει;

 

Btw, με τα -D έχει δίκιο που παραπονιέται, γιατί σου έδωσα εγώ λάθος γραμμή εντολών (κανονικά θέλει: gcc -DCON_PLATFORM=CON_PLATFORM_UNIX -DCON_COLORMODE=CON_COLORMODE_ANSI...). Για πες τι σου δίνουν τα puts() παραπάνω αν δεν κάνεις χειροκίνητο define πουθενά.

 

Αν παίρνεις UNKNOWN, βάλε ΠΡΙΝ από το tui_init() αυτό εδώ:

#ifdef __APPLE__
puts( "I'm an Apple" );
#endif
#ifdef __MACH
puts( "I'm a Macintosh" );
#endif
puts("press enter..."); while ('\n' != getchar());
	tui_init();
...
Αν δεν σου δώσει έξοδο:

I'm an Apple

I'm a Macintosh

 

Τότε υπάρχει θέμα με τον clang (δεν ορίζει κάποιο ή κανένα από τα στάνταρ predefined directives για Mac).

 

Πάντως από το 2ο ss (και από το 1ο βασικά) βλέπω πως υπάρχει θέμα στις αλλαγές γραμμών. Η αλήθεια είναι πως στον κώδικα έχω απλά '\n' αλλά υποτίθεται πως μετατρέπονται αυτόματα από τον compiler στα EOL της εκάστοτε πλατφόρμας (οι Mac έχουν '\r', τα *unix έχουν '\n' και τα Windows έχουν '\r\n'... αλλά υποτίθεται πως αυτά τα αναλαμβάνει ο compiler).

 

 

Όχι δεν είναι σίγουρα.

 

OK λοιπόν για το πρώτο:

 

>delk@Pascal~/Downloads/2048cv$ ./a.out 
Unix|FORCED
ANSI|FORCED
press enter...

 

χωρίς τα #define στο tui.h

 

>
delk@Pascal~/Downloads/2048cv$ ./a.out 
Unknown
NoColors
press enter...

 

χωρίς τα #define στο tui.h και με τα #ifdev πριν την κλήση της tui_init():

 

>
delk@Pascal~/Downloads/2048cv$ ./a.out 
I'm an Apple
press enter...

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

Οπότε 2 τινά μπορώ να σκεφτώ ότι συμβαίνουν:

και __MACH

 

Το con_color.h κοιτάει για __APPLE__ και __MACH predefined directives που είναι νομίζω στάνταρ directives σε όλους τους compilers των Mac.

 

 

 

#ifdef __MACH
puts( "I'm a Macintosh" );
#endif
Αν δεν σου δώσει έξοδο:

I'm an Apple

I'm a Macintosh

 

Τότε υπάρχει θέμα με τον clang (δεν ορίζει κάποιο ή κανένα από τα στάνταρ predefined directives για Mac).

 

 

 

>
delk@Pascal~/Downloads/2048cv$ ./a.out 
I'm an Apple
press enter...

Μήπως είναι ορθογραφικό λάθος ?

 

Νομίζω το σωστό είναι __MACH__ όπως ορίζει και η σύμβαση του δύο underscore πριν - μετά.

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

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

Άρα ο clang δεν κάνει predefine το __MACH. Για να το σιγουρέψω έριξα μια ματιά εδώ κι εδώ πως πλέον παίζει το __MACH__ Άλλοι λένε πως αρκεί μονάχα το __APPLE__

 

Όπως και να 'χει, επισυνάπτω τα con_color_private.h και my.h στα οποία συμπεριλαμβάνω και το __MACH__ στο platform-detection.

 

Για πες :)

 

Download: __MACH__.zip

Ρίχτε τα μέσα στον φάκελο με τα sources του παιχνιδιού (κάντε replace).

EDIT-2: Αγνοήστε το παραπάνω, έχει λάθη. Το σωστό ανέβηκε ως version 0.1b2 στο προηγούμενο ποστ.

 

ΥΓ. Ημίθεος, δεν το είδα το ποστ σου, ήμουν στον editor του φόρουμ αλλά είχα φύγει για λίγο (άρα να το καταργήσω το __MACH... νομίζω πως παλιά υπήρχε ρε σεις).

 

EDIT-1:

 

Άρα με __MACH__ σου παίζει σωστά;

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

Άρα ο clang δεν κάνει predefine το __MACH.

πως πλέον παίζει το __MACH__ Άλλοι λένε πως αρκεί μονάχα το __APPLE__

 

Όπως και να 'χει, επισυνάπτω τα con_color_private.h και my.h στα οποία συμπεριλαμβάνω και το __MACH__ στο platform-detection.

 

ΥΓ. Ημίθεος, δεν το είδα το ποστ σου, ήμουν στον editor του φόρουμ αλλά είχα φύγει για λίγο (άρα να το καταργήσω το __MACH... νομίζω πως παλιά υπήρχε ρε σεις).

 

EDIT:

 

Άρα με __MACH__ σου παίζει σωστά;

 

Εμένα η ένστασή μου ήταν απλά ότι από τη στιγμή που βάζεις το MACH θα έπρεπε να είναι __MACH__ και όχι σκέτο __MACH.

 

Από εκεί και πέρα, πολύ πιθανώς να έχεις δίκιο και να αρκεί μόνο το __APPLE__. Δεν έχω ασχοληθεί καθόλου με MacOS X.

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

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

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

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

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

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

Σύνδεση

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

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

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