Forgotten graphic with gtk
- From: "mistrial libero it" <mistrial libero it>
- To: "gtk-list" <gtk-list gnome org>
- Subject: Forgotten graphic with gtk
- Date: Mon, 19 Dec 2005 21:12:16 +0100
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);
};
};
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]