Fundamentos:Solucións:Reversi:reversigtk.c

De Wiki do Ciclo ASIR do IES de Rodeira

reversigtk.c

Podes Descargar o ficheiro

/* Reversi
*/
#include <stdio.h>
#include <gtk/gtk.h>
#include <glade/glade.h>

#include "reversi.h"
#include "reversilib.h"
#include "tablero.h"

// GUI
GladeXML *__gui=NULL;

// taboleiro
char __tableiro[8][8];

// Xogador ó que lle toca xogar
int __xog=XOG1;

// Nomes dos xogadores
char *nomeXog[]={"Empate","Marron","Azul"};

void dialogoFin(void);
void iniciaTaboleiro(void);
void fichaGui(int fila,int columna,int xogador);
void revira(int i,int j, int dir);

EXPORT gboolean on_celda_button_press_event (GtkWidget *widget,
                                             GdkEventButton *event,
                                             gpointer user_data);
// Pulsada unha celda
//
EXPORT gboolean on_celda_button_press_event (GtkWidget *widget,
                                             GdkEventButton *event,
                                             gpointer user_data)
{
   const char *nome;
   int fila,columna;
   int outro=XOG1;
   char msg[128];
   GtkWidget *sb;
   int id;

   // Obtemos as coordenadas do nome
   nome=gtk_widget_get_name(widget);
   obtenCoordenadas(nome,&fila,&columna);
   
   // Si podemos poñemos ficha e damos a volta
   if (posicionXogada(fila,columna,__xog))
   {
      __tableiro[fila][columna]=__xog;

      // Poñer ficha no GUI 
      fichaGui(fila,columna,__xog);

      darVolta(fila,columna);

      outro=__xog;
      if (__xog==XOG1) __xog=XOG2;
      else           __xog=XOG1;

      // Comprobar si rematou o xogo
      if (!existeXogada()) dialogoFin();
      else 
      {
        // Si o xogador que lle toca non pode xogar, xoga
        // o contrario
        if (!podeXogar(__xog)) __xog=outro;

        // Mensaxe do xogador ó que lle toca
        sb=glade_xml_get_widget(__gui,"statusbar");
        id=gtk_statusbar_get_context_id(GTK_STATUSBAR(sb),"turno");
        gtk_statusbar_pop(GTK_STATUSBAR(sb),id);
        sprintf(msg,"Turno: %s",nomeXog[__xog]);
        gtk_statusbar_push(GTK_STATUSBAR(sb),id,msg);
      }
   }
 }


/* dialogoFin
*/
void dialogoFin(void)
{
   GtkWidget *fin;
   char buffer[1024];
   int gan,f1,f2;

   contaFichas(&f1,&f2);
   gan=0;
   if (f2<f1) gan=XOG1;
   else if (f2>f1) gan=XOG2;
   sprintf(buffer,"<big><b>Felicitacións %s</b></big>\n\n<big><b>%s: %d  %s:%d</b></big>",nomeXog[gan],nomeXog[1],f1,nomeXog[2],f2);
   fin=glade_xml_get_widget(__gui,"msg");
   gtk_label_set_markup(GTK_LABEL(fin),buffer);
   fin=glade_xml_get_widget(__gui,"fin");
   gtk_widget_show(fin);
}


/*iniciaTaboleiro
  DESCRIPCION: Posición inicial do xogo
*/
void iniciaTaboleiro(void)
{
  int i,j;
  GtkImage *img;
  GtkWidget *sb;
  char nome[8];
  int c;
  int id;

  i=0;
  c=1;
  while(i<8)
  {
    j=0;
    while(j<8)
    {
      __tableiro[i][j]=VACIO;
      sprintf(nome,"image%d",c);
      img=(GtkImage *) glade_xml_get_widget(__gui,nome);
      gtk_image_set_from_file(img,"xog0.png");
      j++;
      c++;
    }
    i++;
  }
  __tableiro[3][3]=XOG1;
  // Poñer ficha no GUI
  fichaGui(3,3,XOG1);
 
  __tableiro[3][4]=XOG2;
  // Poñer ficha no GUI
  fichaGui(3,4,XOG2);

  __tableiro[4][3]=XOG2;
  // Poñer ficha no GUI
  fichaGui(4,3,XOG2);

  __tableiro[4][4]=XOG1;
  // Poñer ficha no GUI
  fichaGui(4,4,XOG1);

  __xog=XOG1;
  
  sb=glade_xml_get_widget(__gui,"nombres");
  gtk_widget_show(sb);
}

/* 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;
  fichaGui(i,j,__tableiro[i][j]);
    
  switch(dir)
  {
    case DER: y=i; x=j+1;
              while(__tableiro[y][x]!=__tableiro[i][j]) 
              {
                __tableiro[y][x]=__tableiro[i][j];
                fichaGui(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];
                fichaGui(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];
                fichaGui(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];
                fichaGui(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];
                   fichaGui(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];
                   fichaGui(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];
                   fichaGui(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];
                   fichaGui(y,x,__tableiro[i][j]);
                   x--;
                   y++;
                 }
                 break;
  }
}

//---------------------------------------------------------------------
// Función Principal
//---------------------------------------------------------------------
int main(int argc,char *argv[])
{
   GtkFileChooser *d;

   gtk_init(&argc,&argv);
   __gui=glade_xml_new("tablero.glade",NULL,NULL);
   glade_xml_signal_autoconnect(__gui);
   d=(GtkFileChooser *)glade_xml_get_widget(__gui,"gardar");
   gtk_file_chooser_set_do_overwrite_confirmation(d,TRUE);
   iniciaTaboleiro();
   gtk_main();
}