Programació en C del PIC 16F690

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Desenvolupament de jocs senzills

Othello

A l'iniciar el programa hi ha quatre LED encesos al centre del taulell. Dos són de color blau, corresponents a un jugador, i els altres dos són de color groc, corresponents a l'altre jugador. Cada jugador, per torns, pot posar una fitxa del seu color però sempre de manera que pugui capturar una o més fitxes del contrari entre dues fitxes pròpies. Les fitxes capturades canvien de color i passen a ser del jugador que les ha capturat. El joc acaba quan el taulell queda ple o bé quan cap dels jugadors pot tirar ja que no és possible fer cap més captura. Els polsadors 1 i 2 serveixen per moure el cursor i el 3 per acceptar la situació de la fitxa on està el cursor. El polsador 4 desfà la darrera tirada i el polsador 5 per iniciar el joc.

Othello

El programa és el següent:

#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
#pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
#include "pic16f690.h"  // Carrega el fitxer d'adreces i paràmetres del PIC 16F690
#include <xc.h>  // Carrega el fitxer de funcions necessari per al compilador XC8
#define _XTAL_FREQ  4000000  // La freqüència del rellotge és 4 MHz
#define cic_int  5  // Nombre de cicles per a la intermitència
char Port;  // Gestió del port a la funció Envia_max
char Compta;  // Comptador de bits a la funció Envia_max
char Sortida[6];  // Valors a enviar al MAX7221 (48 bits)
char Sorti[6];  // Valors a enviar al MAX7221 des de la interrupció
char Actiu;  // Variable que diu quin color està actiu
char Polsad;  // Polsador que s'ha premut
char figura[8][8];
char x = 0;  // Coordenada X del cursor (0 a 7)  // X = 0 és la columna de la dreta
char y = 0;  // Coordenada Y del cursor (0 a 7)
char mirar = 1;  // Espera que es deixi anar el polsador
char compt_int = 0;  // Comptador de cicles per a la intermitència
char cur_on = 1;  // Controla l'estat del cursor
char color = 3;  // Comencem amb groc
//nuestras variables
char turno=1;  //número de fichas 
char activacanvis=0;  //interruptor que activa els canvis de color a la matriu
char posiciox=0;  //guarda la coordenada x de l'ultiima posició on s'ha posat fitxa per desfer el torn
char posicioy=0;  //guarda la coordenada y de l'ultiima posició on s'ha posat fitxa per desfer el torn
char colur=0;  //guarda el color del canvis per desfer-ho després
char canvis=0;  //enumera el número de canvis en una posició
char jugador1=0;  //variable complementaria per comptar fitxes del color groc i per evaluar torns
char jugador2=0;  //variable complementaria per comptar fitxes del color blau i per evaluar torns
char djugador1=1;  //decenes per mostrar en la pantalla LCD jugador groc
char djugador2=0;  //decenes per mostrar en la pantalla LCD jugador blau
char ujugador1=0;  //unitats per mostrar en la pantalla LCD jugador groc
char ujugador2=0;  //unitats per mostrar en la pantalla LCD jugador blau
char vector[8];  //vector que conte el numero de canvis en cada direcció, per utilitzar en funció desfer
char player[7]={'J','u','g','a','d','o','r'};
char colorG[4]={'G','r','o','c'};
char colorB[4]={'B','l','a','u'};
char o[7]={'O','T','H','E','L','L','O'};
char space[4]={' ',' ',' ',' '};
char activat=1;  //activar el boto de desfer, que hi hagi canvis viables
// Definició de les funcions que farem servir 
void evaluartorn(void);  //mirar si es pot llençar en el següent torn
void resultat(void);  // mostrar en la pantalla els resultat de la partida
void enviatext(char t[7],char c[4]); // envia text a la pantalla LCD
void desfertorn(void);  // desfa l'últim torn
void condicionsini(void);  //condicions inicials
void canvi(char xc,char yc,char c); // funcio que evalua i fa els canvis en la matriu
void Envia3max(char Valor[]);  // Envia un joc de valors als tres MAX7221
                               // desactivant interrupcions
void Envia_max(void);  // Envia un joc de valors als tres MAX7221
void Ini3max(void);  // Inicialitza els tres MAX7221
void Apaga(void);  // Apaga tots els LED
char Polsador(void);  // Funció de lectura dels polsadors
void EnviaL(char Caracter);  // Envia un caràcter
void Esborra(void);  // Esborra la pantalla i posa el cursor a l'inici
void Cursor(char Filera, char Columna);  // Posiciona el cursor
                                         // (filera 1 a 2 i columna 1 a 32, segons pantalla)
void main (void) {
  OPTION_REG = 0b10000101;  // Configuració de Timer0
  TRISC = 0b00100000;  // Tot el port C és de sortida
  TRISB = 0;  // Tot el port B és de sortida
  TRISA = 0xFF;  // Tot el port A és d'entrada
  ANSEL = 0b00000101;  // Configura AN0 i AN2 com entrada analògica
  ANSELH = 0;  // Desactiva les altres entrades analògiques
  PORTC = 0;  // Inicialitza a 0 el port C
  PORTB = 0;  // Inicialitza a 0 el port B
  ADCON1 = 0b00010000;  // Posa el conversor a 1/8 de la freqüència
  ADCON0 = 0b00001001;  // Activa el conversor A/D connectat a AN2
                        // amb el resultat justificat per l'esquerra
  Ini3max();  // Inicialitza els tres MAX7221
  Actiu = 1;  // Activa el color vermell
  TMR0 = 139;  // Presselecció de 100, que són 156 iteracions
               // Correspon a una interrupció cada 7,5 ms
  INTCON = 0b10100000;  // Activem GIE i T0IE
  Apaga();// Apaga tots els LED
  TXSTAbits.BRGH = 1;  // Configuració de velocitat
  BAUDCTLbits.BRG16 = 0;  // Paràmetre de velocitat de 8 bits
  SPBRG = 25;  // Velocitat de 9600 baud
  TXSTAbits.SYNC = 0;  // Comunicació asíncrona
  TXSTAbits.TX9 = 0;  // Comunicació de 8 bits
  while (1) {  // Mirem els polsadors
    // Un cop s'ha fet l'acció del polsador, no es tornarà 
    // a fer fins que es detecti que s'han deixat anar
    Polsad = Polsador();  // Llegim els polsadors
    if (mirar == 1){
      if(turno<61){//s'ha ombler el taulell amb 60 torns 
        if (Polsad == 1) {  // Si s'ha premut el polsador 1
          x = (x + 1) % 8;  // Incrementa x però la manté entre 0 i 7
          mirar = 0;
        }
        if (Polsad == 2) {  // Si s'ha premut el polsador 2
          y = (y + 1) % 8;  // Incrementa y però la manté entre 0 i 7
          mirar = 0;
        }
        if (Polsad == 3) {  // Si s'ha premut el polsador 3// encen el led del jugador, fa canvis si es possible i mira si es pot llençar en el proper torn  
          if (figura[y][x]==0){  
            colur=color;
            posiciox=x;
            posicioy=y;  
            activacanvis=1;
            canvi(posiciox,posicioy,colur);
            activat=0;
            if (canvis!=0){
              turno=turno+1;
              evaluartorn();
              Esborra();
              if (color==3){  // Esborra la pantalla i posa el cursor a l'inici
                enviatext(player,colorG);
              }else{  // Esborra la pantalla i posa el cursor a l'inici
                enviatext(player,colorB);
              }
            }
          }  
          mirar = 0;
        }  
        if (Polsad == 4) {  // desfa el torn anterior
          if((turno>1)&&(activat==0)){//activació solo una vez para no restar turnos
            desfertorn();
            activat=1;
          }
          mirar=0;
        }
        if (Polsad == 5) {  //reset de partida
          condicionsini();
          mirar = 0;
        }  
      }else{  //calcular numero de fitchas de cada color y ponerlo en la pantalla
        resultat();
        if (Polsad == 5) {  // reset
          condicionsini();
        }
      } 
    } else {
      if (Polsad == 0) {  // Si no s'ha premut cap polsador (o dos a la vegada)
        mirar = 1;
      }
    }
    if (djugador1==0){  // Anem a mostrar la figura actual a la matriu de LED
      for (char j = 0; j < 8; j++){  // Fileres
        char mascara;
        char col;
        Sortida[0] = 0;  // Vermells
        Sortida[2] = 0;  // Verds
        Sortida[4] = 0;  // Blaus
        for (char k = 0; k < 8; k++){  // Caselles de la filera
          if ((y == j) && (x == k)){  // Si estem a la casella del cursor
                                      // El cursor es mostra en el color actual però si coincideix
                                      // amb el color de la casella el mostrem blanc
            if (cur_on == 1){  // Si toca el cursor encès
              col = color;  // Color actual
              if ((3 == figura[y][x])||(6 == figura[y][x])){  // Si coincideixen
                col = 1;  // posem vermell
              }
            } else {
              col = figura[y][x];  // Color de la posició actual
            }
          } else {  // Si no hi estem, és una casella normal
            col = figura[j][k];  // Color de la posició actual
          }
          // Posem els bits a la columna corresponent
          mascara = col & 0b0000001;  // Serà 1 si hi ha vermell
          Sortida[0] = Sortida[0] | (mascara << k);
          mascara = (col & 0b0000010) >> 1;  // Serà 1 si hi ha verd
          Sortida[2] = Sortida[2] | (mascara << k);
          mascara = (col & 0b0000100) >> 2;  // Serà 1 si hi ha blau
          Sortida[4] = Sortida[4] | (mascara << k);
        }
        Sortida[1] = j+1;  // Filera
        Sortida[3] = j+1;
        Sortida[5] = j+1;
        Envia3max(Sortida);  // Ho envia al MAX7221
      }
      compt_int++;
      if (compt_int == cic_int){  // Si toca intermitència
        compt_int = 0;
        cur_on = (cur_on + 1) % 2;  // Canvia el cursor
      }
    }
  } 
}  
void __interrupt() temporit(void){
  if (INTCONbits.T0IF) {  // Comprovem que hi ha interrupció per Timer 0
    TMR0 = 100;  // Preselecció de Timer0
    INTCONbits.T0IF = 0;  // Desactiva el bit que indica interrupció pel Timer0
    if (Actiu != 0) {  // Si la matriu no està apagada
      Actiu--;  // Passem a activar un altre color
      if (Actiu == 0) {  // Si hem arribat a zero
        Actiu = 3;  // Torna a posar el 3
      }
    }
    // D'entrada els desactivem els tres
    Sorti[0] = 0x00;  // Vermell
    Sorti[2] = 0x00;  // Verd
    Sorti[4] = 0x00;  // Blau
    if (Actiu == 1) {  // Si és vermell
      Sorti[0] = 0x01;  // Vermell activat
    }
    if (Actiu == 2) {  // Si és verd
      Sorti[2] = 0x01;  // Verd activat
    }
    if (Actiu == 3) {  // Si és blau
      Sorti[4] = 0x01;  // Blau activat
    }
    Sorti[1] = 0x0C;  // Shutdown mode
    Sorti[3] = 0x0C;  // Shutdown mode
    Sorti[5] = 0x0C;  // Shutdown mode
    Envia_max();  // Ho envia al MAX7221
  }
}
void Envia3max(char Valor[]) {  // Envia un joc de valors als tres MAX7221
  INTCONbits.T0IE = 0;  // Desactiva les interrupcions momentàniament
  char Port = 0;  // Variable on guardem l'estat del port B
  char Temp;  // Variable temporal
  for (signed char j = 5; j >= 0; j--){  // Hem d'enviar 6 bytes
    for (char k = 1; k < 9; k++){  // De 8 bits
      Temp = Valor[j] & 0b10000000;  // Agafa el bit de més a l'esquerra
      // Temp només podrà valer 0 o 128
      if (Temp == 0) {  // Si val 0
        Port = Port & 0b11101111;  // Desactiva Data (bit 4)
      } else {  // Si val 128
        Port = Port | 0b00010000;  // Activa Data (bit 4)
      }
      Valor[j] = Valor[j] << 1;  // Rodem els bits per situar el següent
      PORTB = Port;  // Ho posa al port B
      Port = Port | 0b00100000;  // Activa Clock (bit 5) i força lectura
      PORTB = Port;  // Ho posa al port B
      Port = Port & 0b11011111;  // Desactiva Clock (bit 5)
      PORTB = Port;  // Ho posa al port B
    }
  }
  Port = Port | 0b01000000;  // Activa Latch (bit 6) per copiar a les sortides
  PORTB = Port;  // Ho posa al port B
  INTCONbits.T0IE = 1;  // Reactiva les interrupcions a l'acabar
}
void Envia_max(void) {  // Envia un joc de valors als tres MAX7221
  asm("banksel _Port");
  asm("bcf (_Port&7fh),5");  // S'assegura que Clock està desactivat
  asm("bcf (_Port&7fh),6");  // S'assegura que Latch està desactivat
  asm("movf (_Port&7fh),w");  // Agafa el valor de Port
  asm("movwf PORTB");  // I el posa al port B
  asm("banksel _Compta");
  asm("movlw 48");  // Número de bits a enviar
  asm("movwf (_Compta&7fh)");  // Variable per comptar els bits
  asm("Bucle:");
  asm("banksel _Port");
  asm("bcf (_Port&7fh),4");  // Desactiva Data. Si toca activar-ho, ja ho farem
  asm("banksel _Sorti");
  asm("rlf (_Sorti&7fh),f");  // Fa sortir el bit de més a l'esquerra cap a C
  asm("rlf ((_Sorti+1)&7fh),f");  // i roda els altres a l'esquerra
  asm("rlf ((_Sorti+2)&7fh),f");
  asm("rlf ((_Sorti+3)&7fh),f");
  asm("rlf ((_Sorti+4)&7fh),f");
  asm("rlf ((_Sorti+5)&7fh),f");
  asm("banksel _Port");
  asm("btfsc STATUS,0");  // Mira si el bit de l'esquerra era un 1
  asm("bsf (_Port&7fh),4");  // Si era 1, activa Data
  asm("movf (_Port&7fh),w");  // Agafa el valor de Port. El valor que ha canviat és Data
  asm("movwf PORTB");  // I el posa al port B
  asm("bsf (_Port&7fh),5");  // Activa Clock, forçant a llegir el bit
  asm("movf (_Port&7fh),w");  // Agafa el valor de Port. El valor que ha canviat és Clock
  asm("movwf PORTB");  // I el posa al port B
  asm("bcf (_Port&7fh),5");  // Desactiva Clock
  asm("movf (_Port&7fh),w");  // Agafa el valor de Port. El valor que ha canviat és Clock
  asm("movwf PORTB");  // I el posa al port B
  asm("banksel _Compta");
  asm("decfsz (_Compta&7fh),f");  // Decrementa Compta
  asm("goto Bucle");  // Si Compta no és zero, repeteix el bucle
  asm("banksel (_Port&7fh)");
  asm("bsf (_Port&7fh),6");  // Torna a activar Latch
  // Els valors es copiaran a la sortida del registre
  asm("movf (_Port&7fh),w");  // Agafa el valor de Port. El valor que ha canviat és Latch
  asm("movwf PORTB");  // I el posa al port B
}
void Ini3max(void) {  // Inicialitza els tres MAX7221
  char Bytes[6];  // Els sis bytes que cal enviar
  Bytes[0] = 0x00;  // Desactivat
  Bytes[1] = 0x0C;  // Shutdown mode
  Bytes[2] = 0x00;
  Bytes[3] = 0x0C;
  Bytes[4] = 0x00;
  Bytes[5] = 0x0C;
  Envia3max(Bytes);  // Els envia
  Bytes[0] = 0x00;  // No decode
  Bytes[1] = 0x09;  // Decode mode
  Bytes[2] = 0x00;
  Bytes[3] = 0x09;
  Bytes[4] = 0x00;
  Bytes[5] = 0x09;
  Envia3max(Bytes);  // Els envia
  Bytes[0] = 0x07;  // Vuit fileres
  Bytes[1] = 0x0B;  // Scan limit
  Bytes[2] = 0x07;
  Bytes[3] = 0x0B;
  Bytes[4] = 0x07;
  Bytes[5] = 0x0B;
  Envia3max(Bytes);  // Els envia
}
void Apaga(void) {  // Apaga tots els LED
  char Bytes[6];  // Els sis bytes que cal enviar
  for (char j = 1; j <= 8; j++){  // Hem d'enviar 8 fileres
    Bytes[1] = j;  // Filera
    Bytes[3] = j;
    Bytes[5] = j;
    Bytes[0] = 0x00;  // Vermells
    Bytes[2] = 0x00;  // Verds
    Bytes[4] = 0x00;  // Blaus
    Envia3max(Bytes);  // Els envia
  }
}
char Polsador(void) {
  char Pols = 0;
  ADCON0bits.GO = 1;  // Posa en marxa el conversor
  while (ADCON0bits.GO == 1)  // Mentre no acabi
    ;  // ens esperem
  if (ADRESH < 220 && ADRESH > 200) {
    Pols = 1;  // Comprova polsador 1
  }
  if (ADRESH < 194 && ADRESH > 174) {
    Pols = 2;  // Comprova polsador 2
  }
  if (ADRESH < 163 && ADRESH > 143) {
    Pols = 3;  // Comprova polsador 3
  }
  if (ADRESH < 90 && ADRESH > 70) {
    Pols = 4;  // Comprova polsador 4
  }
  if (ADRESH < 55 && ADRESH > 35) {
    Pols = 5;  // Comprova polsador 5
  }
  return Pols;
}
void canvi(char xc,char yc,char c){
  char zeroenfila=0; //variable interruptor que evalua si n'hi ha algun espai buit 
                     // entre la casella seleccionada i la seguent del seu color
  char canvienfila=0; //mira si ha hagut algun canvi en la fila, ja que només ha d'haver 1
  char esquina=0; // mira si abans de trobar un led del seu color pasa per fora del marc de la matriu
  figura[yc][xc] = c;
  canvis=0;
  if (activacanvis==1){//per crear el vector quan es generen canvis, per poder desfer-los
    for (char k = 0; k < 8; k++){
      vector[k] = 0;  // Comencem amb tots els LED apagats
    }
  }
  for(char a=0; a<=xc; a++){ //horizontal derecha
    if (figura[yc][xc-a]==0){
      zeroenfila=1;
    } else if((c==figura[yc][xc-a])&&(canvienfila==0)&&(zeroenfila==0)&&(a!=0)){
      canvienfila=1;
      if(a>1){
        canvis=canvis+1;
      }
      if (activacanvis==1){
        for(char b=0;b<=a ; b++) {
          figura[yc][xc-b]=c;
        }
        vector[0]=a;
      }  
    }
  }
  zeroenfila=0;
  canvienfila=0;
  for(char a=0; a<(8-xc); a++){ //horizontal izquierda
    if (figura[yc][xc+a]==0){
      zeroenfila=1;
    } else if((c==figura[yc][xc+a])&&(canvienfila==0)&&(zeroenfila==0)&&(a!=0)){
      canvienfila=1;
      if(a>1){
        canvis=canvis+1;
      }
      if (activacanvis==1){
        for(char b=0;b<=a ; b++) {
          figura[yc][xc+b]=c;
        }
        vector[1]=a;
      }
    }
  }
  zeroenfila=0;
  canvienfila=0;
  for(char a=0;  a<=yc; a++){ //vertical +
    if (figura[yc-a][xc]==0){
      zeroenfila=1;
    } else if((c==figura[yc-a][xc])&&(canvienfila==0)&&(zeroenfila==0)&&(a!=0)){
      canvienfila=1;
      if(a>1){
        canvis=canvis+1;
      }
      if (activacanvis==1){
        for(char b=0;b<=a ; b++){
          figura[yc-b][xc]=c;
        }
        vector[2]=a;
      }  
    }
  }
  zeroenfila=0;
  canvienfila=0;
  for(char a=0;  a<(8-yc); a++){ //vertical -
    if (figura[yc+a][xc]==0){
      zeroenfila=1;
    } else if((c==figura[yc+a][xc])&&(canvienfila==0)&&(zeroenfila==0)&&(a!=0)){
      canvienfila=1;
      if(a>1){
        canvis=canvis+1;
      }
      if (activacanvis==1){
        for(char b=0;b<=a ; b++) {
          figura[yc+b][xc]=c;
        }
        vector[3]=a;
      }  
    }
  }
  zeroenfila=0;
  canvienfila=0;
  for(char a=0;a<8;a++){ //diag sup. derecha
    if (figura[yc-a][xc-a]==0){
      zeroenfila=1;
    } else if((c==figura[yc-a][xc-a])&&(canvienfila==0)&&(zeroenfila==0)&&(esquina==0)){  
      if(a>0){
        canvienfila=1;
        if(a>1){
          canvis=canvis+1;
        }
      }
      if (activacanvis==1){
        for(char b=0;b<=a ; b++) {
          figura[yc-b][xc-b]=c;
        }
        vector[4]=a;
      }  
    }
    if((yc-a==0)||(xc-a==0)){
      esquina=1;
    }
  }
  zeroenfila=0;
  canvienfila=0;
  esquina=0;
  for(char a=0;a<8;a++){ //diag sup. izq
    if (figura[yc-a][xc+a]==0){
      zeroenfila=1;
    } else if((c==figura[yc-a][xc+a])&&(canvienfila==0)&&(zeroenfila==0)&&(esquina==0)){
      if(a>0){
        canvienfila=1;
        if(a>1){
          canvis=canvis+1;
        }
      }
      if (activacanvis==1){
        for(char b=0;b<=a ; b++) {
          figura[yc-b][xc+b]=c;
        }
        vector[5]=a;
      }
    }
    if((yc-a==0)||(xc+a==7)){
      esquina=1;
    }
  }
  zeroenfila=0;
  canvienfila=0;
  esquina=0;
  for(char a=0;a<8;a++){ //diag inf. derecha
    if (figura[yc+a][xc-a]==0){
      zeroenfila=1;
    } else if((c==figura[yc+a][xc-a])&&(canvienfila==0)&&(zeroenfila==0)&&(esquina==0)){
      if(a>0){
        canvienfila=1;
        if(a>1){
          canvis=canvis+1;
        }
      }
      if (activacanvis==1){
        for(char b=0;b<=a ; b++) {
          figura[yc+b][xc-b]=c;
        }
        vector[6]=a;
      }
    }
    if((yc+a==7)||(xc-a==0)){
      esquina=1;
    }  
  }
  zeroenfila=0;
  canvienfila=0;
  esquina=0;
  for(char a=0;a<8;a++){ //diag inf. izq
    if (figura[yc+a][xc+a]==0){
      zeroenfila=1;
    } else if((c==figura[yc+a][xc+a])&&(canvienfila==0)&&(zeroenfila==0)&&(esquina==0)){
      if(a>0){
        canvienfila=1;
        if(a>1){
          canvis=canvis+1;
        }
      }
      if (activacanvis==1){
        for(char b=0;b<=a ; b++) {
          figura[yc+b][xc+b]=c;
        }
        vector[7]=a;
      }
    }
    if((yc+a==7)||(xc+a==7)){
      esquina=1;
    }
  }
  if ((activacanvis==0)||(canvis==0)){
    figura[yc][xc]=0;
  }
}
void EnviaL(char Caracter) {
  INTCONbits.GIE = 0;  // Desactiva les interrupcions momentàniament
  RCSTAbits.SPEN = 1;  // Activa comunicació sèrie
  TXSTAbits.TXEN = 1;  // Activa comunicació
  TXREG = Caracter;  // Agafa el caràcter i l'envia
  __delay_ms(1);  // Donem temps
  while (PIR1bits.TXIF == 0)  // Esperem que s'acabi d'enviar
    ;  // No fem res
  RCSTAbits.SPEN = 0;  // Desactiva comunicació sèrie
  TXSTAbits.TXEN = 0;  // Desactiva comunicació
  INTCONbits.GIE = 1;  // Activa les interrupcions
}
void Esborra(void) {
  EnviaL(254);  // Caràcter de control
  EnviaL(1);  // Esborra la pantalla i posa el cursor a l'inici
}
void Cursor(char Filera, char Columna) {
  char Posicio = 0;  // Variable per a calcular la posició
  if (Filera == 2) {
    Posicio = 64;  // La primera columna de la segona fila és 64;
  }
  if (Columna > 0 && Columna < 33) {  // Comprovem que sigui un valor raonable
    Posicio = Posicio + Columna;  // Sumem les adreces
    Posicio = Posicio - 1;  // Restem 1 perquè numera des de 0
  }
  Posicio = Posicio + 128;  // Posa el bit de posicionat a 1
  EnviaL(254);  // Control de la posició del cursor
  EnviaL(Posicio);  // Canvia el cursor de lloc
}
void enviatext(char t[7],char c[4]){
  for (signed char k = 0; k < 7; k++){
    EnviaL(t[k]);
  }
  EnviaL(' ');
  for (signed char k = 0; k < 4; k++){
    EnviaL(c[k]);
  }
}
void desfertorn(void){
  //vector=[hd,hi,v+,v-,dsd,dsi,did,dii]
  char cAUX =0;
  char diff =0;
  if (colur==3){
    cAUX=6;
  }else{
    cAUX=3;
  }
  if(vector[0]!=0){
    diff=vector[0]-1;
    for(char b=0;b<=diff ; b++) {
      figura[posicioy][posiciox-b]=cAUX;
    }
  }
  if(vector[1]!=0){
    diff=vector[1]-1;
    for(char b=0;b<=diff ; b++) {
      figura[posicioy][posiciox+b]=cAUX;
    }
  }
  if(vector[2]!=0){
    diff=vector[2]-1;
    for(char b=0;b<=diff ; b++) {
      figura[posicioy-b][posiciox]=cAUX;
    }
  }
  if(vector[3]!=0){
    diff=vector[3]-1;
    for(char b=0;b<=diff ; b++) {
      figura[posicioy+b][posiciox]=cAUX;
    }
  }
  if(vector[4]!=0){
    diff=vector[4]-1;
    for(char b=0;b<=diff ; b++) {
      figura[posicioy-b][posiciox-b]=cAUX;
    }
  }
  if(vector[5]!=0){
    diff=vector[5]-1;
    for(char b=0;b<=diff ; b++) {
      figura[posicioy-b][posiciox+b]=cAUX;
    }
  }
  if(vector[6]!=0){
    diff=vector[6]-1;
    for(char b=0;b<=diff ; b++) {
      figura[posicioy+b][posiciox-b]=cAUX;
    }
  }
  if(vector[7]!=0){
    diff=vector[7]-1;
    for(char b=0;b<=diff ; b++) {
      figura[posicioy+b][posiciox+b]=cAUX;
    }
  }
  figura[posicioy][posiciox]=0;
  color=colur;
  turno=turno-1;
  Esborra();
  if (color==3){
    enviatext(player,colorG);
  }else{
    enviatext(player,colorB);
  }
}
void condicionsini(void){
  djugador1=1;
  Esborra();
  enviatext(o,space);
  __delay_ms(3000);
  for (signed char j = 0; j < 8; j++){
    for (signed char k = 0; k < 8; k++){
      figura[j][k] = 0;  // Apaguem tot
    }
  }
  figura[3][3]=3;
  figura[3][4]=6;
  figura[4][3]=6; 
  figura[4][4]=3;
  turno=1;
  color=3;
  activat=1;
  Esborra();
  enviatext(player,colorG);
  djugador1=0;
}
void evaluartorn(void){
  jugador1=0;
  jugador2=0;
  for (char i =0; i <8; i++){
    for (char t =0; t <8; t++){
      if (figura[t][i]==0){  
        activacanvis=0;
        canvi(i,t,3);
        if (canvis!=0){
          jugador1=jugador1+1;
        }
        canvi(i,t,6);  
        if (canvis!=0){
          jugador2=jugador2+1;
        }
      }
    }
  }
  if (color==3){
    if (jugador2!=0){
      color=6;
    }else{
      if (jugador1!=0){
        color=3;
      }else{
        turno=61;
      }
    }
  }else{
    if (jugador1!=0){
      color=3;
    }else{
      if (jugador2!=0){
        color=6;
      }else{
        turno=61;
      }
    }
  }
}
void resultat(void){
  jugador1=0;
  jugador2=0;
  for (char i =0; i <8; i++){
    for (char t =0; t <8; t++){
      if (figura[i][t]==3){
        jugador1=jugador1+1;
      } else if(figura[i][t]==6){
        jugador2=jugador2+1;
      }
    }
  }
  djugador1=jugador1/10;
  ujugador1=jugador1%10;
  djugador2=jugador2/10;
  ujugador2=jugador2%10;
  djugador1=djugador1+'0';
  ujugador1=ujugador1+'0';
  djugador2=djugador2+'0';
  ujugador2=ujugador2+'0';
  Esborra();
  enviatext(player,colorG);
  EnviaL(' ');
  EnviaL(djugador1);
  EnviaL(ujugador1);
  Cursor(2,1);
  enviatext(player,colorB);
  EnviaL(' ');
  EnviaL(djugador2);
  EnviaL(ujugador2);
}

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.