|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T u
Length: 7804 (0x1e7c) Types: TextFile Names: »ufo.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Ufo/ufo.c«
/* ufo.c By Kriton Kyrimis compile using: cc -O -s -o ufo ufo.c -lm -lcurses -ltermcap */ #include <curses.h> #include <signal.h> #define BIG 2147483648.0 /* max number returned by rand() plus 1 */ #define move_cursor(x,y) \ if( x<40 ){ \ xx = COLS-1; \ } \ else{ \ xx = 0; \ } \ if( y<12 ){ \ yy = LINES-1; \ } \ else{ \ yy = 0; \ } \ mvcur(yy, xx, (y), (x)) #define strip(s) \ while( (*s >= '0') && (*s <= '9') ){ \ s++; \ } int ufos[51][3], field[21][76], num_ufos, missiles, missl_left, ufos_left, i, j, x, y, try, height, ht, top, bottom, left, right, ver, hor, xx, yy; float temp_score, mult, score_mult, grav, velocity, angle, init_height, tim; char inp[81], *inp1, *inp2, *bel, *bang[7], misl, *term, *back; char *index(),*getenv(); int intr(); long time(); float rnd(); double atof(),fabs(),sqrt(),sin(),cos(); main() { temp_score = 0.0; initialise(); printf("%s",CL); move_cursor(0,LINES-1); help(); l35: printf("Enter number of UFOs (1-50): "); gets(inp); num_ufos = abs(atoi(inp)); if( (num_ufos > 50) || (num_ufos < 1) ){ printf("%s",bel); goto l35; } for(i=1; i<=num_ufos; i++){ l81: x = (int)(rnd()*16.0)+3; y = (int)(rnd()*65.0)+6; if( field[x][y] == 1 ){ goto l81; } field[x][y] = 1; ufos[i][1] = x; ufos[i][2] = y; } l115: printf("Enter number of missiles required (1-%d): ",2*num_ufos); gets(inp); missiles = abs(atoi(inp)); if( (missiles>2*num_ufos) || (missiles<1) ){ printf("%s",bel); goto l115; } mult = (float)missiles / (float)num_ufos; printf("Enter value of surface gravity in M/sec^2 <9.81>: "); gets(inp); grav = atof(inp) / 2.0; if( grav == 0.0 ){ grav = 4.905; /* 9.81/2 */ } printf("Enter Missile representation <*>: "); misl = getchar(); if( misl == '\n' ){ misl = '*'; }; printf("%s",CL); move_cursor(0, LINES-1); for(i=1; i<=20; i++){ printf("|\n"); } printf( "----------------------------------------------------------------------------" ); for(i=1; i<=num_ufos; i++){ move_cursor(ufos[i][2],LINES-1-ufos[i][1]); putchar('#'); } ufos_left = num_ufos; move_cursor(0,LINES-1); putchar('\n'); for(try=1; try<=missiles; try++){ move_cursor(0,LINES-1); if( try != 1 ){ printf("%s",UP); } l680: printf("Enter initial velocity, angle and height:\n"); score_mult = (float)(try-1)/(float)missiles; missl_left = missiles-try+1; printf("Missiles left %d UFOs left %d Score %.0f x %5.3f ", missl_left,ufos_left,temp_score,score_mult); goto l700; l698: printf("%s%s",UP,bel); goto l680; l700: move_cursor(42,LINES-2); gets(inp); inp1 = index(inp,','); inp2 = index(inp1+1,','); if( (inp1 == 0) || (inp2 == 0) ){ goto l698; } velocity = atof(inp); angle = atof(inp1+1); init_height = atof(inp2+1); if( (angle < (float)0.0) || (angle >= (float)90.0) || (init_height > (float)19.0) || (init_height < (float)0.0) || (velocity > (float)sqrt((float)500.0 * fabs(grav))) || (velocity <= (float)0.0) ){ goto l698; } temp_score += (velocity*velocity + 2*grav*height) * mult; height = (int)(init_height+0.5); angle = angle/180.0*3.1415926; move_cursor(1,LINES-4); if( height != 0 ){ for(ht=1; ht<=height; ht++){ printf("%s",UP); } } putchar(misl); for(x=1; x<=74; x++){ tim = (float)x/(velocity*cos(angle)); y = (int)(velocity*tim*sin(angle)-grav*tim*tim+0.5)+height; printf("%s",back); putchar(' '); if( y>19 ){ goto l970; } else{ if( y<0 ){ goto l950; } } move_cursor(x+1,LINES-4-y); putchar(misl); if( field[y+1][x+1] == 0 ){ goto l940; } bang[1] = ". . . . . ."; bang[2] = " \\ | | | / "; bang[3] = ".- BANG! -."; bang[4] = " / | | | \\ "; bang[5] = ". . . . . ."; bang[6] = " "; printf("%s",bel); for(j=1; j<=5; j++){ move_cursor(x-4,LINES-7-y+j); printf("%s%s%s%s",SO,bang[j],SE,DO); } for(j=1; j<=5; j++){ move_cursor(x-4,LINES-7-y+j); printf("%s",bang[6]); } move_cursor(0,LINES-1); field[y+1][x+1] = 0; ufos_left -= 1; if( ufos_left == 0 ){ goto l990; } check(); if( ufos_left == 0 ){ goto l990; } goto l980; l940: ; } goto l970; l950: printf("%s",bel); move_cursor(x-4,LINES-4); printf("( PLOUF! )"); move_cursor(x-3,LINES-5); printf("^^^^^^^^"); for(j=0; j<10000; j+=2){ /* wait a bit */ j--; } move_cursor(x-4,LINES-4); printf(" "); move_cursor(x-3,LINES-5); printf(" "); move_cursor(0,LINES-1); goto l980; l970: printf("%s%s ",bel,back); l980: ; } l990: printf("%s",CL); printf("Final score: %.0f\n\n",temp_score*score_mult); if( ufos_left == 0 ){ printf("You have destroyed all %d UFOs using %d missiles.\n",num_ufos,try); printf("Congratulations !\n%s%s",VE,TE); resetty(); exit(0); } printf("You are out of missiles,and there are still %d UFOs left.\n",ufos_left); printf("Instructions:\n"); printf("A) Find the nearest trench.\n"); printf("B) Fall in and lie down.\n"); printf("C) Make sure you are fully covered.\n"); printf("D) Cover your head with your hands.\n"); printf("E) Kiss the world goodbye - "); printf("the UFOs are going to destroy the Earth, dummy! :-)\n%s%s",VE,TE); resetty(); } initialise() { srand(time()); savetty(); if( signal(SIGINT, SIG_IGN) != SIG_IGN ){ signal(SIGINT, intr); } if( isatty(0) ){ gettmode(); if( (term=getenv("TERM")) ){ setterm(term); } else{ printf("Environment variable TERM is not defined.\n"); resetty(); exit(1); } } else{ printf("Not a tty.\n"); resetty(); exit(1); } strip(TI); strip(TE); strip(VS); strip(VE); strip(VB); strip(CL); strip(SO); strip(SE); strip(BC); strip(UP); strip(DO); printf("%s",TI); printf("%s",VS); if( strlen(VB) != 0 ){ bel = VB; } else{ bel = "\007"; } if( BS ){ back = "\010"; } else{ back = BC; } } check() { top = y-1; bottom = y+3; left = x-4; right = x+6; for(ver=top; ver<=bottom; ver++){ for(hor=left; hor<=right; hor++){ if( field[ver][hor] == 0 ){ goto l3100; } field[ver][hor] = 0; ufos_left = ufos_left-1; l3100: ; } } } help() { printf("If you are not familiar with the game of UFO, ask for help: "); gets(inp); if( ! ((strcmp(inp,"help") == 0) || (strcmp(inp,"HELP") == 0) || (strcmp(inp,"hel" ) == 0) || (strcmp(inp,"HEL" ) == 0) || (strcmp(inp,"he" ) == 0) || (strcmp(inp,"HE" ) == 0) || (strcmp(inp,"h" ) == 0) || (strcmp(inp,"H" ) == 0)) ){ return; } printf("\n\nYou are in charge of the UFO defence command:\n\n"); printf( "You have a gun that fires missiles in a gravity field. To fire,you must enter\n"); printf( "the initial velocity of the missile, the angle of the gun, as well as its\n"); printf( "vertical position. These data must be given in the aforementioned order,\n"); printf("separated by commas.\n\n"); printf( "Each time you are asked to fire, you are given a graphic representation of the\n"); printf( "field. Each axis division stands for 1 metre. As you are soon going to find\n"); printf( "out, the vertical scale is not equal to the horizontal one, so the angles seem\n"); printf( "distorted. However, this is your problem, and not mine.\n\n"); printf( "Your score will be based on many factors, and the lower it is, the better.\n"); printf( "(Scores obtained from games with a different number of UFOs are not comparable)\n\n"); printf("%sG O O D L U C K !%s%s\n\n",SO,SE,bel); } float rnd(x) int x; { return ( (float)rand() / BIG); } intr() { move_cursor(0,LINES-1); printf("\n%sCoward!!!%s%s%s\n",SO,SE,VE,TE); resetty(); exit(1); }