📄 jing.c~
字号:
} do { if(node == HEAD) { my_gc_snake = gdk_gc_new(widget->window);//set the color of the snake head color.red = 0xffff; color.green = 0x0000; color.blue = 0x0000; gdk_gc_set_rgb_fg_color(my_gc_snake, &color); gdk_draw_rectangle(pixmap, my_gc_snake, TRUE, node->location.left , node->location.top, 13, 13); } else { my_gc_snake = gdk_gc_new(widget->window);//set the color of the snake body color.red = 0; color.green = 65535; color.blue = 0; gdk_gc_set_rgb_fg_color(my_gc_snake, &color); gdk_draw_rectangle(pixmap, my_gc_snake, TRUE, node->location.left , node->location.top , 13, 13); } node = node->next; }while (node != HEAD); node = BEANNODE;//set the color of the bean color.red = 65535; color.green = 0; color.blue = 65535; gdk_gc_set_rgb_fg_color(my_gc_background, &color); gdk_draw_rectangle(pixmap, my_gc_background, TRUE, BEANNODE->location.left, BEANNODE->location.top, 13, 13); }/******************************************************************内容 : キーボードを処理するニュースを接収します*参数1: widget*参数2: event*参数3: data *返回 : TRUE:正常 FALSE:異常*異常 : なし*****************************************************************/gboolean IsKeyDown(GtkWidget* widget, GdkEventKey* event, gpointer data){ if (FIRSTFLAG == -1)//judge if the key is pressed for the first time { return FALSE; } if (event->keyval == (unsigned int)HEAD->direction) { //judge if the direction is opersite to the present direction return FALSE; } switch (event->keyval) { case GDK_Up: HEAD->direction = up; break; case GDK_Down: HEAD->direction = down; break; case GDK_Left: HEAD->direction = left; break; case GDK_Right: HEAD->direction = right; break; default: return FALSE; } if ((STILLFLAG%2) == 0) //judge if the key pause is pressed { gtk_timeout_remove(timerID); timerID = 0; OnMove(widget); if(timerID != 0) { gtk_timeout_remove(timerID); timerID = 0; } timerID = gtk_timeout_add(1000,(GtkFunction)my_timer, widget); } return TRUE; } /******************************************************************内容 : 蛇のは格のモバイルを追います*参数 : widget *返回 : TRUE:正常 FALSE:異常*異常 : なし*****************************************************************/gboolean OnMove(GtkWidget *widget){ if (FIRSTFLAG == 0) //if the first time press the direction key,alter the flag { if(timerID != 0) { gtk_timeout_remove(timerID); timerID = 0; } timerID = gtk_timeout_add(1000, (GtkFunction)my_timer, widget); FIRSTFLAG = 1; } int m = HEAD->height; int n = HEAD->width; switch (HEAD->direction) { case up: m = m - 1; break; case down: m = m + 1; break; case left: n = n - 1; break; case right: n = n + 1; break; default: return FALSE; } if ((m < 0)|(m > (MAXLINEINDEX-1))|(n<0)|(n>(MAXCOLUMNINDEX-1))) { //the snake kick the wall gtk_timeout_remove(timerID); FIRSTFLAG = -1; SCORE = 0; GtkWidget * MessageBox; MessageBox = gnome_message_box_new ("Game Over ! ", GNOME_MESSAGE_BOX_WARNING, GNOME_STOCK_BUTTON_OK, NULL) ; gtk_window_set_modal((GtkWindow*)MessageBox,FALSE); gtk_widget_show (MessageBox); return FALSE; } else if (BACKGROUND[m][n] == snake) { //the snake kick itself gtk_timeout_remove(timerID); FIRSTFLAG = -1; SCORE = 0; GtkWidget * MessageBox; MessageBox = gnome_message_box_new ("Game Over ! ", GNOME_MESSAGE_BOX_WARNING, GNOME_STOCK_BUTTON_OK, NULL) ; gtk_window_set_modal((GtkWindow*)MessageBox,TRUE); gtk_widget_show (MessageBox); return FALSE; } else if (BACKGROUND[m][n] == bean) { //the snake eat the bean BEANNODE->direction = HEAD->direction; BEANNODE->last = TAIL; HEAD->last = BEANNODE; TAIL->next = BEANNODE; BEANNODE->next = HEAD; HEAD->direction = HEAD->next->direction; HEAD = BEANNODE; BACKGROUND[m][n] = snake; SCORE ++; CreateBean(); set_statusbar(); gtk_widget_queue_draw_area(widget, 0, 0, 1000, 1000); return TRUE; } else { //the snake moves in common BACKGROUND[m][n] = snake; TAIL->location.bottom = (m+1) * UNIT - 1 ; TAIL->location.top = m * UNIT + 1; TAIL->location.left = n * UNIT + 1; TAIL->location.right = (n+1) * UNIT - 1; TAIL->height = m; TAIL->width = n; TAIL->direction = HEAD->direction; TAIL->next = HEAD; HEAD->direction = HEAD->next->direction; HEAD = HEAD->last; TAIL = TAIL->last; BACKGROUND[TAIL->height][TAIL->width] = grid; gtk_widget_queue_draw_area(widget, 0, 0, 1000, 1000); return TRUE; } }/******************************************************************内容 : ステータス・バーを初期化します*参数 : なし *返回 : なし*異常 : なし*****************************************************************/void initialize_statusbar(){ status_bar = gtk_statusbar_new();//set the statusbar size gtk_widget_set_usize(status_bar, MAXWINDOWWIDTH, STATUSBARHIGHT); gtk_box_pack_end(GTK_BOX (vbox), status_bar, FALSE, TRUE, 0); gtk_widget_show (status_bar); context_ID = gtk_statusbar_get_context_id( GTK_STATUSBAR (status_bar), "Statusbar");}/******************************************************************内容 : ステータス・バーを設けます*参数 : なし *返回 : なし*異常 : なし*****************************************************************/void set_statusbar(){ gchar *buff;//display the score on status bar char TITLE_STATUSBAR[50] = {"SdkWorm // Copyright(2007) by jing_li@neusoft.com"}; buff = g_strdup_printf ("%s\t\t\tScore : %d", TITLE_STATUSBAR, SCORE); gtk_statusbar_push(GTK_STATUSBAR(status_bar), GPOINTER_TO_INT(context_ID), buff);}int main(int argc , char *argv[]){ //GtkAccelGroup *accelgroup; GtkWidget *menu; GtkWidget *menu_bar; GtkWidget *root_menu; GtkWidget *menu_items; char *buf[3] = {"New Game","Pause", "EXIT GAME"}; int i = 0; gtk_init(&argc, &argv);//set the windows size and style window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "SnakeWorm"); gtk_widget_set_size_request(window, MAXWINDOWWIDTH , MAXWINDOWLENGTH); gtk_container_set_border_width(GTK_CONTAINER(window) , 2); gtk_window_set_resizable(GTK_WINDOW(window) , FALSE); vbox = gtk_vbox_new(FALSE , 0); gtk_container_add(GTK_CONTAINER(window) , vbox); gtk_widget_show(vbox); initialize_statusbar(); set_statusbar(); menu = gtk_menu_new (); //set the menu,subitems and speed key //accelgroup = gtk_accel_group_new(); //gtk_accel_group_attach (accelgroup,GTK_OBJECT(window)); root_menu = gtk_menu_item_new_with_label ("Game"); gtk_widget_show (root_menu); menu_items = gtk_menu_item_new_with_label (buf[0]); gtk_menu_append (GTK_MENU (menu), menu_items); g_signal_connect (G_OBJECT(menu_items),"activate", G_CALLBACK(my_replay),NULL); gtk_widget_show (menu_items); // /*gtk_accel_group_add(accelgroup,'N', GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE, GTK_OBJECT(menu_items),"activate"); */ menu_items = gtk_menu_item_new_with_label (buf[1]); gtk_menu_append (GTK_MENU (menu), menu_items); g_signal_connect (G_OBJECT(menu_items),"activate", G_CALLBACK(my_pause),NULL); gtk_widget_show (menu_items); /* gtk_accel_group_add(accelgroup,'P', GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE, GTK_OBJECT(menu_items),"activate");*/ gtk_widget_show (menu_items); menu_items = gtk_menu_item_new_with_label (buf[2]); gtk_menu_append (GTK_MENU (menu), menu_items); g_signal_connect (G_OBJECT(menu_items),"activate", G_CALLBACK(my_quit),NULL); gtk_widget_show (menu_items); /* gtk_accel_group_add(accelgroup,'E', GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE, GTK_OBJECT(menu_items),"activate");*/ gtk_widget_show (menu_items); gtk_menu_item_set_submenu (GTK_MENU_ITEM (root_menu), menu); menu_bar = gtk_menu_bar_new (); gtk_widget_show (menu_bar); gtk_menu_bar_append (GTK_MENU_BAR (menu_bar), root_menu); gtk_box_pack_start (GTK_BOX (vbox), menu_bar, FALSE, FALSE, 2); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(my_quit) , NULL); drawing_area = gtk_drawing_area_new(); gtk_box_pack_start(GTK_BOX(vbox) , drawing_area , TRUE , TRUE , 0); gtk_widget_show(drawing_area); //set the connection of the event g_signal_connect(G_OBJECT(drawing_area) , "configure_event" , G_CALLBACK(InitInstance) , NULL); g_signal_connect(G_OBJECT(drawing_area) , "expose_event" , G_CALLBACK(InvalidateRect) , NULL); g_signal_connect(G_OBJECT(window) , "key_press_event" , G_CALLBACK(IsKeyDown), NULL); gtk_widget_show(window); gtk_main(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -