Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Pulpit

[C] GTK, wyskakujace okienko

Rekomendowane odpowiedzi

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++;
   }


   gtk_widget_show_all(window);

   g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

   // 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_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;
 dialog = gtk_message_dialog_new(window,
           GTK_DIALOG_DESTROY_WITH_PARENT,
           GTK_MESSAGE_INFO,
           GTK_BUTTONS_OK,
           "Download Completed", "title");
 gtk_window_set_title(GTK_WINDOW(dialog), "Information");
 gtk_dialog_run(GTK_DIALOG(dialog));
 gtk_widget_destroy(dialog);
}

// 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(field_[id]), "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? :hmm:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

test:

z Komunikat wywal linijkę gtk_widget_destroy(dialog);

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Już wpadłem na to po kilku minutach od napisania postu :E Po prostu przeczytałem to co kod robi, a co ja potrzebuję :E Program oczekiwał kliknięcia jakiegoś dziwnego żeby wywołać wyświetlenie okienka, a ja potrzebowałem samego wywołania funkcji, a nie jakiegoś "inicjalizatora":P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...