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

📄 snake.c

📁 linux gtk+基础编程源代码
💻 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 + -