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

📄 snake.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 2 页
字号:
		if (p.line == 0 && p.col <5) issame++;		if(same(&p, &you)) issame++;		if(same(&p, &money)) issame++;		if(same(&p, &finish)) issame++;		for (i=0; i<5; i++)			if(same(&p, &snake[i])) issame++;	} while (issame);	*sp = p;}busy(){	FILE *pip, *popen();	char c;	int b,r;	float a;#ifdef CHECKBUSY	if (! strcmp (argval[0], "test")) return;	if ((access(BUSY,1) != 0) || (pip = popen(BUSY,"r")) == NULL){		printf("Sorry, no snake just now.\n");		done();	}	fscanf(pip,"%d",&b);	pclose(pip);	if (b > 20) {		printf("Sorry, the system is too heavily loaded right now.\n");		done();	}	nice(b);#endif}post(score, flag)int	score, flag;{	int	rawscores;	short	uid = getuid();	short	oldbest=0;	short	allbwho=0, allbscore=0;	struct	passwd *p, *getpwuid();	/*	 * Neg uid, 0, and 1 cannot have scores recorded.	 */	if ((uid=getuid()) > 1 && (rawscores=open(SNAKERAWSCORES,2))>=0) {		/* Figure out what happened in the past */		read(rawscores, &allbscore, sizeof(short));		read(rawscores, &allbwho, sizeof(short));		lseek(rawscores, ((long)uid)*sizeof(short), 0);		read(rawscores, &oldbest, sizeof(short));		if (flag) return (score > oldbest ? 1 : 0);		/* Update this jokers best */		if (score > oldbest) {			lseek(rawscores, ((long)uid)*sizeof(short), 0);			write(rawscores, &score, sizeof(short));			printf("You bettered your previous best of $%d\n", oldbest);		} else			printf("Your best to date is $%d\n", oldbest);		/* See if we have a new champ */		p = getpwuid(allbwho);		if (p == NULL || score > allbscore) {			lseek(rawscores, (long)0, 0);			write(rawscores, &score, sizeof(short));			write(rawscores, &uid, sizeof(short));			if (p != NULL)				printf("You beat %s's old record of $%d!\n", p->pw_name, allbscore);			else				printf("You set a new record!\n");		} else			printf("The highest is %s with $%d\n", p->pw_name, allbscore);		close(rawscores);	} else		if (!flag)			printf("Unable to post score.\n");	return (1);}/* * Flush typeahead to keep from buffering a bunch of chars and then * overshooting.  This loses horribly at 9600 baud, but works nicely * if the terminal gets behind. */flushi(){	stty(0, &new);}int mx [8] = { 	0, 1, 1, 1, 0,-1,-1,-1};int my [8] = {	-1,-1, 0, 1, 1, 1, 0,-1};float absv[8]= { 	1, 1.4, 1, 1.4, 1, 1.4, 1, 1.4};int oldw=0;chase (np, sp)struct point *sp, *np;{	/* this algorithm has bugs; otherwise the	   snake would get too good */	struct point d;	int w, i, wt[8];	double sqrt(), v1, v2, vp, max;	point(&d,you.col-sp->col,you.line-sp->line);	v1 = sqrt( (double) (d.col*d.col + d.line*d.line) );	w=0; 	max=0;	for(i=0; i<8; i++)	{		vp = d.col*mx[i] + d.line*my[i];		v2 = absv[i];		if (v1>0)			vp = ((double)vp)/(v1*v2);		else vp=1.0;		if (vp>max)		{			max=vp;			w=i;		}	}	for(i=0; i<8; i++)	{		point(&d,sp->col+mx[i],sp->line+my[i]);		wt[i]=0;		if (d.col<0 || d.col>=ccnt || d.line<0 || d.line>=lcnt)			continue;		if (d.line == 0 && d.col < 5) continue;		if (same(&d,&money)) continue;		if (same(&d,&finish)) continue;		wt[i]= i==w ? loot/10 : 1;		if (i==oldw) wt [i] += loot/20;	}	for(w=i=0; i<8; i++)		w+= wt[i];	vp = (( rand() >> 6 ) & 01777) %w;	for(i=0; i<8; i++)		if (vp <wt[i])			break;		else			vp -= wt[i];	if (i==8) {		printf("failure\n"); 		i=0;		while (wt[i]==0) i++;	}	oldw=w=i;	point(np,sp->col+mx[w],sp->line+my[w]);}spacewarp(w)int w;{	struct point p;	int j;		random(&you);	point(&p,COLUMNS/2 - 8,LINES/2 - 1);	if (p.col < 0)		p.col = 0;	if (p.line < 0)		p.line = 0;	if (w) {		sprintf(str,"BONUS!!!");		loot = loot - penalty;		penalty = 0;	} else {		sprintf(str,"SPACE WARP!!!");		penalty += loot/PENALTY;	}	for(j=0;j<3;j++){		clear();		delay(5);		aprintf(&p,str);		delay(10);	}	setup();	winnings(cashvalue);}snap(){	struct point p;	int i;	if(you.line < 3){		pchar(point(&p,you.col,0),'-');	}	if(you.line > lcnt-4){		pchar(point(&p,you.col,lcnt-1),'_');	}	if(you.col < 10){		pchar(point(&p,0,you.line),'(');	}	if(you.col > ccnt-10){		pchar(point(&p,ccnt-1,you.line),')');	}	if (! stretch(&money)) if (! stretch(&finish)) delay(10);	if(you.line < 3){		point(&p,you.col,0);		remove(&p);	}	if(you.line > lcnt-4){		point(&p,you.col,lcnt-1);		remove(&p);	}	if(you.col < 10){		point(&p,0,you.line);		remove(&p);	}	if(you.col > ccnt-10){		point(&p,ccnt-1,you.line);		remove(&p);	}	fflush(stdout);}stretch(ps)struct point *ps;{	struct point p;		point(&p,you.col,you.line);	if(abs(ps->col-you.col) < 6){		if(you.line < ps->line){			for (p.line = you.line+1;p.line <= ps->line;p.line++)				pchar(&p,'v');			delay(10);			for (;p.line > you.line;p.line--)				remove(&p);		} else {			for (p.line = you.line-1;p.line >= ps->line;p.line--)				pchar(&p,'^');			delay(10);			for (;p.line < you.line;p.line++)				remove(&p);		}		return(1);	} else if(abs(ps->line-you.line) < 3){		p.line = you.line;		if(you.col < ps->col){			for (p.col = you.col+1;p.col <= ps->col;p.col++)				pchar(&p,'>');			delay(10);			for (;p.col > you.col;p.col--)				remove(&p);		} else {			for (p.col = you.col-1;p.col >= ps->col;p.col--)				pchar(&p,'<');			delay(10);			for (;p.col < you.col;p.col++)				remove(&p);		}		return(1);	}	return(0);}surround(ps)struct point *ps;{	struct point x;	int i,j;	if(ps->col == 0)ps->col++;	if(ps->line == 0)ps->line++;	if(ps->line == LINES -1)ps->line--;	if(ps->col == COLUMNS -1)ps->col--;	aprintf(point(&x,ps->col-1,ps->line-1),"/*\\\r* *\r\\*/");	for (j=0;j<20;j++){		pchar(ps,'@');		delay(1);		pchar(ps,' ');		delay(1);	}	if (post(cashvalue,1)) {		aprintf(point(&x,ps->col-1,ps->line-1),"   \ro.o\r\\_/");		delay(6);		aprintf(point(&x,ps->col-1,ps->line-1),"   \ro.-\r\\_/");		delay(6);	}	aprintf(point(&x,ps->col-1,ps->line-1),"   \ro.o\r\\_/");}win(ps)struct point *ps;{	struct point x;	int j,k;	int boxsize;	/* actually diameter of box, not radius */	boxsize = fast ? 10 : 4;	point(&x,ps->col,ps->line);	for(j=1;j<boxsize;j++){		for(k=0;k<j;k++){			pchar(&x,'#');			x.line--;		}		for(k=0;k<j;k++){			pchar(&x,'#');			x.col++;		}		j++;		for(k=0;k<j;k++){			pchar(&x,'#');			x.line++;		}		for(k=0;k<j;k++){			pchar(&x,'#');			x.col--;		}	}	fflush(stdout);}pushsnake(){	int i, bonus;	int issame = 0;	/*	 * My manual says times doesn't return a value.  Furthermore, the	 * snake should get his turn every time no matter if the user is	 * on a fast terminal with typematic keys or not.	 * So I have taken the call to times out.	 */	for(i=4; i>=0; i--)		if (same(&snake[i], &snake[5]))			issame++;	if (!issame)		pchar(&snake[5],' ');	for(i=4; i>=0; i--)		snake[i+1]= snake[i];	chase(&snake[0], &snake[1]);	pchar(&snake[1],SNAKETAIL);	pchar(&snake[0],SNAKEHEAD);	for(i=0; i<6; i++)	{		if (same(&snake[i],&you))		{			surround(&you);			i = (cashvalue) % 10;			bonus = ((rand()>>8) & 0377)% 10;			ll();			printf("%d\n", bonus);			delay(30);			if (bonus == i) {				spacewarp(1);				logit("bonus");				flushi();				return(1);			}			if ( loot >= penalty ){				printf("You and your $%d have been eaten\n",cashvalue);			} else {				printf("The snake ate you.  You owe $%d.\n",-cashvalue);			}			logit("eaten");			length(moves);			done();		}	}	return(0);}	remove(sp)struct point *sp;{	int j;	if (same(sp,&money)) {		pchar(sp,TREASURE);		return(2);	}	if (same(sp,&finish)) {		pchar(sp,GOAL);		return(3);	}	if (same(sp,&snake[0])) {		pchar(sp,SNAKEHEAD);		return(4);	}	for(j=1;j<6;j++){		if(same(sp,&snake[j])){			pchar(sp,SNAKETAIL);			return(4);		}	}	if ((sp->col < 4) && (sp->line == 0)){		winnings(cashvalue);		if((you.line == 0) && (you.col < 4)) pchar(&you,ME);		return(5);	}	if (same(sp,&you)) {		pchar(sp,ME);		return(1);	}	pchar(sp,' ');	return(0);}winnings(won)int won;{	struct point p;	p.line = p.col = 1;	if(won>0){		move(&p);		printf("$%d",won);	}}stop(){	signal(SIGINT,1);	ll();	length(moves);	done();}suspend(){	char *sh;	cook();#ifdef SIGTSTP	kill(getpid(), SIGTSTP);#else	sh = getenv("SHELL");	if (sh == NULL)		sh = "/bin/sh";	system(sh);#endif	raw();	setup();	winnings(cashvalue);}length(num)int num;{	printf("You made %d moves.\n",num);}logit(msg)char *msg;{	FILE *logfile;	long t;	if ((logfile=fopen(LOGFILE, "a")) != NULL) {		time(&t);		fprintf(logfile, "%s $%d %dx%d %s %s", getlogin(), cashvalue, lcnt, ccnt, msg, ctime(&t));		fclose(logfile);	}}

⌨️ 快捷键说明

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