📄 main.c
字号:
#include<stdlib.h>#include<gtk/gtk.h>#include"main.h"#include"drawboard.h"#include"module_act.h"#include"time_tick.h"#include"clean_line.h"#include"about_message.h"extern GdkPixbuf* image;extern gint* board1[COLUMN1];extern gint* board2[COLUMN2];extern pmodule module;extern gboolean ispause;GtkWidget* lscore;GtkWidget* lrow;GtkWidget* llevel;gint score=0;gint row =0;gint level=1;gint timerid;gint timespace=TIME_SPACE;static gint blockWidth=0; static gbooleanstop_the_app(GtkWidget* widget,gpointer data){ gtk_main_quit(); return TRUE;}static voidboard_configure1(GtkWidget* widget, gpointer data){ drawboard_init(widget, COLUMN1,ROW1, blockWidth,1); }static voidboard_configure2(GtkWidget* widget, gpointer data){ drawboard_init(widget, COLUMN2,ROW2, blockWidth*2/3,2);}static gbooleanexpose_event1(GtkWidget* widget, gpointer data){ return drawboard_expose(widget, 1,NULL);}static gbooleanexpose_event2(GtkWidget* widget, gpointer data){ return drawboard_expose(widget, 2,NULL);}static gbooleanapp_start(GtkWidget* widget, gpointer data){ if(0==timerid){ /* Declared in time_tick.h */ time_tick_init(GTK_WIDGET(data)); timerid=g_timeout_add(timespace, time_tick, GTK_WIDGET(data)); } ispause=FALSE; return TRUE;}static gbooleanapp_pause(GtkWidget* widget, gpointer data){ ispause=TRUE; return TRUE;}static gbooleanstop_the_game(GtkWidget* widget, gpointer data){ renew_the_app(GTK_WIDGET(data)); return TRUE;}static gbooleancreate_buttons(GtkWidget* window, GtkWidget* box){ GtkWidget* lbox; GtkWidget* bstart; GtkWidget* bpause; GtkWidget* bstop; GtkWidget* bquit; bquit =gtk_button_new_with_label("Quit"); bstop =gtk_button_new_with_label("Stop"); bpause=gtk_button_new_with_label("Pause"); bstart=gtk_button_new_with_label("Start"); gtk_box_pack_end_defaults(GTK_BOX(box), bquit); gtk_box_pack_end_defaults(GTK_BOX(box), bstop); gtk_box_pack_end_defaults(GTK_BOX(box), bpause); gtk_box_pack_end_defaults(GTK_BOX(box), bstart); gtk_signal_connect(GTK_OBJECT(bstart), "clicked", GTK_SIGNAL_FUNC(app_start), window); gtk_signal_connect(GTK_OBJECT(bpause), "clicked", GTK_SIGNAL_FUNC(app_pause), window); gtk_signal_connect(GTK_OBJECT(bquit), "clicked", GTK_SIGNAL_FUNC(stop_the_app), NULL); gtk_signal_connect(GTK_OBJECT(bstop), "clicked", GTK_SIGNAL_FUNC(stop_the_game), window); lscore=gtk_label_new("score: 0"); lrow =gtk_label_new("row : 0"); llevel=gtk_label_new("level: 1"); lbox=gtk_vbox_new(FALSE,5); gtk_box_pack_end_defaults(GTK_BOX(lbox), llevel); gtk_box_pack_end_defaults(GTK_BOX(lbox), lrow); gtk_box_pack_end_defaults(GTK_BOX(lbox), lscore); gtk_box_pack_end_defaults(GTK_BOX(box), lbox); return TRUE;}static gbooleankey_release_answer(GtkWidget* widget, GdkEventKey* key, gpointer data){ switch(key->keyval){ case 65364: break; default: break; } return TRUE;}static gbooleankey_press_answer(GtkWidget* widget, GdkEventKey* key, gpointer data){ if(ispause) return TRUE; // g_print("::%d::\n",key->keyval); switch(key->keyval){ case 65362: /* up */ module_rotate(module); draw_mod_board1(module); drawboard_draw(widget, board1, COLUMN1, ROW1, 1); break; case 65361: /* left */ module_left(module); draw_mod_board1(module); drawboard_draw(widget, board1, COLUMN1, ROW1, 1); break; case 65363: /* right */ module_right(module); draw_mod_board1(module); drawboard_draw(widget, board1, COLUMN1, ROW1, 1); break; case 65364: /* down */ time_tick(widget); break; case 32: module_direct_down(widget, module); draw_mod_board1(module); drawboard_draw(widget, board1, COLUMN1, ROW1, 1); break; default: break; } return TRUE;}static gbooleancreate_menu(GtkWidget* window, GtkWidget* vbox){ GtkWidget* label; GtkWidget* menubar; GtkWidget* gamemenuitem; GtkWidget* helpmenuitem; GtkWidget* menu; GtkWidget* item; menubar=gtk_menu_bar_new(); gtk_box_pack_start_defaults(GTK_BOX(vbox), menubar); gamemenuitem=gtk_menu_item_new_with_label("Game"); helpmenuitem=gtk_menu_item_new_with_label("Help"); gtk_menu_bar_append(GTK_MENU_BAR(menubar), gamemenuitem); gtk_menu_bar_append(GTK_MENU_BAR(menubar), helpmenuitem); menu=gtk_menu_new(); item=gtk_menu_item_new_with_label("Start"); gtk_menu_append(GTK_MENU(menu),item); gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(app_start), window); item=gtk_menu_item_new_with_label("Pause "); gtk_menu_append(GTK_MENU(menu),item); gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(app_pause), window); item=gtk_menu_item_new_with_label("Stop"); gtk_menu_append(GTK_MENU(menu),item); gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(stop_the_game), window); item=gtk_menu_item_new_with_label("Quit"); gtk_menu_append(GTK_MENU(menu),item); gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(stop_the_app), window); gtk_menu_item_set_submenu(GTK_MENU_ITEM(gamemenuitem),menu); menu=gtk_menu_new(); item=gtk_menu_item_new_with_label("About "); gtk_menu_append(GTK_MENU(menu),item); gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(show_about_message), window); gtk_menu_item_set_submenu(GTK_MENU_ITEM(helpmenuitem),menu); return TRUE;}static gbooleaninit_interface(GtkWidget* window){ GtkWidget* hbox; GtkWidget* vbox; GtkWidget* canvas1; GtkWidget* canvas2; GtkWidget* test; gchar fname[]="pixmaps/colors.png"; vbox=gtk_vbox_new(FALSE,5); gtk_container_add(GTK_CONTAINER(window), vbox); hbox=gtk_hbox_new(FALSE,5);// gtk_container_add(GTK_CONTAINER(window),hbox); gtk_box_pack_end_defaults(GTK_BOX(vbox), hbox); create_menu(window,vbox); vbox=gtk_vbox_new(FALSE,5); gtk_box_pack_end_defaults(GTK_BOX(hbox), vbox); image=gdk_pixbuf_new_from_file(fname, NULL); if(NULL==image){ g_print("Fail to open file: %s\n",fname); exit(0); } blockWidth=gdk_pixbuf_get_width(image)/3; canvas1=gtk_drawing_area_new(); gtk_drawing_area_size(GTK_DRAWING_AREA(canvas1), blockWidth*COLUMN1, blockWidth*ROW1); gtk_box_pack_end_defaults(GTK_BOX(hbox), canvas1); gtk_signal_connect(GTK_OBJECT(canvas1), "configure_event", GTK_SIGNAL_FUNC(board_configure1), canvas1); gtk_signal_connect(GTK_OBJECT(canvas1), "expose_event", GTK_SIGNAL_FUNC(expose_event1), NULL); canvas2=gtk_drawing_area_new(); gtk_drawing_area_size(GTK_DRAWING_AREA(canvas2), blockWidth*2/3*COLUMN2, blockWidth*2/3*ROW2); gtk_box_pack_start_defaults(GTK_BOX(vbox), canvas2); gtk_signal_connect(GTK_OBJECT(canvas2), "configure_event", GTK_SIGNAL_FUNC(board_configure2), canvas2); gtk_signal_connect(GTK_OBJECT(canvas2), "expose_event", GTK_SIGNAL_FUNC(expose_event2), NULL); gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(key_press_answer), NULL); gtk_signal_connect(GTK_OBJECT(window), "key_release_event", GTK_SIGNAL_FUNC(key_release_answer), NULL); create_buttons(window,vbox); return TRUE;}static gbooleancreate_app(void){ gint i,j; GtkWidget* window; srand(time(0)); for(i=0;i<COLUMN1;i++){ board1[i]=&_board1[i*ROW1]; } for(i=0;i<COLUMN2;i++){ board2[i]=&_board2[i*ROW2]; } window=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Teris Game"); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_resizable(GTK_WINDOW(window), FALSE); gtk_container_set_border_width(GTK_CONTAINER(window), 0); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(stop_the_app), NULL); init_interface(window); gtk_widget_show_all(window); return TRUE;}gint main(gint argc,gchar* argv[]){ gtk_init(&argc,&argv); if(create_app()){ gtk_main(); } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -