monkey90 Δημοσ. 21 Μαΐου 2012 Δημοσ. 21 Μαΐου 2012 Καλησπέρα. Προσπαθώ να φτιάξω μία προσομοίωση του παιχνιδιού νταμα. Όλα πηγαίναν καλά μέχρι που για κάποιο λόγο η συνάρτηση της αναδρομής που πρόσθεσα στο πρόγραμα δεν κάνει απολύτως τίποτα, σα να μην υπάρχει. Όταν ο χρήστης φάει ένα πούλι του αντιπάλου καλείται η συνάρτηση της αναδρομής για να φάει(με τυχαία επιλογή δεξιού αριστερού) όσα άλλα μπορεί να φάει το συγκεκριμένο πούλι. Βλέπεται κάποιο λάθος; μπας και χρειαστεί στη main την καλώ έτσι. > else { usersMove(board, string); if(k!=0)//if the is an eating { recursion(board, xto(string), yto(string)); } turn=changeTurn(turn); } > void recursion(char board[8][8], int x, int y) { int k1=0,k2=0; srand((int)time(NULL)); if(board[x][y]=='X') { if(board[x+1][y+1]=='O' || board[x+1][y+1]=='k') { if(((x+2)<8) && ((y+2)<8)) //<--------------------------- { if(emptyBlock(board , x+2, y+2)==1) { k1=1; } } } if(board[x+1][y-1]=='O' || board[x+1][y-1]=='k') { if(((x+2)<8) && ((y-2)>-1)) //<---------------------- { if(emptyBlock(board , x+2, y-2)==1) { k2=1; } } } if(k1==1 && k2==1) { if(rand()%2==0) { board[x+2][y+2]=board[x][y]; board[x][y]='.'; board[x+1][y+1]='.'; recursion(board, x+2, y+2); } else { board[x+2][y-2]=board[x][y]; board[x][y]='.'; board[x+1][y-1]='.'; recursion(board, x+2, y-2); } } else if(k1==1) { board[x+2][y+2]=board[x][y]; board[x][y]='.'; board[x+1][y+1]='.'; recursion(board, x+2, y+2); } else if(k2==1) { board[x+2][y-2]=board[x][y]; board[x][y]='.'; board[x+1][y-1]='.'; recursion(board, x+2, y-2); } } else if(board[x][y]=='O') { if(board[x-1][y+1]=='X' || board[x-1][y+1]=='K') { if(((x-2)>-1) && ((y+2)<8))<------------------------- { if(emptyBlock(board , x-2, y+2)==1) { k1=1; } } } if(board[x-1][y-1]=='X' || board[x-1][y-1]=='K') { if(((x-2)>-1) && ((y-2)>-1)) <------------------- { if(emptyBlock(board , x-2, y-2)==1) { k2=1; } } } if(k1==1 && k2==1) { if(rand()%2==0) { board[x-2][y+2]=board[x][y]; board[x][y]='.'; board[x-1][y+1]='.'; recursion(board, x-2, y+2); } else { board[x-2][y-2]=board[x][y]; board[x][y]='.'; board[x-1][y-1]='.'; recursion(board, x-2, y-2); } } else if(k1==1) { board[x-2][y+2]=board[x][y]; board[x][y]='.'; board[x-1][y+1]='.'; recursion(board, x-2, y+2); } else if(k2==2) { board[x-2][y-2]=board[x][y]; board[x][y]='.'; board[x-1][y-1]='.'; recursion(board, x-2, y-2); } } }
ChRis6 Δημοσ. 21 Μαΐου 2012 Δημοσ. 21 Μαΐου 2012 Δεν ξερω πως δουλευει ο αναδρομικος αλγοριθμος , αλλα παρατησα οτι δεν ελεγχεις για τα ορια του πινακα στη συναρτηση και αυτο μπορει να οδηγησει σε seg fault. Δηλαδη , αν περασεις για χ = 7, y = 7 , το board[ x+2 ]ειναι εκτος οριων Επισης την srand για ποιο λογο την εχεις μεσα την συναρτηση ; Καλο ειναι να την καλεις μονο μια φορα μεσα στο προγραμμα σου . Αν χρειαζεσαι ψευδοτυχαιους αριθμους καλεις την rand()
monkey90 Δημοσ. 21 Μαΐου 2012 Μέλος Δημοσ. 21 Μαΐου 2012 έχω βάλει να ελένχει για τα όρια θα βάλω βελάκι εκεί που είναι όσο για το rand()%2 βγάζει τυχαίο αριθμό μεταξύ 0 και 1 έτσι; Yπάρχει πρόβλημα που καλώ την srand εκεί;
bnvdarklord Δημοσ. 21 Μαΐου 2012 Δημοσ. 21 Μαΐου 2012 Γεμισε την αναδρομική συναρτηση με println σε κομβικά σημεία για να ξέρεις τι εκτελείται και τί οχι. Βάλε επίσης και μια προσωρινή παράμετρο depth στην αναδρομική συνάρτηση, ξεκίνα την με 0 και καθε φορά που καλείται περνα το depth+1, και τύπωσε και αυτό. Με αυτόν τον τρόπο θα ξερεις και το βαθος της αναδρομής στα μηνύματα που εμφανίζεις.
NewProject Δημοσ. 21 Μαΐου 2012 Δημοσ. 21 Μαΐου 2012 Γεμισε την αναδρομική συναρτηση με println σε κομβικά σημεία για να ξέρεις τι εκτελείται και τί οχι. Βάλε επίσης και μια προσωρινή παράμετρο depth στην αναδρομική συνάρτηση, ξεκίνα την με 0 και καθε φορά που καλείται περνα το depth+1, και τύπωσε και αυτό. Με αυτόν τον τρόπο θα ξερεις και το βαθος της αναδρομής στα μηνύματα που εμφανίζεις. τα παραπανω μπορεις να τα βαλεις σε #ifdef / #endif αν θελεις να ειναι παντα εκει , π.χ. : > // apla orizeis h oxi to DEBUG #define DEBUG void recursion(char board[8][8], int x, int y) { int k1=0,k2=0; srand((int)time(NULL)); ... #ifdef DEBUG printf("debug message"); #endif ... }
defacer Δημοσ. 22 Μαΐου 2012 Δημοσ. 22 Μαΐου 2012 Θα σου πρότεινα να ξαναγράψεις τη συνάρτηση από την αρχή (μπορείς να αναφερθείς στην ήδη υπάρχουσα αν κάπου κολλήσεις, αλλά μην το παρακάνεις). Είναι φανερό πως για διάφορους λόγους -- που περιλαμβάνουν το ότι οι μεταβλητές σου έχουν άσχημα ονόματα αλλά κυρίως το ότι κάνει παραπάνω από ένα πράγματα ταυτόχρονα -- η συνάρτηση έφτασε σε επίπεδο πολυπλοκότητας που δεν μπορεί κανείς εύκολα να κατανοήσει. Κατά την άποψή μου η λύση δεν είναι να βάλεις printf και να πασαλείψεις ένα fix αλλά να την ξαναγράψεις με τέτοιο τρόπο που πλέον να γίνει κατανοητή (ενδεχομένως να το κάνεις παραπάνω από μία φορά). Μπορεί να μη παίξεις ντάμα το ίδιο γρήγορα, όμως νομίζω πως ο σκοπός δεν είναι η ντάμα αλλά το να μάθεις προγραμματισμό.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα