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

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

Δημοσ.

Καλησπέρα. Προσπαθώ να φτιάξω μία προσομοίωση του παιχνιδιού νταμα. Όλα πηγαίναν καλά μέχρι που για κάποιο λόγο η συνάρτηση της αναδρομής που πρόσθεσα στο πρόγραμα δεν κάνει απολύτως τίποτα, σα να μην υπάρχει. Όταν ο χρήστης φάει ένα πούλι του αντιπάλου καλείται η συνάρτηση της αναδρομής για να φάει(με τυχαία επιλογή δεξιού αριστερού) όσα άλλα μπορεί να φάει το συγκεκριμένο πούλι. Βλέπεται κάποιο λάθος;

μπας και χρειαστεί στη 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);
                }           
         }
    
}

Δημοσ.

Δεν ξερω πως δουλευει ο αναδρομικος αλγοριθμος , αλλα παρατησα οτι δεν ελεγχεις για τα ορια του πινακα στη συναρτηση και αυτο μπορει να οδηγησει σε seg fault. Δηλαδη , αν περασεις για χ = 7, y = 7 , το board[ x+2 ]ειναι εκτος οριων

 

Επισης την srand για ποιο λογο την εχεις μεσα την συναρτηση ; Καλο ειναι να την καλεις μονο μια φορα μεσα στο προγραμμα σου . Αν χρειαζεσαι ψευδοτυχαιους αριθμους καλεις την rand()

Δημοσ.

έχω βάλει να ελένχει για τα όρια θα βάλω βελάκι εκεί που είναι όσο για το rand()%2 βγάζει τυχαίο αριθμό μεταξύ 0 και 1 έτσι; Yπάρχει πρόβλημα που καλώ την srand εκεί;

Δημοσ.

Γεμισε την αναδρομική συναρτηση με println σε κομβικά σημεία για να ξέρεις τι εκτελείται και τί οχι. Βάλε επίσης και μια προσωρινή παράμετρο depth στην αναδρομική συνάρτηση, ξεκίνα την με 0 και καθε φορά που καλείται περνα το depth+1, και τύπωσε και αυτό. Με αυτόν τον τρόπο θα ξερεις και το βαθος της αναδρομής στα μηνύματα που εμφανίζεις.

Δημοσ.

Γεμισε την αναδρομική συναρτηση με 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
  ...

}




Δημοσ.

Θα σου πρότεινα να ξαναγράψεις τη συνάρτηση από την αρχή (μπορείς να αναφερθείς στην ήδη υπάρχουσα αν κάπου κολλήσεις, αλλά μην το παρακάνεις). Είναι φανερό πως για διάφορους λόγους -- που περιλαμβάνουν το ότι οι μεταβλητές σου έχουν άσχημα ονόματα αλλά κυρίως το ότι κάνει παραπάνω από ένα πράγματα ταυτόχρονα -- η συνάρτηση έφτασε σε επίπεδο πολυπλοκότητας που δεν μπορεί κανείς εύκολα να κατανοήσει.

 

Κατά την άποψή μου η λύση δεν είναι να βάλεις printf και να πασαλείψεις ένα fix αλλά να την ξαναγράψεις με τέτοιο τρόπο που πλέον να γίνει κατανοητή (ενδεχομένως να το κάνεις παραπάνω από μία φορά). Μπορεί να μη παίξεις ντάμα το ίδιο γρήγορα, όμως νομίζω πως ο σκοπός δεν είναι η ντάμα αλλά το να μάθεις προγραμματισμό.

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα
  • Δημιουργία νέου...