#include #include #include #include void help(void) {} int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,r,s,t,u,v,w,x,y; int g_array[175]; int random_seed; int rnd(int n) { random_seed = random_seed * 1103515245 + 12345; return ((((random_seed / 65536) % 32768) & 0x7fffffff) % n) + 1; } char input_str(const char prompt[]) { char response[10]; for (;;) { printf(prompt); if (fgets(response, 10, stdin) != NULL) if (response[0] > ' ') break; printf("You must enter a response\n"); } return (response[0]); } int is_numeric(const char prompt[]) { int i; for (i = 0; prompt[i] != '\n' && prompt[i] != '\0'; i++) { if (!isdigit(prompt[i])) return 0; } return 1; } int input_int(const char prompt[]) { char response[10]; for (;;) { printf(prompt); if (fgets(response, 10, stdin) != NULL) if (is_numeric(response)) break; printf("You must enter a response\n"); } return (atoi(response)); } void list_commands(void) { printf("\n"); printf("r=Report s=SR. sensor l=LR. sensor\n"); printf("g=Galaxy map p=Phaser t=Torpedo\n"); printf("w=Warp engine h=Help q=Quit\n"); printf("\n"); } void L40(void); void L45(void); void L65(void); void L145(void); void L160(void); void L165(void); void L175(void); void L180(void); void L200(void); void L220(void); void L260(void); void L295(void); void L305(void); void L325(void); void L360(void); void L375(void); void L420(void); void L465(void); void L555(void); void L615(void); // ------ Subroutines ------ void L40(void) { u=rnd(8); v=rnd(8); x=rnd(8); y=rnd(8); L45(); } void L45(void) { for (i=71; i <= 152; i++) { g_array[i] = 0; } g_array[8*x+y+62] = 4; m=abs(g_array[8*u+v-9]); n=m/100; i=1; if (n) { for (j = 1; j <= n; j++) { L165(); g_array[j+134] = 300; g_array[j+140] = s; g_array[j+146] = t; } } L175(); m=m-100*n; i=2; if (m/10) L165(); m=m-m/10*10; i=3; if (m) { for (j=1; j <= m; j++) { L165(); } } L65(); } void L65(void) { L145(); L325(); if (k == 0) { printf("\n"); printf("Mission accomplished.\n"); if (d<3) { printf("Boy, you barely made it.\n"); } if (d>5) { printf("Good work...\n"); if (d>9) { printf("Fantastic!\n"); if (d>13) { printf("Unbelievable!\n"); } } } d=30-d; i=h*100/d*10; printf("%d Klingons in %d stardates. (%d)\n", h, d, i); j=100*(c==0)-5*c; printf("%d casualties incurred. (%d)\n", c, j); printf("Your score: %d\n", i + j); } else { if (d<0) { printf("It's too late, the federation has been conquered.\n"); } } } void L145(void) { for (i=x-(x>1); i <= x+(x<8); i++) { for (j=y-(y>1); j <= y+(y<8); j++) { if (g_array[8*i+j+62] == 2) { if (o==0) { printf("Sulu: 'Captain, we are docked at Starbase.'\n"); } L160(); return; } } } o=0; } void L160(void) { e=4000; f=10; o=1; for (i=64; i <= 70; i++) { g_array[i] = 0; } } void L165(void) { do { s=rnd(8); t=rnd(8); a=8*s+t+62; } while (g_array[a] != 0); g_array[a] = i; } void L175(void) { printf("Enterprise in q-%d%d s-%d%d\n", u, v, x, y); } // Galaxy Map void L180(void) { L175(); j=2; L375(); if (i) { return; } printf(" of galaxy map\n"); for (i=0; i <= 7; i++) { printf("\n"); printf("%d:", i + 1); for (j=0; j <= 7; j++) { m=g_array[8*i+j]; printf("%4d", (m>0)*m); } printf("\n"); } printf(" "); for (i=0; i <= 7; i++) { printf(" .."); } printf("\n"); printf(" "); for (i=1; i <= 8; i++) { printf("%4d", i); } printf("\n"); printf("\n"); } // Long Range Sensor void L200(void) { L175(); j=3; L375(); if (i) { return; } printf("\n"); for (i=u-1; i <= u+1; i++) { for (j=v-1; j <= v+1; j++) { m=8*i+j-9; a=0; if ((i>0)*(i<9)*(j>0)*(j<9)) { a=abs(g_array[m]); g_array[m] = a; } printf("%4d", a); } printf("\n"); } } // Short Range Sensor void L220(void) { L175(); j=1; L375(); if (i) { return; } m=8*u+v-9; g_array[m] = abs(g_array[m]); printf("\n"); for (i=1; i <= 8; i++) { printf("%d", i); for (j=1; j <= 8; j++) { m=g_array[8*i+j+62]; switch (m) { case 0: printf(" ."); break; case 1: printf(" K"); break; case 2: printf(" B"); break; case 3: printf(" *"); break; case 4: printf(" E"); break; } } printf("\n"); } printf(" "); for (i=1; i <= 8; i++) { printf("%2d", i); } printf("\n"); } // Phaser - can end game void L260(void) { j=4; L375(); if (i) return; a = input_int(" energized. Units to fire:"); if (a<1) return; if (a>e) { printf("Spock: 'We have only %d units.'\n", e); return; } e=e-a; if (n<1) { printf("Phaser fired at empty space.\n"); L65(); return; } a=a/n; for (m=135; m <= 140; m++) { if (g_array[m] != 0) { L295(); printf("%3d units hit ", s); L305(); } } L65(); } void L295(void) { if (a>1090) { printf("...overloaded..\n"); j=4; g_array[67] = 1; a=9; L375(); } i=g_array[m+6]-x; j=g_array[m+12]-y; s=a*30/(30+i*i+j*j)+1; } void L305(void) { printf("Klingon at s-%d%d",g_array[m+6], g_array[m+12]); g_array[m] = g_array[m] - s; if (g_array[m]>0) { printf(" **damaged**\n"); return; } g_array[m] = 0; i=8*u+v-9; j=g_array[i]/abs(g_array[i]); g_array[i] = g_array[i] - 100 * j; k=k-1; i=8*g_array[m+6]+g_array[m+12]+62; g_array[i] = 0; n=n-1; printf(" ***destroyed***\n"); } void L325(void) { if (n==0) { return; } printf("Klingon attack\n"); if (o) { printf("Starbase protects Enterprise\n"); return; } t=0; for (m=135; m <= 140; m++) { if (g_array[m] != 0) { a=(g_array[m]+rnd(g_array[m]))/2; L295(); t=t+s; i=g_array[m+6]; j=g_array[m+12]; printf("%3d units hit from Klingon at s-%d%d\n", s, i, j); } } e=e-t; if (e<=0) { printf("*** bang ***\n"); return; } printf("%d units of energy left.\n", e); if (rnd(e/4)>t) { return; } L360(); } void L360(void) { if (g_array[70]==0) { g_array[70] = rnd(t/50+1); j=7; L375(); return; } j=rnd(6); g_array[j+63] = rnd(t/99+1) + g_array[j+63]; i=rnd(8)+1; c=c+i; printf("McCoy: 'Sickbay to bridge, we suffered %d casualties.'\n", i); L375(); } void L375(void) { i=g_array[j+63]; switch (j) { case 1: printf("Short range sensor"); break; case 2: printf("Computer display"); break; case 3: printf("Long range sensor"); break; case 4: printf("Phaser"); break; case 5: printf("Warp engine"); break; case 6: printf("Photon torpedo tubes"); break; case 7: printf("Shield"); break; } if (i!=0) { printf(" damaged, %d stardates estimated for repair\n", i); } } // Report void L420(void) { printf("Status report:\n"); printf("stardate %10d\n", 3230-d); printf("time left %7d\n", d); printf("Condition "); if (o) printf("Docked\n"); else if (n) printf("Red\n"); else if (e<999) printf("Yellow\n"); else printf("Green\n"); printf("position q-%d%d s-%d%d\n", u, v, x, y); printf("energy %12d\n", e); printf("torpedoes %7d\n", f); printf("Klingons left %3d\n", k); printf("Starbases %6d\n", b); for (j=1; j <= 7; j++) { if (g_array[j+63]) { L375(); } } } void L525(void) { g_array[8*x+y+62] = 4; L175(); L65(); } void L521(void) { printf("**Emergency stop**\n"); printf("Spock: 'To err is human.'\n"); L525(); } void L530(void) { p=u*72+p/5+w/5*s/r-9; u=p/72; g=v*72+g/5+w/5*t/r-9; v=g/72; if (rnd(9)<2) { printf("***Space storm***\n"); t=100; L360(); } if ((u>0)*(u<9)*(v>0)*(v<9)) { x=(p+9-72*u)/9; y=(g+9-72*v)/9; L45(); return; } printf("**You wandered outside the galaxy**\n"); printf("On board computer takes over, and saved your life\n"); L40(); } // Warp Engine - can end game void L465(void) { j=5; L375(); if (i==0) printf("\n"); for (;;) { w = input_int("sector distance:"); if (w<1) return; if (i*(w>2) == 0) break; printf("Chekov: 'We can try 2 at most, sir.'\n"); } if (w>91) { w=91; printf("Spock: 'Are you sure, Captain?'\n"); } if (e0); } p=45*x+22; g=45*y+22; w=45*w; for (m=1; m <= 8; m++) { w=w-r; if (w<-22) { L525(); return; } p=p+s; g=g+t; i=p/45; j=g/45; if ((i<1)+(i>8)+(j<1)+(j>8)) { L530(); return; } if (g_array[8*i+j+62]!=0) { L521(); return; } x=i; y=j; } L521(); } void L590(void) { s=rnd(99)+280; for (m=135; m <= 140; m++) { if ((g_array[m+6]==i)*(g_array[m+12]==j)) L305(); } L65(); } void L595(void) { b=b-1; g_array[l] = 0; g_array[w] = g_array[w]-10*r; printf("Starbase destroyed\n"); printf("Spock: 'I often find human behaviour fascinating.'\n"); L65(); } void L610(void) { t=300; printf("It novas ***Radiation alarm***\n"); L360(); L65(); } void L605(void) { g_array[l] = 0; g_array[w] = g_array[w]-r; if (rnd(9)<6) { printf("Star destroyed\n"); L65(); return; } L610(); } void L600(void) { printf("Hit a star\n"); if (rnd(9)<3) { printf("Torpedo absorbed\n"); L65(); return; } L605(); } // Torpedo - can end game void L555(void) { j=6; L375(); if (i) return; if (f==0) { printf(" empty\n"); return; } printf(" loaded\n"); L615(); if (r==0) return; printf("torpedo track "); f=f-1; p=45*x+22; g=45*y+22; for (m=1; m <= 8; m++) { p=p+s; g=g+t; i=p/45; j=g/45; if ((i<1)+(i>8)+(j<1)+(j>8) == 0) { l=8*i+j+62; w=8*u+v-9; r=g_array[w]/abs(g_array[w]); printf("%d %d ", i, j); switch (g_array[l]) { case 1: L590(); return; case 2: L595(); return; case 3: L600(); return; case 4: L605(); return; case 5: L610(); return; } } } printf("...missed\n"); L65(); } // Get Course void L615(void) { i = input_int("course (0-360):"); if ((i>360)+(i<0)) { r=0; return; } s=(i+45)/90; i=i-s*90; r=(45+i*i)/110+45; switch (s) { case 1: s=i; t=45; break; case 2: s=45; t=-i; break; case 3: s=-i; t=-45; break; default: s=-45; t=i; break; } } int main() { int quit = 0; random_seed = clock(); printf("StarTrek\n"); do { y=2999; if (input_str("Do you want a difficult game? (y or n):") == 'y') y=999; printf("\n");; printf("Stardate 3200: your mission is "); do { k=0; b=0; d=30; for (i=0; i <= 63; i++) { j=rnd(99)<5; b=b+j; m=rnd(y); m=(m<209)+(m<99)+(m<49)+(m<24)+(m<9)+(m<2); k=k+m; g_array[i] = -100*m-10*j-rnd(8); } } while ((b<2)+(k<4) != 0); printf("to destroy ", k, " Klingons in 30 stardates.\n"); printf("There are ", b, " Starbases.\n"); printf("\n"); L160(); c=0; h=k; L40(); list_commands(); while (e >= 0 && d >= 0 && quit==0) { switch (input_str("Captain? ")) { case 'g': L180(); break; case 'l': L200(); break; case 's': L220(); break; case 'p': L260(); break; case 'r': L420(); break; case 'w': L465(); break; case 't': L555(); break; case 'q': quit++; break; case 'h': help(); break; default: list_commands(); } } if (e <= 0) { printf("Enterprise destroyed\n"); if (h-k>9) printf("But you were a good man\n"); } y=987; printf("\n"); } while (input_str("Another game? (y or n):") == 'y'); printf("Good bye.\n"); return 0; }