Fundamentos:Solucións:Reversi:reversigtk.c
Saltar á navegación
Saltar á procura
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();
}