Forgotten graphic with a gtk program



ciao
  First of all I make excuses myself for my English not too much corrected.  I write in order to speak you to you about a problem that I have found with my first program written in C with gtk.
I have written the algorithm in order to resolve the puzzle and have set up all the graphical interface but when start the simulation does not visualize me in real Time the graphic regarding the algorithm that is under.
I enclose the code of my program with the hope that someone can gives some council to me.

In order to see something i enclose a little png that it must be include in the program folder.

Regards

Michele

***************************************************************************

#include <gdk/gdkx.h>
#include <gtk/gtk.h>
#define DISCHI 64
#include <stdlib.h>
//variabili e strutture globali

gint valoreAnelloDrag,rigaAnelloDrag,colonnaAnelloDrag;

gint controllo=0,servizio;
gint disk=64;

gint asta[DISCHI][3];
GtkWidget *event_box[DISCHI][3];
GdkPixbuf *imaPixbuf[DISCHI];
GtkWidget *ringSenzaRef[DISCHI],*ring[DISCHI];
GtkWidget *oggettoFinestra;
GtkWidget *vbox3;
GtkWidget *hbox5;
GtkWidget *label3;
GtkWidget *entry1;
GtkWidget *SIMULA;

GtkWidget *ESCI;
GtkWidget *tabella;


enum {
  TARGET_STRING,
  TARGET_ROOTWIN
};

static GtkTargetEntry target_table[] = {
  { "STRING",     0, TARGET_STRING },
  { "text/plain", 0, TARGET_STRING },
  { "application/x-rootwin-drop", 0, TARGET_ROOTWIN }
};


static guint n_targets = sizeof(target_table) / sizeof(target_table[0]);

//prototipi di funzione
int puntatore_testa_colonna(int);

int fineDelGioco(void);

void disegna(void);

void inizializza(void);

void resettaCol(int);

void quick_message (gchar *);

void dohanoi(gint, gint, gint, gint);

void
on_SIMULA_clicked                      (GtkButton       *button,
                                        gpointer         user_data)
{
	GError **ERR2=0;
	gint i,j,servizio;
	gdouble x2;
			gchar *text;

			//GtkWidget *entry = lookup_widget (GTK_WIDGET(button), "ENTRY");
			text=(gchar*)gtk_entry_get_text(GTK_ENTRY(entry1));
			disk=atoi(text);

			g_print("\n\ndisk=%d\n\n",disk);
			gint N=disk;
			gint DA=0, A=2,USANDO=1;

			//Caricamento immagini dinamico
	for (i=1;i<=disk;i++){

		//equazione retta che passa da A(8,64) e B(20,3) per ottenere la larghezza dell'anello
		x2=-0.2*disk+20.51;
		//funzione che carica un pixbuf da un file e lo scala con un fattore che decido io.La larghezza e' ottenuta pensando ad un iperbole equilatera.
		imaPixbuf[i]=gdk_pixbuf_new_from_file_at_scale("ring.png",(320/disk)*i,x2,FALSE,ERR2);
		//carico nel widget ringSenzaRef il pixbuf appena creato
		ringSenzaRef[i]=gtk_image_new_from_pixbuf(imaPixbuf[i]);
		//carico in ring la referenza appena stanziata
		ring[i]=g_object_ref(ringSenzaRef[i]);
	};


	//creazione disegno e struttura dinamico
	for (i=0;i<=disk-1;i++){
			for (j=0;j<=2;j++){
			//le immagini non possono ricevere eventi percio' le inseriremo in un event box
			event_box[i][j]=gtk_event_box_new ();
			gtk_table_attach_defaults (GTK_TABLE (tabella), event_box[i][j], j,j+1,i,i+1);
				};
			};

	resettaCol(1);
	resettaCol(2);
	inizializza();
	disegna();
	dohanoi(N, DA, A,USANDO);
			//Visualizzazione
	gtk_widget_show_all (oggettoFinestra);


};



void
on_ESCI_clicked                        (GtkButton       *button,
                                        gpointer         user_data)
{
gtk_main_quit();
}


//MAIN
int main( int   argc,char *argv[] ){
	gtk_init (&argc, &argv);

  oggettoFinestra = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (oggettoFinestra), ("Towers of Hanoi 0.1b"));

  vbox3 = gtk_vbox_new (FALSE, 0);
  gtk_widget_show (vbox3);
  gtk_container_add (GTK_CONTAINER (oggettoFinestra), vbox3);

  hbox5 = gtk_hbox_new (TRUE, 0);
  gtk_widget_show (hbox5);
  gtk_box_pack_start (GTK_BOX (vbox3), hbox5, FALSE, FALSE, 0);

  label3 = gtk_label_new (("Numero Anelli"));
  gtk_widget_show (label3);
  gtk_box_pack_start (GTK_BOX (hbox5), label3, FALSE, FALSE, 0);
  gtk_widget_set_size_request (label3, 107, -1);

  entry1 = gtk_entry_new ();
  gtk_widget_show (entry1);
  gtk_box_pack_start (GTK_BOX (hbox5), entry1, FALSE, FALSE, 0);
  gtk_widget_set_size_request (entry1, 41, -1);

  SIMULA = gtk_button_new_with_mnemonic (("Simula"));
  gtk_widget_show (SIMULA);
  gtk_box_pack_start (GTK_BOX (hbox5), SIMULA, FALSE, FALSE, 0);







  ESCI = gtk_button_new_with_mnemonic (("Esci"));
  gtk_widget_show (ESCI);
  gtk_box_pack_start (GTK_BOX (hbox5), ESCI, FALSE, FALSE, 0);

  tabella = gtk_table_new (3, 3, TRUE);
  gtk_widget_show (tabella);
  gtk_box_pack_start (GTK_BOX (vbox3), tabella, TRUE, FALSE, 0);



	// segnali PULSANTI

  g_signal_connect ((gpointer) SIMULA, "clicked",
                    G_CALLBACK (on_SIMULA_clicked),
                    NULL);
  g_signal_connect ((gpointer) ESCI, "clicked",
                    G_CALLBACK (on_ESCI_clicked),
                    NULL);


gtk_widget_show_all (oggettoFinestra);
	//Loop
	gtk_main ();

	return 0;
};


//FUNZIONI
int  puntatore_testa_colonna(int colonnaDaEsaminare){
	gint i,j,parz,h;
	for(i=disk-1;i>=0;i--){
		if(asta[i][(gint)colonnaDaEsaminare]==0){
						g_print("\nIl primo elemento della col %d e' %d con indice%d",
			colonnaDaEsaminare,
			asta[i+1][(gint)colonnaDaEsaminare],i+1);
			parz=i+1;

			break;
			};
		};
		if(asta[disk-1][(gint)colonnaDaEsaminare]==0){
		g_print("\nLa colonna %d e' vuota",colonnaDaEsaminare);
		parz=disk-1;
		};
		if(asta[0][(gint)colonnaDaEsaminare]!=0){
		g_print("\nLa colonna %d e' piena",colonnaDaEsaminare);
		parz=0;
	};
	return parz;
	};
void resettaCol(int colonnaDaResettare){
	gint i,h,j;
	for (i=0;i<=disk-1;i++)
		{
					h=asta[i][colonnaDaResettare];
					if(h!=0)
						{
						gtk_container_remove (GTK_CONTAINER (event_box[i][colonnaDaResettare]), ring[h]);
				};
		};
};

void inizializza(void){
		gint i,j,h;
	//carico gli anelli per iniziare nell'event box della prima asta e tolgo il flag da controllo in modo che
	//carichi dischi solo all'inizio della partita
	if(controllo==0){
				//inserisco gli anelli nella prima asta
		for(i=0;i<=disk-1;i++)
			{
		asta[i][0]=i+1;
		asta[i][1]=0;
		asta[i][2]=0;
		};
	};

};

void disegna(void){
	gint i,j,h;
//stampo a schermo la matrice del gioco per questioni di servizio
	g_print("controllo%d\n",controllo);
	for (i=0;i<=disk-1;i++)
		{g_print("\n");
			for (j=0;j<=2;j++){
				g_print("%4d",asta[i][j]);
				};
			};
//disegno lo stato del gioco in base allo stato degli array
		for (i=0;i<=disk-1;i++)
		{
			for(j=0;j<=2;j++)
				{
					h=asta[i][j];
					if(h!=0)
						{
						gtk_container_add (GTK_CONTAINER (event_box[i][j]), ring[h]);
				};
		};
	};
};

void quick_message (gchar *message) {

   GtkWidget *dialog, *label;

   /* Create the widgets */

   dialog = gtk_dialog_new_with_buttons ("Message",
                                         oggettoFinestra,
                                         GTK_DIALOG_DESTROY_WITH_PARENT,
                                         GTK_STOCK_OK,
                                         GTK_RESPONSE_NONE,
                                         NULL);
   label = gtk_label_new (message);

   /* Ensure that the dialog box is destroyed when the user responds. */

   g_signal_connect_swapped (dialog,
                             "response",
                             G_CALLBACK (gtk_widget_destroy),
                             dialog);

   /* Add the label, and show everything we've added to the dialog. */

   gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox),
                      label);
   gtk_widget_show_all (dialog);
};
void dohanoi(gint N, gint da, gint a, gint usando){
	int i,j,h,parz;

	if (N > 0){

		dohanoi(N-1,da,usando,a);
		g_print("\n\nmuovo da %d --> a %d\n",da,a);
		sleep(1);
		for(i=disk-1;i>=0;i--){
			if(asta[i][da]==0){
			parz=i+1;
			//salvo in h la posizione dell'anello da rimuovere(il valore contenuto nell'array riflette l'indice del vettore che contiene gli anelli)
			h=asta[parz][da];
			//salvo il numero dell'anello in valoreAnelloDrag.Mi servira' dopo nella sezione DROP
			valoreAnelloDrag=h;
			rigaAnelloDrag=parz;
			//setto a 0 l'elemento trovato
			asta[parz][da]=0;
			//rimuovo l'anello dal container
			gtk_container_remove (GTK_CONTAINER (event_box[parz][da]), ring[h]);
			break;
			};
		};
			//se non  trova niente nel for vuol dire che sto togliendo il primo anello di un asta
	if(asta[0][da]!=0){
			h=asta[0][da];
			valoreAnelloDrag=asta[0][da];
			asta[0][da]=0;
			//ora rimuovo il widget anello dall'event box
			gtk_container_remove (GTK_CONTAINER (event_box[0][da]), ring[h]);
	};
	for(i=disk-1;i>=0;i--){
		if(asta[i][a]==0){

					asta[i][a]=valoreAnelloDrag;
					//aggiungo l'anello al container
					gtk_container_add (GTK_CONTAINER (event_box[i][a]), ring[valoreAnelloDrag]);
					break;
			};
		};
			for (i=0;i<=disk-1;i++){
			g_print("\n");
			for (j=0;j<=2;j++){
				g_print("%4d",asta[i][j]);
				};
			};
		dohanoi(N-1,usando,a,da);
	};
};

Attachment: ring.png
Description: PNG image



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]