Punky29 Δημοσ. 9 Μαρτίου 2014 Δημοσ. 9 Μαρτίου 2014 (επεξεργασμένο) Στον προγραμματισμό έχω την εξής άσκηση έως και την Τρίτη: Στην άσκηση αυτή θα υλοποιήσετε το παιχνίδι Fiver. Το παιχνίδι παίζεται σε ένα ταμπλό 5×5. Αρχικά όλες οι θέσεις καταλαμβάνονται από λευκά κομμάτια. Ο παίκτης έχει τη δυνατότητα να επιλέξει ένα κομμάτι κάθε φορά. Με την επιλογή ενός κομματιού, το κομμάτι αυτό αλλάζει χρώμα από λευκό σε μαύρο (και το ανάποδο) . Επίσης, χρώμα αλλάζουν τα κομμάτια που βρίσκονται αριστερά, δεξιά, πάνω και κάτω από το κομμάτι που επιλέχτηκε. Σκοπός του παιχνιδιού είναι να μετατραπούν όλα τα κομμάτια του ταμπλό από άσπρα σε μαύρα. Όμως, όταν κάνω compile, εμφανίζεται μόνο το εξής μήνυμα: ********** Fiver **********Congratulations! You win!Play again (y/n)? Ωστόσο, δεν μπορώ να καταλάβω που είναι το λάθος.. #include <stdio.h> const int board_size = 5; // Game board size const char BLACK = 'X'; // Black Piece const char WHITE = 'O'; // White Piece void initBoard(char A[board_size][board_size], int i, int j); // Board initialization void playGame(char A[board_size][board_size], int i, int j); // Play the game void displayBoard(char A[board_size][board_size], int i, int j);// Print game board char checkEnd(char A[board_size][board_size], int i, int j, char check); // Check if game ends void flip(char A[board_size][board_size], int i, int j); // Flip the piece to a different color int main() { char A[board_size][board_size]; char answer; do { initBoard(); printf("*********\n"); printf("* Fiver *\n"); printf("*********\n"); displayBoard(); do { playGame(); displayBoard(); } while(0); printf("Congratulations! You win!\n"); printf("Play again (y/n)? "); scanf("%c", &answer); }while(answer =='Y' || answer =='y'); return 0; } //initialize the game board content void initBoard(char A[board_size][board_size], int i, int j) { for(i=0;i<board_size;i++) { for(j=0;j<board_size;j++) { A[i][j] = WHITE; printf("\t%c", A[i][j]); } printf("\n"); } } void playGame(char A[board_size][board_size], int i, int j) { int i,j; checkEnd(); do { printf("Please select the piece's row and column number: "); scanf("%d" "%d", &i,j); flip; }while(0); displayBoard(); } //check to see if all pieces have been changed to black char checkEnd(char A[board_size][board_size], int i, int j, char check) { int i,j; for(i=0;i<board_size;i++) { for(j=0;j<board_size;j++) { if (A[i][j] == BLACK) { check=1; } else { check=0; } } } return check; } //display the game board void displayBoard(char A[board_size][board_size], int i, int j) { int i,j; for(i=0;i<board_size;i++) { for(j=0;j<board_size;j++) { printf("%c", A[i][j]); } } } //flip a piece to a different color void flip(char A[board_size][board_size], int i, int j) { int i,j; if (A[i][j] == WHITE) { A[i][j] = BLACK; if (i-1>0) { if (A[i-1][j] == WHITE) { A[i-1][j] = BLACK; } else { A[i-1][j] = WHITE; } } if (j-1>0) { if (A[i][j-1] == WHITE) { A[i][j-1] = BLACK; } else { A[i][j-1] = WHITE; } } if (j+1<board_size) { if (A[i][j+1] == WHITE) { A[i][j+1] = BLACK; } else { A[i][j+1] = WHITE; } } if (i+1<board_size) { if (A[i+1][j] == WHITE) { A[i+1][j] = BLACK; } else { A[i+1][j] = WHITE; } } } else { A[i][j] = WHITE; if (i-1>0) { if (A[i-1][j] == WHITE) { A[i-1][j] = BLACK; } else { A[i-1][j] = WHITE; } } if (j-1>0) { if (A[i][j-1] == WHITE) { A[i][j-1] = BLACK; } else { A[i][j-1] = WHITE; } } if (j+1<board_size) { if (A[i][j+1] == WHITE) { A[i][j+1] = BLACK; } else { A[i][j+1] = WHITE; } } if (i+1<board_size) { if (A[i+1][j] == WHITE) { A[i+1][j] = BLACK; } else { A[i+1][j] = WHITE; } } } } Επεξ/σία 9 Μαρτίου 2014 από Punky29
TheOneGandalf Δημοσ. 9 Μαρτίου 2014 Δημοσ. 9 Μαρτίου 2014 Με μια γρήγορη ματια παρατηρω ότι Σε κάθε συνάρτηση μέσα δηλώνεις int i, j παρόλου που τα δίνεις και ως παράμετρο -> syntax error Καλείς συναρτήσεις, π.χ initboard() χωρίς να έχεις δώσει παραμέτρους παρόλο που στον ορισμό τους έχεις δηλώσει ότι παίρνουν. void initBoard(char A[board_size][board_size], int i, int j) Εδώ προσπαθείς να στείλεις πίνακα? Πρέπει να σβήσεις αυτά που έχεις μέσα στις αγκύλες. Δοκίμασε να το αλλάξεις σε void initBoard(char A[][], int rows, int columns) Οπου rows, columns ο αριθμός των γραμμών/στηλών του πίνακα.
Punky29 Δημοσ. 9 Μαρτίου 2014 Μέλος Δημοσ. 9 Μαρτίου 2014 Διόρθωσα το πρόγραμμα, ωστόσο δεν ξέρω πώς να καλέσω συνάρτηση, η οποία ουσιαστικά κάνει έλεγχο(checkEnd). #include <stdio.h> const int board_size = 5; // Game board size const char BLACK = 'X'; // Black Piece const char WHITE = 'O'; // White Piece void initBoard(); // Board initialization void playGame(); // Play the game void displayBoard();// Print game board char checkEnd(char check); // Check if game ends void flip(); // Flip the piece to a different color int main() { char A[board_size][board_size]; char answer; do { initBoard(); printf("*********\n"); printf("* Fiver *\n"); printf("*********\n"); displayBoard(); do { playGame(); displayBoard(); } while(0); printf("Congratulations! You win!\n"); printf("Play again (y/n)? "); scanf("%c", &answer); }while(answer =='Y' || answer =='y'); return 0; } //initialize the game board content void initBoard() { char A[board_size][board_size]; int i,j; for(i=0;i<board_size;i++) { for(j=0;j<board_size;j++) { A[i][j] = WHITE; printf("\t%c", A[i][j]); } printf("\n"); } } void playGame() { char A[board_size][board_size]; int i,j; checkEnd(A[board_size][board_size]); do { printf("Please select the piece's row and column number: "); scanf("%d" "%d", &i,j); flip; }while(0); displayBoard(); } //check to see if all pieces have been changed to black char checkEnd(char A[board_size][board_size]) { char check; int i,j; for(i=0;i<board_size;i++) { for(j=0;j<board_size;j++) { if (A[i][j] == BLACK) { check=1; } else { check=0; } } } return check; } //display the game board void displayBoard() { char A[board_size][board_size]; int i,j; for(i=0;i<board_size;i++) { for(j=0;j<board_size;j++) { printf("%c", A[i][j]); } } } //flip a piece to a different color void flip() { char A[board_size][board_size]; int i,j; if (A[i][j] == WHITE) { A[i][j] = BLACK; if (i-1>0) { if (A[i-1][j] == WHITE) { A[i-1][j] = BLACK; } else { A[i-1][j] = WHITE; } } if (j-1>0) { if (A[i][j-1] == WHITE) { A[i][j-1] = BLACK; } else { A[i][j-1] = WHITE; } } if (j+1<board_size) { if (A[i][j+1] == WHITE) { A[i][j+1] = BLACK; } else { A[i][j+1] = WHITE; } } if (i+1<board_size) { if (A[i+1][j] == WHITE) { A[i+1][j] = BLACK; } else { A[i+1][j] = WHITE; } } } else { A[i][j] = WHITE; if (i-1>0) { if (A[i-1][j] == WHITE) { A[i-1][j] = BLACK; } else { A[i-1][j] = WHITE; } } if (j-1>0) { if (A[i][j-1] == WHITE) { A[i][j-1] = BLACK; } else { A[i][j-1] = WHITE; } } if (j+1<board_size) { if (A[i][j+1] == WHITE) { A[i][j+1] = BLACK; } else { A[i][j+1] = WHITE; } } if (i+1<board_size) { if (A[i+1][j] == WHITE) { A[i+1][j] = BLACK; } else { A[i+1][j] = WHITE; } } } }
defacer Δημοσ. 10 Μαρτίου 2014 Δημοσ. 10 Μαρτίου 2014 Κάθε μία από τις συναρτήσεις σου ορίζει τη μεταβλητή board τοπική, οπότε πώς είναι δυνατόν να "δει" η μία το ίδιο ταμπλό που βλέπουν οι άλλες; Τα do...while(0) τι ρόλο παίζουν; Γιατί δεν τα βγάζεις τελείως; Η function checkEnd δε φαίνεται πως επιστρέφει αποτέλεσμα λαμβάνοντας υπόψη μόνο το τελευταίο κομμάτι του ταμπλό και άρα δε λειτουργεί σωστά με την καμία; Μέσα στη flip() έχεις ένα τεράστιο if/else όπου και στα δύο μέλη του έχεις ακριβώς τον ίδιο κώδικα με τα 4 if για τις παρακείμενες θέσεις -- γιατί δεν τα βγάζεις έξω από το if;
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα