求纯C语言打字游戏源代码及其分析

#包含“Typer.h”

# include & ltstdio.h & gt

# include & ltstdlib.h & gt

# include & ltgraphics.h & gt

//下载者

void main()

{

BOOL bQuit = FALSE/*您想退出吗*/

BOOL bPause = FALSE/*是否要暂停*/

int tm1,tm2

字节键;

randomize();/*初始化随机数种子*/

SetGraphMode();

select level();

ShowBar();

tm1=CreateTimer(1,move letter);/*创建移动角色对象时钟*/

tm2=CreateTimer(Interval,create letter);/*创建一个生成角色对象的时钟*/

create letter();

key = askey();

而(!bQuit)

{

timer event();

开关(钥匙)

{

大小写为空:

打破;

案例键_ESC:

bQuit = TRUE

打破;

案例关键字_空格:

bPause=!b暂停;

tmTM[tm1]。启用=!b暂停;

tmTM[tm2]。启用=!b暂停;

打破;

默认值:

如果(!bPause)检查(键);

}

key = askey();

}

CloseGraphMode();

}

void SetGraphMode()

{

int Device=VGA,Mode = VGAHI

init graph(& amp;设备和。模式,“”;

settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);

setfillstyle(SOLID_FILL,0);

set color(7);

}

void CloseGraphMode()

{

restorrectmode();

}

/*直接从键盘缓冲区读取ASC代码*/

字节askey(void)

{

int start,end

字键= 0;

start=peek(0,0x 41a);

end=peek(0,0x 41c);

if (start==end)返回(0);

其他

{

key=peek(0x40,start);

start+= 2;

if(start = = 0x3e)start = 0x 1e;

戳(0x40,0x1a,start);

返回(键& amp0x ff);

}

}

void MoveLetter(无效)

{

int I;

for(I = 0;我& ltMAX _ LETTERi++)

{

如果(字母[i]。已使用)

{

HideLetter(一);

字母[i]。y+=步长;

ShowLetter(一);

/*角色对象落到底部*/

如果(字母[i]。y & gtMAX _ HEIGHT)kill letter(I);

}

}

}

void KillLetter(int LetterID)

{

if(字母[LetterID]。已使用)

{

字母[LetterID]。已用=假;

字母使用-;

hide letter(LetterID);

}

/*删除后立即创建角色对象*/

create letter();

}

void CreateLetter()

{

int I = 0;

int x;

字节值;

if (LetterUsed==MAX_LETTER)返回;/*如果没有可用的字符对象,返回*/

while(字母[++i]。用过);/*找到第一个自由角色对象并生成一个角色对象*/

x = I;

字母[i]。x = x * 640/MAX _ LETTER;

字母[i]。y = 0;

字母[i]。val = random(26)+A;

字母[i]。已用=真;

字母使用的++;

}

void HideLetter(int ID)

{

/*带填充矩形的空白字符*/

栏(字母[ID].x,字母[ID]。y,字母[ID]。x+16,字母[ID]。y+20);

}

void ShowLetter(int ID)

{

char str[2]={0,0 };

str[0]=字母[ID]。val

outtextxy(字母[ID].x,字母[ID]。y,str);

}

无效检查(字节键)

{

int I;

char str[6];

hits++;

for(I = 0;我& ltMAX _ LETTERi++)

/*点击*/

如果(字母[i]。二手& amp& amp字母[i]。val==toupper(Key))

{

声音(1000);

延时(10);

KillLetter(一);

右++;

nosound();

}

/*显示状态*/

setfillstyle(SOLID_FILL,5);

吧(260,430,320,450);

吧(410,430,470,450);

set color(2);

sprintf(str," %4ld ",Hits);

outtextxy(260,430,str);

sprintf(str," %4ld ",右);

outtextxy(410,430,str);

set color(7);

setfillstyle(SOLID_FILL,0);

}

void显示栏()

{

FILE * bmp

字节r,g,b,t;

int i,x,y;

bmp=fopen("bar.bmp "," Rb ");

fseek(bmp,54,SEEK _ SET);

for(I = 0;我& lt16;i++)

{

setpalette(i,I);

b=fgetc(bmp)>& gt2;

g=fgetc(bmp)>& gt2;

r=fgetc(bmp)>& gt2;

t=fgetc(bmp)>& gt2;

setrgbpalette(i,r,g,b);

}

for(y = 0;y & lt80;y++)

for(x = 0;x & lt320;x++)

{

t = fgetc(BMP);

putpixel(x*2,479-y,t & gt& gt4);

putpixel(x*2+1,479-y,t & amp15);

}

fclose(BMP);

}

void SelectLevel()

{

int Steps[3]={1,2,4 };

int Intervals[3]={18,9,5 };

int Sel = 0;

FILE * bmp

字节r,g,b,t,Key

int i,x,y;

bmp=fopen("sel.bmp "," Rb ");

fseek(bmp,54,SEEK _ SET);

for(I = 0;我& lt16;i++)

{

setpalette(i,I);

b=fgetc(bmp)>& gt2;

g=fgetc(bmp)>& gt2;

r=fgetc(bmp)>& gt2;

t=fgetc(bmp)>& gt2;

setrgbpalette(i,r,g,b);

}

for(y = 0;y & lt200;y++)

for(x = 0;x & lt160;x++)

{

t = fgetc(BMP);

putpixel(x*2+160,339-y,t & gt& gt4);

putpixel(x*2+161,339-y,t & amp15);

}

fclose(BMP);

while(真)

{

key = toupper(ASC key());

if(Key = = ' A ')Sel = 1;

if(Key = = ' B ')Sel = 2;

if(Key = = ' C ')Sel = 3;

如果(Sel)破裂;

}

step = Steps[Sel-1];

interval = Intervals[Sel-1];

clear device();

}

/*********************************************************/

/*文件:定时器。H */

/*********************************************************/

/*********************************************************/

/*系统可用计时器的最大数量*/

#定义MAXTIMER 10

# ifndef NULL

#定义NULL 0

# endif

/*定时器结构*/

结构商标

{

双字间隔;/*间隔*/

DWORD LastTimer/*上次事件时间*/

BOOL使能;/*活动*/

使用了BOOL/*可用*/

void(*指针)();/*事件远指针*/

};

struct TM tmTM[max timer+1];

int timer used = 0;

/*获取BIOS计数器值*/

双字BiosTimer(空)

{

DWORD BIOS timer = 0;

BIOSTIMER=peek(0x0,0x46e);

BIOSTIMER & lt& lt=8;

BIOSTIMER+=peek(0x0,0x 46c);

return(BIOS timer);

}

/*时间事件(时钟系统内核)*/

void TimerEvent()

{

int I;

DWORD TimerDiff

for(I = 1;我& lt= MAXTIMERi++)

{

if (tmTM[i].二手& amp& amptmTM[i]。启用)

{

TimerDiff=BiosTimer()-tmTM[i]。LastTimer

if (tmTM[i].间隔& lt=TimerDiff)

{

tmTM[i]。指针();

tmTM[i]。last timer = BIOS timer();

}

}

}

}

/*创建时钟(成功返回时钟的句柄,否则返回NULL) */

int CreateTimer(DWORD Interval,void (*Pointer)())

{

int I = 0;

if (TimerUsed==MAXTIMER)返回NULL

while (tmTM[++i].用过);

tmTM[i]。指针=指针;

tmTM[i]。区间=区间;

tmTM[i]。Enable = TRUE

tmTM[i]。已用=真;

tmTM[i]。last timer = BIOS timer();

time rused++;

返回I;

}

/*删除时钟*/

void KillTimer(int *TimerID)

{

if (tmTM[*TimerID])。已使用)

{

time rused-;

tmTM[*TimerID]。已用=假;

}

* time rid = 0;

}

/*删除所有时钟*/

void KillAllTimer()

{

int I;

for(I = 0;我& lt= MAXTIMERi++) tmTM[i]。已用=假;

timer used = 0;

}