migf1 Δημοσ. 5 Μαρτίου 2015 Δημοσ. 5 Μαρτίου 2015 ... Όλοι το ξέρουν. Απλώς θα έχεις χάσει versions. Το όλο point του versioning. ... Το παλικάρι συνειδητά ΔΕΝ ενδιαφέρεται για versioning σε αυτό το toy program, για αυτό και δεν έβαλε. Τί ακριβώς είναι δυσνόητο εδώ πέρα; Και τι ακριβώς έχασε που δεν θα έχει ιστορικό; Θα πάει ας πούμε μετά από ένα χρόνο να διαβάσει τις ξέρω γώ 500 γραμμές του τελικού του κώδικα και δεν θα καταλάβει γρι επειδή δεν θα έχει ιστορικό; Μήπως ας πούμε τα σχόλια προηγούνται ως concept του versioning; Τι θα πει "δεν είναι διαπραγματεύσιμο". Ίσως δεν είναι για σένα, για άλλους είναι. Νομίζω πως μάλλον εσύ θεωρείς το ιστορικό ως κάτι το βαρύγδουπα αναγκαίο σε toy προγράμματα.
AllCowsEatGrass Δημοσ. 5 Μαρτίου 2015 Δημοσ. 5 Μαρτίου 2015 Αν δεν καταλαβαίνεις πως τα files και το history είναι το ένα και αυτό στο 99% των περιπτώσεων (εκεί κολλάει το "δεν είναι διαπραγματεύσιμο. Όταν έχεις files έχεις history και όλα τ άλλα που σου λέμε 3 σελίδες τώρα με x->0 effort, εκτός αν θες να πας κόντρα στο κατεστημένο σύστημα που χρησιμοποιεί git/vcs επειδή είναι mainstream ή χωρίς να ξέρουν γιατί, shame on them) είναι το source με λίγα λόγια, δεν μπορώ να κάνω κάτι. Με το παλικάρι συνεννοηθήκαμε δεν καταλαβαίνω γιατί συνεχίζεις να το αναφέρεις. Anyway, sorry @bnv για το thread. Cya around.
παπι Δημοσ. 5 Μαρτίου 2015 Δημοσ. 5 Μαρτίου 2015 Τελικα εχουμε κωδια να κραξουμε; Να σχολιασουμε θελω να πω.
gon1332 Δημοσ. 5 Μαρτίου 2015 Δημοσ. 5 Μαρτίου 2015 Θα ήθελα να το δοκιμάσω κι εγώ, αλλά δε μπορώ να αφήσω την αγκαλιά του Linux. Μάλλον είναι λίγο χρο- νοβόρο να φτιάξεις κανένα binary για Linux. Να έχω κι εγώ κάτι να παίζω όσο κάνω compile.
Aztec Δημοσ. 5 Μαρτίου 2015 Δημοσ. 5 Μαρτίου 2015 Θα ήθελα να το δοκιμάσω κι εγώ, αλλά δε μπορώ να αφήσω την αγκαλιά του Linux. Μάλλον είναι λίγο χρο- νοβόρο να φτιάξεις κανένα binary για Linux. Να έχω κι εγώ κάτι να παίζω όσο κάνω compile. Χα το δοκίμασα και παίζει άψογα μέσω wine
bnvdarklord Δημοσ. 6 Μαρτίου 2015 Μέλος Δημοσ. 6 Μαρτίου 2015 Θα ήθελα να το δοκιμάσω κι εγώ, αλλά δε μπορώ να αφήσω την αγκαλιά του Linux. Μάλλον είναι λίγο χρο- νοβόρο να φτιάξεις κανένα binary για Linux. Να έχω κι εγώ κάτι να παίζω όσο κάνω compile. Έτσι όπως το έχω φτιάξει νομίζω είναι πανεύκολο να γίνει port, καθώς windows specific είναι μόνο ένα αρχείο το οποίο κάνει καποια συγκεκριμένα πράγματα(δημιουργία παραθυρου, διαβασμα input mouse/keyboard, εμφάνιση ενος buffer στο παραθυρο και τέτοια). Το αρχείο αυτό σε κάθε frame απλά καλεί μια μέθοδο από τον cross-platform κώδικα του παιχνιδιού παρέχοντας της τα δεδομένα που ζητάει. Σκεφτόμουν, αν έχω όρεξη, μήπως ψαχτώ πως γίνονται αυτά μόλις τελειώσω με τον κώδικα για να δω αν όντως έχω δίκιο. Τελικα εχουμε κωδια να κραξουμε; Να σχολιασουμε θελω να πω. Είχα κάποιες υποχρεώσεις αυτη τη βδομάδα και δεν έχω σουλουπώσει κάποια μικροπράγματα που θέλω. Μόλις το κάνω θα το ανεβάσω, και τότε κράξτε ελεύθερα
migf1 Δημοσ. 6 Μαρτίου 2015 Δημοσ. 6 Μαρτίου 2015 ... Σκεφτόμουν, αν έχω όρεξη, μήπως ψαχτώ πως γίνονται αυτά μόλις τελειώσω με τον κώδικα για να δω αν όντως έχω δίκιο. Είχα κάποιες υποχρεώσεις αυτη τη βδομάδα και δεν έχω σουλουπώσει κάποια μικροπράγματα που θέλω. Μόλις το κάνω θα το ανεβάσω, και τότε κράξτε ελεύθερα Όταν με το καλό ανεβάσεις τον κώδικα, αν είναι όντως ξεχωρισμένο το ui από τον πυρήνα, τότε υποθέτω θα είναι εύκολο να φτιάξει κάποιος π.χ. μια GTK+ ή μια QT version του ui για να τρέχει και σε *nix και σε osx (ίσως το κάνω κι εγώ αν έχω όρεξη και χρόνο). @AllCowsEatGrass: Εγώ μια χαρά καταλαβαίνω. Βάζε εσύ source-control και στο "hello world"... ποτέ δεν ξέρεις πόσο μεγάλο θα καταλήξει να γίνει τελικά ως πρότζεκτ το "hello world". Χώρια ότι χωρίς ιστορικό πώς θα μπορείς να δεις πότε έγραψες το "hello" και πότε το "world"; Κάνε και commit σε κάθε γραμμή, μη ξεφύγει και τίποτα unrecorded ή/και uncommented και χάσεις την μπάλα μετά όταν πας να ξαναδιαβάσεις τον κώδικα των 5 γραμμών
H_ANARXIA_EINAI_PSEMA Δημοσ. 6 Μαρτίου 2015 Δημοσ. 6 Μαρτίου 2015 Τελικα εχουμε κωδια να κραξουμε; Να σχολιασουμε θελω να πω. Θα κλέψω την δόξα του OP και θα βάλω εγώ τον πρώτο κώδικα minesweeper σε C. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <limits.h> #include <signal.h> #include <time.h> #include <curses.h> #define WALL_TOP 0 #define WALL_MIDDLE 1 #define WALL_BOTTOM 2 #define MINE 1 #define HIDDEN ((unsigned char)(~(UCHAR_MAX >> 1u))) #define FLAG (HIDDEN >> 1u) typedef struct minefield_struct { unsigned char *minefield; size_t x, y; size_t mines, tiles; } minefield_t; int create_minefield(minefield_t *, size_t, size_t, size_t); void reveal_tile(minefield_t *, size_t, size_t); void reveal_mines(minefield_t *); void flag_tile(minefield_t *, size_t, size_t); void display_field(minefield_t *); void display_wall(size_t, int); void display_row(size_t, minefield_t *); int main(int argc, char **argv) { minefield_t p; MEVENT event; size_t x, y; int c; unsigned row, col, i, j, k; i = j = 9; k = 10; if(argc > 1) { if(sscanf(argv[1], "%u x %u", &i, &j) != 2) { fprintf(stderr, "%s [NxM] [minenum]\n", argv[0]); return EXIT_FAILURE; } if(argc > 2 && sscanf(argv[2], "%u", &k) != 1) { fprintf(stderr, "%s [NxM] [minenum]\n", argv[0]); return EXIT_FAILURE; } } if(i * j < k) { fprintf(stderr, "%ux%u can't have %u mines.\n", i, j, k); return EXIT_FAILURE; } srand(time(NULL)); initscr(); keypad(stdscr, TRUE); nonl(); cbreak(); noecho(); mousemask(BUTTON1_PRESSED | BUTTON3_PRESSED, NULL); getmaxyx(stdscr, row, col); if((i * 2 + 1) > row || (j * 2 + 1) > col) { /* how the fuck am I supposed to output an error without shit fucking up * I just don't know. */ endwin(); return EXIT_FAILURE; } if(create_minefield(&p, i, j, k) == -1) { perror(NULL); return EXIT_FAILURE; } move(y = 0, x = 0); display_field(&p); move(1, 1); refresh(); while(p.tiles > p.mines && (c = getch()) != 'q') { switch(c) { case KEY_MOUSE: if(getmouse(&event) == OK) { if(!((size_t)event.x & 1)) event.x++; if(!((size_t)event.y & 1)) event.y++; event.x /= 2; event.y /= 2; if((size_t)event.x >= p.x || (size_t)event.y >= p.y) break; if(event.bstate & BUTTON1_PRESSED) { reveal_tile(&p, event.x, event.y); if(p.minefield[p.x * event.y + event.x] == MINE) { reveal_mines(&p); move(0, 0); display_field(&p); addstr("You lost!\n"); refresh(); free(p.minefield); endwin(); return 0; } } else if(event.bstate & BUTTON3_PRESSED) flag_tile(&p, event.x, event.y); } break; case KEY_RIGHT: if(x != p.x - 1) ++x; break; case KEY_LEFT: if(x != 0) --x; break; case KEY_DOWN: if(y != p.y - 1) ++y; break; case KEY_UP: if(y != 0) --y; break; case 'f': flag_tile(&p, x, y); break; case ' ': reveal_tile(&p, x, y); if(p.minefield[p.x * y + x] == MINE) { reveal_mines(&p); move(0, 0); display_field(&p); addstr("You lost!\n"); refresh(); free(p.minefield); endwin(); return 0; } break; } move(0, 0); display_field(&p); move(y * 2 + 1 , x * 2 + 1); refresh(); } if(p.tiles == p.mines) { move(0, 0); display_field(&p); addstr("You won!\n"); refresh(); } free(p.minefield); endwin(); return 0; } void flag_tile(minefield_t *p, size_t x, size_t y) { if(x >= p->x || y >= p->y) return; if(p->minefield[p->x * y + x] & HIDDEN) { p->minefield[p->x * y + x] |= FLAG; p->minefield[p->x * y + x] &= ~HIDDEN; } else if(p->minefield[p->x * y + x] & FLAG) { p->minefield[p->x * y + x] |= HIDDEN; p->minefield[p->x * y + x] &= ~FLAG; } } void reveal_mines(minefield_t *p) { size_t x, y; for(y = 0; y < p->y; y++) for(x = 0; x < p->x; x++) if((p->minefield[p->x * y + x] & ~(HIDDEN | FLAG)) == MINE) reveal_tile(p, x, y); } void reveal_tile(minefield_t *p, size_t x, size_t y) { unsigned char c; if(x >= p->x || y >= p->y) return; c = p->minefield[p->x * y + x]; if(c & HIDDEN || c & FLAG) { c &= ~(HIDDEN | FLAG); p->minefield[p->x * y + x] = c; p->tiles--; if(c == '0') { reveal_tile(p, x - 1, y); reveal_tile(p, x + 1, y); reveal_tile(p, x, y - 1); reveal_tile(p, x, y + 1); reveal_tile(p, x - 1, y - 1); reveal_tile(p, x + 1, y + 1); reveal_tile(p, x - 1, y + 1); reveal_tile(p, x + 1, y - 1); } } } int create_minefield(minefield_t *p, size_t x, size_t y, size_t mines) { p->x = x; p->y = y; p->mines = mines; p->tiles = x * y; p->minefield = malloc(p->tiles); if(p->minefield == NULL) return -1; memset(p->minefield, '0', p->tiles); while(mines--) { x = rand() % p->x; y = rand() % p->y; if(p->minefield[p->x * y + x] == MINE) { mines++; continue; } p->minefield[p->x * y + x] = MINE; #define f(x0, y0) if(!((x0) >= p->x || (y0) >= p->y) && p->minefield[p->x * (y0) + (x0)] != MINE) p->minefield[p->x * (y0) + (x0)]++ f(x - 1, y ); f(x + 1, y ); f(x , y - 1); f(x , y + 1); f(x - 1, y - 1); f(x + 1, y + 1); f(x - 1, y + 1); f(x + 1, y - 1); #undef f } for(x = 0; x < p->tiles; x++) p->minefield[x] |= HIDDEN; return 0; } void display_field(minefield_t *p) { size_t i; display_wall(p->x, WALL_TOP); addch('\n'); for(i = 0; i < p->y; i++) { display_row(i, p); addch('\n'); if(i != p->y - 1) { display_wall(p->x, WALL_MIDDLE); addch('\n'); } } display_wall(p->x, WALL_BOTTOM); addch('\n'); } void display_wall(size_t x, int type) { size_t i; chtype top[2] = { ACS_HLINE, ACS_TTEE }; chtype middle[2] = { ACS_HLINE, ACS_PLUS }; chtype bottom[2] = { ACS_HLINE, ACS_BTEE }; x = x * 2 - 1; if(type == WALL_TOP) { addch(ACS_ULCORNER); for(i = 0; i < x; i++) addch(top[i & 1]); addch(ACS_URCORNER); } else if(type == WALL_MIDDLE) { addch(ACS_LTEE); for(i = 0; i < x; i++) addch(middle[i & 1]); addch(ACS_RTEE); } else { addch(ACS_LLCORNER); for(i = 0; i < x; i++) addch(bottom[i & 1]); addch(ACS_LRCORNER); } } void display_row(size_t x, minefield_t *p) { size_t i, j, k; unsigned char c; j = p->x * 2 + 1; for(i = k = 0; i < j; i++) { if(i & 1) { c = p->minefield[p->x * x + k]; if(c & HIDDEN) addch(ACS_BULLET); else if(c & FLAG) addch(ACS_DIAMOND); else if(c == '0') addch(' '); else if(isdigit(c)) addch(c); else if(c == MINE) addch('X'); else addch(' '); k++; } else addch(ACS_VLINE); } } Επειδή buggare το software και δεν μπορώ να κάνω επεξεργασία, απλώς να αναφέρω ότι είναι σε C για linux και χρησιμοποιεί την βιβλιοθήκη ncurses (-lncurses). Χρησιμοποιεί και ποντίκι και πληκτρολόγιο. Το πρώτο argument είναι της μορφής XxY για το μέγεθος του ναρκοπεδίου και το δεύτερο είναι ο αριθμός των ναρκών. http://i.imgur.com/UgvtLUf.png 2
migf1 Δημοσ. 6 Μαρτίου 2015 Δημοσ. 6 Μαρτίου 2015 (επεξεργασμένο) ... Επειδή buggare το software και δεν μπορώ να κάνω επεξεργασία, απλώς να αναφέρω ότι είναι σε C για linux και χρησιμοποιεί την βιβλιοθήκη ncurses (-lncurses). ... Δείχνει να τρέχει και σε Windows με pdcurses και αλλαγή της getmouse() σε nc_getmouse() ... στην pdcurses η getmouse() αντιστοιχεί στην συνάρτηση της αυθεντικής curses, και η nc_getmouse() αντιστοιχεί στην getmouse() της ncurses. Με τους χαρακτήρες μπορεί να έχει ένα θεματάκι, ανάλογα την γραμματοσειρά & to codepage της κονσόλας, γιατί μάλλον χρησιμοποιείς χαρακτήρες πάνω από τον ASCII 127. ΥΓ1. Το παραπάνω link για την pdcurses είναι για την έκδοση 3.4, που την κάνουμε build από τα sources (εγώ την έχω κάνει με τον mingw32-gcc). Υπάρχουν και pre-compiled binaries αλλά από παλιότερη έκδοση, την 2.6. ΥΓ2. Τον κώδικα δεν τον κοίταξα καθόλου. Απλώς τον έκανα compile για να δω αν τρέχει με την pdcurses. Επεξ/σία 6 Μαρτίου 2015 από migf1
H_ANARXIA_EINAI_PSEMA Δημοσ. 7 Μαρτίου 2015 Δημοσ. 7 Μαρτίου 2015 Πολύ σοβαρό το φόρουμ του προγραμματισμού! 50 απαντήσεις μπουρδολογία και μόλις κάποιος βάλει κώδικα τουμπεκί όλοι... Ντα φακ.
bnvdarklord Δημοσ. 7 Μαρτίου 2015 Μέλος Δημοσ. 7 Μαρτίου 2015 Πολύ σοβαρό το φόρουμ του προγραμματισμού! 50 απαντήσεις μπουρδολογία και μόλις κάποιος βάλει κώδικα τουμπεκί όλοι... Ντα φακ. Ε ναι ρε, χύμα κώδικας άνευ git? Πέρα από την πλάκα λίγο που το είδα χθες ήθελα να σχολιάσω για το αναδρομικό γέμισμα που κάνεις σε περίπτωση που πατηθεί κενό κουτάκι. Νομίζω θα σε περιορίζει πολύ σε μέγεθος board καθώς τo stack θα γεμίζει πολύ γρήγορα. Τι μεγέθη έχεις δοκιμάσει για να το τεστάρεις αυτό;
H_ANARXIA_EINAI_PSEMA Δημοσ. 7 Μαρτίου 2015 Δημοσ. 7 Μαρτίου 2015 Δεν είναι σχεδιασμένο για πολύ μεγάλα μεγέθη, διότι είναι για terminal. Από μόνοι τους οι extra χαρακτήρες της ncurses παίρνουν πολύ χώρο. To stack σίγουρα γεμίζει γρήγορα, όχι όμως τόσο γρήγορα όσο θα περίμενες. Καλώ την συνάρτηση 9 φορές αλλά το stack depth είναι <= max{X,Y}. Σε περίπτωση που έχουμε π.χ. Χ*Υ/3 mines που είναι ομοιόμορφα κατανεμημένες (λέμε τώρα!!), η average κενή περιοχή έχει max{width, height} <= max{X,Y}/3. Οπότε π.χ. για 60x60 με 1200 νάρκες έχουμε ~20 stack calls, και φυσικά υπό την υπόθεση ότι ο χρήστης θα πατήσει το <<σωστό>> κουτάκι ώστε να πετύχει το μάξιμουμ. (disclaimer: drunk, etc) Σίγουρα υπάρχει κάτι καλύτερο. Εσύ πως το έγραψες; (άντε μας πέθανες στην αναμονή)
bnvdarklord Δημοσ. 7 Μαρτίου 2015 Μέλος Δημοσ. 7 Μαρτίου 2015 Έβαλα ένα λινκ από τον κώδικα στο dropbox στο αρχικό post. Έχω αφήσει κάποια todos, ήθελα και να χωρίσω λίγο περισσότερο το mine_game.cpp σε δυο αρχεια αλλά δεν βαριέσαι. Κράξτε ελεύθερα @H_ANARXIA_EINAI_PSEMA Στην αρχή πήγα να το κάνω και γω με αναδρομή, αλλα τελικά το έκανα να είναι σαν εξαντλητική διασχιση λαβυρίνθου(το οποίο τελικά ανακάλυψα ότι υπήρχε http://en.wikipedia.org/wiki/Flood_fill).Χρειάζεται φυσικά κάποια μνήμη για να αποθηκεύει τιμές σε στοίβα, αλλά σε 100x100 με 0 νάρκες(το μέγιστο θεωριτικά δυνατό) δεν έχει κανένα θέμα. 1
migf1 Δημοσ. 8 Μαρτίου 2015 Δημοσ. 8 Μαρτίου 2015 (επεξεργασμένο) Παράθεση... μούφα Download: minesweeper_mingw32.7z (46.8Kb) Ξεζιπάρετε το .7z όπου θέλετε, θα φτιάξει έναν υποφάκελο: minesweeper_mingw32. Κατόπιν, με την προϋπόθεση πως έχετε στημένο mingw32-toolchain, γράφετε από τερματικό ή κονσόλα... cd [όπου_ξεζιπάρατε]/minesweeper_mingw32 make -f mingw32.mak Το εκτελέσιμο είναι: minesweeper_mingw32.exe (αν είστε σε linux, τρέξτε το με Wine). ΥΓ. Το αρχείο: minesweeper.session είναι session του Notepad++. Αν σας ενδιαφέρει το ανοίγεται με File->Load session, και σας ανοίγει όλα τα πηγαία αρχεία και το makefile. Φίλε bnvdarklord, δεν κοίταξα καθόλου τον κώδικα σε επίπεδο αλγορίθμων, λογικής, κλπ. Του έφτιαξα όμως ένα makefile για να γίνεται compile με το mingw32 toolchain σε οποιαδήποτε πλατφόρμα. Για παράδειγμα, μπορείτε να το κάνετε compile σε linux, και κατόπιν να τρέξετε το παραγόμενο .exe με το Wine (δεν το δοκίμασα, αλλά δεν βλέπω κάποιο λόγο να μην δουλεύει). Επιχείρησα επίσης να κάνω τον κώδικα να σέβεται το 80 column rule (μαζί με το 8-characters-identation), παρόλο που δεν τα κατάφερα παντού. Βασικά, με αφορμή αυτό είδα πως υπάρχουν αρκετά σημεία που ενδεχομένως θα μπορούσαν να γραφτούν καλύτερα φίλε bnvdarklord (π.χ. κάτι 6-7 nested blocks στην HandleGameInput(), στο mine_game.cpp). Ένα άλλο που έκανα, είναι να κάνω cast σε void όσα ορίσματα συναρτήσεων δεν χρησιμοποιούνται μέσα στην συνάρτηση, για να μην βγάζει warnings ο compiler. Π.χ.: static void Win32GetBitmap24( HDC DeviceContext, HINSTANCE Instance, LPCTSTR ResourceID, void* Memory ) { /* unused parameter */ (void) DeviceContext; ... Παρατήρησα επίσης πως κάνεις #include .cpp αρχεία, αντί να διαχωρίζεις τα declarations σε .h header αρχεία, τα οποία να κάνεις κατόπιν include. Αυτό θεωρείται κακή πρακτική. Επίσης, εκείνα τα #pragma once που βάζεις στα .cpp αρχεία σου (υποθέτω για να τα προστατεύσεις από multiple inclusions) εκτός του ότι δεν είναι cross-platform, κάνουν τον gcc να παραπονιέται (επειδή κανονικά πρέπει να χρησιμοποιούνται σε .h αρχεία). Btw, ο cross-platform τρόπος για να προστατεύεις header αρχεία είναι να τα περικλείεις μέσα σε: #ifndef MY_HEADER_H #define MY_HEADER_H ... #endif Συναφές με την πρακτική που ακολουθείς να κάνεις include .cpp αρχεία, είναι πως ο g++ παραπονιέται για συναρτήσεις που τις ορίζεις αλλά δεν τις χρησιμοποιείς. Βασικά, αυτό που κάνεις είναι να τις ορίζεις ως static σε ένα αρχείο, που σημαίνει πως έχουν internal linkage στο συγκεκριμένο .cpp αρχείο, αλλά δεν τις χρησιμοποιείς σε αυτό το αρχείο (για αυτό και παίρνεις warning από τον g++). Κατόπιν όμως κάνεις include αυτό το .cpp αρχείο σε ένα δεύτερο .cpp αρχείο και χρησιμοποιείς εκεί τις συναρτήσεις. Δουλεύουν τελικά γιατί το #include είναι απλό copy-and-paste, αλλά όπως καταλαβαίνεις δεν είναι αυτός σωστός τρόπος για να κάνεις include. Είδα επίσης πως χρησιμοποιείς πολλές global μεταβλητές (μάλλον κακό), αν και συνήθως τις περιορίζεις στο εκάστοτε file (μάλλον καλό). Όπως είπα δεν κάθισα να δω τον κώδικα, οπότε μπορεί όντως να εξυπηρετούν καλύτερα οι συγκεκριμένες καθολικές μεταβλητές. Συνήθως όμως προσπαθούμε να τις αποφύγουμε (αν δλδ δεν υπάρχει costly trade-off) γιατί οι καθολικές έχουν side-effects που είναι πιο δύσκολο να τα παρακολουθήσουμε. Ακόμα, ο g++ δείχνει να τσινάει όταν κάνεις initialize με {}, ακόμα κι αν του βάλεις -std=c++11 (νομίζω πως κακώς τσινάει). Όπως και να έχει, βγάζει warnings (όχι errors) για αυτό και τα απενεργοποίησα με: -Wno-missing-field-initializers στο makefile. Βασικά αυτό είναι το output που παίρνω από το compilation του mingw32 g++ v4.8.1: make -f mingw32.mak Process started >>> g++ -O3 -Wall -Wextra -Wno-missing-field-initializers -std=c++11 -finput-charset=cp1253 -c mine_game.cpp mine_game.cpp:1:9: warning: #pragma once in main file [enabled by default] #pragma once ^ mine_game.cpp:810:13: warning: 'void GameUpdateAndRender(game_memory*, game_buffer*, game_raw_input*, game_raw_input*)' defined but not used [-Wunused-function] static void GameUpdateAndRender( ^ g++ -O3 -Wall -Wextra -Wno-missing-field-initializers -std=c++11 -finput-charset=cp1253 -c mine_spritework.cpp mine_spritework.cpp:1:9: warning: #pragma once in main file [enabled by default] #pragma once ^ mine_spritework.cpp:97:13: warning: 'void ExtractSpriteSheet(void*, void*, game_sprite*)' defined but not used [-Wunused-function] static void ExtractSpriteSheet( ^ g++ -O3 -Wall -Wextra -Wno-missing-field-initializers -std=c++11 -finput-charset=cp1253 -c mine_graphics.cpp mine_graphics.cpp:1:9: warning: #pragma once in main file [enabled by default] #pragma once ^ In file included from mine_graphics.cpp:5:0: mine_spritework.cpp:97:13: warning: 'void ExtractSpriteSheet(void*, void*, game_sprite*)' defined but not used [-Wunused-function] static void ExtractSpriteSheet( ^ mine_graphics.cpp:295:13: warning: 'void InitializeGame(game_buffer*, int, int, game_sprite*)' defined but not used [-Wunused-function] static void InitializeGame( ^ g++ -O3 -Wall -Wextra -Wno-missing-field-initializers -std=c++11 -finput-charset=cp1253 -c win32_minesweeper.cpp win32_minesweeper.cpp: In function 'void Win32InitializeWindowBuffer(win32_buffer*, int)': win32_minesweeper.cpp:142:6: warning: unused variable 'BytesPerPixel' [-Wunused-variable] int BytesPerPixel = 4; ^ windres -i Minesweeper.rc --input-format=rc -o Minesweeper.o -O coff g++ -O3 -Wall -Wextra -Wno-missing-field-initializers -std=c++11 -finput-charset=cp1253 mine_game.o mine_spritework.o mine_graphics.o win32_minesweeper.o Minesweeper.o -o minesweeper_mingw32.exe -lkernel32 -luser32 -lcomdlg32 -lgdi32 -lcomctl32 -lwinmm -Wl,--subsystem,windows rm -f *.o *.obj ./minesweeper_mingw32.exe <<< Process finished. (Exit code 0) Επίσης, στο αρχείο "Minesweeper.rc" (που μάλλον είναι auto-generated από το VS) έκανε include το "winres.h", το οποίο ΔΕΝ υπάρχει στο mingw32 toolchain. Αντί αυτού λοιπόν, έκανα include το "winresrc.h" και δεν δείχνει να έχει πρόβλημα. Βασικά, κόπιαρα & δοκίμασα και το "winres.h" του VS με το mingw32 και δεν παρατήρησα καμιά διαφορά (βέβαια δεν το έψαξα και πολύ). Τέλος, παρατήρησα το εξής κουφό. Όταν κάνω compile με ενεργοποιημένο το debugging flag (-g3) και τρέχω το πρόγραμμα μέσα στον gdb, δεν μου κάνει draw τα σκορ και τον χρόνο, γιατί λέει πως τους παίρνει πολύ ώρα (1η φορά βλέπω κάτι τέτοιο στον gdb... ίσως υπάρχει κάποιο flag που να απενεργοποιεί τέτοιον έλεγχο, δεν ξέρω). ΥΓ. Βάλε αν θέλεις και περιληπτικά comment στις αρχές των συναρτήσεων. Θα διευκολύνει πολύ όσους θελήσουν (θελήσουμε) να κοιτάξουμε διεξοδικά τον κώδικα. Επεξ/σία 8 Μαρτίου 2015 από migf1 1
migf1 Δημοσ. 8 Μαρτίου 2015 Δημοσ. 8 Μαρτίου 2015 Έριξα μόλις μια ματιά στα include και στις global μεταβλητές που χρησιμοποιείς... εχμ, τα έχεις κάνει λίγο ρόϊδο Θα δοκιμάσω να τα ξεμπλέξω αργότερα (ίσως και αύριο, θα δω).
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα