📄 actions.c
字号:
number = (gint**)g_malloc(MAX_ROW*sizeof(gint*)); g_assert (block != NULL); g_assert (bomb != NULL); g_assert (number != NULL); //memset (block, 0, MAX_ROW*sizeof(void)); //memset (bomb, 0, MAX_ROW*sizeof(void)); //memset (number, 0, MAX_ROW*sizeof(void)); block[0] = (gint*)g_malloc (MAX_ROW*MAX_COL*sizeof(gint)); bomb[0] = (gint*)g_malloc (MAX_ROW*MAX_COL*sizeof(gint)); number[0] = (gint*)g_malloc (MAX_ROW*MAX_COL*sizeof(gint)); g_assert (block[0] != NULL); g_assert (bomb[0] != NULL); g_assert (number[0] != NULL); memset (block[0], 0, MAX_ROW*MAX_COL*sizeof(gint)); memset (bomb[0], 0, MAX_ROW*MAX_COL*sizeof(gint)); memset (number[0], 0, MAX_ROW*MAX_COL*sizeof(gint)); for (i = 0; i < MAX_ROW-1; i++) { block[i+1] = block[i] + MAX_COL; bomb[i+1] = bomb[i] + MAX_COL; number[i+1] = number[i] + MAX_COL; } //new_game (NULL, NULL); if (main_window != NULL) { gtk_drawing_area_size (GTK_DRAWING_AREA(area), MAX_COL*BLOCK_WIDTH, MAX_ROW*BLOCK_HEIGHT); gtk_widget_set_usize (main_window, BLOCK_WIDTH*MAX_COL, BLOCK_HEIGHT*MAX_ROW+65); sprintf (lab, "%d bombs left", MAX_BOMB); gtk_label_set_text (GTK_LABEL(label), lab); sprintf (lab, "0:0"); gtk_label_set_text (GTK_LABEL(timelab), lab); }}gint time_loop (){ char lab[20]; int min, sec; if (START == 1) { timer++; min = timer/60; sec = timer%60; sprintf (lab, "%d:%d", min, sec); gtk_label_set_text (GTK_LABEL(timelab), lab); timerid = gtk_timeout_add (1000, (GtkFunction)time_loop, NULL); } return FALSE;}gint new_game (GtkWidget* widget, GdkEvent* event){ int i; char lab[20]; START = 0; timer = 0; if (PREFLAG != 0 || LOGFLAG != 0) return FALSE; if (timerid != -1) gtk_timeout_remove (timerid);//i think this id should > 0 for (i = 0; i < MAX_ROW; i++) { memset (block[i], 0, MAX_COL*sizeof(gint)); memset (bomb[i], 0, MAX_COL*sizeof(gint)); memset (number[i], -1, MAX_COL*sizeof(gint)); } load_bomb(); START = 1; LOST = 0; TIMES++; REALNUM = BOMBNUM = MAX_BOMB; fprintf (stderr, "start addr =%x\n", &START); fprintf (stderr, "block addr =%x\n", &block); fprintf (stderr, "num addr =%x\n", &number); fprintf (stderr, "times addr = %x\n", &TIMES); fprintf (stderr, "MAX_ROW addr = %x\n", &MAX_ROW); fprintf (stderr, "MAX_COL addr = %x\n", &MAX_COL); gtk_drawing_area_size (GTK_DRAWING_AREA(area), MAX_COL*BLOCK_WIDTH, MAX_ROW*BLOCK_HEIGHT); gtk_widget_set_usize (main_window, BLOCK_WIDTH*MAX_COL, BLOCK_HEIGHT*MAX_ROW+65); sprintf (lab, "%d bombs left", BOMBNUM); gtk_label_set_text (GTK_LABEL(label), lab); sprintf (lab, "0:0"); gtk_label_set_text (GTK_LABEL(timelab), lab); timerid = gtk_timeout_add (1000, (GtkFunction)time_loop, NULL); return FALSE;}void pref_ok (GtkWidget* widget, gpointer data){ if (tmp_size != AREA_SIZE) { AREA_SIZE = tmp_size; clear_area(); switch (tmp_size) { case Small: MAX_ROW = 9; MAX_COL = 9; MAX_BOMB = 10; break; case Middle: case Large: MAX_ROW = 16; MAX_COL = 30; MAX_BOMB = 99; break; } reset_area(); } gtk_widget_destroy (pref_dialog); PREFLAG = 0;}void pref_cancel (GtkWidget* widget, gpointer data){ gtk_widget_destroy (pref_dialog); PREFLAG = 0;}void size_toggled (GtkWidget* widget, gpointer data){ tmp_size =(gint) data;}gint pref_set (GtkWidget* widget, GdkEvent* event){ GtkWidget* ok; GtkWidget* cancel; GtkWidget* vbox; GtkWidget* hbox; GtkWidget* size[3]; GtkWidget* frame; gint i; if (START != 0 ) return FALSE; if (PREFLAG != 0) return FALSE; PREFLAG = 1; tmp_size = AREA_SIZE; pref_dialog = gtk_dialog_new (); gtk_widget_show (pref_dialog); gtk_window_set_title (GTK_WINDOW(pref_dialog), "GPE-Bomb: Preferences:"); //gpe_set_window_icon (pref_dialog, "icon"); //gtk_widget_set_usize (pref_dialog, 200, 200); //gtk_window_set_policy (GTK_WINDOW(pref_dialog), FALSE, FALSE, FALSE); ok = gtk_button_new_from_stock (GTK_STOCK_OK); cancel = gtk_button_new_from_stock (GTK_STOCK_CANCEL); gtk_widget_show (ok); gtk_widget_show (cancel); gtk_signal_connect (GTK_OBJECT(ok), "clicked", GTK_SIGNAL_FUNC(pref_ok), NULL); gtk_signal_connect (GTK_OBJECT(cancel), "clicked", GTK_SIGNAL_FUNC(pref_cancel), NULL); gtk_signal_connect (GTK_OBJECT(pref_dialog), "delete_event", GTK_SIGNAL_FUNC(pref_cancel), pref_dialog); gtk_box_pack_end (GTK_BOX(GTK_DIALOG(pref_dialog)->action_area), ok, TRUE, TRUE, 0); gtk_box_pack_end (GTK_BOX(GTK_DIALOG(pref_dialog)->action_area), cancel, TRUE, TRUE, 0); //gtk_grab_add (pref_dialog); size[0] = gtk_radio_button_new_with_label (NULL, "Small"); gtk_signal_connect (GTK_OBJECT(size[0]), "toggled", GTK_SIGNAL_FUNC(size_toggled), (gpointer)Small); size[1] = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(size[0]), "Middle"); size[2] = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(size[0]), "Large"); gtk_signal_connect (GTK_OBJECT(size[1]), "toggled", GTK_SIGNAL_FUNC(size_toggled), (gpointer)Middle); gtk_signal_connect (GTK_OBJECT(size[2]), "toggled", GTK_SIGNAL_FUNC(size_toggled), (gpointer)Large); if (AREA_SIZE == Small) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(size[0]), TRUE); } else if (AREA_SIZE == Middle) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(size[1]), TRUE); } else if (AREA_SIZE == Large) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(size[2]), TRUE); } hbox = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox); gtk_box_pack_start_defaults (GTK_BOX(GTK_DIALOG(pref_dialog)->vbox), hbox); vbox = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox); frame = gtk_frame_new ("Size Setting:"); gtk_widget_show (frame); gtk_container_add (GTK_CONTAINER(frame), vbox); gtk_box_pack_start_defaults (GTK_BOX(hbox), frame); gtk_box_pack_start_defaults (GTK_BOX(vbox), size[0]); gtk_box_pack_start_defaults (GTK_BOX(vbox), size[1]); gtk_box_pack_start_defaults (GTK_BOX(vbox), size[2]); gtk_widget_show (size[0]); gtk_widget_show (size[1]); gtk_widget_show (size[2]);}gint log_destroy (GtkWidget* widget, GdkEvent* event, gpointer data){ gchar* my_name = gtk_editable_get_chars (GTK_EDITABLE(data), 0, -1); if (data == NULL) { myout ("a anonymous\n"); strcpy (name[last_pos], "Anonymous"); } else if (!strcmp (my_name, "")) { myout ("a anonymous\n"); strcpy (name[last_pos], "Anonymous"); g_free (my_name); } else { strncpy (name[last_pos], my_name, 19); g_free (my_name); } gtk_widget_destroy (log_dialog); LOGFLAG = 0;}int sort (){ int i, t; char tmp[20]; for (i = last_pos = 9; i > 0; i--) { if (score[i] < score[i-1] || score[i-1] == 0) { swap_int (score[i], score[i-1]); swap_string (name[i], name[i-1]); last_pos--; } } return last_pos;}void log_name (int my_score){ int i, j, position; GtkWidget* entry[10]; GtkWidget* label[10]; GtkWidget* table; char lab[10]; if (LOGFLAG == 1) return; if (my_score < score[9] || score[9] == 0) score[9] = my_score; else return; LOGFLAG = 1; log_dialog = gtk_dialog_new (); gtk_widget_show (log_dialog); gtk_window_set_title (GTK_WINDOW(log_dialog), "Rank by Time"); position = sort (); for (i = 0; i < 10; i++) { if (score[i] == 0) break; entry[i] = gtk_entry_new_with_max_length (19); gtk_widget_show (entry[i]); if (i != position) { gtk_entry_set_text (GTK_ENTRY(entry[i]), name[i]); gtk_entry_set_editable (GTK_ENTRY(entry[i]), FALSE); } sprintf (lab, "%d", score[i]); label[i] = gtk_label_new (lab); gtk_widget_show (label[i]); } fprintf (stderr, "i==%d\n", i); table = gtk_table_new (i+1, 2, TRUE); gtk_widget_show (table); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(log_dialog)->vbox), table, FALSE, FALSE, FALSE); for (j = 0; j < i; j++) { gtk_table_attach (GTK_TABLE(table), entry[j], 0, 1, j, j+1, GTK_FILL, GTK_FILL, 0, 0); gtk_table_attach (GTK_TABLE(table), label[j], 1, 2, j, j+1, GTK_FILL, GTK_FILL, 0, 0); } gtk_signal_connect (GTK_OBJECT(log_dialog), "delete_event", GTK_SIGNAL_FUNC(log_destroy), (gpointer)entry[position]);}void load_log (){ int i; FILE* log = fopen (LOG_FILE, "r"); if (log == NULL) { fprintf (stderr, "cant' open log file:%d\n", errno); return; } for (i = 0; i < 10; i++) { if (fscanf (log, "%s\t%d\n", name[i], &score[i]) <= 0) break;#ifdef _DEBUG fprintf (stderr, "%s\t%d\n", name[i], score[i]);#endif } fclose (log);} void save_log (){ int i; FILE* log = fopen (LOG_FILE, "w"); if (log == NULL) { fprintf (stderr, "can't open log:%d\n", errno); return; } for (i = 0; i < 10; i++) { if (score[i] == 0) break; fprintf (log, "%s\t%d\n", name[i], score[i]);#ifdef _DEBUG fprintf (stderr, "%s\t%d\n", name[i], score[i]);#endif } fclose (log);}gint quit_game (GtkWidget* widget, GdkEvent* event, gpointer data){ save_log (); gtk_main_quit ();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -