VB icon

Daktari

Email
Submitted on: 1/1/2015 12:02:00 PM
By: Jim Cook (from psc cd)  
Level: Beginner
User Rating: By 3 Users
Compatibility: Borland C++
Views: 672
 
     I wrote this game in C to help me learn C. It is a text-based Shoot-em-Up that will go Very fast so you can play against the speed of the machine. It was developed in Borland Turbo C/C++ lite (and may only run/be compatible with that editor). The text aliens spin and dive in random moves, The speed of the game increases and the number of bombs is incremented after each level. Left and Right SHIFT keys move the ship and CTRL sends out a stream of missiles to wipe out the attackers! There is a Hall of Fame which saves as a file. Plus great sound effects from the PC speaker! Have fun with it !
 

INCLUDE files:

Can't Copy and Paste this?
Click here for a copy-and-paste friendly version of this code!
//**************************************
//INCLUDE files for :Daktari
//**************************************
#include"stdio.h"
#include"conio.h"
#include"bios.h"
#include"stdlib.h"
#include"dos.h"
#include"string.h"
code:
Can't Copy and Paste this?
Click here for a copy-and-paste friendly version of this code!
				
//**************************************
// Name: Daktari
// Description:I wrote this game in C to help me learn C.
It is a text-based Shoot-em-Up that will go Very fast
so you can play against the speed of the machine.
It was developed in Borland Turbo C/C++ lite (and
may only run/be compatible with that editor). 
The text aliens spin and dive in random moves,
The speed of the game increases and the number of
bombs is incremented after each level.
Left and Right SHIFT keys move the ship and CTRL
sends out a stream of missiles to wipe out the attackers!
There is a Hall of Fame which saves as a file.
Plus great sound effects from the PC speaker!
Have fun with it !
// By: Jim Cook (from psc cd)
//
// Inputs:Left and Right SHIFT keys move the ship and CTRL
sends out a stream of missiles to wipe out the attackers!
Q quit, S toggle sound
//
// Side Effects:
//**************************************

// Manic Attack or DAKTARI : by J.J.Cook. 
#include"stdio.h"
#include"conio.h"
#include"bios.h"
#include"stdlib.h"
#include"dos.h"
#include"string.h"
#define MAXNUMGALS 120
#define MAXNUMMISS 30
#define MAXNUMBOMBS 20
#define RIGHT 0x01
#define LEFT0x02
#define CTRL0x04
#define ALT0x08
float LOOP=15000;
float Count;
float gspeed=4,ovespeed=1,firespeed=1;
float ispeed=2,cgspeed=8,g1speed=2;
float bspeed=2,mspeed=2,sndspeed=1000;
float sspeed=8,espeed=8;
int Numbombs=0,M2,M1,MISS1,CG1,I1,B1,E1,S1;
int Homefactor=1,swoop=50;
int gchar[10]={86,192,60,218,65,191,62,217,32,42};
int galx[MAXNUMGALS], misx[MAXNUMMISS], 
galy[MAXNUMGALS], misy[MAXNUMMISS],
galc[MAXNUMGALS], bombx[MAXNUMBOMBS],
galdx[MAXNUMGALS], bomby[MAXNUMBOMBS],
galdy[MAXNUMGALS], galm[MAXNUMGALS],
gall[MAXNUMGALS], galsp[MAXNUMGALS], gald[MAXNUMGALS];
int key,a,shipx,shipy,Numgals,xadder=1,newxadder,shipxadder,hits,Sheet;
long Hscore[30],SC,Count2,Score,Highscore;
char Highname[11]="\0";
int fa,Hwave[30];
int Colour[30]={15,1,9,3,11,15,1,9,3,11,15,1,9,3,11,15,1,9,3,11,15,1,9,3,11,15,1,9,3,11};
int Colour1[9]={4,12,6,14,10,2,3,11,15};
char Hname[30][11]={ "....","....","....","....","....",
			"....","....","....","....","....",
			"....","....","....","....","....",
			"....","....","....","....","....",
			"....","....","....","....","....",
			"....","....","....","....","...." };
int Gameover,lives;
char Ch,Mov;
long int Delay=1000;
float freq=0,freqadder=0;
int Soundoff=0;
int Tone[9]={ 100,200,300,400,500,600,700,800,900 };
// Moves
char *Moveptr[30];
FILE *Hallfileptr;
char *Pstring[9]={"P","s","y","c","o","s","o","f","t"};
void main()
{
 void Initialise();
 void Game();
 void Scores();
 void Hall();
 void ShowHall();
 for(a=0;a<30;a++)
 {
Hscore[a]=30000-(a*1000);
 }
 
 for(a=0;a<9;a++)
 {
Moveptr[a]=((char*)malloc(41));
 }
 strcpy(Moveptr[0],"0000000000000000000000000000000000000000\0");
 strcpy(Moveptr[1],"0AAAAAAAA765432110777665544332AAAAAAAAAA\0");
 strcpy(Moveptr[2],"0089999999901234567011118221009999999999\0");
 strcpy(Moveptr[3],"AAAAAAAAAA000000000000000000000099999999\0");
 strcpy(Moveptr[4],"0AAAAAAAA765432110777665544332AAAAAAAAAA\0");
 strcpy(Moveptr[5],"0000000999999990110077001100770011107770\0");
 strcpy(Moveptr[6],"2222222222222222222222222222222222222210\0");
 strcpy(Moveptr[7],"777777777666666666667777777777AAAAAAAAAA\0");
 strcpy(Moveptr[8],"44449A444489A9A44449A4444484567012345670\0");
 strcpy(Moveptr[9],"9999999999999999999999999999899AAAAAAAAAA\0");
 strcpy(Moveptr[10],"0000000000000000000000000000009999999999\0");
 strcpy(Moveptr[11],"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AA\0");
 strcpy(Moveptr[12],"0123456700000000111111100000009999999999\0");
 strcpy(Moveptr[13],"012345677777777777777777777777AAAAAAAAAA\0");
 strcpy(Moveptr[14],"0765432111111111111111111111115999999999\0");
 strcpy(Moveptr[15],"012345434543454345434543454345670AAAAAAA\0");
 strcpy(Moveptr[16],"0122222222222222222222211110000099999999\0");
 strcpy(Moveptr[17],"00777777777011111111107777777700AAAAAAAA\0");
 strcpy(Moveptr[18],"01233333333345670A99AA99AA99AA99AA99AA90\0");
 strcpy(Moveptr[19],"0101010101010101010101010101010101010101\0");
 strcpy(Moveptr[20],"0909090909090909090909090909090909090909\0");
 strcpy(Moveptr[21],"0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A\0");
 strcpy(Moveptr[22],"0990990990990990990990990990990990990990\0");
 strcpy(Moveptr[23],"4AA4AA4AA4AA4AA4AA4AA4AA4AA4AA4AA4AA4AA4\0");
 strcpy(Moveptr[24],"6543322111000777666655554444333333222210\0");
 strcpy(Moveptr[25],"1011011100110011000101101011100101010011\0");
 strcpy(Moveptr[26],"7654567076545670765456707654567076545670\0");
 strcpy(Moveptr[27],"7070707077707070070707707707070707070771\0");
 strcpy(Moveptr[28],"7707707007707010101010110101707007011011\0");
 strcpy(Moveptr[29],"1101010101101077070770707070110011010101\0");
	
 // Load Hall of fame
 
 fclose(Hallfileptr);
 if((Hallfileptr=fopen("HALL.dat","r"))==NULL)
 {
printf("File could not be opened");
 }
 else
 {
fa=0;
while(fscanf(Hallfileptr,"%ld %d %s",&Hscore[fa],&Hwave[fa],&Hname[fa])!=EOF)
{
	fa++;
}
fclose(Hallfileptr);
strcpy(Highname,Hname[0]);
Highscore=Hscore[0];
 }
 
 textmode(C4350);
 nosound();
 while(Ch!='q' && Ch!='Q')
 {
gotoxy(30,24);
textcolor(LIGHTGREEN);
cprintf("D - A - K - T - A - R - I\r");
delay(2000);
Hall();
{strncpy(Highname,Hname[0],11);}
	 
clrscr();
gotoxy(14,26);
textcolor(LIGHTGREEN);
cprintf("Press 'Q' to quit or 'H' for Hall or other key for Game\r");
cprintf("\n\n Keys: Left / Right SHIFT to move, CTRL to Fire, S Sound On/Off\r");
Ch=getch();
Initialise();
Score=0;
lives=4;
Sheet=1;
LOOP=12000;
swoop=70; Homefactor=1;
if(Ch!='q' && Ch!='Q' && Ch!='H' && Ch!='h') {Game();}
if(Ch=='h' || Ch=='H') {ShowHall();}
 }
}
void Initialise()
{
 // New sheet
 void Ship();
 nosound();
 LOOP=LOOP-500;
 if(LOOP<60) {LOOP=60;} // Max game speed
 if(Sheet==10 || Sheet==15 || Sheet==20 || Sheet==25 || Sheet>30) {lives++;}
 if(Sheet>=25) {lives++;}
 Gameover=0;
 int i,j=10,jf=0,y=3,c=0;
 
 shipy=45; shipx=40; 
 Numgals=MAXNUMGALS;
 if(Sheet++>1) {Score=Score+1000;} 
 swoop=swoop-5; if(swoop<1) {swoop=1;}
 Homefactor=Homefactor*5;
 if(Homefactor>10000) {Homefactor=10000;}
 Numbombs++; if(Numbombs>MAXNUMBOMBS) {Numbombs=MAXNUMBOMBS;}
 for(i=0;i<Numgals;i++)
 {
j=j+4; 
if(j>70-c) 
{
	j=16+c; jf=0; y++; y++; c=c+2;
	if(jf==1) {jf=0; j=j+2;}
	else {jf=1;}
}
galx[i]=j;
galy[i]=y;
galc[i]=0; galdx[i]=0; galdy[i]=0; gall[i]=2;
 }
 for(i=0;i<MAXNUMMISS;i++)
 {
misx[i]=98;
 }
 for(i=0;i<MAXNUMBOMBS;i++)
 {
bombx[i]=99;
 }
 for(i=0;i<MAXNUMGALS;i++)
 {
galsp[i]=0;
galm[i]=0;
gald[i]=0;
 }
 clrscr();
 Ship();
}
void Game()
{
 void Showgals(int);
 void Movegals();
 void Ship();
 void Missiles();
 void Input();
 void Changegals();
 void Bombs();
 void Movegals2();
 void Scores();
 void Explosion();
 Ship();
 while(Gameover==0)
 {
//if(sndspeed==(Count*8/LOOP))
{
	S1++; if(S1>=sndspeed) {S1=0;}
	if(S1==0)
	{
	 if(freq!=0 && Soundoff==0) {sound(freq);}
	 SC++; if(SC>=Delay) {SC=0; nosound();}
	
	 freq=freq+freqadder; 
	 if(freq<0) {freq=0;}
	 if(freq>8000) { nosound(); freq=0; Delay=0; SC=0;}
	}
}
if(sspeed==(Count*8/LOOP))
{
Scores();
}
if(gspeed==(Count*8/LOOP))
{
	Showgals(1);
	M1++; if(M1>=g1speed) {M1=0;}
	if(M1==0) {Movegals2();}
	M2++; if(M2>=gspeed) {M2=0;}
	if(M2==0) {Movegals();} 
	Showgals(0);
}
if(ispeed==(Count*8/LOOP))
{
	I1++; if(I1>=ispeed) {I1=0;}
	if(I1==0) {Input();}
}
if(cgspeed==(Count*8/LOOP))
{
	CG1++; if(CG1>=cgspeed) 
	{
	 CG1=0;
	 Changegals();
	 Showgals(0);
	}
}
if(bspeed==(Count*8/LOOP))
{
	B1++; if(B1>=bspeed) {B1=0;}
	if(B1==0) {Bombs();}
}	
if(mspeed==(Count*8/LOOP))
{
	MISS1++; if(MISS1>=mspeed) {MISS1=0;}
	if(MISS1==0) {Missiles();}
}
if(espeed==(Count*8/LOOP))
{
	E1++; if(E1>=espeed) {E1=0;}
	if(E1==0) {Explosion();}
}	
if((Count++)>LOOP) {Count=0;}
 }
}
void Showgals(int m)
{
 int k;
 for(k=0;k<Numgals;k++)
 {
if(gald[k]==0)
{
	gotoxy(galx[k],galy[k]);
	if(m==0) 
	{
	 if(galc[k]!=0) {textcolor(Colour1[galc[k]]);}
	 else {textcolor(gall[k]);}
	}
	else {textcolor(0);}
	cprintf("%c\r",gchar[galc[k]]);
}
 }
}
void Movegals()
{
 int l;
 newxadder=xadder;
 for(l=0;l<Numgals;l++)
 {
if(gald[l]==0 && galm[l]==0) 
{
	galx[l]=galx[l]+xadder;
	if((galx[l]<2 || galx[l]>78)&&galm[l]==0) {newxadder=-xadder;}
}
 }
 xadder=newxadder;
}
void Ship()
{
 gotoxy(shipx,shipy);
 textcolor(LIGHTCYAN);
 cprintf(" \r");
 if(shipx+shipxadder>0 && shipx+shipxadder<80) {shipx=shipx+shipxadder;}
 gotoxy(shipx,shipy);
 cprintf("A\r");
}
void Missiles()
{
 int m;
 void Hitcheck(int);
 for(m=0;m<=MAXNUMMISS-1;m++)
 {
if(misx[m]!=98)
{
	gotoxy(misx[m],misy[m]);
	textcolor(WHITE);
	cprintf(" \r");
	shipxadder=0;
	Ship();
	Hitcheck(m);
	misy[m]--;
	if(misy[m]>1 && misx[m]!=98)
	{
	 gotoxy(misx[m],misy[m]);
	 cprintf(":\r");
	}
	else {misx[m]=98;}
}
 }
}
void Hitcheck(int mm)
{
 int n;
 for(n=0;n<MAXNUMBOMBS;n++)
 {
if(misx[mm]==bombx[n] && misy[mm]==bomby[n]) // Hit bomb
{
	gotoxy(bombx[n],bomby[n]);
	cprintf(" \r");
	bombx[n]=99; misx[mm]=98;
	
}
 }
 for(n=0;n<Numgals;n++)
 {
if(misx[mm]==galx[n] && misy[mm]==galy[n] && gald[n]==0) // Hit galaxian
{
	gotoxy(galx[n],galy[n]);
	textcolor(YELLOW);
	cprintf("*\r");
	gald[n]=1; misx[mm]=98;
	hits++; 
	if(galy[n]>20) {Score+=20;}
	if(galm[n]!=0) {Score+=40;}
	Score+=10;
	if(hits==Numgals) {hits=0; Initialise(); break;}
	freq=200; freqadder=50; Delay=10; SC=0;
	break;
}
 }
}
void Input()
{
 int mod,o,oi,oc;
 shipxadder=0; 
 {
mod=bioskey(2);
if(mod & CTRL) 
{
	for(o=0;o<MAXNUMMISS;o++)
	{
	 if(misx[o]==98)
	 {
	oc=0;
	for(oi=0;oi<MAXNUMMISS;oi++)
	{
		if(misy[oi]<shipy) {oc=1;} 
	}	 
	if(oc==1) 
	{
		oc=0; misx[o]=shipx; misy[o]=shipy; 
		freq=2350; freqadder=-50;
		Delay=50;
		SC=0;
		break;
	}
	 }
	}
}
 }
 
 {
if(mod & RIGHT)
{
	shipxadder=1;
} 
if(mod & LEFT)
{
	shipxadder=-1;
}
 }
 
 
 {
while(bioskey(1)!=0)
{
	key=bioskey(0);
	
	//if(key==19712 || key==29696) {shipxadder=1; }
	//if(key==19200 || key==29440) {shipxadder=-1;}
	if(key==4209 || key==4177) { nosound(); Ch='q'; Gameover=1; }
	if(key==8051 || key==8019) { if(Soundoff==0) Soundoff=1; else Soundoff=0;}
}
 }
 Ship();
}
void Changegals()
{
 int p;
 
 for(p=0;p<Numgals;p++)
 {
if(galm[p]==0)
{
	if(rand()%2==1)
	{
	 galc[p]++; if(galc[p]>7) {galc[p]=0;}
	}
	else
	{
	 if(int(rand()%2)==1)
	 {
	galc[p]--; if(galc[p]<0) {galc[p]=7;}
	 }
	}
}
 }
}
void Bombs()
{
 void BombHitcheck(int);
 int q,r;
 for(q=0;q<Numbombs;q++)
 {
if(bombx[q]!=99)
{
	gotoxy(bombx[q],bomby[q]);
	textcolor(RED);
	cprintf(" \r");
	BombHitcheck(q);
	bomby[q]++;
	if(bomby[q]<49 && bombx[q]!=99)
	{
	 gotoxy(bombx[q],bomby[q]);
	 cprintf("o\r");
	}
	else {bombx[q]=99; }
}
else 
{
	r=rand()%Numgals;
	while(gald[r]==1)
	{
	 r=rand()%Numgals;
	}
	bombx[q]=galx[r]; bomby[q]=galy[r]; break;;
}
 }
}
void BombHitcheck(int qq)
{
 void HitShip();
 if(bombx[qq]==shipx && bomby[qq]==shipy)
 {
HitShip();
 }
}
void HitShip()
{
 void Ship();
 void Endgame();
 int s;
 clrscr();
 nosound();
 for(s=0;s<lives-1;s++)
 {
shipx=38+s*2; shipy=26;
shipxadder=0;
Ship();
delay(250);
 }
delay(1000);
clrscr();
//Initialise();
shipx=40; shipy=45;
lives--;
if(lives==0) {Endgame();}
delay(1000);
}
void Endgame()
{
 clrscr();
 gotoxy(33,26);
 textcolor(RED);
 cprintf("G A M EO V E R\r");
 delay(2500);
 hits=0;
 Numbombs=0;
 Gameover=1;
}
void Movegals2()
{
 void Hitcheck2(int);
 int u,v,w;
 if(Numgals-hits>=1)
 {
v=rand()%swoop;
if(v==0) 
{
	w=rand()%Numgals;
	while(gald[w]==1)
	{
	 w=rand()%Numgals;
	}
	//if(galm[w]==0)
	{
	 galm[w]=(rand()%28)+1;
	 galsp[w]=0;
	 freq=1000+rand()%200*Sheet; Delay=4; freqadder=-1; SC=0;
	}
}
 }
 for(u=0;u<Numgals;u++)
 {
if(galm[u]!=0 && gald[u]==0)
{
	strncpy(&Mov,(Moveptr[galm[u]])+galsp[u],1);
	switch (Mov)
	{
	 case '0': { galc[u]=0; galy[u]++; Hitcheck2(u); break;}
	 case '1': { galc[u]=1; galy[u]++; galx[u]--; Hitcheck2(u); break;}
	 case '2': { galc[u]=2; galx[u]--; Hitcheck2(u); break;}
	 case '3': { galc[u]=3; galx[u]--; galy[u]--; Hitcheck2(u); break;}
	 case '4': { galc[u]=4; galy[u]--; Hitcheck2(u); break;}
	 case '5': { galc[u]=5; galy[u]--; galx[u]++; Hitcheck2(u); break;}
	 case '6': { galc[u]=6; galx[u]++; Hitcheck2(u); break;}
	 case '7': { galc[u]=7; galx[u]++; galy[u]++; Hitcheck2(u); break;} 
	 case '8': { 
			 if(galy[u]<15 && galy[u]>2 && galx[u]>2 && galx[u]<78)
			 {
			galm[u]=0; galsp[u]=0; break;
			 } 
			 else
			 {
			 Hitcheck2(u); 
			 freqadder=1; Delay=10;
			 break;
			 }
			}
	 case '9': { galc[u]++; if(galc[u]>7) {galc[u]=0;} break;}
	 case 'A': { galc[u]--; if(galc[u]<0) {galc[u]=7;} break;}
	}
	galsp[u]++; if(galsp[u]>39) {galsp[u]=0;}
}
 }
}
void Hitcheck2(int uu)
{
 void HitShip();
 if(galx[uu]<1) {galx[uu]=78;}
 if(galx[uu]>79) {galx[uu]=2;}
 if(galy[uu]<1) {galy[uu]=48;}
 if(galy[uu]>48) {galy[uu]=2;}
 if(galx[uu]==shipx && galy[uu]==shipy) 
 {
gald[uu]=1; hits++;
if(hits==Numgals) {hits=0; Initialise(); }
HitShip();
 }
 if(rand()%Homefactor==1) {galm[uu]=8; galsp[uu]=0;}
}
void Scores()
{
 int z;
 if(Highscore<Score) 
 {
Highscore=Score; 
if(Gameover==0) 
{strcpy(Highname," ");}
 }
						 
 gotoxy(1,1); textcolor(LIGHTCYAN);
 cprintf("Score:%ld\r",Score);
 gotoxy(32,1);
 cprintf("Highscore:%ld \"%s\"\r",Highscore,Highname);
 gotoxy(24,1);
 cprintf("Wave:%d",Sheet);
 for(z=0;z<lives-1;z++)
 {
gotoxy(80-z*2,1);
cprintf("A \r");
 }
}
void Explosion()
{
 // Clears explosion
 int az;
 for(az=0;az<Numgals;az++)
 {
if(gald[az]==1)
{
	//galx[az]==0; galy[az]==0;
	gotoxy(galx[az],galy[az]);
	cprintf(" \r");
}
 }
}
void Hall()
{
 void ShowHall();
 int ha,hb,hc,sa;
 clrscr();
 for(hb=0;hb<30;hb++)
 {
if(Score>Hscore[hb])
{
	for(hc=29;hc>=hb;hc--)
	{
	 Hscore[hc]=Hscore[hc-1];
	 Hwave[hc]=Hwave[hc-1];
	 strncpy(Hname[hc],Hname[hc-1],11);
	}
	Hscore[hb]=Score;
	Hwave[hb]=Sheet;
	textcolor(LIGHTCYAN);
	gotoxy(28,24); cprintf("----------\r");
	gotoxy(10,23); cprintf("Enter your name : ");
	scanf("%10s",&Hname[hb]);
	clrscr();
	break;
}
 }
 // save to file
 if((Hallfileptr=fopen("HALL.dat","w"))==NULL)
 { printf("Unable to open file for output !"); }
 else
 {
for(ha=0;ha<30;ha++)
{
	fprintf(Hallfileptr,"%ld %d %s\n ",Hscore[ha],Hwave[ha],Hname[ha]);
}
fclose(Hallfileptr);
 }
 delay(1000);
 textcolor(WHITE);
 gotoxy(67,48); 
 cprintf("by ");
 for(sa=0;sa<9;sa++)
 {
delay(60);
textcolor(Colour1[sa]);
cprintf("%c",*Pstring[sa]);
if(Soundoff==0) sound(Tone[sa]);
 }
 nosound();
 delay(1000);
 gotoxy(67,48); printf(" ");
 gotoxy(79,48); 
 delay(1000);
 ShowHall();
 getch();
 clrscr();
}
void ShowHall()
{
 int sha;
 
 textcolor(LIGHTGREEN); gotoxy(7,1);
 cprintf("Hall of FAME\r\n\n\n");
 cprintf("Rank Score Wave Name\n\n\r");
 for(sha=0;sha<30;sha++)
 {
textcolor(Colour[sha]);
cprintf("%2d : %6ld : %2d : %s\n\r",sha+1,Hscore[sha],Hwave[sha],&Hname[sha]); 
 }
}


Report Bad Submission
Use this form to tell us if this entry should be deleted (i.e contains no code, is a virus, etc.).
This submission should be removed because:

Your Vote

What do you think of this code (in the Beginner category)?
(The code with your highest vote will win this month's coding contest!)
Excellent  Good  Average  Below Average  Poor (See voting log ...)
 

Other User Comments


 There are no comments on this submission.
 

Add Your Feedback
Your feedback will be posted below and an email sent to the author. Please remember that the author was kind enough to share this with you, so any criticisms must be stated politely, or they will be deleted. (For feedback not related to this particular code, please click here instead.)
 

To post feedback, first please login.