📄 main.c
字号:
for(i=0; i<algorithm_game.row ;i++) { for(j=0; j<algorithm_game.col ;j++) { if(algorithm_game.data[i][j] > 0) { for(k=i;k<algorithm_game.row;k++) { for(l=0;l<algorithm_game.col;l++) { if(k == i && l == j)continue; /*exclude the situation of link to itself*/ if(algorithm_game.data[k][l] > 0) { struct AlgorithmPoint p1,p2; p1.x = i; p1.y = j; p2.x = k; p2.y = l; if(algorithm_can_link(p1,p2,NULL,NULL)) { ui_replace_image(p1,p2); /*the window's redraw action is done in ui_replace_image function*/ /*switch the card image at p1 and p2,the image stand for hint status*/ if(gtk_check_menu_item_get_active(ui_menu_item.sound_effect))ui_play("Hint.wav"); return; /*got a pair that can link,return immediately*/ } } } } } } }}/* dealing with the link line effect when delete cards*/void ui_draw_line(struct AlgorithmPoint p1,struct AlgorithmPoint p2){ gint i; gint width,height; if(p1.x == p2.x) { if(p1.y < p2.y) for(i=p1.y; i<p2.y; i++) { width = gdk_pixbuf_get_width(ui_pixbuf.horizon); height = gdk_pixbuf_get_height(ui_pixbuf.horizon); gdk_pixbuf_render_to_drawable_alpha(ui_pixbuf.horizon,ui_double_pixmap, 0,0,UI_FIXED_START_DRAW_LEFT+(i-algorithm_game.difficulty)*(UI_BACK_WIDTH-UI_BACK_BORDER_1) + 20, UI_FIXED_START_DRAW_TOP + p1.x*(UI_BACK_HEIGHT-UI_BACK_BORDER_2), width,height, GDK_PIXBUF_ALPHA_BILEVEL,128, GDK_RGB_DITHER_NORMAL, 0, 0); } else for(i=p2.y; i<p1.y; i++) { width = gdk_pixbuf_get_width(ui_pixbuf.horizon); height = gdk_pixbuf_get_height(ui_pixbuf.horizon); gdk_pixbuf_render_to_drawable_alpha(ui_pixbuf.horizon,ui_double_pixmap, 0,0,UI_FIXED_START_DRAW_LEFT + (i-algorithm_game.difficulty)*(UI_BACK_WIDTH-UI_BACK_BORDER_1)+20, UI_FIXED_START_DRAW_TOP + p1.x*(UI_BACK_HEIGHT-UI_BACK_BORDER_2), width,height, GDK_PIXBUF_ALPHA_BILEVEL,128, GDK_RGB_DITHER_NORMAL, 0, 0); } } else /*p1.y == p2.y*/ { if(p1.x < p2.x) for(i=p1.x; i<p2.x; i++) { width = gdk_pixbuf_get_width(ui_pixbuf.vertical); height = gdk_pixbuf_get_height(ui_pixbuf.vertical); gdk_pixbuf_render_to_drawable_alpha(ui_pixbuf.vertical,ui_double_pixmap, 0,0,UI_FIXED_START_DRAW_LEFT + (p1.y-algorithm_game.difficulty)*(UI_BACK_WIDTH-UI_BACK_BORDER_1), UI_FIXED_START_DRAW_TOP + i*(UI_BACK_HEIGHT - UI_BACK_BORDER_2) + 25, width,height, GDK_PIXBUF_ALPHA_BILEVEL,128, GDK_RGB_DITHER_NORMAL, 0, 0); } else for(i=p2.x; i<p1.x; i++) { width = gdk_pixbuf_get_width(ui_pixbuf.vertical); height = gdk_pixbuf_get_height(ui_pixbuf.vertical); gdk_pixbuf_render_to_drawable_alpha(ui_pixbuf.vertical,ui_double_pixmap, 0,0,UI_FIXED_START_DRAW_LEFT + (p1.y-algorithm_game.difficulty)*(UI_BACK_WIDTH-UI_BACK_BORDER_1), UI_FIXED_START_DRAW_TOP + i*(UI_BACK_HEIGHT-UI_BACK_BORDER_2) + 25, width,height, GDK_PIXBUF_ALPHA_BILEVEL,128, GDK_RGB_DITHER_NORMAL, 0, 0); } }/* because on link will call ui_draw_line for 1 or 2 or 3 times,so the redraw action should put after all lines are drawn. not put redraw action here.*/}void ui_link(struct AlgorithmPoint p1, struct AlgorithmPoint p2){ GdkRectangle update_rect; if(algorithm_can_direct_link(p1,p2)) { ui_draw_line(p1,p2); } else { struct AlgorithmPoint p3,p4; algorithm_can_link(p1,p2,&p3,&p4); ui_draw_line(p1,p3); if(p3.x != p4.x || p3.y != p4.y)ui_draw_line(p3,p4); ui_draw_line(p4,p2); } /*redraw window*/ update_rect.x = 0; update_rect.y = 0; update_rect.width = ui_drawingarea->allocation.width; update_rect.height = ui_drawingarea->allocation.height; gtk_widget_draw (ui_drawingarea, &update_rect);}/* Cheat*/void ui_game_cheat(GtkWidget *w,gpointer data){ if(algorithm_game.status != ALGORITHM_GAME_STOP) { algorithm_game.life = 99; algorithm_game.hint = 99; time_remain = ui_get_time_limited(); ui_refresh_top(); }}/*Creat a background bitmap which has suitable size*/static gintconfigure_event (GtkWidget *widget, GdkEventConfigure *event){ /* if the double pixmap exists, donot recreat, or the background will be black. */ if (ui_double_pixmap) return TRUE; //gdk_pixmap_unref(ui_double_pixmap); ui_double_pixmap = gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1); gdk_draw_rectangle (ui_double_pixmap, widget->style->black_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height); return TRUE;}/*redraw screen base on the back ground bitmap*/static gintexpose_event (GtkWidget *widget, GdkEventExpose *event){ gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], ui_double_pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return FALSE;}/* load ini setting file, and pak file. gchar **message: modify message,make it point to the error message. return value: gboolean, TRUE for success, FALSE for fail.*/gbooleanui_load_ini_pak(gchar **message){ struct passwd *user; int result; char path[MAX_PATH_LENGTH]; *message = (gchar *)g_malloc(sizeof(gchar)*100); gchar *return_str; GSList *radio_item_group=NULL; GtkWidget *menu,*menuitem; gint i; /* load ini file,if it do not exist, make a new one */ user = getpwuid(getuid()); /*user home directory: user->pw_dir*/ sprintf(path,"%s/.llk_linux",user->pw_dir); result = mkdir(path,S_IRWXU);/*read write and execuable*/ if(result == -1) { if(errno != EEXIST) /*Directory exists*/ { sprintf(*message,_("User Setting Save Error,fail to creat directory:$HOME/.llk_linux\n")); return FALSE; } } strcat(path,"/UserSettings.ini"); /* path = $HOME/.llk_linux/UserSettings.ini */ while(1) { if(g_file_test(path,G_FILE_TEST_EXISTS)) { ui_ini = ini_file_open_file(path); if(ui_ini == NULL) { sprintf(*message,_("Unable to read UserSettings.ini")); return FALSE; } else { gboolean tmp=FALSE; gchar *themename,*themenum; ini_file_read_boolean(ui_ini,"UISETTING","bgmusic",&tmp); if(tmp)gtk_check_menu_item_set_active(ui_menu_item.background_music,TRUE); else gtk_check_menu_item_set_active(ui_menu_item.background_music,FALSE); ini_file_read_boolean(ui_ini,"UISETTING","sound",&tmp); if(tmp)gtk_check_menu_item_set_active(ui_menu_item.sound_effect,TRUE); else gtk_check_menu_item_set_active(ui_menu_item.sound_effect,FALSE); ini_file_read_boolean(ui_ini,"UISETTING","bgpicture",&tmp); if(tmp)gtk_check_menu_item_set_active(ui_menu_item.background_picture,TRUE); else gtk_check_menu_item_set_active(ui_menu_item.background_picture,FALSE); /* read theme names and make menu items accordingly */ menu = gtk_menu_new(); gtk_menu_item_set_submenu( GTK_MENU_ITEM(ui_menu_item.themes),menu ); /* read default themenum,and set according menu item's check status */ if(!ini_file_read_string(ui_ini,"UISETTING", "themenum", &return_str)) { sprintf(*message,_("Failed to read \"[UISETTING]/themename\" key.")); return FALSE; } themename = (gchar *)g_malloc(sizeof(gchar)*30); themenum = (gchar *)g_malloc(sizeof(gchar)*10); /* "Theme10" string length = 8 */ for(i=0;i<10;i++) { sprintf(themenum,"theme%d",i); ini_file_read_string(ui_ini,"THEMEFILE",themenum,&themename); if(!strcmp(themename,""))continue; menuitem = gtk_radio_menu_item_new_with_label (radio_item_group, themename); radio_item_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem)); gtk_menu_append(GTK_MENU(menu), menuitem); if(!strcmp(themenum,return_str)){ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), TRUE); ui_menu_item.current_theme = GTK_RADIO_MENU_ITEM(menuitem); } gtk_signal_connect(GTK_OBJECT (menuitem), "activate", GTK_SIGNAL_FUNC (radio_item_on_clicked), GINT_TO_POINTER(i)); gtk_widget_show (menuitem); } g_free(themename); g_free(themenum); break; /* exit while loop */ } } else { ui_ini = ini_file_new(); ini_file_write_boolean(ui_ini, "UISETTING", "bgmusic", FALSE ); ini_file_write_boolean(ui_ini, "UISETTING", "sound" , TRUE ); ini_file_write_boolean(ui_ini, "UISETTING", "bgpicture", TRUE ); ini_file_write_string (ui_ini, "UISETTING", "themenum", "theme0" ); /* Support at most 10 themes */ ini_file_write_string (ui_ini, "THEMEFILE", "theme0", "Classical"); ini_file_write_string (ui_ini, "THEMEFILE", "theme1", "QQ"); ini_file_write_string (ui_ini, "THEMEFILE", "theme2", ""); ini_file_write_string (ui_ini, "THEMEFILE", "theme3", ""); ini_file_write_string (ui_ini, "THEMEFILE", "theme4", ""); ini_file_write_string (ui_ini, "THEMEFILE", "theme5", ""); ini_file_write_string (ui_ini, "THEMEFILE", "theme6", ""); ini_file_write_string (ui_ini, "THEMEFILE", "theme7", ""); ini_file_write_string (ui_ini, "THEMEFILE", "theme8", ""); ini_file_write_string (ui_ini, "THEMEFILE", "theme9", ""); ini_file_write_int (ui_ini, "GAMERECORD", "difficulty", 1 ); if(!ini_file_write_file(ui_ini,path)) { sprintf(*message,_("Unable to save $HOME/.llk_linux/UserSettings.ini")); return FALSE; } continue; /* continue,return to the start of while,to read ini file */ } } /* load pak file */ if(ini_file_read_string(ui_ini,"UISETTING", "themenum", &return_str)) { gchar *tmpstr = return_str; return_str = NULL; if( ! ini_file_read_string(ui_ini,"THEMEFILE",tmpstr, &return_str)) { sprintf(*message,_("Failed to read \"[THEMEFILE]/%s\""),tmpstr); g_free(tmpstr); return FALSE; } } else { sprintf(*message,_("Failed to read \"[UISETTING]/themename\" key.")); return FALSE; } sprintf(path,"%s/%s/%s.pak",PACKAGE_DATA_DIR,PACKAGE,return_str); if( ! g_file_test(path,G_FILE_TEST_EXISTS)) { sprintf(*message,_("The package file:LLK_DATA_PATH/pak/%s does not exists."),return_str); g_free(return_str); return FALSE; } g_free(return_str); if( ! LoadPAKHFT(path)) { sprintf(*message,_("LoadPAKHFT error.")); return FALSE; } pak_info.back_num = GetFileNum("back","jpg"); pak_info.sound_num = GetFileNum("sound","wav"); pak_info.music_num = GetFileNum("music","mid"); if( !ExtractSingleFile("cardimages.png") || !ExtractSingleFile("cardbacks.png") || !ExtractSingleFile("horizon.png") || !ExtractSingleFile("vertical.png") || !ExtractSingleFile("pause.jpg") || !ExtractSingleFile("logo.png") || !ExtractSingleFile("mainback.jpg") ) { sprintf(*message,_("Failed to extract necessary jpg/png files.")); return FALSE; } ui_pixbuf.cardimages = gdk_pixbuf_new_from_file("/tmp/llk_cardimages.png",NULL); ui_pixbuf.cardbacks = gdk_pixbuf_new_from_file("/tmp/llk_cardbacks.png",NULL); ui_pixbuf.vertical = gdk_pixbuf_new_from_file("/tmp/llk_vertical.png",NULL); ui_pixbuf.horizon = gdk_pixbuf_new_from_file("/tmp/llk_horizon.png",NULL); ui_pixbuf.logo = gdk_pixbuf_new_from_file("/tmp/llk_logo.png",NULL); ui_pixbuf.pause = gdk_pixbuf_new_from_file("/tmp/llk_pause.jpg",NULL); ui_pixbuf.mainback = gdk_pixbuf_new_from_file("/tmp/llk_mainback.jpg",NULL); ui_pixbuf.cardback_choice = g_rand_int_range(ui_rand,0,6); /*begin to end-1*/ if(pak_info.back_num > 0){ ui_pixbuf.randomback_choice = g_rand_int_range(ui_rand,1,pak_info.back_num+1); /* Extract the bg picture and read it to ui_pixbuf.randomback */ gchar bgfilename[30]; sprintf(bgfilename,"back%d.jpg",ui_pixbuf.randomback_choice-1); if(!ExtractSingleFile(bgfilename)){g_print(_("Failed to extract file:%s.\n"),bgfilename);} sprintf(bgfilename,"/tmp/llk_back%d.jpg",ui_pixbuf.randomback_choice-1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -