Fundamentos:Solucións:Reversi:reversi.c

De Wiki do Ciclo ASIR do IES de Rodeira

Podes Descargar o ficheiro

#include <stdio.h>
#include <stdlib.h>
 
#include "reversi.h"
#include "reversilib.h"
 
// taboleiro
char __tableiro[8][8];
 
void iniciaTaboleiro(void);
void visualizaTaboleiro(void);
void revira(int fila,int columna, int dir);
void xoga(int x);
 
/* Principal
*/
int main(void)
{
  int xog;
  int fu,fd;
 
  iniciaTaboleiro();
  visualizaTaboleiro();
  xog=XOG1;
  while (existeXogada())
  {
     xoga(xog);
     if (xog==XOG1) 	xog=XOG2;
     else		xog=XOG1;
     visualizaTaboleiro();
  }
  contaFichas(&fu,&fd);
  printf("Xog 1 %d Xog 2 %d\n",fu,fd);
  return 0;
}
 
/*iniciaTaboleiro
  DESCRIPCION: Posición inicial do xogo
*/
void iniciaTaboleiro(void)
{
  int i,j;
 
  i=0;
  while(i<8)
  {
    j=0;
    while(j<8)
    {
      __tableiro[i][j]=VACIO;
      j++;
    }
    i++;
  }
  __tableiro[3][3]=XOG1;
  __tableiro[3][4]=XOG2;
  __tableiro[4][3]=XOG2;
  __tableiro[4][4]=XOG1;
}
 
/* revira
   RECIBE: i,j - coordenadas de inicio
           dir - dirección.
   DESCRIPCIÓN: Da a volta as fichas hacia a dirección indicada
*/
void revira(int i,int j, int dir)
{
  int outro=XOG1;
  int x,y;
 
  if (__tableiro[i][j]==XOG1) outro=XOG2;
  switch(dir)
  {
    case DER: y=i; x=j+1;
              while(__tableiro[y][x]!=__tableiro[i][j]) 
              {
                __tableiro[y][x]=__tableiro[i][j];
                x++;
              }
              break;
    case ESQ: y=i; x=j-1;
              while(__tableiro[y][x]!=__tableiro[i][j]) 
              {
                __tableiro[y][x]=__tableiro[i][j];
                x--;
              }
              break;
    case ARR: y=i-1; x=j;
              while(__tableiro[y][x]!=__tableiro[i][j]) 
              {
                __tableiro[y][x]=__tableiro[i][j];
                y--;
              }
              break;
    case ABA: y=i+1; x=j;
              while(__tableiro[y][x]!=__tableiro[i][j]) 
              {
                __tableiro[y][x]=__tableiro[i][j];
		y++;
              }
              break;
    case ARRDER: y=i-1; x=j+1;
                 while(__tableiro[y][x]!=__tableiro[i][j]) 
                 {
                   __tableiro[y][x]=__tableiro[i][j];
                   x++;
                   y--;
                 }
                 break;
    case ARRESQ: y=i-1; x=j-1;
                 while(__tableiro[y][x]!=__tableiro[i][j]) 
                 {
                   __tableiro[y][x]=__tableiro[i][j];
                   x--;
                   y--;
                 }
                 break;
    case ABADER: y=i+1; x=j+1;
                 while(__tableiro[y][x]!=__tableiro[i][j]) 
                 {
                   __tableiro[y][x]=__tableiro[i][j];
                   x++;
                   y++;  
                 }
                 break;
    case ABAESQ: y=i+1; x=j-1;
                 while(__tableiro[y][x]!=__tableiro[i][j]) 
                 {
                   __tableiro[y][x]=__tableiro[i][j];
                   x--;
                   y++;
                 }
                 break;
  }
}
 
/* visualizaTaboleiro
   DESCRIPCION: Pinta o taboleiro na pantalla
*/
void visualizaTaboleiro(void)
{
   int i,j;
   char *ficha="·X0";
 
   system("clear");
   i=0;
   while(i<8)
   {
     j=0;
     while(j<8)
     {
       printf("%c ",ficha[ __tableiro[i][j]  ]);
       j++;
     }
     printf("\n");
     i++;
   }
}
 
 
/* xoga
   RECIBE: O xogador (x) que lle toca xogar
   DESCRIPCION: Pide a xogada, verificando que é correcta e
                efectúa a xogada completa (dando a volta ás fichas
                que o precisen)
 
   Si podeXogar(x)
     Facer 
       Pedir fila e columna
     Mentras non poda poñer a ficha en fila,columna
     Poñer a ficha
     Dar a volta ás fichas que o necesiten
   FinSi
*/
void xoga(int x)
{
   int fila,columna;
 
   if (podeXogar(x))
   {
      do {
         printf("fila?:"); scanf("%d",&fila);
         printf("columna?:"); scanf("%d",&columna);
      }
      while(!posicionXogada(fila,columna,x));
      __tableiro[fila][columna]=x;
      darVolta(fila,columna);
   }
}