Fundamentos:Solucións:Reversi:tablero.c

De Wiki do Ciclo ASIR do IES de Rodeira

tablero.h

Podes Descargar o ficheiro

#ifndef __TABLEROH__
#define __TABLEROH__

EXPORT void on_novo_clicked(GtkWidget *w,gpointer p);
EXPORT void on_acerca_de_activate(GtkWidget *w,gpointer p);
EXPORT void on_gardar_activate(GtkWidget *w,gpointer p);
EXPORT void on_abrir_activate(GtkWidget *w,gpointer p);

void obtenCoordenadas(const char *nome,int *f,int *c);
void fichaGui(int fila,int columna,int xogador);

#endif

tablero.c

Podes Descargar o ficheiro

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

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

// GUI
extern GladeXML *__gui;

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

// Xogador ó que lle toca xogar
extern int __xog;

// Nomes dos xogadores
extern char *nomeXog[];

// Gardar Xogo
//
EXPORT void on_gardar_activate(GtkWidget *w,gpointer p)
{
   GtkWidget *ad;
   gchar *fn;
   FILE *f;

   ad=glade_xml_get_widget(__gui,"gardar");
   if (gtk_dialog_run (GTK_DIALOG(ad)) == GTK_RESPONSE_OK) 
   {
      fn=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(ad));
      f=fopen(fn,"w");
      fwrite(&__xog,sizeof(__xog),1,f);
      fwrite(__tableiro,sizeof(__tableiro),1,f);
      fclose(f);
      g_free(fn);
   }
   gtk_widget_hide(ad);
}


// Cargar Xogo
//
EXPORT void on_abrir_activate(GtkWidget *w,gpointer p)
{
   GtkWidget *ad,*sb;
   gchar *fn;
   FILE *f;
   char msg[128];
   int i,j;

   ad=glade_xml_get_widget(__gui,"abrir");
   if (gtk_dialog_run (GTK_DIALOG(ad)) == GTK_RESPONSE_OK) 
   {
      // Recuperar o ficheiro
      fn=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(ad));
      f=fopen(fn,"r");
      fread(&__xog,sizeof(__xog),1,f);
      fread(__tableiro,sizeof(__tableiro),1,f);
      fclose(f);
      // Poñer as fichas no gui
      for(i=0;i<8;i++)
        for(j=0;j<8;j++) fichaGui(i,j,__tableiro[i][j]);
      // Indicar a que xogador lle toca
      sb=glade_xml_get_widget(__gui,"statusbar");
      i=gtk_statusbar_get_context_id(GTK_STATUSBAR(sb),"turno");
      gtk_statusbar_pop(GTK_STATUSBAR(sb),i);
      sprintf(msg,"Turno do Xogador %s",nomeXog[__xog]);
      gtk_statusbar_push(GTK_STATUSBAR(sb),i,msg);
      g_free(fn);
   }
   gtk_widget_hide(ad);
}

// Acerca de ...
//
EXPORT void on_acerca_de_activate(GtkWidget *w,gpointer p)
{
   GtkWidget *ad;

   ad=glade_xml_get_widget(__gui,"acercade");
   gtk_widget_show(ad);
}

// Novo Xogo
//
EXPORT void on_novo_clicked(GtkWidget *w,gpointer p)
{
  GtkWidget *fin;

  fin=glade_xml_get_widget(__gui,"fin");
  gtk_widget_hide(fin);
  iniciaTaboleiro();
}

/* on_xogadores_aceptar_clicked

  Botón de aceptar do diálogo de poñer nome os xogadores
*/
EXPORT void on_xogadores_aceptar_clicked(GtkWidget *w,gpointer p)
{
  GtkWidget *sb;
  char buffer[128];
  int id;
  
  sb=glade_xml_get_widget(__gui,"nombres");
  gtk_widget_hide(sb);
  sb=glade_xml_get_widget(__gui,"xogadores_marron");
  nomeXog[1]=(char *)gtk_entry_get_text(GTK_ENTRY(sb));
  sb=glade_xml_get_widget(__gui,"xogadores_azul");
  nomeXog[2]=(char *)gtk_entry_get_text(GTK_ENTRY(sb));
  sb=glade_xml_get_widget(__gui,"statusbar");
  id=gtk_statusbar_get_context_id(GTK_STATUSBAR(sb),"turno");
  sprintf(buffer,"Turno: %s",nomeXog[1]);
  gtk_statusbar_push(GTK_STATUSBAR(sb),id,buffer);
}

/*fichaGui
  RECIBE: fila, columna, xogador
  DESCRIPCION: Pon no gui a ficha do xogador na fila e columna
               indicadas.
*/
void fichaGui(int fila,int columna,int xogador)
{
  GtkImage *img;
  char buffer[12];

  // Obtemos a imaxe da ficha
  sprintf(buffer,"image%d",fila*8+columna+1);
  img=(GtkImage *) glade_xml_get_widget(__gui,buffer);
  
  // Poñemos ficha na posición
  sprintf(buffer,"xog%d.png",xogador);
  gtk_image_set_from_file(img,buffer);

}

/*obtenCoordenadas
  RECIBE: O nome da casilla
          As direccións de memoria onde deixar a fila (f) e a columna (c)
  DESCRIPCION: Obten as coordenadas da casilla a partir do nome
*/
void obtenCoordenadas(const char *nome,int *f,int *c)
{
   int num;

   // Obter o número da casilla do nome
   num=atoi(&nome[8])-1;
   // Calcular fila e columna
   *f=num/8;
   *c=num%8;
}