📄 snake.c
字号:
#include<gtk/gtk.h>#include<gdk/gdkkeysyms.h>#define LEFT 1#define UP 2#define RIGHT 3#define DOWN 4#define MAXLENGTH 30struct _point{ int x, y;};typedef struct _point point;static GdkPixbuf *pixbuf = NULL;static GdkPixbuf *pix1 = NULL;static GdkPixbuf *pix2 = NULL;static GtkImage *image[60][40];static GtkWidget *label;gchar locate[30][2];gint slength;gint now_forward = DOWN;gint forward = DOWN;gint level = 1;static gint timer = 0;gint headx;gint heady;gint tailx;gint taily;gint beanx;gint beany;void init(gint length);void erase();void draw();void move();void clean();void game_run();point rand_point();void bean();void on_begin_clicked(GtkButton *button, gpointer data);void on_end_clicked(GtkButton *button, gpointer data);point rand_point(){ point p; p.x = g_random_int_range(0, 60); p.y = g_random_int_range(0, 40); return p;}void bean(){ point p; p = rand_point(); if(p.x == 5) p.x ++; gtk_image_set_from_pixbuf(GTK_IMAGE(image[p.x][p.y]), pix2); beanx = p.x; beany = p.y;}void init (gint length){ gint i; gint x, y; for(i=0; i<length; i++) { locate[i][0] = 5; locate[i][1] = i; gtk_image_set_from_pixbuf(GTK_IMAGE(image[5][i]), pix1); } slength = length;}void clean(){ gint i, x, y; for(i=0; i<slength; i++) { x = locate[i][0]; y = locate[i][1]; gtk_image_set_from_pixbuf(GTK_IMAGE(image[x][y]), pixbuf); }}void erase(){ gtk_image_set_from_pixbuf(GTK_IMAGE(image[tailx][taily]), pixbuf);}void draw(){ gtk_image_set_from_pixbuf(GTK_IMAGE(image[headx][heady]), pix1);}void move(){ gint i, len; gchar buf[1024]; len = slength -1; tailx = locate[0][0]; taily = locate[0][1]; headx = locate[len][0]; heady = locate[len][1]; switch(forward) { case LEFT: erase(); headx --; if(headx == -1) headx = 59; for(i=0; i<len; i++) { locate[i][0] = locate[i+1][0]; locate[i][1] = locate[i+1][1]; } locate[len][0] = headx; locate[len][1] = heady; draw(); break; case UP: erase(); heady --; if(heady == -1) heady = 39; for(i=0; i<len; i++) { locate[i][0] = locate[i+1][0]; locate[i][1] = locate[i+1][1]; } locate[len][0] = headx; locate[len][1] = heady; draw(); break; case RIGHT: erase(); headx ++; if(headx == 60) headx = 0; for(i=0; i<len; i++) { locate[i][0] = locate[i+1][0]; locate[i][1] = locate[i+1][1]; } locate[len][0] = headx; locate[len][1] = heady; draw(); break; case DOWN: erase(); heady ++; if(heady = 40)heady = 0; for(i=0; i<len; i++) { locate[i][0] = locate[i+1][0]; locate[i][1] = locate[i+1][1]; } locate[len][0] = headx; locate[len][1] = heady; draw(); break; } if((beanx = headx) && (beany == heady)) { level ++; if(level == 7)return ; clean(); sprintf(buf, "snake length:%d", level); gtk_label_set_text(GTK_LABEL(label), buf); now_forward = forward = DOWN; init(level*5); bean(); }}void game_run(){ move();}void key_press(GtkWidget *widget, GdkEventKey *event, gpointer data){ switch(event->keyval) { case GDK_Up: if(now_forward != DOWN) forward = now_forward = UP; break; case GDK_Down: if(now_forward != UP) forward = now_forward = DOWN; break; case GDK_Left: if(now_forward != RIGHT) forward = now_forward = LEFT; break; case GDK_Right: if(now_forward != LEFT) forward = now_forward = RIGHT; break; }}void on_begin_clicked(GtkButton *button, gpointer data){ timer = gtk_timeout_add(50, (GtkFunction)game_run, NULL);}void on_end_clicked(GtkButton *button, gpointer data){ gtk_timeout_remove(timer);}int main(int argc, char **argv){ GtkWidget *window; GtkWidget *table; GtkWidget *vbox; GtkWidget *bbox; GtkWidget *button; GtkWidget *sep; gint i, j; 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); g_signal_connect(G_OBJECT(window), "key_press_event", G_CALLBACK(key_press), NULL); gtk_window_set_title(GTK_WINDOW(window), "snake"); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(window), 5); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); table = gtk_table_new(40, 40, FALSE); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 5); pixbuf = gdk_pixbuf_new_from_file("back.png", NULL); pix1 = gdk_pixbuf_new_from_file("snake.png", NULL); pix2 = gdk_pixbuf_new_from_file("bean.png", NULL); for(i=0; i<60; i++) { for(j=0; j<40; j++) { image[i][j] = gtk_image_new_from_pixbuf(pixbuf); gtk_table_attach(GTK_TABLE(table), image[i][j], i, i+1, j, j+1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); } sep = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 5); bbox = gtk_hbutton_box_new(); gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 5); gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); label = gtk_label_new("snale length:1"); gtk_box_pack_start(GTK_BOX(bbox), label, TRUE, TRUE, 5); button = gtk_button_new_with_label("begin"); gtk_box_pack_start(GTK_BOX(bbox), button , TRUE, TRUE, 5); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_begin_clicked), NULL); button = gtk_button_new_with_label("stop"); gtk_box_pack_start(GTK_BOX(bbox), button, TRUE, TRUE, 5); g_signal_connect(GTK_OBJECT(button), "clicked", G_CALLBACK(on_end_clicked), NULL); init(5); bean(); gtk_widget_show_all(window); gtk_main(); return FALSE; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -