Advertisement
Jerkiller

tictactoe

Dec 15th, 2014
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.23 KB | None | 0 0
  1.     #include <stdlib.h>
  2.     #include <sys/types.h>
  3.     #include <sys/stat.h>
  4.     #include <fcntl.h>
  5.     #include <stdbool.h>
  6.     #include <stdio.h>
  7.     #include <string.h>
  8.     #include <stdarg.h>
  9.     #include <errno.h>
  10.     #include <signal.h>
  11.     #include <time.h>
  12.      
  13.     #define PIPE_IN "ticPipeIn"
  14.     #define PIPE_OUT "ticPipeOut"
  15.      
  16.     //funzione che rimuove le pipe
  17.      void chiuditutto(){
  18.             unlink(PIPE_IN);
  19.             unlink(PIPE_OUT);
  20.             exit(1);
  21.      }
  22.      
  23. //azzera tutto l'array delle occorrenze
  24. void azzera(int arr[3][3]){
  25.     int i,j;
  26.     for(i=0;i<3;i++)for(j=0;j<3;j++)arr[i][j]=0;
  27. }
  28.  
  29.  
  30.      
  31.     int main(){
  32.        
  33.         int positions[3][3]; //L'array positions funge da vettore delle occorrenze delle mosse
  34.         //file descriptor associati alle pipe
  35.         int fdin, fdout;
  36.         //contatori per i cicli
  37.         int i,j,k;
  38.         //qui mi vado a salvare le posizioni temporanee lette e da scrivere su pipe
  39.         int x,y;
  40.         int mossa=0,turno=1;
  41.         int partitevinte=0;
  42.  
  43.             char leggi[100],carat,newpos[8],useless[3],temp[3],message[100];
  44.      
  45.            //se premo ctrl+c chiudo le pipe
  46.            signal(SIGINT,chiuditutto);
  47.            
  48.             //creo le pipe con nome a meno che non esistano già
  49.             mkfifo(PIPE_IN,0666); mkfifo(PIPE_OUT,0666);
  50.            
  51.             /* APRO LE PIPE e gli assegno un file descriptor, gestisco eventuali errori */
  52.             if ( (fdin = open (PIPE_IN,O_WRONLY)) < 0 ) { // apre la pipe in lettura
  53.                     perror("errore apertura pipe");
  54.                     exit(1);
  55.             }
  56.             if ( (fdout = open (PIPE_OUT,O_RDONLY)) < 0 ) { // apre la pipe in scrittura
  57.                     perror("errore apertura pipe");
  58.                     exit(1);
  59.             }
  60.        
  61.     //scrivo g per iniziare la partita
  62.     write (fdin,"g",1);
  63.    
  64.     //azzero vettore occorrenze
  65.     azzera(positions);
  66.    
  67.     //ciclop fintanto che non ho contato 100 vittorie, o finché la read non fallisce
  68.     while((partitevinte<100)&&(read(fdout,&carat,1))){
  69.        
  70.         if(carat=='$'){ //hai perso!
  71.             azzera(positions);
  72.             write (fdin,"g",1);
  73.             continue;
  74.         }
  75.         else if(carat=='&'){//la partita prosegue e tocca a me
  76.  
  77.             //cerca posizione libera
  78.             for(j=0;j<3;j++)for(k=0;k<3;k++){
  79.                 //se trovi la posizione libera...
  80.                 if((positions[j][k]==0)&&(!mossa)){
  81.                
  82.                     sprintf(newpos,"%d,%d#",j,k);
  83.                     //segno la mossa che ho fatto nel vettore positions
  84.                     positions[j][k]=1;
  85.                     //invio alla pipe la mossa salvata in newpos
  86.                     write (fdin,newpos,4);
  87.                     mossa=1;
  88.                 }
  89.             }
  90.             mossa=0;
  91.             read(fdout,&carat,1);
  92.             //mi aspetto & oppure vittoria cioè $
  93.             if(carat=='$'){//vinta la partita con la mia mossa
  94.                 partitevinte++;
  95.                 azzera(positions);
  96.                 write (fdin,"g",1);
  97.             }
  98.  
  99.         }
  100.         else {
  101.             //salva la x
  102.             //converto char carat in stringa temp
  103.             sprintf(temp,"%c",carat);
  104.             //salvo in x l'intero
  105.             x=atoi(temp);
  106.             //consumo la ','
  107.             read(fdout,&carat,1);
  108.            
  109.             //salvo la y
  110.             read(fdout,&carat,1);
  111.             sprintf(temp,"%c",carat);
  112.             //salvo in y l'intero
  113.             y=atoi(temp);
  114.  
  115.             //segna posizione occupata nel vettore delle occorrenze
  116.             positions[x][y]=1;
  117.             //consumo il #
  118.             read(fdout,&carat,1);
  119.            
  120.         }
  121.    
  122.  
  123.        
  124.     }
  125.    
  126.         return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement