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

📄 llk_main.c

📁 连连看linux版V1.0,用C语言写的
💻 C
📖 第 1 页 / 共 3 页
字号:
  GdkPixbuf *pixbuf;  GdkRectangle update_rect;  gint i;  gint width,height;    if(p1.x == p2.x)  {    if(p1.y < p2.y)      for(i=p1.y; i<p2.y; i++)      {        pixbuf = gdk_pixbuf_new_from_inline(-1,horizon_inline,FALSE,NULL);	width = gdk_pixbuf_get_width(pixbuf);	height = gdk_pixbuf_get_height(pixbuf);	gdk_pixbuf_render_to_drawable_alpha(pixbuf,ui_double_pixmap,                0,0,UI_FIXED_START_DRAW_LEFT - algorithm_game.difficulty*40 + i*40 + 20,UI_FIXED_START_DRAW_TOP + p1.x*50,		width,height,                GDK_PIXBUF_ALPHA_BILEVEL,128,                GDK_RGB_DITHER_NORMAL, 0, 0);        gdk_pixbuf_unref(pixbuf);      }    else      for(i=p2.y; i<p1.y; i++)      {        pixbuf = gdk_pixbuf_new_from_inline(-1,horizon_inline,FALSE,NULL);	width = gdk_pixbuf_get_width(pixbuf);	height = gdk_pixbuf_get_height(pixbuf);	gdk_pixbuf_render_to_drawable_alpha(pixbuf,ui_double_pixmap,                0,0,UI_FIXED_START_DRAW_LEFT - algorithm_game.difficulty*40 + i*40 + 20,UI_FIXED_START_DRAW_TOP + p1.x*50,		width,height,                GDK_PIXBUF_ALPHA_BILEVEL,128,                GDK_RGB_DITHER_NORMAL, 0, 0);        gdk_pixbuf_unref(pixbuf);      }  }  else  /*p1.y == p2.y*/  {    if(p1.x < p2.x)      for(i=p1.x; i<p2.x; i++)      {        pixbuf = gdk_pixbuf_new_from_inline(-1,vertical_inline,FALSE,NULL);	width = gdk_pixbuf_get_width(pixbuf);	height = gdk_pixbuf_get_height(pixbuf);	gdk_pixbuf_render_to_drawable_alpha(pixbuf,ui_double_pixmap,                0,0,UI_FIXED_START_DRAW_LEFT - algorithm_game.difficulty*40 + p1.y*40,UI_FIXED_START_DRAW_TOP + i*50 + 25,		width,height,                GDK_PIXBUF_ALPHA_BILEVEL,128,                GDK_RGB_DITHER_NORMAL, 0, 0);        gdk_pixbuf_unref(pixbuf);      }    else      for(i=p2.x; i<p1.x; i++)      {        pixbuf = gdk_pixbuf_new_from_inline(-1,vertical_inline,FALSE,NULL);	width = gdk_pixbuf_get_width(pixbuf);	height = gdk_pixbuf_get_height(pixbuf);	gdk_pixbuf_render_to_drawable_alpha(pixbuf,ui_double_pixmap,                0,0,UI_FIXED_START_DRAW_LEFT - algorithm_game.difficulty*40 + p1.y*40,UI_FIXED_START_DRAW_TOP + i*50 + 25,		width,height,                GDK_PIXBUF_ALPHA_BILEVEL,128,                GDK_RGB_DITHER_NORMAL, 0, 0);        gdk_pixbuf_unref(pixbuf);      }  }    /*重绘窗口*/    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);   }void ui_link(struct AlgorithmPoint p1, struct AlgorithmPoint p2){  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);  }  }/*  作弊*/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();  }}/*  使用自己的牌面图案*/void ui_use_mycards(GtkWidget *w,gpointer data){  GtkWidget *dialog;  GtkMessageType type;  static gint count = 0;  gchar *message = (gchar *)g_malloc(sizeof(gchar)*100);  gchar *filename;    /*用count,是为了放置在本函数中重设active时,会再次触发本函数而弹出两次警告窗口*/  if(count == 0)  {    count ++;  }  else  {    g_free(message);    return;  }  if(algorithm_game.status == ALGORITHM_GAME_RUN)  {      sprintf(message,"不要了吧,游戏中切换可能导致图案混乱,你只能在游戏停止或暂停时切换!");      type = GTK_MESSAGE_INFO;  }  else  {    if(gtk_check_menu_item_get_active(item_use_mycards))    {      type = GTK_MESSAGE_INFO;            /*打开文件*/      dialog = gtk_file_chooser_dialog_new ("选择牌面图片",                                      GTK_WINDOW(w),                                      GTK_FILE_CHOOSER_ACTION_OPEN,                                      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,                                      GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,                                      NULL);      if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)      {        filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));        if(ui_pixbuf)gdk_pixbuf_unref(ui_pixbuf);        ui_pixbuf = gdk_pixbuf_new_from_file(filename,NULL);        if(ui_pixbuf)        {          if(gdk_pixbuf_get_width(ui_pixbuf) == 1656 && gdk_pixbuf_get_height(ui_pixbuf) == 110)	  {	    sprintf(message,"切换牌面成功!");          }	  else	  {	    sprintf(message,"\'%s\'的尺寸不对,应该是1656×110!!\n切换失败,仍使用默认牌面.",filename);	    gdk_pixbuf_unref(ui_pixbuf);	    ui_pixbuf = gdk_pixbuf_new_from_inline(-1,image_cards_inline,FALSE,NULL);	    gtk_check_menu_item_set_active (item_use_mycards,FALSE);	  }        }        else        {          sprintf(message,"打开文件\'%s\'时出错!\n切换失败,仍使用默认牌面.",filename);	  ui_pixbuf = gdk_pixbuf_new_from_inline(-1,image_cards_inline,FALSE,NULL);	  gtk_check_menu_item_set_active (item_use_mycards,FALSE);        }	g_free(filename);      }      else      {        gtk_check_menu_item_set_active(item_use_mycards,FALSE);	sprintf(message,"您放弃了选择图片操作,牌面图片不变.");      }      gtk_widget_destroy (dialog);    }    else    {      sprintf(message,"您取消了自定义牌面,以后将使用默认牌面.");      type = GTK_MESSAGE_WARNING;      if(ui_pixbuf)gdk_pixbuf_unref(ui_pixbuf);      ui_pixbuf = gdk_pixbuf_new_from_inline(-1,image_cards_inline,FALSE,NULL);    }  }  dialog = gtk_message_dialog_new(NULL,GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,type,GTK_BUTTONS_OK,message);  gtk_dialog_run(GTK_DIALOG(dialog));  gtk_widget_destroy(dialog);  g_free(message);  count = 0;}/* 创建一个适当大小的后端位图 */static gintconfigure_event (GtkWidget *widget, GdkEventConfigure *event){  if (ui_double_pixmap)    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;}/* 从后端位图重新绘制屏幕 */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;}/*  主函数,创建窗体,进入消息循环。  注意,其中创建fixed之后,给全局变量llk_fixed赋值.*/int main (int argc , char* argv[]){	GtkWidget *window;	GtkWidget *main_vbox,*vbox,*hbox;	GtkWidget *menubar;	GdkPixbuf *pixbuf;	gtk_init(&argc,&argv);	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);	g_signal_connect(G_OBJECT(window),"delete_event",					G_CALLBACK(gtk_main_quit),NULL);	gtk_window_set_title(GTK_WINDOW(window),"连连看-linux Version 1.0 by Alpher");	gtk_window_set_default_size(GTK_WINDOW(window),770+4,600+30);	gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);	gtk_window_set_policy(GTK_WINDOW(window),TRUE,FALSE,FALSE);	pixbuf = gdk_pixbuf_new_from_inline(-1,logo_inline,FALSE,NULL);	gtk_window_set_icon(GTK_WINDOW(window),pixbuf);			main_vbox = gtk_vbox_new(FALSE,1);	gtk_container_set_border_width(GTK_CONTAINER(main_vbox),1);	gtk_container_add(GTK_CONTAINER(window),main_vbox);	gtk_widget_show(main_vbox);	/*这里处理菜单*/	vbox = gtk_vbox_new(FALSE,1);	gtk_container_set_border_width(GTK_CONTAINER(vbox),1);	gtk_box_pack_start(GTK_BOX(main_vbox),vbox,FALSE,TRUE,0);	gtk_widget_show(vbox);	get_main_menu(window,&menubar);	/*第一个false是说菜单不填满整个main_vbox,最后的0,表示菜单栏于main_vbox上端之间的间距*/	gtk_box_pack_start(GTK_BOX(vbox),menubar,FALSE,TRUE,0);	gtk_widget_show(menubar);	/*这里处理游戏区上方的信息*/	hbox = gtk_hbox_new(FALSE,1);	gtk_box_pack_start(GTK_BOX(main_vbox),hbox,FALSE,TRUE,0);	gtk_widget_show(hbox);	ui_top.label_difficulty = gtk_label_new_with_mnemonic("难度:");	gtk_widget_set_size_request(ui_top.label_difficulty,100,20);	gtk_label_set_justify(GTK_LABEL(ui_top.label_difficulty),GTK_JUSTIFY_LEFT);	gtk_box_pack_start(GTK_BOX(hbox),ui_top.label_difficulty,FALSE,FALSE,0);	gtk_widget_show(ui_top.label_difficulty);	ui_top.label_level = gtk_label_new_with_mnemonic("级别:");	gtk_widget_set_size_request(ui_top.label_level,100,20);	gtk_label_set_justify(GTK_LABEL(ui_top.label_level),GTK_JUSTIFY_LEFT);	gtk_box_pack_start(GTK_BOX(hbox),ui_top.label_level,FALSE,FALSE,0);	gtk_widget_show(ui_top.label_level);	ui_top.label_change_type = gtk_label_new_with_mnemonic("变化类型:");	gtk_widget_set_size_request(ui_top.label_change_type,200,20);	gtk_label_set_justify(GTK_LABEL(ui_top.label_change_type),GTK_JUSTIFY_CENTER);	gtk_box_pack_start(GTK_BOX(hbox),ui_top.label_change_type,FALSE,FALSE,0);	gtk_widget_show(ui_top.label_change_type);	ui_top.label_score = gtk_label_new_with_mnemonic("0");	gtk_widget_set_size_request(ui_top.label_score,100,20);	gtk_label_set_justify(GTK_LABEL(ui_top.label_score),GTK_JUSTIFY_LEFT);	gtk_box_pack_end(GTK_BOX(hbox),ui_top.label_score,FALSE,FALSE,0);	gtk_widget_show(ui_top.label_score);	hbox = gtk_hbox_new(FALSE,1);	gtk_box_pack_start(GTK_BOX(main_vbox),hbox,FALSE,TRUE,0);	gtk_widget_show(hbox);	ui_top.label_life = gtk_label_new_with_mnemonic("生命:");	gtk_widget_set_size_request(ui_top.label_life,100,20);	gtk_label_set_justify(GTK_LABEL(ui_top.label_life),GTK_JUSTIFY_LEFT);	gtk_box_pack_start(GTK_BOX(hbox),ui_top.label_life,FALSE,FALSE,0);	gtk_widget_show(ui_top.label_life);	ui_top.label_hint = gtk_label_new_with_mnemonic("提示:");	gtk_widget_set_size_request(ui_top.label_hint,100,20);	gtk_label_set_justify(GTK_LABEL(ui_top.label_hint),GTK_JUSTIFY_LEFT);	gtk_box_pack_start(GTK_BOX(hbox),ui_top.label_hint,FALSE,FALSE,0);	gtk_widget_show(ui_top.label_hint);	ui_top.progress_bar = gtk_progress_bar_new();	gtk_widget_set_size_request(ui_top.progress_bar,200,20);	gtk_box_pack_start(GTK_BOX(hbox),ui_top.progress_bar,FALSE,FALSE,0);	gtk_widget_show(ui_top.progress_bar);	gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ui_top.progress_bar),0);		/*这里处理游戏区*/	vbox = gtk_vbox_new(FALSE,1);	gtk_container_set_border_width(GTK_CONTAINER(vbox),0);	gtk_box_pack_start(GTK_BOX(main_vbox),vbox,FALSE,TRUE,0);	gtk_widget_show(vbox);	ui_drawingarea = gtk_drawing_area_new();	gtk_widget_set_size_request(ui_drawingarea,770,550);	gtk_box_pack_start( GTK_BOX(main_vbox),ui_drawingarea,FALSE,TRUE,0);	gtk_signal_connect (GTK_OBJECT (ui_drawingarea), "expose_event",                      (GtkSignalFunc) expose_event, NULL);	gtk_signal_connect (GTK_OBJECT(ui_drawingarea),"configure_event",                      (GtkSignalFunc) configure_event, NULL);	gtk_signal_connect (GTK_OBJECT (ui_drawingarea), "button_press_event",                      (GtkSignalFunc) ui_drawingarea_clicked, NULL);	gtk_widget_set_events (ui_drawingarea, GDK_EXPOSURE_MASK                         | GDK_LEAVE_NOTIFY_MASK                         | GDK_BUTTON_PRESS_MASK                         | GDK_POINTER_MOTION_HINT_MASK);		/*绘制并显示背景图片,undo*/	/*main_fixed_draw_bg(nameofthepic);*/	gtk_widget_show(ui_drawingarea);	ui_pixbuf = gdk_pixbuf_new_from_inline(-1,image_cards_inline,FALSE,NULL);	gtk_widget_show(window); 	ui_game_init(); /*初始化,准备开始游戏*/	gtk_main();  /*进入消息循环*/	return FALSE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -