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

📄 actions.c

📁 本程序是扫雷游戏在linux下可以运行的
💻 C
📖 第 1 页 / 共 2 页
字号:
	number = (gint**)g_malloc(MAX_ROW*sizeof(gint*));	g_assert (block != NULL);	g_assert (bomb != NULL);	g_assert (number != NULL);	//memset (block, 0, MAX_ROW*sizeof(void));	//memset (bomb, 0, MAX_ROW*sizeof(void));	//memset (number, 0, MAX_ROW*sizeof(void));	block[0] = (gint*)g_malloc (MAX_ROW*MAX_COL*sizeof(gint));	bomb[0] = (gint*)g_malloc (MAX_ROW*MAX_COL*sizeof(gint));	number[0] = (gint*)g_malloc (MAX_ROW*MAX_COL*sizeof(gint));	g_assert (block[0] != NULL);	g_assert (bomb[0] != NULL);	g_assert (number[0] != NULL);	memset (block[0], 0, MAX_ROW*MAX_COL*sizeof(gint));	memset (bomb[0], 0, MAX_ROW*MAX_COL*sizeof(gint));	memset (number[0], 0, MAX_ROW*MAX_COL*sizeof(gint));	for (i = 0; i < MAX_ROW-1; i++) {		block[i+1] = block[i] + MAX_COL;		bomb[i+1] = bomb[i] + MAX_COL;		number[i+1] = number[i] + MAX_COL;		}	//new_game (NULL, NULL);	if (main_window != NULL) {		gtk_drawing_area_size (GTK_DRAWING_AREA(area), 				MAX_COL*BLOCK_WIDTH, MAX_ROW*BLOCK_HEIGHT);		gtk_widget_set_usize (main_window,				BLOCK_WIDTH*MAX_COL, BLOCK_HEIGHT*MAX_ROW+65);			sprintf (lab, "%d bombs left", MAX_BOMB);		gtk_label_set_text (GTK_LABEL(label), lab);		sprintf (lab, "0:0");		gtk_label_set_text (GTK_LABEL(timelab), lab);	}}gint time_loop (){	char lab[20];	int min, sec;	if (START == 1) {		timer++;		min = timer/60;		sec = timer%60;		sprintf (lab, "%d:%d", min, sec);		gtk_label_set_text (GTK_LABEL(timelab), lab);		timerid = gtk_timeout_add (1000, (GtkFunction)time_loop, NULL);	}	return FALSE;}gint new_game (GtkWidget* widget, GdkEvent* event){	int i;	char lab[20];	START = 0;	timer = 0;	if (PREFLAG != 0 || LOGFLAG != 0)		return FALSE;	if (timerid != -1)		gtk_timeout_remove (timerid);//i think this id should > 0	for (i = 0; i < MAX_ROW; i++) {		memset (block[i], 0, MAX_COL*sizeof(gint));		memset (bomb[i], 0, MAX_COL*sizeof(gint));		memset (number[i], -1, MAX_COL*sizeof(gint));	}	load_bomb();	START = 1;	LOST = 0;	TIMES++;	REALNUM = BOMBNUM = MAX_BOMB;	fprintf (stderr, "start addr =%x\n", &START);	fprintf (stderr, "block addr =%x\n", &block);	fprintf (stderr, "num addr =%x\n", &number);	fprintf (stderr, "times addr = %x\n", &TIMES);	fprintf (stderr, "MAX_ROW addr = %x\n", &MAX_ROW);	fprintf (stderr, "MAX_COL addr = %x\n", &MAX_COL);	gtk_drawing_area_size (GTK_DRAWING_AREA(area), 			MAX_COL*BLOCK_WIDTH, MAX_ROW*BLOCK_HEIGHT);	gtk_widget_set_usize (main_window,			BLOCK_WIDTH*MAX_COL, BLOCK_HEIGHT*MAX_ROW+65);		sprintf (lab, "%d bombs left", BOMBNUM);	gtk_label_set_text (GTK_LABEL(label), lab);	sprintf (lab, "0:0");	gtk_label_set_text (GTK_LABEL(timelab), lab);	timerid = gtk_timeout_add (1000, (GtkFunction)time_loop, NULL);	return FALSE;}void pref_ok (GtkWidget* widget, gpointer data){	if (tmp_size != AREA_SIZE) {		AREA_SIZE = tmp_size;		clear_area();				switch (tmp_size) {			case Small: MAX_ROW = 9; MAX_COL = 9;					MAX_BOMB = 10;					break;			case Middle:			case Large: MAX_ROW = 16; MAX_COL = 30;					MAX_BOMB = 99;					break;		}		reset_area();	}	gtk_widget_destroy (pref_dialog);	PREFLAG = 0;}void pref_cancel (GtkWidget* widget, gpointer data){	gtk_widget_destroy (pref_dialog);		PREFLAG = 0;}void size_toggled (GtkWidget* widget, gpointer data){	tmp_size =(gint) data;}gint pref_set (GtkWidget* widget, GdkEvent* event){	GtkWidget* ok;	GtkWidget* cancel;	GtkWidget* vbox;	GtkWidget* hbox;	GtkWidget* size[3];	GtkWidget* frame;	gint i;		if (START != 0 ) return FALSE;	if (PREFLAG != 0) return FALSE;	PREFLAG = 1;	tmp_size = AREA_SIZE;		pref_dialog = gtk_dialog_new ();	gtk_widget_show (pref_dialog);	gtk_window_set_title (GTK_WINDOW(pref_dialog),			"GPE-Bomb: Preferences:");	//gpe_set_window_icon (pref_dialog, "icon");	//gtk_widget_set_usize (pref_dialog, 200, 200);	//gtk_window_set_policy (GTK_WINDOW(pref_dialog), FALSE, FALSE, FALSE);		ok = gtk_button_new_from_stock (GTK_STOCK_OK);	cancel = gtk_button_new_from_stock (GTK_STOCK_CANCEL);	gtk_widget_show (ok);	gtk_widget_show (cancel);	gtk_signal_connect (GTK_OBJECT(ok), "clicked",			GTK_SIGNAL_FUNC(pref_ok), NULL);	gtk_signal_connect (GTK_OBJECT(cancel), "clicked",			GTK_SIGNAL_FUNC(pref_cancel), NULL);	gtk_signal_connect (GTK_OBJECT(pref_dialog), "delete_event",			GTK_SIGNAL_FUNC(pref_cancel), pref_dialog);		gtk_box_pack_end (GTK_BOX(GTK_DIALOG(pref_dialog)->action_area),			ok, TRUE, TRUE, 0);	gtk_box_pack_end (GTK_BOX(GTK_DIALOG(pref_dialog)->action_area),			cancel, TRUE, TRUE, 0);	//gtk_grab_add (pref_dialog);	size[0] = gtk_radio_button_new_with_label (NULL, "Small");	gtk_signal_connect (GTK_OBJECT(size[0]), "toggled",			GTK_SIGNAL_FUNC(size_toggled), (gpointer)Small);	size[1] = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(size[0]),								"Middle");	size[2] = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(size[0]),								"Large");	gtk_signal_connect (GTK_OBJECT(size[1]), "toggled",			GTK_SIGNAL_FUNC(size_toggled), (gpointer)Middle);	gtk_signal_connect (GTK_OBJECT(size[2]), "toggled",			GTK_SIGNAL_FUNC(size_toggled), (gpointer)Large);	if (AREA_SIZE == Small) {		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(size[0]), TRUE);	}	else if (AREA_SIZE == Middle) {		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(size[1]), TRUE);	}	else if (AREA_SIZE == Large) {		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(size[2]), TRUE);	}	hbox = gtk_hbox_new (FALSE, 0);	gtk_widget_show (hbox);	gtk_box_pack_start_defaults (GTK_BOX(GTK_DIALOG(pref_dialog)->vbox),				hbox);	vbox = gtk_vbox_new (FALSE, 0);	gtk_widget_show (vbox);	frame = gtk_frame_new ("Size Setting:");	gtk_widget_show (frame);	gtk_container_add (GTK_CONTAINER(frame), vbox);	gtk_box_pack_start_defaults (GTK_BOX(hbox), frame);	gtk_box_pack_start_defaults (GTK_BOX(vbox), size[0]);	gtk_box_pack_start_defaults (GTK_BOX(vbox), size[1]);	gtk_box_pack_start_defaults (GTK_BOX(vbox), size[2]);	gtk_widget_show (size[0]);	gtk_widget_show (size[1]);	gtk_widget_show (size[2]);}gint log_destroy (GtkWidget* widget, GdkEvent* event, gpointer data){	gchar* my_name = gtk_editable_get_chars (GTK_EDITABLE(data),						0, -1);	if (data == NULL) {		myout ("a anonymous\n");		strcpy (name[last_pos], "Anonymous");	}	else if (!strcmp (my_name, "")) {		myout ("a anonymous\n");		strcpy (name[last_pos], "Anonymous");		g_free (my_name);	}	else {		strncpy (name[last_pos], my_name, 19);		g_free (my_name);	}		gtk_widget_destroy (log_dialog);		LOGFLAG = 0;}int sort (){	int i, t;	char tmp[20];	for (i = last_pos = 9; i > 0; i--) {		if (score[i] < score[i-1] || score[i-1] == 0) {			swap_int (score[i], score[i-1]);			swap_string (name[i], name[i-1]);			last_pos--;		}	}	return last_pos;}void log_name (int my_score){	int i, j, position;	GtkWidget* entry[10];	GtkWidget* label[10];	GtkWidget* table;	char lab[10];	if (LOGFLAG == 1)		return;	if (my_score < score[9] || score[9] == 0)		score[9] = my_score;	else		return;	LOGFLAG = 1;	log_dialog = gtk_dialog_new ();	gtk_widget_show (log_dialog);	gtk_window_set_title (GTK_WINDOW(log_dialog),				"Rank by Time");			position = sort ();	for (i = 0; i < 10; i++) {		if (score[i] == 0)			break;		entry[i] = gtk_entry_new_with_max_length (19);		gtk_widget_show (entry[i]);		if (i != position) {			gtk_entry_set_text (GTK_ENTRY(entry[i]), name[i]);			gtk_entry_set_editable (GTK_ENTRY(entry[i]),						FALSE);		}		sprintf (lab, "%d", score[i]);		label[i] = gtk_label_new (lab);		gtk_widget_show (label[i]);	}	fprintf (stderr, "i==%d\n", i);	table = gtk_table_new (i+1, 2, TRUE);	gtk_widget_show (table);	gtk_box_pack_start (GTK_BOX(GTK_DIALOG(log_dialog)->vbox), table,			FALSE, FALSE, FALSE);	for (j = 0; j < i; j++) {		gtk_table_attach (GTK_TABLE(table), entry[j],			0, 1, j, j+1, GTK_FILL, GTK_FILL, 0, 0);		gtk_table_attach (GTK_TABLE(table), label[j],			1, 2, j, j+1, GTK_FILL, GTK_FILL, 0, 0);		}		gtk_signal_connect (GTK_OBJECT(log_dialog), "delete_event",			GTK_SIGNAL_FUNC(log_destroy),			(gpointer)entry[position]);}void load_log (){	int i;	FILE* log = fopen (LOG_FILE, "r");	if (log == NULL) {		fprintf (stderr, "cant' open log file:%d\n", errno);		return;	}	for (i = 0; i < 10; i++) {		if (fscanf (log, "%s\t%d\n", name[i], &score[i]) <= 0)			break;#ifdef _DEBUG		fprintf (stderr, "%s\t%d\n", name[i], score[i]);#endif		}	fclose (log);}	void save_log (){	int i;	FILE* log = fopen (LOG_FILE, "w");	if (log == NULL) {		fprintf (stderr, "can't open log:%d\n", errno);		return;	}	for (i = 0; i < 10; i++) {		if (score[i] == 0)			break;		fprintf (log, "%s\t%d\n", name[i], score[i]);#ifdef _DEBUG		fprintf (stderr, "%s\t%d\n", name[i], score[i]);#endif		}	fclose (log);}gint quit_game (GtkWidget* widget, GdkEvent* event, gpointer data){	save_log ();	gtk_main_quit ();}

⌨️ 快捷键说明

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