Monkey7 Δημοσ. 27 Απριλίου 2011 Share Δημοσ. 27 Απριλίου 2011 Καλησπέρα προσπαθώ να φτιάξω το παιχνίδι ναρκαλιευτή σε C και έχω κάποιες απορίες άμα έχετε χρόνο και όρεξη απαντήστε μου Για αρχή στόχος μου με τη χρηση malloc να δημιουργήσω δυσδιάστατο πινακα nxm γεμίζοντας τον με 0 και έπειτα να εμφανίσω στην οθόνη έναν πίνακα που αποτελέιται απο #. #include <stdio.h> #include <stdlib.h> int main() { int i,j,n,m,o; int **pa=NULL; printf("Dwste tis diastaseis tou paixnidiou n x m\n"); scanf("%d%d", &n,&m); pa=(int**)malloc(n*sizeof(int*)); for(i=0;i<n;i++) { pa=(int*)malloc(m*sizeof(int)); for(j=0;j<m;i++) { pa[j]=0; } } for(i=0;i<n;i++) { for(j=0;j<m;i++) { if(pa[j]==0) { printf("#"); } printf("\n"); } system("PAUSE"); return 0; } Δεν ξέρω γιατί εμφανιστηκε έτσι κανονικά φένεται πιο ωραία ο κώδικας Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Pantelwolf Δημοσ. 27 Απριλίου 2011 Share Δημοσ. 27 Απριλίου 2011 Εργασια στα ΤΕΙ; Εμας καποτε μας την ειχαν βαλει στην πασκαλ. Λοιπον, Γενικες κατευθυνσεις, αν θες τις ακολουθεις. Κανε το user friendly, βαλε λογακια να εκτυπωθουν στην οθονη Φτιαξε functions. μια που να ελέγχει το κεντρικο μενου. Να εμφανίζει δηλαδή λίστα με επιλογές και να ζητά εισαγωγή πχ 1. Νεο παιχνιδι 2. κατι αλλο 3. εξοδος. μια που να ειναι το ιδιο το παιχνίδι. Μενου που να επιλεγει επομενη κινηση και το ειδος της. μια για την εμφανιση του πινακα που θα βαλεις με τα στοιχεια.Να καλείται κάθε φορά που κάνει κάτι ο χρήστης πριν τις επιλογες. Να εμφανίζει δηλαδη το ταμπλω! Καλά το πας στη σκεψη με τη μαλλοκ αλλα ειναι πολυ αργα για να δω αν το εχεις σωστα μην ξεχασεις να απελευθερωνεις τη μνημη σε καθε game over. καλη τυχη. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Monkey7 Δημοσ. 27 Απριλίου 2011 Μέλος Share Δημοσ. 27 Απριλίου 2011 ΑΕΙ αλλα δεν εχει σημασία. Υπάρχουν οδηγίες για το πως να λύσω την άσκηση απλως κολλάω σε κάποια πραγματάκια αύριο πρωι με τον καφέ ρίξε μια ματιά να μου πεις αν έχεις χρόνο Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Directx Δημοσ. 27 Απριλίου 2011 Share Δημοσ. 27 Απριλίου 2011 Καταρχήν σου είχε ξεφύγει ένα άγκιστρο στον κώδικα που ανάρτησες, ύστερα στο δεύτερο εσωτερικό for loop αυξάνεις την μεταβλητή i αντί για την j, τέλος αντί της malloc μπορείς να χρησιμοποιήσεις την calloc που δεσμεύει πίνακες & μηδενίζει κατευθείαν τα περιεχόμενα τους δίχως έξτρα εντολές. Κώδικας: > #include <stdio.h> #include <stdlib.h> int main() { int i,j,n,m,o; int **pa=NULL; printf("Dwste tis diastaseis tou paixnidiou n x m\n"); scanf("%d%d", &n,&m); pa=(int**)calloc(n, sizeof(int*)); for(i=0;i<n;i++) pa[i]=(int*)calloc(m, sizeof(int)); for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(pa[i][j]==0) { printf("#"); } } printf("\n"); } /* Free memory! */ for(i=0;i<n;i++) free(pa[i]); free(pa); system("PAUSE"); return 0; } ΕΞΟΔΟΣ: > Dwste tis diastaseis tou paixnidiou n x m 10 5 ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### Press any key to continue . . . Καλή συνέχεια!! Υ.Γ. Δεν ξέρω γιατί εμφανιστηκε έτσι κανονικά φένεται πιο ωραία ο κώδικας Για να αναρτάς με σωστή μορφή τον κώδικα σου θα πρέπει να επικολληθεί μεταξύ των [ code] και [ /code] tags, δίχως το κενό μεταξύ του [ και του code. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Monkey7 Δημοσ. 27 Απριλίου 2011 Μέλος Share Δημοσ. 27 Απριλίου 2011 Σε ευχαριστώ πολύ θα με βοηθήσουν πολύ αυτά που μου είπες Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Timonkaipumpa Δημοσ. 27 Απριλίου 2011 Share Δημοσ. 27 Απριλίου 2011 Θα πρότεινα τις λειτουργίες που θες να κάνεις, π.χ. αρχικοποίηση του board, να τις κάνουν συναρτήσεις και όχι χύμα. Π.χ., int** createBoard(int dim1, int dim2); Έτσι, θα μπορούσες να καλείς: printf("Dose diastaseis\n"); scanf("%d%d", &n,&m); int** board = createBoard(n,m); Δεν είναι τόσο για το να γίνει σωστά η αρχικοποίηση.... αλλά για να "χτίσεις" πιο "σωστά" τον κώδικά σου. Το σκεπτικό είναι... όχι το τι ακριβώς θα κάνει Έτσι θα μπορείς να ελέγχεις καλύτερα τα λάθη σου και να αλλάζεις πιο εύκολα τον κώδικα (πόσο μάλλον δε όταν κάθε τέτοια συνάρτηση θα είναι και σε ένα header - source file "μόνη της"). Επίσης, η διαδικασία του προγράμματος θα είναι πιο ευδιάκριτη στην main. Δεν είναι δύσκολη η εργασία... και για αυτό λέει να ασχοληθείς να την κάνεις "τσίλικη". (Π.χ., θα μπορούσες τα μηνύματα προς τον χρήση να τα έχεις σε μία άλλη συνάρτηση την οποία θα καλείς στην αρχή: δήλωση: void diplsayMessagesToUser(void); και στο main.c .... displayMessagesToUser(); .... Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Monkey7 Δημοσ. 27 Απριλίου 2011 Μέλος Share Δημοσ. 27 Απριλίου 2011 Πως μπορώ να χρησιμοποιήσω τη rand() ωστε να βάλω σε τυχαίες θέσεις του πίνακα τον αριθμό 10(νάρκες)? Έχεις δίκιο τιμον...λέω να χρησιμοποιήσω πολλές συναρτήσεις. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
C6WGMN Δημοσ. 27 Απριλίου 2011 Share Δημοσ. 27 Απριλίου 2011 Πάρε ιδέες από εδώ Compile: cc -lncurses. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Monkey7 Δημοσ. 27 Απριλίου 2011 Μέλος Share Δημοσ. 27 Απριλίου 2011 (επεξεργασμένο) Υπάρχει κάποιο πρόβλημα στον τρόπο που χρησιμοποιώ τη rand() δε βγάζει error αλλά κολλάει..? (δώστε σημασία μονο στη rand έτσι όπως το έχω τώρα απλόσ εμφανίζει τα πάντα) > #include <stdio.h> #include <stdlib.h> void tamplo(int n, int m, int **pa); void narkes(int n, int m, int **pa); int main(int argc, char *argv[]) { int i,j,n,m,o,p,a,b,r1,r2,q,w; int **pa=NULL; printf("Dwste tis diastaseis tou paixnidiou n x m\n"); printf("Prosoxh, to tamplo mporei na exei megethos to poly 24x30\n"); scanf("%d%d", &n,&m); printf("Epilxte to epipedo duskolias tou paixnidiou\n"); printf("Pathste 1 gia eukolo, 2 gia metro, 3 gia duskolo kai 4 gia akatorthoto\n"); scanf("%d", &o); if(o==1) { p=m*n/8; } if(o==2) { p=m*n/7; } if(o==3) { p=m*n/6; } if(o==4) { p=m*n/5; } pa=(int**)calloc(n, sizeof(int*)); //desmeush mnhmhs gia dimiourgia 2d pinaka for(i=0;i<n;i++) { pa[i]=(int*)calloc(m, sizeof(int)); } tamplo(n,m,pa); printf("dwste tis syntetagmenes tou tetragwnou pou thelete na anoixete\n"); scanf("%d%d", &a,&; pa[a][b]=9; q=n+1; w=m+1; for(i=0;i<p;i++) { do { r1=rand()%q; r2=rand()%w; }while(r1==a && r2==; pa[r1][r2]=1;//to 10 antiprosopevei tis narkes } tamplo(n,m,pa); for(i=0;i<n;i++) { free(pa[i]); } free(pa); system("PAUSE"); return 0; } Επεξ/σία 28 Απριλίου 2011 από Monkey7 Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Monkey7 Δημοσ. 28 Απριλίου 2011 Μέλος Share Δημοσ. 28 Απριλίου 2011 περίεργο άμα στη θέση αυτού: r1=rand()%q; r2=rand()%w; αντί για q και w βάλω n και m θα δουλέψει αλλά εγώ χρειάζομαι n+1=q και m+1=w. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Monkey7 Δημοσ. 28 Απριλίου 2011 Μέλος Share Δημοσ. 28 Απριλίου 2011 Υπάρχει κάποιο πρόβλημα στον τρόπο που χρησιμοποιώ τη rand() δε βγάζει error αλλά κολλάει..? (δώστε σημασία μονο στη rand έτσι όπως το έχω τώρα απλόσ εμφανίζει τα πάντα) > #include <stdio.h> #include <stdlib.h> void tamplo(int n, int m, int **pa); void narkes(int n, int m, int **pa); int main(int argc, char *argv[]) { int i,j,n,m,o,p,a,b,r1,r2,q,w; int **pa=NULL; printf("Dwste tis diastaseis tou paixnidiou n x m\n"); printf("Prosoxh, to tamplo mporei na exei megethos to poly 24x30\n"); scanf("%d%d", &n,&m); printf("Epilxte to epipedo duskolias tou paixnidiou\n"); printf("Pathste 1 gia eukolo, 2 gia metro, 3 gia duskolo kai 4 gia akatorthoto\n"); scanf("%d", &o); if(o==1) { p=m*n/8; } if(o==2) { p=m*n/7; } if(o==3) { p=m*n/6; } if(o==4) { p=m*n/5; } pa=(int**)calloc(n, sizeof(int*)); //desmeush mnhmhs gia dimiourgia 2d pinaka for(i=0;i<n;i++) { pa[i]=(int*)calloc(m, sizeof(int)); } tamplo(n,m,pa); printf("dwste tis syntetagmenes tou tetragwnou pou thelete na anoixete\n"); scanf("%d%d", &a,&; pa[a-1][b-1]=9; q=n+1; w=m+1; for(i=0;i<p;i++) { do { r1=rand()%q; r2=rand()%w; }while(r1==a && r2==; pa[r1][r2]=1;//to 10 antiprosopevei tis narkes } tamplo(n,m,pa); for(i=0;i<n;i++) { free(pa[i]); } free(pa); system("PAUSE"); return 0; } Άμα αντί για q και w βάλω n και m δουλεύει Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
nilosgr Δημοσ. 28 Απριλίου 2011 Share Δημοσ. 28 Απριλίου 2011 Υπάρχει κάποιο πρόβλημα στον τρόπο που χρησιμοποιώ τη rand() δε βγάζει error αλλά κολλάει..? (δώστε σημασία μονο στη rand έτσι όπως το έχω τώρα απλόσ εμφανίζει τα πάντα) Άμα αντί για q και w βάλω n και m δουλεύει Αφου το q και το w δεν τα εχεις δωσει τιμες... Επισης, η srand(); που ειναι? Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Monkey7 Δημοσ. 28 Απριλίου 2011 Μέλος Share Δημοσ. 28 Απριλίου 2011 Η srand χρειάζεται αναγκαστικά? Τους έχω δώσει τιμές.Το λάθος ήτανε ότι υπερβαίνει το μέγεθος του πίνακα με το q και w. Τα n και m είναι τα όρια Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Monkey7 Δημοσ. 28 Απριλίου 2011 Μέλος Share Δημοσ. 28 Απριλίου 2011 Προσπαθώ να φτιάξω ναρκαλιευτή σε C αλλά μου φένεται αδύνατον να φτιάξω τη συνάρτηση(int anoigma) που ανοίγει τα κουτάκια και βάζει αριθμούς με αναδρομή.(αναγκαστικά αναδρομη ) Άμα κάποιος μπορεί με οποιδήποτε τρόπο να με βοηθήσει θα του ήμουν ευγνώμων! > #include <stdio.h> #include <stdlib.h> #include <time.h> void tamplo(int n, int m, int **pa); int anoigma(int a, int b, int **pa); int main(int argc, char *argv[]) { int i,j,n,m,o,p,a,b,r1,r2,k; int **pa=NULL; printf("Dwste tis diastaseis tou paixnidiou n x m\n"); printf("Prosoxh, to tamplo mporei na exei megethos to poly 24x30\n"); scanf("%d%d", &n,&m); printf("Epilxte to epipedo duskolias tou paixnidiou\n"); printf("Pathste 1 gia eukolo, 2 gia metro, 3 gia duskolo kai 4 gia akatorthoto\n"); scanf("%d", &o); if(o==1) { p=m*n/8; } if(o==2) { p=m*n/7; } if(o==3) { p=m*n/6; } if(o==4) { p=m*n/5; } pa=(int**)calloc(n, sizeof(int*)); //desmeush mnhmhs gia dimiourgia 2d pinaka for(i=0;i<n;i++) { pa[i]=(int*)calloc(m, sizeof(int)); } tamplo(n,m,pa); printf("dwste tis syntetagmenes tou tetragwnou pou thelete na anoixete\n"); scanf("%d%d", &a,&; a=a-1; b=b-1; pa[a][b]=9;//9 antiprosopeyei ta anoixta tetragvna poy den periexoyn kati srand(time(NULL)); for(i=0;i<p;i++) { do { r1=rand()%n; r2=rand()%m; }while(r1==a && r2==; //wste na mhn yparxei narkh sto tetragwnw pou epelekse pa[r1][r2]=10;//to 10 antiprosopevei tis narkes } k=anoigma(a,b,pa); printf("%s%d\n", "ayto einai to k:", k); tamplo(n,m,pa); for(i=0;i<n;i++) { free(pa[i]); } free(pa); system("PAUSE"); return 0; } int anoigma(int a, int b, int **pa) { int i,j,k=0,narkes=0; for(i=a-1;i<a+2;i++) { for(j=b-1;j<b+2;j++) { if(pa[i][j]==1) { narkes=narkes+1; } } } if(narkes==0) { pa[a][b]=9; } else { pa[a][b]=narkes; } k=k+1; return k; } void tamplo(int n, int m, int **pa) { int i,j; if(m<10) { printf(" "); for(j=0;j<m;j++) { printf("%s%d", " ", j+1); } printf("\n"); printf("-"); for(j=0;j<m+1;j++) { printf("--"); } printf("\n"); } else { printf(" "); for(j=0;j<9;j++) { printf("%s%d", " ", j+1); } for(j=0;j<m-9;j++) { printf("%s%d", " ", j+10); } printf("\n"); printf("---"); for(j=0;j<m;j++) { printf("---"); } printf("\n"); } for(i=0;i<n;i++) { if(i<9) { printf("%s%d%s", " ", i+1, "|"); } else { printf("%d%s", i+1, "|"); } for(j=0;j<m;j++) { if(pa[i][j]==0) { if(m<10) { printf(" #"); } else { printf(" #"); } } if(pa[i][j]==9) { if(m<10) { printf(" ."); } else { printf(" ."); } } if(pa[i][j]!=0 && pa[i][j]!=9) { if(m<10) { printf("%s%d", " ", pa[i][j]); } else { printf("%s%d", " ", pa[i][j]); } } } printf("\n"); } } Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Timonkaipumpa Δημοσ. 29 Απριλίου 2011 Share Δημοσ. 29 Απριλίου 2011 Γιατί το κάνεις έτσι; Π.χ., δεν κατάλαβα γιατί το τετράγωνο a-1 και b-1 πρέπει να μην έχει νάρκη. Σου προτείνω: 1ον Δες πώς παίζεται ο ναρκαλιευτής (απ' ό,τι φαίνεται, ξέρεις) 2ον Δες ένα σενάριο χρήσης. Π.χ., είσαι ο χρήστης, τρέχεις το πρόγραμμά σου, επιλέγεις ένα τετράγωνο και τι γίνεται; 3ον Δες πώς μπορείς να ικανοποιήσεις αυτά που θα γίνονται κατά το βήμα 2. 4ον Βάσει των προηγουμένων, οργάνωσε όλες τις λειτουργίες σε διάκριτα τμήματα. Π.χ., υπάρχει ένα τμήμα εισαγωγής προτιμήσεων από τον χρήστη, όπως μέγεθος ταμπλό και δυσκολία. Μετά, βάσει των δεδομένων που εισήγαγε ο χρήστης, πρέπει να φτιαχτεί ένα ταμπλό με τις ανάλογες νάρκες και το ανάλογο μέγεθος. Έπειτα, πρέπει να μπει σε ένα mode το πρόγραμμα που να τρέχει είτε μέχρι να χτυπήσει νάρκη ο χρήστης είτε μέχρι να τελειώσουν όλα τα κενά τετράγωνα. 5ον Δες τι είναι βολικό να επιστρέφουν οι συναρτήσεις σου. Π.χ., μπορείς να έχεις δύο συναρτήσεις: int playGame(int** board) int usersChoise(int** board) Όπου, να έχει στο body: int status = 1; while(status == 1){ status = usersChoise(board); } και η usersChoise να παραπέμπει τον χρήστη να δώσει ένα τετράγωνο, να ανιχνεύει εάν αυτό το τετράγωνο έχει νάρκη και εάν δεν έχει να επιστρέφει 1 αλλιώς 0. Εάν είναι το τελευταίο ανοιχτό να επιστρέφει 2 (π.χ.). Έτσι, η playGame να έχει μετά το while: if(status == 2) { returnedValue = 1; } else { returnedValue = 0; } και έτσι στην main θα έχεις: int result = playGame(board); if(result){ printf("Congrats, you win!\n"); } else { printf("Sorry, you lose\n"); } Επίσης, θα πρέπει να αποφασίσεις στα διάφορα επίπεδα δυσκολίας πόσα κενά τετράγωνα θα υπάρχουν. Π.χ., στο επίπεδο difficult πόσα κενά θα αφήνεις σε ποσοστό; 10% του board; 20% ή 5%; Αφού το αποφασίσεις, κάνεις τις πράξεις και βρίσκεις πόσες επαναλήψεις θα πρέπει να κάνεις για να γεμίσεις τα τετράγωνα με "1" (όπου θα σημαίνει ότι έχουν νάρκη), με την προϋπόθεση ότι τα κενά έχουν 0 (ή το αντίθετο, 1 για κενό 0 για νάρκη). Κάνεις τις επαναλήψεις στον πίνακα και γεμίζεις ΤΥΧΑΙΑ τόσα τετράγωνα όσα πρέπει με νάρκες και τροφοδοτείς τον πίνακα αυτόν πάλι πίσω στην main. Δηλαδή, η main θα έχει την μορφή: > int main(){ welcomeMessage(); int* choises = getUsersPreferences(); int** board = makeBoard(choises); int result = 3; while (result == 3) { result = playGame(board); if(result){ printf("Congrats, you win!\n"); result = askForRepetition(); } else { printf("Sorry, you lose\n"); result = askForRepetition(); //προφανώς για να ξανατρέξει θα πρέπει η askForRepetition να επιστρέψει 3 } } return 0; } Και έχεις και ένα header file στην μορφή: > #ifndef MYFUNCS_H #define MYFUNCS_H void welcomeMessage(void); int* getUsersPreferences(void); int** makeBoard(int* ); int playGame(int** ); int askForRepetition(void); #endif Υ.Γ. η getUsersPreferences θα μπορούσε να είναι: { int* toReturn = (int*) malloc(sizeof(int) * 2); printf("Choose size\n"); scanf("%d", toReturn[0]); printf("Choose difficulty\n"); scanf("%d", toReturn[1]); return toReturn; } Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα