⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 连连看
💻 C
📖 第 1 页 / 共 5 页
字号:
  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 + -