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

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

Δημοσ.

Καλησπέρα. Φτιάχνω ένα παιχνίδι και πρέπει να δίνω στον χρήστη την επιλογή να κάνει αναίρεση μιας κίνησης.

Αυτό πρέπει να γίνει με pop και push. Κάθε φορά που κάνει μία κίνηση να καλείται η push και όταν θέλει να

αναιρέση μια κίνηση να καλείται η pop. ο Πίνακας μου ειναι char array[8][8] (οχι με malloc). Έχω φτίαξει μια pop και push

αλλά για κάποιο λόγο δεν κάνει απολύτως τίποτα. Καμια συμβουλή? Ευχαριστώ

Επίσης είναι εφικτό η Pop και η push να είναι void? δηλαδή στην push να δίνω τον πίνακα

και να τον βάζει στο stack ενώ στην pop να δίνω τον πίνακα και να αντιγράφει τα στοιχεία του

πίνακα που βρίσκεται πάνω πάνω στο stack στον πίνακα που έδωσα?

 

 

>
typedef struct node
{
       char array[8][8];
       struct node *next;
}NODE;

typedef struct stack
{
       NODE *top;
       int size;
}STACK;

void pushStack(char[8][8], STACK*); //push sth stoiva
void popStack(char[8][8], STACK*); //pop apo th stoiva

void pushStack(char board[8][8], STACK *s)
{
    int i,j;
    NODE *p;
    p=(NODE *)malloc(sizeof(NODE));
    if(p==NULL)
    {
               printf("System out of memory. Exiting...\n");
               exit(1);
    }
    for(i=0;i<8;i++)
    {
         for(j=0;j<8;j++)
         {
             p->array[i][j] = board[i][j];
         }
    }
    p->next = s->top;
    s->top = p;
    (s->size)++;
}

void popStack(char board[8][8], STACK *s)
{
    int i,j;
    NODE *p;
    if(s->size==0)
    {
         printf("Sorry, stack is empty. Exiting...\n");
         exit(1);
    }
    for(i=0;i<8;i++)
    {
         for(j=0;j<8;j++)
         {
             board[i][j] = (s->top)->array[i][j];
         }
    }
    p=s->top;
    s->top=p->next;
    (s->size)--;
    free(p);
}

 

όλος ο κώδικας μπας και χρειαστεί.(δίνεις εντολές με τη μορφή πχ c3-d4)

 

 

>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <ctype.h>


typedef struct node
{
       char array[8][8];
       struct node *next;
}NODE;

typedef struct stack
{
       NODE *top;
       int size;
}STACK;

typedef struct FourCoords
{
       int x0,y0,x1,y1,x2,y2,x3,y3,t;
}FourCoords;

void gemisma(char [8][8]); //vazei ta poulia stis arxikes tous theseis
void printBoard(char [8][8]); //ektupwnei to tamplo
void play(char [8][8]);  //ulopoiei to paixnidi
int isValidMove(char[8][8], char[] , int, int, FourCoords); //elenxei an mia kinhsh einai egurh
int emptyBlock(char[8][8] , int, int); //elenxei ama h sugekrimenh thesh einai kenh
void recursion(char[8][8], int, int);  //anadromiko "fagwma" kaleitai otan o xrhsths kanei mia egurh kinhsh
void help(); //ektypwnei vohtheia
struct FourCoords checking(char[8][8], int);  //
int checkLoose(char[8][8], int); //elenxei an kapoios exei xasei to paixnidi
void pushStack(char[8][8], STACK*); //push sth stoiva
void popStack(char[8][8], STACK*); //pop apo th stoiva
int xfrom(char[]); //kanoun thn allagh gt o xrhsths ousiastika dinei anapoda tis suntetagmenes
int yfrom(char[]); //kai epishs metatrpeoun tis syntetagmenes poy dinei o xrhsths se arithmous
int xto(char[]);
int yto(char[]);  
void usersMove(char[8][8], char[]); //ulopoiei thn kinhsh tou paixth
int changeTurn(int); //allagh seiras
void terminating(); //ama epileksei o xrhsths na termatisei to paixnidi
char intToChar(int); //metatrepei int se char
void transformToK(char[8][8]); //metatrepei X se K kai O se k

int main(int argc, char *argv[])
{
   char board[8][8];
   gemisma(board);  
   play(board);
   system("PAUSE");	
   return 0;
}



void play(char board[8][8])
{
    printf("~~~~~~~~~~New Game~~~~~~~~~~\n");
    int pass;
    int turn=1; //X
    int k;
    FourCoords c;
    char string[10];
    STACK stack1;
    STACK *ptr;
    ptr= &stack1;
    stack1.top=NULL;
    stack1.size=0;
    do
    {
       k=0;
       pass=1;
       printBoard(board);
       if(checkLoose(board, turn)==1)
       {
               printf("exases\n");
               exit(1);             
       }
       c=checking(board, turn); //lathos me ta oria
       if(c.x0!=-1)
       {
            if(c.x2==-1)
            {                   
                   k=1;
                   printf("The disc at the location %c-%d can eat the disc and move at the location %c-%d\n", intToChar(c.y0),c.x0+1,intToChar(c.y1),c.x1+1);     
                   printf("You have to move this disc\n"); 
            }
            else
            {
                   k=2;//mlkia ena den mporei na faei 2 ektos an einai k 
                   printf("The disc at the location %c,%d can eat the disc and move at the location %c,%d\n", intToChar(c.y0),c.x0+1,intToChar(c.y1),c.x1+1);
                   printf("Also the disc at the location %c,%d can eat the disc and move at the location %c,%d\n", intToChar(c.y2),c.x2+1,intToChar(c.y3),c.x3+1);
                   printf("You have to move 1 of these discs\n"); 
            }
                          
       }
       if(turn==1)
       {
               printf("player X give your move: ");
       }
       else
       {
               printf("player O give your move: ");
       }
       do
       {
            scanf("%s", string);
            if(isValidMove(board, string, turn, k, c)==0)
            {
                  printf("give a valid move\n");
                  pass=0;                                 
            }
       }while(pass==0);
       if(strcmp( string, "z9-z9" ) == 0)//termatismos
       {
    
       }
       else if(strcmp( string, "u9-u9" ) == 0)//anairesh
       {
            popStack(board, ptr);
            turn=changeTurn(turn);
       }
       else
       {
            usersMove(board, string);
            if(k!=0)
            {
               recursion(board, xto(string), yto(string));
            }
            pushStack(board, ptr);
            turn=changeTurn(turn);    
       }
       transformToK(board);
   }while(strcmp( string, "z9-z9" ) != 0); 
}


void recursion(char board[8][8], int x, int y)
{
         int k1=0,k2=0,k3=0,k4=0;
         srand((int)time(NULL));
         if(board[x][y]=='X')
         {
		 if(((x+1)<7) && ((y+1)<7))
		 {
                if(board[x+1][y+1]=='O' || board[x+1][y+1]=='k')
                {                   
                       if(emptyBlock(board , x+2, y+2)==1)
                       {
                              k1=1;             
                       }                                   
                }
		 }
		 if((x+1<7) && (y-1>0))
		 {
                if(board[x+1][y-1]=='O' || board[x+1][y-1]=='k')
                {            
                       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(((x-1)>0) && ((y+1)<7))
		  {
                if(board[x-1][y+1]=='X' || board[x-1][y+1]=='K')
                {
                       if(emptyBlock(board , x-2, y+2)==1)
                       {
                              k1=1;             
                       }                                 
                }
		  }
		  if(((x-1)>0) && ((y-1)>0))
		  {
                if(board[x-1][y-1]=='X' || board[x-1][y-1]=='K')
                {
                       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]=='K')
         {
		 if(((x+1)<7) && ((y+1)<7))
		 {
                if(board[x+1][y+1]=='O' || board[x+1][y+1]=='k')
                {                   
                       if(emptyBlock(board , x+2, y+2)==1)
                       {
                              k1=1;             
                       }                                   
                }
		 }
		 if((x+1<7) && (y-1>0))
		 {
                if(board[x+1][y-1]=='O' || board[x+1][y-1]=='k')
                {            
                       if(emptyBlock(board , x+2, y-2)==1)
                       { 
                              k2=1;                                                 
                       }                                     
                }
		 }
		 if(((x-1)>0) && ((y+1)<7))
		 {
                if(board[x-1][y+1]=='O' || board[x-1][y+1]=='k')
                {                   
                       if(emptyBlock(board , x-2, y+2)==1)
                       {
                              k3=1;             
                       }                                   
                }
		 }
		 if((x-1>0) && (y-1>0))
		 {
                if(board[x-1][y-1]=='O' || board[x-1][y-1]=='k')
                {            
                       if(emptyBlock(board , x-2, y-2)==1)
                       { 
                              k4=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 && k3==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 && k4==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(k2==1 && k3==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(k2==1 && k4==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(k3==1 && k4==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(k3==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(k4==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]=='k')
         {
		 if(((x+1)<7) && ((y+1)<7))
		 {
                if(board[x+1][y+1]=='X' || board[x+1][y+1]=='K')
                {                   
                       if(emptyBlock(board , x+2, y+2)==1)
                       {
                              k1=1;             
                       }                                   
                }
		 }
		 if((x+1<7) && (y-1>0))
		 {
                if(board[x+1][y-1]=='X' || board[x+1][y-1]=='K')
                {            
                       if(emptyBlock(board , x+2, y-2)==1)
                       { 
                              k2=1;                                                 
                       }                                     
                }
		 }
		 if(((x-1)>0) && ((y+1)<7))
		 {
                if(board[x-1][y+1]=='X' || board[x-1][y+1]=='K')
                {                   
                       if(emptyBlock(board , x-2, y+2)==1)
                       {
                              k3=1;             
                       }                                   
                }
		 }
		 if((x-1>0) && (y-1>0))
		 {
                if(board[x-1][y-1]=='X' || board[x-1][y-1]=='K')
                {            
                       if(emptyBlock(board , x-2, y-2)==1)
                       { 
                              k4=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 && k3==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 && k4==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(k2==1 && k3==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(k2==1 && k4==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(k3==1 && k4==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(k3==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(k4==1)
            {
			board[x-2][y-2]=board[x][y];
               board[x][y]='.';
               board[x-1][y-1]='.';
               recursion(board, x-2, y-2); 
		 }
		 
	  }
    
}


void pushStack(char board[8][8], STACK *s)
{
    int i,j;
    NODE *p;
    p=(NODE *)malloc(sizeof(NODE));
    if(p==NULL)
    {
               printf("System out of memory. Exiting...\n");
               exit(1);
    }
    for(i=0;i<8;i++)
    {
         for(j=0;j<8;j++)
         {
             p->array[i][j] = board[i][j];
         }
    }
    p->next = s->top;
    s->top = p;
    (s->size)++;
}

void popStack(char board[8][8], STACK *s)
{
    int i,j;
    NODE *p;
    if(s->size==0)
    {
         printf("Sorry, stack is empty. Exiting...\n");
         exit(1);
    }
    for(i=0;i<8;i++)
    {
         for(j=0;j<8;j++)
         {
             board[i][j] = (s->top)->array[i][j];
         }
    }
    p=s->top;
    s->top=p->next;
    (s->size)--;
    free(p);
}

int checkLoose(char board[8][8], int turn)//etoimh nomizw na prosthesw se ola genika gia ta oria 
{
   int r=1,i=0,j=0; //epistrefei 1 an einai na termatistei
   if(turn==1)
   {
        do//to kanw me do while wste na vgei me to pou vrei kapoio
        {
              if(board[i][j]=='X')
              {
                  if(emptyBlock(board, i+1, j+1)==1)
                  {
                      r=0;
                  }
                  else if(board[i+1][j+1]=='O' || board[i+1][j+1]=='k')
                  {
                      if(emptyBlock(board, i+2, j+2)==1)
                      {
                            r=0;
                      } 
                  }
                  if(emptyBlock(board, i+1, j-1)==1)
                  {
                      r=0;
                  }
                  else if(board[i+1][j-1]=='O' || board[i+1][j-1]=='k')
                  {
                      if(emptyBlock(board, i+2, j-2)==1)
                      {
                            r=0;
                      } 
                  }
              }
              else if(board[i][j]=='K')
              {
                  if(emptyBlock(board, i+1, j+1)==1)
                  {
                      r=0;
                  }
                  else if(board[i+1][j+1]=='O' || board[i+1][j+1]=='k')
                  {
                      if(emptyBlock(board, i+2, j+2)==1)
                      {
                            r=0;
                      } 
                  }
                  if(emptyBlock(board, i+1, j-1)==1)
                  {
                      r=0;
                  }
                  else if(board[i+1][j-1]=='O' || board[i+1][j-1]=='k')
                  {
                      if(emptyBlock(board, i+2, j-2)==1)
                      {
                            r=0;
                      } 
                  }
                  if(emptyBlock(board, i-1, j+1)==1)
                  {
                      r=0;
                  }
                  else if(board[i-1][j+1]=='O' || board[i-1][j+1]=='k')
                  {
                      if(emptyBlock(board, i-2, j+2)==1)
                      {
                            r=0;
                      } 
                  }
                  if(emptyBlock(board, i-1, j-1)==1)
                  {
                      r=0;
                  }
                  else if(board[i-1][j-1]=='O' || board[i-1][j-1]=='k')
                  {
                      if(emptyBlock(board, i-2, j-2)==1)
                      {
                            r=0;
                      } 
                  }
                   
              }
              j=j+1;// gia na stamataei me to poy vrei kapoio pou mporei na kinithei
              if(j==8)
              {
                      i=i+1;
              }
              if(j==8)
              {
                      j=0;
              }
        }while(i!=8 && r!=1);
              
   }
   else
   {
        do//to kanw me do while wste na vgei me to pou vrei kapoio
        {
              if(board[i][j]=='O')
              {
                  if(emptyBlock(board, i-1, j+1)==1)
                  {
                      r=0;
                  }
                  else if(board[i-1][j+1]=='X' || board[i-1][j+1]=='K')
                  {
                      if(emptyBlock(board, i-2, j+2)==1)
                      {
                            r=0;
                      } 
                  }
                  if(emptyBlock(board, i-1, j-1)==1)
                  {
                      r=0;
                  }
                  else if(board[i-1][j-1]=='X' || board[i-1][j-1]=='K')
                  {
                      if(emptyBlock(board, i-2, j-2)==1)
                      {
                            r=0;
                      } 
                  }
              }
              else if(board[i][j]=='k')
              {
                  if(emptyBlock(board, i+1, j+1)==1)
                  {
                      r=0;
                  }
                  else if(board[i+1][j+1]=='X' || board[i+1][j+1]=='K')
                  {
                      if(emptyBlock(board, i+2, j+2)==1)
                      {
                            r=0;
                      } 
                  }
                  if(emptyBlock(board, i+1, j-1)==1)
                  {
                      r=0;
                  }
                  else if(board[i+1][j-1]=='X' || board[i+1][j-1]=='K')
                  {
                      if(emptyBlock(board, i+2, j-2)==1)
                      {
                            r=0;
                      } 
                  }
                  if(emptyBlock(board, i-1, j+1)==1)
                  {
                      r=0;
                  }
                  else if(board[i-1][j+1]=='X' || board[i-1][j+1]=='K')
                  {
                      if(emptyBlock(board, i-2, j+2)==1)
                      {
                            r=0;
                      } 
                  }
                  if(emptyBlock(board, i-1, j-1)==1)
                  {
                      r=0;
                  }
                  else if(board[i-1][j-1]=='X' || board[i-1][j-1]=='K')
                  {
                      if(emptyBlock(board, i-2, j-2)==1)
                      {
                            r=0;
                      } 
                  }
                   
              }
              j=j+1;// gia na stamataei me to poy vrei kapoio pou mporei na kinithei
              if(j==8)
              {
                      i=i+1;
              }
              if(j==8)
              {
                      j=0;
              }
        }while(i!=8 && r!=0);    
   }
   return r;
}


//synarthsh gia to an uparxei anagastiko fagwma
struct FourCoords checking(char board[8][8], int turn) 
{
   int i,j,k=0;
   FourCoords r = {-1,-1,-1,-1,-1,-1,-1,-1,0};
   for(i=0;i<8;i++)
   {
      for(j=0;j<8;j++)
      {             
         if(turn==1)
         {
                if(board[i][j]=='X' || board[i][j]=='K')//gia X kai K
                {  if(i+1<7 && j+1<7)
                   {
                       if(board[i+1][j+1]=='O' || board[i+1][j+1]=='k')
                       {
                             if(board[i+2][j+2]=='.') 
                             {
                                  if(k==1)
                                  {
                                      r.x2=i;
                                      r.y2=j;
                                      r.x3=i+2;
                                      r.y3=j+2;
                                      r.t=r.t+1;  
                                  }
                                  else
                                  {
                                      r.x0=i;
                                      r.y0=j;
                                      r.x1=i+2;
                                      r.y1=j+2;
                                      r.t=r.t+1;
                                      k=1; 
                                  }                  
                             } 
                                            
                       }
				}
				if(i+1<7 && j-1>0)
				{
                       if(board[i+1][j-1]=='O' || board[i+1][j-1]=='k')
                       {
                            if(board[i+2][j-2]=='.')
                            {
                                  if(k==1)
                                  {
                                     r.x2=i;
                                     r.y2=j;
                                     r.x3=i+2;
                                     r.y3=j-2;
                                     r.t=r.t+1;
                                  }
                                  else
                                  {                 
                                     r.x0=i;
                                     r.y0=j;
                                     r.x1=i+2;
                                     r.y1=j-2;
                                     r.t=r.t+1;
                                     k=1;  
                                  }                
                            }
                       }
				}                                      
                }
                if(board[i][j]=='K')//gia K
                {
				 if(i-1>0 && j+1<7)
				 {
                       if(board[i-1][j+1]=='O' || board[i-1][j+1]=='k')
                       {
                             if(board[i-2][j+2]=='.') //mporei na vgei eksw apo ta oria na to tsekarw meta
                             {
                                  if(k==1)
                                  {
                                     r.x2=i;
                                     r.y2=j;
                                     r.x3=i-2;
                                     r.y3=j+2;
                                     r.t=r.t+1;     
                                  }
                                  else
                                  {
                                     r.x0=i;
                                     r.y0=j;
                                     r.x1=i-2;
                                     r.y1=j+2;
                                     r.t=r.t+1;
                                     k=1; 
                                  }                  
                             }                  
                       }
				}
				if(i-1>0 && j-1>0)
				{
                       if(board[i-1][j-1]=='O' || board[i-1][j-1]=='k')
                       {
                             if(board[i-2][j-2]=='.')
                             {
                                  if(k==1)
                                  {
                                     r.x2=i;
                                     r.y2=j;
                                     r.x3=i-2;
                                     r.y3=j-2;
                                     r.t=r.t+1;     
                                  }
                                  else
                                  {
                                     r.x0=i;
                                     r.y0=j;
                                     r.x1=i-2;
                                     r.y1=j-2;
                                     r.t=r.t+1;
                                     k=1; 
                                  }                  
                             }                  
                       }
				}
                                                    
                }    
         }
         
         else//turn=2
         {
                if(board[i][j]=='O' || board[i][j]=='k')//gia O kai k
                {
				 if(i-1>0 && j+1<7)
				 {
                       if(board[i-1][j+1]=='X' || board[i-1][j+1]=='K')
                       {
                             if(board[i-2][j+2]=='.') //mporei na vgei eksv apo ta oria na to tsekarw meta
                             {
                                  if(k==1)
                                  {
                                      r.x2=i;
                                      r.y2=j;
                                      r.x3=i-2;
                                      r.y3=j+2;
                                      r.t=r.t+1;  
                                  }
                                  else
                                  {
                                      r.x0=i;
                                      r.y0=j;
                                      r.x1=i-2;
                                      r.y1=j+2;
                                      r.t=r.t+1;
                                      k=1; 
                                  }                  
                             }                 
                       }
				}
				if(i-1>0 && j-1>0)
				{
                       if(board[i-1][j-1]=='X' || board[i-1][j-1]=='K') ////edw ta peiraksa
                       {
                            if(board[i-2][j-2]=='.')
                            {
                                  if(k==1)
                                  {
                                     r.x2=i;
                                     r.y2=j;
                                     r.x3=i-2;
                                     r.y3=j-2;
                                     r.t=r.t+1;
                                  }
                                  else
                                  {                 
                                     r.x0=i;
                                     r.y0=j;
                                     r.x1=i-2;
                                     r.y1=j-2;
                                     r.t=r.t+1;
                                     k=1;  
                                  }                
                            }   
				     }                                   
                }
                if(board[i][j]=='k')//gia K
                {
				 if(i+1<7 && j+1<7)
				 {
                       if(board[i+1][j+1]=='X' || board[i+1][j+1]=='K')
                       {
                          if(((i+2)<8) && ((j+2)<8))
                          {
                                  if(k==1)
                                  {
                                     r.x2=i;
                                     r.y2=j;
                                     r.x3=i+2;
                                     r.y3=j+2;
                                     r.t=r.t+1;     
                                  }
                                  else
                                  {
                                     r.x0=i;
                                     r.y0=j;
                                     r.x1=i+2;
                                     r.y1=j+2;
                                     r.t=r.t+1;
                                     k=1; 
                                  }                  
                             }                  
                       }
				}
				if(i+1<7 && j-1>0)
				{
                       if(board[i+1][j-1]=='X' || board[i+1][j-1]=='K')
                       {
                             if(board[i+2][j-2]=='.')
                             {
                                  if(k==1)
                                  {
                                     r.x2=i;
                                     r.y2=j;
                                     r.x3=i+2;
                                     r.y3=j-2;
                                     r.t=r.t+1;     
                                  }
                                  else
                                  {
                                     r.x0=i;
                                     r.y0=j;
                                     r.x1=i+2;
                                     r.y1=j-2;
                                     r.t=r.t+1;
                                     k=1; 
                                  }                  
                             }
                                            
                       }
				}
                                                    
                }    
         }
      }             
   }
 }  
 return r;
}


int emptyBlock(char board[8][8] , int i, int j)//etoimh O_o
{
   int r=0;
   if(board[i][j]=='.')
   {
       r=1;
   }
   return r;
   
}


int isValidMove(char board[8][8], char n[], int turn, int k, FourCoords l)//mallon etoimh mporei na exei kanena lathos
{
   int r=1,a,b,c,d;
   a=xfrom(n);
   b=yfrom(n);
   c=xto(n);
   d=yto(n);
   if(strlen(n)!=5)
   {
       printf("The length of the input should be 5 letters long example: b6-c5\n");
       r=0;
   }
   else if( (isalpha(n[0])==0) || (isdigit(n[1])==0) || (n[2]!='-') || (isalpha(n[3])==0) || (isdigit(n[4])==0) )
   {
       printf("The input should be like this b6-c5\n");
       r=0;
   }
   else if(strcmp( n, "z9-z9" ) == 0 || strcmp( n, "u9-u9" ) == 0)
   {
        if(strcmp( n, "z9-z9" ) == 0)
        {
              printf("you choosed to terminate the program\n");
        }
        else
        {
            printf("you choosed to recall a move\n");
        }
   }
   else if(a<0 || a>7 || b<0 || b>7 || c<0 || c>7 || d<0 || d>7)
   {
        printf("The input should be like this b6-c5.You can't move out of the board. You can use letter from a to h and numbers from 1 to 8\n"); 
        r=0;
   }
   if(turn==1)
   {
        if(emptyBlock(board, a, ==1)    
        {
            printf("there is no disc at the location you choosed\n");
            r=0;                  
        } 
        else if(board[a][b]=='O' || board[a][b]=='k' ) //ama paizei ta swsta poulia
        {
            printf("you can't move your anemies discs\n");
            r=0;
        }
        else if((c-a)!=1)   // ama einai swsth h grammh    <-----edw einai to provlhma
        {
             if(k==0) //k k=0 an den uparxei anagastiko fagwma
             {
                 printf("wrong move\n");
                 r=0;
             }
        }                        
        else if(b-d!=1 && d-b!=1)  //ama einai swsth h sthlh
        {
             if(k==0)
             {
                  printf("wrong move\n");
                  r=0;
             }
        }
        else if(emptyBlock(board, c, d)==0) 
        {              
              printf("you can't move at the location you choosed because there is oneother disc\n"); 
              r=0;                                    
        }                                
   }
   else
   {
        if(emptyBlock(board, a, ==1)    
        {
            printf("there is no disc at the location you choosed\n");
            r=0;                  
        } 
        else if(board[a][b]=='X' || board[a][b]=='K') //ama paizei ta swsta poulia
        {
            printf("you can't move your anemies discs\n");
            r=0;
        }
        else if((a-c)!=1)   // ama einai swsth h grammh <--- epishs edw
        {
             if(k==0)
             {
                 printf("wrong move\n");
                 r=0;
             }
        }                        
        else if(b-d!=1 && d-b!=1)  //ama einai swsth h sthlh
        {
             if(k==0)
             {
                 printf("wrong move\n");
                 r=0;
             }
        }
        else if(emptyBlock(board, c, d)==0) 
        {              
              printf("you can't move at the location you choosed because there is oneother disc\n"); 
              r=0;                                    
        }                                
   }
   if((strcmp( n, "z9-z9" ) == 0) || (strcmp( n, "u9-u9" ) == 0))
   {
	r=1;
}
else
{
	if(k==1)
       {
             if(l.x0!=a || l.y0!=b || l.x1!=c || l.y1!=d)
             {
                  printf("You have to eat the disc, you aren't allowed to make oneother move\n");
                  r=0;      
             }  
       }
       if(k==2)
       {
             if((l.x0!=a || l.y0!=b || l.x1!=c || l.y1!=d) && (l.x2!=a || l.y2!=b || l.x3!=c || l.y3!=d))
             {
                 printf("You have to eat the disc, you aren't allowed to make oneother move\n");    
                 r=0;    
             }            
       }
}  
   return r;
}
    



void printBoard(char board[8][8])//etoimh
{
    int i,j;
    printf("    a b c d e f g h\n");
    printf("  -------------------\n");
    for(i=0;i<8;i++)
    {
                    printf("%d | ", i+1);
                    for(j=0;j<8;j++)
                    {
                                    printf("%c ", board[i][j]);
                    
                    }
                    printf(" | %d\n", i+1);
    }
    printf("  -------------------\n");
    printf("    a b c d e f g h\n");
}



void gemisma(char board[8][8])//etoimh
{
    int i,j;
    for(i=0;i<8;i++)
    {
                    for(j=0;j<8;j++)
                    {
                                    board[i][j]= '.';
                    
                    }
    }
    board[0][0]='X';
    board[0][2]='X';
    board[0][4]='X';
    board[0][6]='X';
    board[1][1]='X';
    board[1][3]='X';
    board[1][5]='X';
    board[1][7]='X';
    board[2][0]='X';
    board[2][2]='X';
    board[2][4]='X';
    board[2][6]='X';
    board[5][1]='O';
    board[5][3]='O';
    board[5][5]='O';
    board[5][7]='O';
    board[6][0]='O';
    board[6][2]='O';
    board[6][4]='O';
    board[6][6]='O';
    board[7][1]='O';
    board[7][3]='O';
    board[7][5]='O';
    board[7][7]='O';

}

void usersMove(char board[8][8], char string[10])
{
    if(board[xfrom(string)][yfrom(string)]=='X')
    {
           if(yto(string)-yfrom(string)<0)
           {
                board[xfrom(string)+1][yfrom(string)-1]='.';                        
           }
           else
           {
                board[xfrom(string)+1][yfrom(string)+1]='.';      
           }
           board[xto(string)][yto(string)]=board[xfrom(string)][yfrom(string)];
           board[xfrom(string)][yfrom(string)]='.';
                                             
    }
    else if(board[xfrom(string)][yfrom(string)]=='O')
    {
           if(yto(string)-yfrom(string)<0)
           {
                board[xfrom(string)-1][yfrom(string)-1]='.';                        
           }
           else
           {
                board[xfrom(string)-1][yfrom(string)+1]='.';      
           }
           board[xto(string)][yto(string)]=board[xfrom(string)][yfrom(string)];
           board[xfrom(string)][yfrom(string)]='.';
         
    }
    else if(board[xfrom(string)][yfrom(string)]=='K')
    {
           if(yto(string)-yfrom(string)<0)
           {
                if(xto(string)-xfrom(string)<0)
                {
                    board[xfrom(string)-1][yfrom(string)-1]='.'; 
                }
                else
                {
                    board[xfrom(string)+1][yfrom(string)-1]='.'; 
                }
                                        
           }
           else
           {
                if(xto(string)-xfrom(string)<0)
                {
                    board[xfrom(string)-1][yfrom(string)+1]='.'; 
                }
                else
                {
                    board[xfrom(string)+1][yfrom(string)+1]='.'; 
                }     
           }
           board[xto(string)][yto(string)]=board[xfrom(string)][yfrom(string)];
           board[xfrom(string)][yfrom(string)]='.';
         
         
    }
    else if(board[xfrom(string)][yfrom(string)]=='k')
    {
           if(yto(string)-yfrom(string)<0)
           {
                if(xto(string)-xfrom(string)<0)
                {
                    board[xfrom(string)-1][yfrom(string)-1]='.'; 
                }
                else
                {
                    board[xfrom(string)+1][yfrom(string)-1]='.'; 
                }
                                        
           }
           else
           {
                if(xto(string)-xfrom(string)<0)
                {
                    board[xfrom(string)-1][yfrom(string)+1]='.'; 
                }
                else
                {
                    board[xfrom(string)+1][yfrom(string)+1]='.'; 
                }     
           }
           board[xto(string)][yto(string)]=board[xfrom(string)][yfrom(string)];
           board[xfrom(string)][yfrom(string)]='.';         
    }
}

int xfrom(char string[10])
{
   int r;
   r=(int)string[1]-49;
   return r;
}

int yfrom(char string[10])
{
   int r;
   r=(int)string[0]-97;
   return r;
}

int xto(char string[10])
{
   int r;
   r=(int)string[4]-49;
   return r;
}

int yto(char string[10])
{
   int r;
   r=(int)string[3]-97;
   return r;
}

char intToChar(int i)
{
    char c;
    c=(char)(i+97);
    return c;
}

int changeTurn(turn)
{
   if(turn==1)
   {
       turn=2;
   }
   else
   {
       turn=1;
   }
   return turn;
}

void transformToK(char board[8][8])
{
    int i;
    for(i=0;i<8;i++)
    {
         if(board[0][i]=='O')
         {
             board[0][i]='k';
         }
         else if(board[7][i]=='X')
         {
             board[7][i]='K';
         }
    }
}

void help()
{
    printf("bla bla bla bla se voithaw twra bla bla bla\n");    
}
    

 

 

Δημοσ.

Γιατί ανοίγεις συνέχεια νέα νήματα για το ίδιο πρόγραμμα; Μας είναι πολύ πιο εύκολο να παρακολουθούμε ένα νήμα αντί για πολλά ;)

 

Τώρα για το συγκεκριμένο ερώτημα, θεωρώ πως το υλοποιείς αχρείαστα πολύπλοκα και κυρίως inefficiently. Από ότι βλέπω στον κώδικα σου, το κάθε node της stack περιέχει ολόκληρο το instance του board, δηλαδή 64 κελιά.

 

Για να κρατάς τις κινήσεις του παίκτη το μόνο που χρειάζεσαι είναι μια στοίβα με τη θέση της κίνησης (και όχι όλου του board). Εφόσον το board το έχεις ορίσει ως 2D array (υποθέτω δεν σε εξυπηρέτησε ο ορισμός του ως 1D που σου είχα υποδείξει σε προηγούμενο νήμα) χρειάζεσαι στο κάθε node της στοίβας τις 2 συντεταγμένες της κίνησης (θέσης)... με το 1D approach θα χρειαζόσουν απλά έναν int.

 

>
/* custom types */
typedef struct Pos {
int row;
int col;
} Pos;
typedef struct Stack {
Pos pos;
struct Stack *back;
} Stack;

/* function prototypes */
void stack_push( Stack **stack, Pos pos );
Pos stack_pop( Stack **stack );

/* program entry */
int main( void )
{
Pos pos = {-1, -1};    	// temp var
Stack *stack1 = NULL;   // stack of 1st player
...
/* record player1 moves */
while ( make_move( player1, &pos) )
  	   stack_push( &stack1, pos );
...
/* undo player1 moves */
while ( NULL != stack1 ) {
  	   pos = stack_pop( &stack1 );
  	   printf( "Undo'ed move: %d, %d\n", pos.row, pos.col );
}
  ...
}

Την στοίβα μπορείς να την υλοποιήσεις ως απλά συνδεδεμένη λίστα (και προφανώς χρειάζεται να κάνεις και error-checking στον παραπάνω κώδικα).

 

Επίσης, το pos θα μπορούσες εναλλακτικά να το περνάς ως const δείκτη στην push().

Δημοσ.

Καταρχάς συγνώμη που για κάθε μου απορία ανοίγω και καινούργιο θέμα. :mrgreen:

Στην άσκηση λέει στη στοίβα να μην αποθηκεύουμε την κίνηση του χρήστη

αλλά όλον τον πίνακα.

Δημοσ.

Εκφώνηση. Το κομμάτι περι στοίβας γράφει Αναίρώντας κινήσεις με μεγάλα γράμματα. Έχω βάλει βελάκι εκεί που είναι.

 

 

Εκτέλεση από τη γραμμή εντολών

Ο χρήστη̋ θα μπορεί να τρέξει το πρόγραμμα από τη γραμμή εντολών με του̋

τρόπου̋ που περιγράφονται παρακάτω. Λύσει̋ που δεν θα υλοποιούν αυτή τη

λειτουργικότητα θα έχουν ποινή -10%

10%.

myCheckers –n

τρέχει το πρόγραμμα και επιτρέπει στον χρήστη

να ξεκινήσει να παίξει ένα καινούριο παιχνίδι

ντάμα̋

myCheckers –l christos.chk

τρέχει το πρόγραμμα και επιτρέπει στον χρήστη

να φορτώσει και να συνεχίσει το παίξιμο μια̋

αποθηκευμένη̋ παρτίδα̋ από ένα αρχείο που

δίνεται από τον χρήστη (στο συγκεκριμένο

παράδειγμα το christos.chk)

myCheckers –h

τυπώνει βοήθεια στον χρήστη που του εξηγεί με

τι παραμέτρου̋ μπορεί να τρέξει το πρόγραμμα

παιχνιδιού

Εκκίνηση και παίξιμο του παιχνιδιού

Αν ο χρήστη̋ επίλεξει να παίξει ένα καινούριο παιχνίδι ντάμα̋ (τρέχοντα̋ το

παιχνίδι με την παράμετρο -n) τότε το πρόγραμμά σα̋ θα πρέπει να κάνει τα

εξή̋:

2

1. Θα πρέπει να δημιουργεί ένα καινούριο ταμπλό παιχνιδιού αρχικοποιώντα̋

έναν πίνακα διαστάσεων 8x8 όπου επάνω του θα τοποθετούνται τα πιόνια

8x

των δύο παικτών στι̋ αρχικέ̋ του̋ θέσει̋. Οι γραμμέ̋ του πίνακα θα είναι

αριθμημένε̋ από το 1-8 και οι στήλε̋ του από το a-h, όπω̋ φαίνεται

παρακάτω. Για τα δύο είδη πιονιών μπορείτε να χρησιμοποιείσετε όποιον

χαρακτήρα θέλετε (στο παράδειγμα χρησιμοποιούνται τα Ο και Χ), ενώ για

το κενό τετράγωνο χρησιμοποιείστε την τελεία. Υλοποιήσει̋ που δεν θα

ακολουθούν την παρακάτω αναπαράσταση θα έχουν ποινή -10%.

1

2

3

4

5

6

7

8

a b c d e f g h

-------------------

| Χ . Χ . Χ . Χ . |

| . Χ . Χ . Χ . Χ |

| Χ . Χ . Χ . Χ . |

| . . . . . . . . |

| . . . . . . . . |

| . Ο . Ο . Ο . Ο |

| Ο . Ο . Ο . Ο . |

| . Ο . Ο . Ο . Ο |

-------------------

a b c d e f g h

1

2

3

4

5

6

7

8

1

2

3

4

5

6

7

8

Σχήμα 1. Αρχικό ταμπλό του παιχνιδιού

a b c d e f g h

-------------------

| Χ . Χ . Χ . . . |

| . Χ . . . Χ . Χ |

| Χ . Χ . Χ . Χ . |

| . Χ . Χ . . . Ο |

| . . . . . . Ο . |

| . Ο . Ο . Ο . . |

| Ο . Ο . Ο . Ο . |

| . Ο . Ο . Ο . . |

-------------------

a b c d e f g h

1

2

3

4

5

6

7

8

Σχήμα

Σχήμα 2. Ταμπλό του παιχνιδιού μετά

από μερικέ̋ κινήσει̋

2. Η ντάμα είναι παιχνίδι δύο παικτών, οπότε θα πρέπει να ζητάτε κάθε φορά

από τον παίκτη που είναι η σειρά του να παίξει να δώσει την κίνηση που

θέλει να κάνει με τη μορφή εντολή̋ από το πληκτρολόγιο. Η εντολή θα δίνει

τι̋ συντεταγμένε̋ από το πιόνι που θα μετακινηθεί και τι̋ συντεταγμένε̋

παύλα.

του κενού τετραγώνου που θα τοποθετηθεί χωρισμένα με μία παύλα Ο

τρόπο̋

που

θα

φαίνεται

αυτό

στον

χρήστη

φαίνεται

παρακάτω.

Υλοποιήσει̋ που θα ζητούν την κίνηση διαφορετικά θα έχουν ποινή -10%.

> player X give your move: a3-b4

> player O give your move: b6-a5

Αν ο χρήστη̋ δώσει τι̋ τιμέ̋ σε άλλη μορφή ή δώσει μη έγκυρε̋ τιμέ̋, το

πρόγραμμά σα̋ θα πρέπει να του εμφανίζει κατάλληλο μήνυμα και να του

ζητάει την εισαγωγή νέα̋ κίνηση̋. Θα πρέπει σε κάθε περίπτωση να

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

χαρακτήρων και αλφαριθμητικών.

3. Σε κάθε κίνηση του παίκτη θα πρέπει να γίνεται έλεγχο̋ αν υπάρχει κάποιο

αναγκαστικό «φάγωμα» σε πιόνι του αντιπάλου, και αν υπάρχει θα πρέπει

να επισημαίνεται στον παίκτη και να μην επιτρέπεται άλλη κίνηση. Σε

περίπτωση που ένα πιόνι μπορεί να φάει με διαδοχικέ̋ κινήσει̋ πολλά

αντίπαλα πιόνια, τότε ο χρήστη̋ θα πρέπει να κάνει την πρώτη κίνηση και

μετά με αναδρομικό τρόπο το πρόγραμμά σα̋ θα πρέπει να εκτελεί τι̋

υπόλοιπε̋ κινήσει̋ εώ̋ ότου δεν μπορούν να φαγωθούν άλλα πιόνια, ή το

πιόνι φτάσει στην απέναντι άκρη του ταμπλό. Υλοποιήσει̋ χωρί̋ αυτήν τη

λειτουργικότητα ή χωρί̋ την αναδρομή θα έχουν ποινή -25%.

3

4. Αν ο χρήστη̋ εισάγει ω̋ εντολή κίνηση̋ το z9-z9 σημαίνει ότι επιθυμεί να

τερματίσει την τρέχουσα παρτίδα, οπότε θα πρέπει να τον ρωτήσετε αν

θέλει να αποθηκεύσει την παρτίδα ή να παίξει μία νέα. Στην περίπτωση που

θέλει να αποθηκεύσει την παρτίδα ζητάτε από τον χρήστη το όνομα του

αρχείου

κειμένου

στο

οποίο

θέλει

να

το

αποθηκεύσει.

Τα

αρχεία

αποθήκευση̋ πρέπει πάντα να έχουν προέκταση .chk, την οποία θα

προσθέτετε εσεί̋ στο τέλο̋ του ονόματο̋ που δίνει ο χρήστη̋. Λύσει̋ που

δεν θα υλοποιούν αυτή τη λειτουργικότητα θα έχουν ποινή -20%

20%.

5. Σε κάθε κίνηση παίκτη το πρόγραμμά σα̋ θα πρέπει να ελέγχει αν ο παίκτη̋

μπορεί να κινήσει τα πιόνια του (ή αν του έχουν μείνει πιόνια), και αν όχι να

τερματίζει το παιχνίδι ανακοινώνοντα̋ τον παίκτη που κέρδισε.

Αναιρώντα̋

Αναιρώντα̋ κινήσει̋ <-------------------------------------------------

Το πρόγραμμά σα̋ θα πρέπει να δίνει τη δυνατότητα να αναιρεθούν κινήσει̋

των παικτών. Αν ο παίκτη̋ δώσει την εντολή u9-u9, τότε σημαίνει ότι θέλει να

αναιρέσει την τελευταία του κίνηση. Οι χρήστε̋ μπορούν να αναιρέσουν όσε̋

επιθυμούν

μούν,

κινήσει̋ επιθυμούν ακόμα και αν οι αναιρέσει̋ αυτέ̋ επιστρέψουν το παιχνίδι

στην αρχή του.

Για να υλοποιήσετε αυτήν τη λειτουργία θα χρειαστείτε μία στοίβα (θυμηθείτε

ότι η στοίβα είναι η απλούστερη μορφή απλά συνδεδεμένη̋ λίστα̋: ένα στοιχείο

είσάγεται μόνο στην αρχή τη̋ στοίβα̋, και εξάγεται μόνο από την αρχή τη̋)

στην οποία θα είσάγετε ένα στοιχείο κάθε φορά που εκτελείται μία κίνηση από

έναν παίκτη, και θα εξάγετε ένα στοιχείο κάθε φορά που ο παίκτη̋ αναιρεί μία

του.

κίνησή του Για να μη μπλέξετε με συμβολισμού̋ κινήσεων, μπορείτε να

αποθηκεύετε στη στοίβα ολόκληρο το ταμπλό μετά από κάθε κίνηση. Έτσι, η

αναίρεση

κινήσεων

γίνεται

ευκολότερη

καθώ̋

δεν

θα

χρειάζεται

να

ανασυνθέτετε το ταμπλό από τι̋ κινήσει̋ των παικτών, απλά θα πρέπει να

τυπώνετε το ταμπλό που είναι αποθηκευμένο στο στοιχείο τη̋ στοίβα̋ που

εξάγετε. Λύσει̋ που δεν θα υλοποιούν την αναίρεση κινήσεων θα έχουν ποινή

-25%.

25%

Η αναίρεση κινήσεων από του̋ παίκτε̋ θα καταγράφεται μόνο για την

τρέχουσα παρτίδα και δεν χρειάζεται να αποθηκεύεται. Επομένω̋ αν ένα̋

χρήστη̋ φορτώσει μια ημιτελή παρτίδα το ιστορικό των κινήσεων τη̋ παρτίδα̋

θα είναι κενό και θα ξεκινά να καταγράφεται με την πρώτη κίνηση συνέχιση̋

τη̋ παρτίδα̋.

Hints and Tips

Στο αρχείο που θα αποθηκεύετε το ταμπλό του παιχνιδιού μπορεί να

χρειαστεί να αποθηκεύσετε και άλλε̋ πληροφορίε̋ (όπω̋ για παράδειγμα

ποιο̋ παίκτη̋ έχει σειρά να παίξει, τα ονόματα των παικτών, κλπ).

Σκεφτείτε τι χρειάζεται να αποθηκεύσετε και αποφασίστε μια κατάλληλη

αναπαράσταση για το αρχείο σα̋.

4

∆ομήστε

τον

κώδικά

σα̋

χρησιμοποιώντα̋

κατάλληλε̋

συναρτήσει̋.

Ενδεικτικά αναφέρονται μερικέ̋ από τι̋ συναρτήσει̋ που πρέπει να

ορίσετε:

isValidMove:

ελέγχει αν η κίνηση του παίκτη είναι έγκυρη και

επιστρέφει ανάλογα 1 (TRUE) ή 0 (FALSE).

emptyBlock: ελέγχει αν η θέση που θα μετακινηθεί το πούλι είναι κενή.

Χρησιμοποιείται από την isValidMove και επιστρέφει ανάλογα 1 (TRUE) ή

0 (FALSE).

pushStack: γεμίζει τι̋ τιμέ̋ ενό̋ στοιχείου τη̋ στοίβα̋ και το εισάγει

στην κορυφή τη̋ στοίβα̋. Αν είχαμε λίστα, η συνάρτηση θα ονομαζόταν

insert, απλά συνηθίζεται στι̋ στοίβε̋ η συνάρτηση να λέγεται push.

popStack:

διαγράφει το κορυφαίο στοιχείο τη̋ στοίβα̋. Αν είχαμε

λίστα, η συνάρτηση θα ονομαζόταν delete, απλά συνηθίζεται στι̋

στοίβε̋ η συνάρτηση να λέγεται pop.

saveToFile:

ανοίγει το αρχείο κειμένου που υπέδειξε ο χρήστη̋,

αποθηκεύει το ταμπλό τη̋ τρέχουσα̋ παρτίδα̋ στο αρχείο αυτό, και

κλείνει το αρχείο.

loadFromFile: ανοίγει το αρχείο κειμένου που υπέδειξε ο χρήστη̋,

διαβάζει το ταμπλό τη̋ παρτίδα̋ που έχει αποθηκευτεί στο αρχείο αυτό,

το φορτώνει σε ένα ταμπλό που βρίσκεται στην κύρια μνήμη, και κλείνει

το αρχείο.

printBoard: τυπώνει το ταμπλό του παιχνιδιού στην οθόνη.

∆εν χρειάζεστε μόνο αυτέ̋ τι̋ συναρτήσει̋! Χωρίστε το πρόβλημα σε

υποπροβλήματα και δημιούργείστε τι̋ συναρτήσει̋ που θα λύνουν κάθε

υποπρόβλημα. ∆ομήστε τον κώδικά σα̋ με συναρτήσει̋ και μην γράψετε όλη

main.

 

 

 

Δημοσ.

Έχει δίκιο τελικά, γιατί εγώ δεν υπολόγισα πως μετά την αναίρεση πρέπει να ανασυντεθεί το ταμπλό :fear:

 

 

 

>
#define BRD_SIDE	8
#define BRD_SIZEOF	( BRD_SIDE * BRD_SIDE * sizeof(char) )

typedef struct Stack {
char  board[ BRD_SIDE ][ BRD_SIDE ];
struct Stack *back;
} Stack;

/* -------------------------------- */
bool stack_push( Stack **stack, char board[ BRD_SIDE ][ BRD_SIDE ] )
{
Stack *node = NULL;

if ( !stack || !board )
	return false;

if ( NULL == (node = malloc( sizeof(Stack) )) )
	return false;

memcpy( node->board, board, BRD_SIZEOF );
node->back = (NULL == *stack) ? NULL : *stack;
*stack = node;

return true;
}

/* -------------------------------- */
bool stack_pop( Stack **stack, char board[bRD_SIDE ][bRD_SIDE ] )
{
Stack *top = NULL;

if ( !stack || !board )
	return false;
if ( NULL == *stack )	/* stack is empty */
	return false;

top = *stack;
memcpy(board, top->board, BRD_SIZEOF);
*stack = top->back;

free(top);

return true;
}
/* -------------------------------- */
int main( void )
{
char board[bRD_SIDE][bRD_SIDE] = { '\0' };	// near initialization
char tempBoard[bRD_SIDE][bRD_SIDE] = { '\0' };	// near initialization
Stack *stack1 = NULL;				// 1st player stack
...
board_init( board, player1, player2 );
...
/* record 1st player moves */
while ( make_move(player1, board) )
	stack_push( &stack1, board );
...
/* undo 1st player moves */
while ( NULL != stack1 ) {
	pop( &stack1, tempBoard );
	print_board( tempBoard );
}
...
}

 

 

Δημοσ.

Σε ευχαριστώ πάρα πολύ τελειώνω ένα άλλο κομάτι και το κοιτάω. :-D

 

Υπάρχει bool στη C; Αν όχι να τα μετατρέψω σε int;

 

Τι ακριβώς έχεις κάνει με το board? Έχω μπερδευτεί..

Είναι το βασικό board που έχω και στον κώδικα μου;

 

Έχει δίκιο τελικά, γιατί εγώ δεν υπολόγισα πως μετά την αναίρεση πρέπει να ανασυντεθεί το ταμπλό :fear:

 

 

 

>
#define BRD_SIDE	8
#define BRD_SIZEOF	( BRD_SIDE * BRD_SIDE * sizeof(char) )

typedef struct Stack {
char  board[ BRD_SIDE ][ BRD_SIDE ];
struct Stack *back;
} Stack;

/* -------------------------------- */
bool stack_push( Stack **stack, char board[ BRD_SIDE ][ BRD_SIDE ] )
{
Stack *node = NULL;

if ( !stack || !board )
	return false;

if ( NULL == (node = malloc( sizeof(Stack) )) )
	return false;

memcpy( node->board, board, BRD_SIZEOF );
node->back = (NULL == *stack) ? NULL : *stack;
*stack = node;

return true;
}

/* -------------------------------- */
bool stack_pop( Stack **stack, char board[bRD_SIDE ][bRD_SIDE ] )
{
Stack *top = NULL;

if ( !stack || !board )
	return false;
if ( NULL == *stack )	/* stack is empty */
	return false;

top = *stack;
memcpy(board, top->board, BRD_SIZEOF);
*stack = top->back;

free(top);

return true;
}
/* -------------------------------- */
int main( void )
{
char board[bRD_SIDE][bRD_SIDE] = { '\0' };	// near initialization
char tempBoard[bRD_SIDE][bRD_SIDE] = { '\0' };	// near initialization<--------------------------
Stack *stack1 = NULL;				// 1st player stack
...
board_init( board, player1, player2 );
...
/* record 1st player moves */
while ( make_move(player1, board) )
	stack_push( &stack1, board );
...
/* undo 1st player moves */
while ( NULL != stack1 ) {
	pop( &stack1, tempBoard );
	print_board( tempBoard );
}
...
}

 

 

Μου εμφανίζει το εξείς warning στο

char tempBoard[bRD_SIDE][bRD_SIDE] = { '\0' };

main1.c:90:6: warning: missing braces around initializer [-Wmissing-braces]

Δημοσ.

Σε ευχαριστώ πάρα πολύ τελειώνω ένα άλλο κομάτι και το κοιτάω. :-D

Παρακαλώ :)

 

Υπάρχει bool στη C; Αν όχι να τα μετατρέψω σε int;

Ναι αμέ, αλλά πρέπει να ενεργοποιήσεις την αναθεώρηση C99 ( -std=c99 στη γραμμή εντολών του gcc) και να κάνεις #include <stdbool.h> στον κώδικα.

 

Τι ακριβώς έχεις κάνει με το board? Έχω μπερδευτεί..

Είναι το βασικό board που έχω και στον κώδικα μου;

Ναι, ένας πίνακας 8x8 χαρακτήρων είναι. Που ακριβώς έχεις μπερδευτεί, γίνε λίγο πιο συγκεκριμένος.

 

 

Μου εμφανίζει το εξείς warning στο

char tempBoard[bRD_SIDE][bRD_SIDE] = { '\0' };

main1.c:90:6: warning: missing braces around initializer [-Wmissing-braces]

Για αυτό έχω βάλει σε σχόλιο δίπλα "// near initialization", επίτηδες το έχω έτσι, αλλιώς θα έπρεπε να αρχικοποιώ ένα-ένα και τα 64 κελιά σε '\0'.

 

Κανονικά θέλει...

> char board[bRD_SIDE][bRD_SIDE] = { {0} };

για να μη σου πει ότι λείπουν braces (αλλά θα σου πει "near initialization)... το ίδιο και για τον tempBoard.

 

Εναλλακτικά μπορείς να τα αφήσεις χωρίς αρχικοποίηση αλλά πριν τα χρησιμοποιήσεις να τα κάνεις...

 

>memset( board, '\0', BRD_SIZEOF );
memset( temBoard, '\0', BRD_SIZEOF );

Δημοσ.

Νομίζω πως δε θέλει bool...οπότε έκανα μια προσπάθει να μετατρέψω τα bool σε int με true=1 και false=0.

το board που λες υποτίθεται ότι είναι ο πίνακας που γίνεται όλο το παιχνίδι; Αυτό που ονομάζω και εγώ board στον κώδικά μου? Ποια η χρήση του tempboard?

Συγνώμη αλλά δεν έχω πολλές γνώσεις πάνω στη C και το μυαλό μου αυτή τη στιγμή είναι κάπως μουδιασμένο.

:mrgreen:

Γιατί πρέπει να γεμίσεις όλα τα κελιά με '\0'? Το '\0' είναι το σύμβολο του τερματισμού σωστά?

 

Καμία ιδέα γιατί όταν το τρέχω απο τη γραμμή εντολών και γράψω myCheckers -l λέει command not fount?

Τα υπόλυπα δηλαδή myCheckers -h και myCheckers - n είναι μια χαρά.

 

>
int main(int argc, char *argv[])
{
   char board[8][8];
   int turn,k;
   if(strcmp(argv[1], "-h")==0)
   {
	printf("To start a new game write: myCheckers -n\n");
	printf("To load a game write: myCheckers -l\n");
	return 0;
}
else if(strcmp(argv[1], "-n")==0 && argc==2)
{
	gemisma(board);
	turn=1;
	play(board, turn);
}
else if(strcmp(argv[1], "-l")==0 && argc==3)     //<-----------------------------------------
{
	k=loadGame(board, argv[2], &turn);
	if(k==0)
	{
		 return 0;
	}
	else
	{
		printf("Game loading...\n");
		play(board, turn);
	}
}
else
{
	printf("Wrong input for help write: myCheckers -h\n");
	return 0;
}
   system("PAUSE");	
   return 0;
}

Δημοσ.

Τι εννοείς δεν θέλει bool; Σου εξήγησα τι πρέπει να κάνεις για να ενεργοποιήσεις το bool data type. Αν δεν θέλεις να ενεργοποιήσεις την αναθεώρηση C99 της γλώσσας, όρισε έναν δικό σου τύπο bool. Ένας τρόπος είναι ο παρακάτω...

 

>
#if !defined( true ) && !defined( false ) 
typedef enum { false=0, true = !false} bool;
#endif

 

Τις έχω βάλει να επιστρέφουν bool για να μπορείς να διαχειριστείς πιθανή αποτυχία τους στη συνάρτηση που τις καλεί (άσχετα αν δεν το κάνω εγώ στον κώδικα που σου έδωσα).

 

Ο board είναι ο κανονικός board ναι. Όσο για τον tempBoard, η stack_pop() πρέπει να σου επιτρέψει κάπου τον πίνακα που έχει αποθηκευμένο στο top node της στοίβας πριν το καταστρέψει. Οπότε πρέπει να της περάσεις μια μεταβλητή στην οποία αντιγράφει τον αποθηκευμένο πίνακα του top node.

 

Γιατί πρέπει να γεμίσεις όλα τα κελιά με '\0'? Το '\0' είναι το σύμβολο του τερματισμού σωστά?

Γιατί πρέπει να το κάνεις η 2η φύση σου να αρχικοποιείς ΟΛΕΣ τις τοπικές μεταβλητές που ορίζεις.

 

Καμία ιδέα γιατί όταν το τρέχω απο τη γραμμή εντολών και γράψω myCheckers -l λέει command not fount?

Τα υπόλυπα δηλαδή myCheckers -h και myCheckers - n είναι μια χαρά.

Στο -l του απαιτείς να έχει 3 παραμέτρους στη γραμμή εντολών αλλά από ότι λες του γράφεις μόνο 2.

Δημοσ.

Ξανακοιτάζοντας σήμερα την εκφώνηση σε συνδυασμό με την ερώτησή σου για τον tempBoard[ ][ ], διαπιστώνω πως όντως δεν χρειάζεται ο tempBoard.

 

Μπορείς να περάσεις απευθείας τον κανονικό board στην stack_pop(), μιας και σύμφωνα με την εκφώνηση δεν χρειάζεται να κρατήσεις αντίγραφο της διάταξης που είχε ο board πριν γίνει το Undo (κάτι τέτοιο θα ήταν χρήσιμο αν για παράδειγμα ήθελες να υλοποιήσεις και Redo).

 

Επίσης, άλλη μια διευκρίνηση έχει να κάνει με τη χρήση της memcpy(). Ουσιαστικά αντικαθιστά τα 2 nested loops που έχεις στον δικό σου κώδικα της pop() με τα οποία αντιγράφεις τα στοιχεία του top->board στο όρισμα board της συνάρτησης. Η memcpy() κάνει την ίδια δουλειά πιο γρήγορα και κυρίως πιο ευανάγνωστα ;)

 

Απλώς πρέπει να προσέχεις να της περνάς το σωστό size στο 3ο της όρισμα, που στη δική μας περίπτωση είναι το μέγεθος (σε bytes) του πίνακα board. Επειδή στη C όταν περνάς δείκτες ως ορίσματα σε συναρτήσεις ο τελεστής sizeof πάνω τους σου επιστρέφει το μέγεθος μονάχα του δείκτη στο 1ο στοιχείο, πρέπει το συνολικό μέγεθος όλων των στοιχείων του πίνακα να το περνάς ως ξεχωριστό όρισμα στην συνάρτηση, ή να το έχεις προϋπολογισμένο σε μια σταθερά (#define ή const) και να το χρησιμοποιείς από εκεί όσο είσαι μέσα στη συνάρτηση.

 

Αυτό ακριβώς έχω κάνει με τη σταθερά BRD_SIZEOF ... έχω προϋπολογίσει μέσα της (στην αρχή του κώδικα) το μέγεθος όλων των στοιχείων του πίνακα και κατόπιν όπου το χρειάζομαι (π.χ. 3ο όρισμα της memcpy() ) χρησιμοποιώ απευθείας την σταθερά BRD_SIZEOF.

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

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

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

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

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

Σύνδεση

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

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