求纯C语言打字游戏源代码及其分析
# 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;
}