📄 snake.c
字号:
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 + -