Jeżeli mam kod
main.c
#include "funkcje.c"
int main (int argc, char *argv[])
{
int i= 0, j = 0, z = 0;
GtkWidget *kolumny;
gtk_init(&argc, &argv);
ZerujTablice();
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Kolko i krzyzyk");
gtk_window_set_default_size(GTK_WINDOW(window), 150, 150);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
frame = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), frame);
kolumny = gtk_label_new("A");
gtk_widget_set_size_request(kolumny, 50, 15);
gtk_fixed_put(GTK_FIXED(frame), kolumny, 020, 0);
kolumny = gtk_label_new("B");
gtk_widget_set_size_request(kolumny, 50, 15);
gtk_fixed_put(GTK_FIXED(frame), kolumny, 70, 0);
kolumny = gtk_label_new("C");
gtk_widget_set_size_request(kolumny, 50, 15);
gtk_fixed_put(GTK_FIXED(frame), kolumny, 120, 0);
kolumny = gtk_label_new("1");
gtk_widget_set_size_request(kolumny, 20, 50);
gtk_fixed_put(GTK_FIXED(frame), kolumny, 0, 15);
kolumny = gtk_label_new("2");
gtk_widget_set_size_request(kolumny, 20, 50);
gtk_fixed_put(GTK_FIXED(frame), kolumny, 0, 65);
kolumny = gtk_label_new("3");
gtk_widget_set_size_request(kolumny, 20, 50);
gtk_fixed_put(GTK_FIXED(frame), kolumny, 0, 115);
// Rysowanie pola
for (i=0;i<F_SIZE*F_SIZE;i++)
{
// Namalowanie kwadratow
field_[i] = gtk_button_new_with_label("");
gtk_widget_set_size_request(field_[i], 50, 50);
gtk_fixed_put(GTK_FIXED(frame), field_[i], 20+50*z, 15+50*j);
// Wypelnienie ich domyslnie...niczym
field_label[i] = gtk_label_new("");
gtk_fixed_put(GTK_FIXED(frame), field_label[i], 40+(50*z), 35+(50*j));
if ((i+1)%3 == 0)
{
j++;
}
if (z == 2) z = 0;
else z++;
}
// Pobieranie ruchów od gracza
for(i=0;i<F_SIZE*F_SIZE;i++)
{
g_signal_connect(field_[i], "clicked", G_CALLBACK(RysujPole), field_label[i]);
g_signal_connect(field_[i], "clicked", G_CALLBACK(WykonajRuch), (gpointer) i);
}
gtk_widget_show_all(window);
g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_main();
return 0;
}
funkcje.h
#include <gtk/gtk.h>
#define F_SIZE 3
GtkWidget *field_label[F_SIZE*F_SIZE];
GtkWidget *field_[F_SIZE*F_SIZE];
GtkWidget *frame;
GtkWidget *window;
int pole[F_SIZE*F_SIZE];
int ruchy = 0;
int ruch = 1, poprzedni = 2;
void ZerujTablice();
void WykonajRuch(GtkWidget *widget, gpointer label);
void RysujPole(GtkWidget *widget, gpointer label);
int CzyPoprawny(int id);
int CzyWygral();
void Komunikat();
funkcje.c
#include "funkcje.h"
// Zerowanie tablicy na wszelki wypadek
void ZerujTablice()
{
int i = 0;
for (i = 0;i<F_SIZE*F_SIZE;i++)
{
pole[i] = 0;
}
}
// Funkcja blokujaca nadpisywanie ruchow
int CzyPoprawny(int id)
{
if(pole[id] != 0)
return 0;
pole[id] = ruch;
return 1;
}
void Komunikat(GtkWidget *widget, gpointer window)
{
GtkWidget *dialog;
if (ruch == 1)
{
dialog = gtk_message_dialog_new(window,
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"Wygral gracz: X", "title");
}
else
{
dialog = gtk_message_dialog_new(window,
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"Wygral gracz: O", "title");
}
gtk_window_set_title(GTK_WINDOW(dialog), "Informacja");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
gtk_main_quit();
}
// Funkcja wpisujaca ruch do tablicy i uruchamiajaca sprawdzanie wygranej
void WykonajRuch(GtkWidget *widget, gpointer label)
{
int id = (int) label;
int wynik = 0;
printf("Gracz %d wykonuje ruch na pole %d\n", ruch, id);
if (CzyPoprawny(id) == 1)
{
wynik = CzyWygral();
if (wynik)
{
printf("Stan: ");
switch (wynik)
{
case 1:
printf("Wygral X");
gtk_signal_connect(GTK_OBJECT(widget), "clicked", G_CALLBACK(Komunikat), (gpointer) window);
//gtk_main_quit();
break;
case 2:
printf("Wygral O");
//gtk_main_quit();
break;
default:
printf("Gra w toku...");
break;
}
printf("\n");
}
ruchy++;
poprzedni = ruch;
ruch = (ruch==1 ? 2 : 1);
}
else
return;
}
// Funkcja wpisująca X lub O w dane pole
void RysujPole(GtkWidget *widget, gpointer label)
{
if (ruchy < F_SIZE*F_SIZE)
{
gtk_label_set_text( (GtkLabel*) label, (ruch == 1? "X":"O") );
}
}
// Funkcja sprawdzajaca czy gracz wygral
int CzyWygral()
{
int i = 0, j = 0, suma = 0, z = 0;
//Sprawdzanie przekatnych
if (pole[0])
{
suma = 0;
// Lewa przekatna
for(i = 0;i<F_SIZE*F_SIZE;i++)
{
if (i%4 == 0)
{
if(pole[i] != pole[0])
break;
else
suma++;
}
if (suma == F_SIZE)
return pole[0];
}
}
if (pole[F_SIZE-1])
{
suma = 0;
// Prawa przekatna
for (i = F_SIZE-1;i<=F_SIZE*2;i++)
{
if (i%2 == 0)
{
if(pole[i] != pole[F_SIZE-1])
break;
else
suma++;
}
if (suma == F_SIZE)
return pole[F_SIZE-1];
}
}
// Sprawdzanie linii poziomych
for (i = 0;i<F_SIZE;i++)
{
suma = 0;
for (j = 0;j<F_SIZE;j++)
{
if (pole[(F_SIZE*i)])
{
if (pole[j+(3*i)] != pole[(F_SIZE*i)])
break;
else
suma++;
}
if (suma == F_SIZE)
return pole[j+(3*i)];
}
}
// Sprawdzanie linii pionowych
for (j = 0;j<F_SIZE;j++)
{
suma = 0;
for (i = 0;i<F_SIZE;i++)
{
if (pole[j])
{
z = j + (F_SIZE*i);
if (pole[z] != pole[j])
break;
else
suma++;
if (suma == F_SIZE)
return pole[j];
}
}
}
return 0;
}
To dlaczego nie chce mi wyskoczyć okienko po wygraniu? :|