亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? trace.c

?? 本程序是掃雷游戲在linux下可以運行的
?? C
字號:
#include "bomb.h"#include <sys/types.h>#include <sys/ptrace.h>#include <signal.h>#include <X11/Xlib.h>#include <X11/StringDefs.h>#include <X11/keysym.h>#include <X11/extensions/XTest.h>#define start_pointer 0x804ece8#define block_pointer 0x804ed40#define number_pointer 0x804ed44#define times_pointer 0x804ecfc#define row_pointer 0x804ea20#define col_pointer 0x804ea24#define lost_pointer 0x804ecec gint block_area;gint number_area;gint** my_block;gint** num_block;gint times = 1;gint child;gint change = 0;gint first = 0;gint MAX_ROW = 9;gint MAX_COL = 9;Display *dpy;extern int errno;void x_init (){	dpy = XOpenDisplay (NULL);}void clear_area (){	//clear old	int i;	if (my_block != NULL) {		free (my_block[0]);		free (my_block);	}	if (num_block != NULL) {		free (num_block[0]);		free (num_block);	}}void reset_area (){	int i;//x ->row, y ->col	//create new	my_block = (gint**)g_malloc(MAX_ROW*sizeof(gint*));	num_block = (gint**)g_malloc(MAX_ROW*sizeof(gint*));	g_assert (my_block != NULL);	g_assert (num_block != NULL);	my_block[0] = (gint*)g_malloc (MAX_ROW*MAX_COL*sizeof(gint));	num_block[0] = (gint*)g_malloc (MAX_ROW*MAX_COL*sizeof(gint));	g_assert (my_block[0] != NULL);	g_assert (num_block[0] != NULL);	memset (my_block[0], 0, MAX_ROW*MAX_COL*sizeof(gint));	memset (num_block[0], -1, MAX_ROW*MAX_COL*sizeof(gint));	for (i = 0; i < MAX_ROW-1; i++) {		my_block[i+1] = my_block[i] + MAX_COL;		num_block[i+1] = num_block[i] + MAX_COL;		}}void dig_block (int x, int y){	if (x < 0 || y < 0 || x >= MAX_ROW || y >= MAX_COL)		return;	if (my_block[x][y] == B_UNKNOW) {		fprintf (stderr, "dig_block: r=%d, c=%d\n", x, y);		XTestFakeMotionEvent (dpy, DefaultScreen(dpy),				100+12+y*BLOCK_WIDTH,				100+55+10+x*BLOCK_HEIGHT, 10);		XTestFakeButtonEvent (dpy, 1, 1, 10);		XFlush (dpy);		XTestFakeButtonEvent (dpy, 1, 0, 10);		XFlush (dpy);	}}void dig_near (int x, int y){	int i, j;	for (i = x-1; i<= x+1; i++)		for (j = y-1; j<= y+1; j++) {			dig_block (i, j);		}}int count_block_mark (int x, int y){	if (x < 0 || y < 0 || x >=MAX_ROW || y>= MAX_COL){		return 0;	}	if (num_block[x][y] == -2 ) {					return 1;	}	return 0;}int count_near_mark (int x, int y){	int i, j, num = 0;	for (i = x-1; i <= x+1; i++)		for (j = y-1; j<=y+1; j++) {			num += count_block_mark (i, j);		}	return num;}int count_block_unknow (int x, int y){	if (x < 0 || y < 0 || x >=MAX_ROW || y>= MAX_COL){		return 0;	}	if (num_block[x][y] == -1) {		return 1;	}	return 0;}// not right!int count_near_unknow (int x, int y){	int i, j, num = 0;	for (i = x-1; i <= x+1; i++)		for (j = y-1; j<=y+1; j++) {			num += count_block_unknow (i, j);		}	return num;}void print_block (){	int i, j;	for (i = 0; i < MAX_ROW; i++) {		for (j = 0; j< MAX_COL; j++) {			fprintf (stderr, "%d\t", num_block[i][j]);		}		fprintf (stderr, "\n");	}}void scan_block (){	long bomb;	int i, j, status;	kill (child, SIGSTOP);	wait(&status);	//stop traced process	for (i = 0; i < MAX_ROW; i++) {		for (j = 0; j < MAX_COL; j++) {			bomb = ptrace (PTRACE_PEEKTEXT, child,			block_area+i*MAX_COL*sizeof(int)+j*sizeof(int));			if (bomb == -1) {				fprintf (stderr, "peek failed in scan block:%d\n", errno);				kill (child, SIGKILL);				exit(1);			}			if (my_block[i][j] != bomb) {				change = 1;				my_block[i][j] = bomb;				if (my_block[i][j] == B_ONE) {					bomb = ptrace (PTRACE_PEEKTEXT, child,					number_area+i*MAX_COL*sizeof(int)+j*sizeof(int));					if (bomb == -1) {						fprintf (stderr, "peek failed in scan block 2:%d\n", errno);						kill (child, SIGKILL);						exit(1);					}					num_block[i][j] = bomb;				}				else if (my_block[i][j] == B_MARK) {					num_block[i][j] = -2;				}				else if (my_block[i][j] == B_UNKNOW) {					num_block[i][j] = -1;				}				else if (my_block[i][j] == B_NO) {					num_block[i][j] = 0;				}				//ugly code!			}		}	}	ptrace (PTRACE_CONT, child, NULL, NULL);	//and start it again;}int is_definite (int i, int j){	int unknow, mark;	if (num_block[i][j] <= 0)		return -2;	unknow = count_near_unknow (i, j);	mark = count_near_mark (i, j);	//fprintf (stderr, "block %d, %d:\t%d %d %d\n", i, j,	//					unknow, mark, num_block[i][j]);	if (num_block[i][j] == (unknow + mark) && unknow != 0) {	//case 1: all the unknow should mark		return 1;	}	if (num_block[i][j] == mark && unknow != 0) {	//case 2: all the unknow should dig		return 2;	}	return -1;}void mark_block (int i, int j){	if (i < 0 || j < 0 || i >= MAX_ROW || j>= MAX_COL) 		return;	if (my_block[i][j] == B_UNKNOW) {		fprintf (stderr, "mark block: r=%d c=%d\n", i, j);		XTestFakeMotionEvent (dpy, DefaultScreen(dpy),				100+12+j*BLOCK_WIDTH,				100+60+10+i*BLOCK_HEIGHT, 10);		XTestFakeButtonEvent (dpy, 3, 1, 10);		XFlush (dpy);		sleep (1);		XTestFakeButtonEvent (dpy, 3, 0, 10);		XFlush (dpy);	}}	void mark_near (int x, int y){	int i, j;	for (i = x-1; i<= x+1; i++)		for (j = y-1; j<= y+1; j++) {			mark_block (i, j);		}}int find_definite (){	int i, j, r;	for (i = 0; i < MAX_ROW; i++)		for (j = 0; j < MAX_COL; j++) {			r = is_definite (i, j);			if(r == 1) {				mark_near (i, j);				return 0;			}			else if (r == 2) {				dig_near (i, j);				return 0;			}/*		fprintf (stderr, "find definite:r:%d c:%d\n", i, j);				return 0;*/		}	return -1;}		void assume (int i, int j){	my_block[i][j] = B_MARK;	num_block[i][j] = -2;}void unassume (int i, int j){	my_block[i][j] = B_UNKNOW;	num_block[i][j] = -1;}void set_impossible (int i, int j){	if (i < 0 || j < 0 || i >=MAX_ROW || j>= MAX_COL)		return;	if (num_block[i][j] == -1) {		num_block[i][j] = -3;	}}void unset_impossible(){	int i, j;	for (i = 0; i < MAX_ROW; i++)		for (j = 0; j < MAX_COL; j++) {			if (num_block[i][j] == -3)				num_block[i][j] = -1;		}}int set_full (int i, int j){	int unknow, mark, m, n;	if (num_block[i][j] <= 0)		return -2;	unknow = count_near_unknow (i, j);	mark = count_near_mark (i, j);	if (mark == num_block[i][j] && unknow != 0) {		for (m = i-1; m <= i+1; m++)			for (n = j-1; n<= j+1; n++) {				set_impossible (m, n);			}		return 0;	}	return -1;}int it_is_impossible (int i, int j){	int unknow, mark, m, n;	if (num_block[i][j] <= 0)		return -2;	unknow = count_near_unknow (i, j);	mark = count_near_mark (i, j);		if (mark > num_block[i][j])	//will it happen???		return 0;	if (unknow < (num_block[i][j] - mark))	//after setting some impossible, unknow will be less		return 0;	return -1;}int find_impossible (){	int i, j;	for (i = 0; i < MAX_ROW; i++)		for (j = 0; j < MAX_COL; j++) {			set_full (i, j);		}	for (i = 0; i < MAX_ROW; i++)		for (j = 0; j < MAX_COL; j++) {			if (! it_is_impossible (i, j)) {				unset_impossible ();				return 0;			}		}	unset_impossible ();	return -1;}	int one_step_assume (){	int i, j;	for (i = 0; i < MAX_ROW; i++)		for (j = 0; j < MAX_COL; j++) {			if (my_block[i][j] != B_UNKNOW)				continue;				assume (i, j);			if (! find_impossible ()) {				unassume (i, j);				dig_block (i, j);				return 0;			}			unassume (i, j);		}	return -1;}void rand_try (){	int i, j;	for (i = 0; i < MAX_ROW; i++)		for (j = 0; j < MAX_COL; j++)			if (my_block[i][j] == B_UNKNOW) {				dig_block (i, j);				return;			}//			else fprintf (stderr, "%d\t", my_block[i][j]);}void try_auto (){	fprintf (stderr, "ok, let's have a try\n");	if (! find_definite ())		return;	if (! one_step_assume ()) {	/* perhaps we will do better for two or more steps assumption	but that's a NP problem, i won't try it	*/		fprintf (stderr, "\t find assume\n");		return;	}	//if (! find_definite ())	//	return;	fprintf (stderr, "sorry, i have no idea\n");	rand_try ();	}int get_data_by_address (int address){	int data;	int status;	kill (child, SIGSTOP);	wait (&status);	data = ptrace (PTRACE_PEEKTEXT, child, address);	if (data < 0) {		fprintf (stderr, "peek failed in get %x:%d\n",					address, errno);		exit (1);	}	ptrace (PTRACE_CONT, child, NULL, NULL);	return data;}int get_block_area (){	//read twice to get block_area	int block_area;	int tmp;	int status;	kill (child, SIGSTOP);		wait (&status);	tmp = ptrace (PTRACE_PEEKTEXT, child, block_pointer);	if (tmp < 0) {		fprintf (stderr, "peek failed in get block 1:%d\n", errno);		exit (1);	}	block_area = ptrace (PTRACE_PEEKTEXT, child, tmp);	if (block_area < 0) {		fprintf (stderr, "peek failed in get block 2:%d\n", errno);		exit (1);	}	if ((status = ptrace (PTRACE_CONT, child, NULL, NULL)) < 0){		fprintf (stderr, "cont failed in get block:%d\n", errno);		exit (1);	}	return block_area;}int get_number_area (){	//read twice to get number_area	int number_area;	int tmp;	int status;	kill (child, SIGSTOP);		wait (&status);	tmp = ptrace (PTRACE_PEEKTEXT, child, number_pointer);	if (tmp < 0) {		fprintf (stderr, "peek failed in number 1:%d\n", errno);		exit (1);	}	number_area = ptrace (PTRACE_PEEKTEXT, child, tmp);	if (number_area < 0) {		fprintf (stderr, "peek failedin number 2:%d\n", errno);		exit (1);	}	ptrace (PTRACE_CONT, child, NULL, NULL);	return number_area;}int main(void){	long bomb;	int status, i, j, tmp_times, tmp_row, tmp_col;	char t;			child = fork();	if (child == 0) {		fprintf (stderr, "trace me\n");		if (ptrace (PTRACE_TRACEME) < 0) {			fprintf (stderr, "trace failed:%d\n", errno);		}		fprintf (stderr, "child start\n");		if (execlp ("./bomb", "bomb") < 0) {			fprintf (stderr, "exec failed:%d\n", errno);		}	}	x_init ();		//wait (&status);	//sleep (3);	//if (ptrace (PTRACE_ATTACH, child) < 0) {	//	fprintf (stderr, "attach failed:%d\n", errno);	//}	wait (&status);	if (ptrace (PTRACE_CONT, child, NULL, NULL) < 0) {		fprintf (stderr, "cont failed:%d\n", errno);	}	sleep (1);	//ok, finish preparetion	//start manually	/*	while (get_data_by_address (start_pointer) == 0) {		sleep (1);	}	*/	//start auto	XTestFakeMotionEvent (dpy, DefaultScreen(dpy),			100+30,			100+30, 10);	XTestFakeButtonEvent (dpy, 1, 1, 10);	XFlush (dpy);	sleep (1);	XTestFakeButtonEvent (dpy, 1, 0, 10);	XFlush (dpy);	sleep (1);	first = 1;	times = tmp_times;	tmp_row = get_data_by_address (row_pointer);	tmp_col = get_data_by_address (col_pointer);	MAX_ROW = tmp_row;	MAX_COL = tmp_col;	block_area = get_block_area();	number_area = get_number_area();	reset_area ();	//scan_block ();	while (1) {		//sleep (1);		tmp_times = get_data_by_address (times_pointer);		if (get_data_by_address (start_pointer) == 0) {			int lost = get_data_by_address (lost_pointer);			myout ("not start\n");			fprintf (stderr, "lost=%d\n", lost);			kill (child, SIGKILL);			if (!lost) {				myout ("win\n");				system ("touch win");			}			else {				myout ("lost\n");			}			return ;			sleep (1);			continue;		}		if (tmp_times > times) {			sleep (1);			memset (my_block[0], 0, MAX_ROW*MAX_COL*sizeof(gint));			memset (num_block[0], -1, MAX_ROW*MAX_COL*sizeof(gint));			times = tmp_times;			tmp_row = get_data_by_address (row_pointer);			tmp_col = get_data_by_address (col_pointer);			if (tmp_row != MAX_ROW || tmp_col != MAX_COL) {				clear_area ();				MAX_ROW = tmp_row;				MAX_COL = tmp_col;				reset_area ();				block_area = get_block_area();				number_area = get_number_area();			}			while (get_data_by_address (start_pointer) == 0) {				sleep (1);			}			first = 1;		}		scan_block ();/*		if (change == 1 || first == 1) {			first = 0;			change = 0;			sleep (1);		}*/		if (change == 0)			sleep (0); //penalty		print_block();		try_auto ();	}}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆123| 久久综合色综合88| 欧美一级日韩免费不卡| 91精品国产黑色紧身裤美女| 7777女厕盗摄久久久| 欧美草草影院在线视频| 国产欧美视频一区二区三区| 中文字幕中文字幕在线一区 | 日本一区二区电影| 中文字幕日本乱码精品影院| 国产精品影视网| 制服丝袜av成人在线看| 国产日韩影视精品| 国内成人免费视频| 国产精品国产a| 国产精品美女久久久久aⅴ国产馆| 秋霞av亚洲一区二区三| 99久久国产综合色|国产精品| 日韩在线观看一区二区| 色婷婷久久综合| 亚洲电影在线播放| 欧美午夜精品一区二区三区| 亚洲1区2区3区4区| 亚洲精品在线网站| 99久久久免费精品国产一区二区| 最新久久zyz资源站| 制服丝袜亚洲精品中文字幕| 卡一卡二国产精品 | 中文字幕 久热精品 视频在线| 国产拍揄自揄精品视频麻豆| 亚洲一卡二卡三卡四卡无卡久久| 图片区小说区区亚洲影院| 国产成a人亚洲精| 久久亚洲精精品中文字幕早川悠里| 精品精品国产高清a毛片牛牛 | 国产日韩欧美一区二区三区乱码| 亚洲欧美偷拍卡通变态| 精一区二区三区| 91精品国产综合久久久蜜臀粉嫩| 国产精品日日摸夜夜摸av| 久久国产尿小便嘘嘘| 91麻豆精品91久久久久久清纯| 国产精品对白交换视频| 国产一区二区调教| 国产亚洲一区二区三区四区 | 午夜久久久久久电影| 色丁香久综合在线久综合在线观看| 国产日韩欧美不卡| av日韩在线网站| 亚洲欧美激情插| 欧美日韩日本视频| 日本aⅴ精品一区二区三区| 欧美一二三区在线| 国产一区二区三区精品视频| 久久综合九色综合欧美就去吻| 成人天堂资源www在线| 欧美成人官网二区| 色吧成人激情小说| av在线播放一区二区三区| 免费精品视频最新在线| 亚洲天堂福利av| 国产日韩精品久久久| 欧美日本高清视频在线观看| 91免费国产在线| 国产成人免费视频网站高清观看视频| 一区二区日韩电影| 国产精品久久久久一区二区三区共| 欧美日本免费一区二区三区| 99久久精品国产一区| 成人性色生活片| 国产成人久久精品77777最新版本| 视频一区二区三区中文字幕| 亚洲一区二区在线观看视频| 日韩美女精品在线| 国产精品丝袜一区| 国产精品久久久久影院亚瑟 | 国产精品福利一区| 国产精品免费网站在线观看| 久久久99免费| 国产日韩欧美亚洲| 亚洲四区在线观看| 亚洲高清免费一级二级三级| 五月激情综合色| 青青草原综合久久大伊人精品 | 国产一区在线观看麻豆| 极品少妇一区二区| 99精品国产99久久久久久白柏| av亚洲精华国产精华| 欧美久久久久久久久中文字幕| 欧美夫妻性生活| 国产三级欧美三级日产三级99 | 欧美一级精品大片| 国产偷国产偷精品高清尤物| 国产精品久久免费看| 一区二区三区影院| 蜜桃免费网站一区二区三区| 不卡的av网站| 日韩精品一区二区在线| 亚洲国产精品久久艾草纯爱| 久久亚洲影视婷婷| 欧美大片免费久久精品三p| 亚洲成人www| 91精品免费观看| 毛片av一区二区| 精品成人在线观看| 丰满亚洲少妇av| 亚洲精品免费在线播放| 日本韩国欧美在线| 亚洲一区二区三区四区的| 9191国产精品| 激情国产一区二区| 国产日韩精品视频一区| 91女厕偷拍女厕偷拍高清| 久久亚洲私人国产精品va媚药| 久久97超碰国产精品超碰| 色婷婷精品久久二区二区蜜臀av | 国产美女一区二区| 6080日韩午夜伦伦午夜伦| 亚洲成人动漫在线免费观看| 日本韩国欧美一区| 亚洲日本丝袜连裤袜办公室| 成人aa视频在线观看| 亚洲三级免费电影| 欧美视频一区在线| 美女免费视频一区| 精品成人a区在线观看| 国产麻豆精品一区二区| 国产精品久久久久7777按摩| 在线中文字幕不卡| 麻豆精品国产传媒mv男同| 久久久久久久久99精品| 91亚洲国产成人精品一区二区三| 亚洲精品国产精华液| 日韩亚洲欧美在线| 99精品黄色片免费大全| 日韩中文字幕亚洲一区二区va在线 | 久久久久一区二区三区四区| 成人avav在线| 激情六月婷婷久久| 日韩av一区二区在线影视| 国产偷国产偷亚洲高清人白洁| 在线观看免费视频综合| 国产精品羞羞答答xxdd| 免费观看在线色综合| 亚洲精品国产高清久久伦理二区| 日韩欧美亚洲国产另类 | 色视频成人在线观看免| 国产乱码精品一品二品| 五月天久久比比资源色| 自拍偷在线精品自拍偷无码专区 | 欧美丰满一区二区免费视频| 国产传媒欧美日韩成人| 日韩二区三区在线观看| 亚洲天天做日日做天天谢日日欢| 国产亚洲成av人在线观看导航| 欧美日韩一区二区电影| 色爱区综合激月婷婷| 91免费国产视频网站| 91久久久免费一区二区| 色综合久久久久综合体| 日本福利一区二区| 在线亚洲一区观看| 日本精品一区二区三区四区的功能| 国产一区二区三区美女| 精品亚洲成a人在线观看| 国产一区二区在线电影| 国产老妇另类xxxxx| 成人av先锋影音| 欧美性三三影院| 精品国产91九色蝌蚪| 国产精品无码永久免费888| 国产视频911| 亚洲免费观看高清完整版在线| 一区二区三区在线影院| 日韩综合小视频| 国产成人av电影免费在线观看| 99久久伊人精品| 日韩视频在线永久播放| 国产蜜臀av在线一区二区三区| 亚洲一级二级在线| 精品亚洲成a人| 欧美美女网站色| 日韩毛片高清在线播放| 激情六月婷婷久久| 欧美高清性hdvideosex| 亚洲欧美另类久久久精品| 精品亚洲国产成人av制服丝袜| 91久久精品午夜一区二区| 欧美精品一区二区在线播放| 亚洲午夜一区二区| 成人黄色国产精品网站大全在线免费观看 | 精品美女一区二区| 日韩在线卡一卡二| 欧美三级一区二区| 亚洲精品久久久蜜桃| 99麻豆久久久国产精品免费| 26uuu国产在线精品一区二区| 亚洲成人av在线电影| 欧美三日本三级三级在线播放| 国产精品国产a|