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.

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


_______________________________________________
gtk-list mailing list
gtk-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-list

Reply via email to