您的位置:

c语言涂字游戏,C++文字游戏

本文目录一览:

用C语言编写一个简单的打字母游戏,给出基本思路及完整程序。

# includestdio.h

# include conio.h

# include graphics.h

# include time.h

# pragma comment(lib,”Winmm.lib”) //引用Windows Multimedia APT

int score =0; //全局变量********整型的分数

char s[5]; //全局变量****字符型的分数

struct player_ //自定义的结构体,并顺便定义一个结构体变量

{

char name[20];

int score_;

}player[11];

/***************函数声明*****************/

void record_(); //记录彼此成绩函数

void welcome( ); //欢迎界面函数

void instructions( ); //游戏说明界面函数

void gane (int rank2); //游戏函数

void record ( ); //显示记录函数

int rank_(char rank1); //等级选择函数

void goodbye ( ); //退出界面函数

/**************主函数**************/

int main ()

{

char rank1; //rank1接受从键盘输入的字符,根据字符判断等级

int rank2=15; // 控制延时时间,从而控制速度

intsign=1; // 当做标记,用于标记是否弹出MessageBox对话框

welcome ( ); //调用欢迎界面函数

instructions ( ); //调用游戏什么函数

record( ); //调用显示记录函数

InputBox(player[10].name,20,"请输入玩家昵称"; //以对话框形式获取用户输入函数

rank1=getch();//读入一个字母

rank2=rank_(rank1); //调用等级函数

game (rank2); //调用游戏函数

HWND wnd =GetHWnd();

while (sign) //sign作为标记,执行循环

if (MessageBox(wnd,"游戏结束!!!\n再来一局,挑战更高分数","询问",MB_YESNO|MB_ICONQUESTION)==IDYES)

game (rank2);

else

{

sign=0;

goodbye( );

}

closegraph( );

return 0;

}

/***************记录本次成绩函数***************/

void record_()

{

FILE*fp; //文件指针

int i,j;

struct player_t; //定义结构体变量t,冒泡法比较大小时用

player[10].score_=score; //把该局的分数赋给该局用户的结构体变量中

fp=fopen("记录.dat","rb"); //打开二进制文件

for (i=0;i10;i++)

{

fread(player[i].name,20,l,fp); //读入记录中的成绩和名字

fread (player[i].score_,4,l,fp);

}

fclose(fp); //关闭二进制文件

for (j=0;j10;j++) //冒泡法排序

for (i=0;i10-j;i++)

if (player[i].score_)

{

t=player[i];

player[i]=player[i+1];

player[i+1]=t;

}

fp=fopen("记录.dat","wb"); //打开文件

for (i=0;i10;i++) //把排好序列的数据存入记录文件

{

fwrite(player[i].name,20,l,fp);

fwrite (player[i].score_,4,l,fp);

}

fclose(fp); //关闭文件

}

/****************欢迎界面函数****************/

void welcome ( )

{

char ch;

mciSendString("open\"res\\Sleep Away.mp3\"alias mymusic",NULL,0,NULL);

initgraph(640,480); //初始化画图界面

IMAGE img; //定义IMAGE对象

loadimage (img,"res\\00.jpg"); //读取图片到img对象中

putimage (0,0,img); //在坐标(0,0)位置显示IMAGE对象

ch=getch(); //吸收掉一个按键

cleardevice(); //清屏

}

/***************游戏说明界面函数**************/

void instructions()

{

int c=255; //控制变色的变量

setcolor(YELLOW); //设置颜色

setfont (30,0,"黑体"); //设置字体

outtextxy(0,0,"游戏说明"); //输出文字

setcolor(WHITE);

setfont(28,0,"宋体");

outtextxy(0,30,"一、每次游戏下落200个字母"); //输出文字

outtextxy(0,58,"二、请按数字键选择游戏等级");

outtextxy(0,86,"三、统计被击中的个数");

setfont(30,0,"华文行楷")

outtextxy (20,220,"等级一二三四 五六七八九");

outtextxy(20,260,“按键 1 2 3 4 5 6 7 8 9”);

while (!kbhit()) //kihit()作用是判断是否有字幕输入

{

setcolor(RGB(c,255,0));

setfont (80,0,"楷体");

outtextxy(140,130,"请选择等级");

setcolor(RGB(c,0,255));

setfont(100,0,"Wickenden Cafe NDP");

outtextxy(100,135,"Let's go!!!");

c-=25; //控制颜色的变量自减

if(c0)c=255; //控制颜色的变量小于0时,再把255赋给c

cleardevice(); //清屏

}

/***************退出界面函数***************/

void goodbye()

{

int c=255; //控制变色变量

cleardevice(); //清屏

setcolor(YELLOW);

setfont (48,0,"黑体");

outtextxy (104,120,"的最终成绩是: ");

setfont (48,0,"华文楷体");

setcolor(RGB(255,255,0));

outtextxy(140,320,"按任意键退出游戏");

setcolor(YELLOW);

setfont(48,0,"黑体");

outtextxy (104,120,"的最终成绩是: ");

outtextxy(104,70,player[10].name);

record_(); //调用记录本次成绩函数

while(!kbhit())

{

setcolor(RGB(255,0,c-100)); //设置颜色

setfont(100,0,”Wickenden Café NDP”);

outtextxy(400,90,s); //输出数字

setcolor(RGB(c,0,255));

setfont(48,0,”黑体”);

if (score==200)

outtextxy(100,200,”全部击中!!!”);

else

if(score190)

outtextxy(100,200,”不错!继续加油!”);

else

outtextxy(100,200,”不要灰心!继续加油!”);

c-=25;

if(c0)

c=255;

Sleeep(20); //延时20秒

}

getch( ); //提供给用户时需要等待输入后再退出

}

/**************等级选择函数**************/

int rank_(char rank1)

{

int rank2;

switch(rank1) //判断字符,确定等级

{

case’0’:rank2=11;break;

case’1’:rank2=10;break;

case’2’:rank2=9;break;

case’3’:rank2=8;break;

case’4’:rank2=7;break;

case’5’:rank2=6;break;

case’6’:rank2=5;break;

case’7’:rank2=4;break;

case’8’:rank2=3;break;

case’9’:rank2=2;break;

default:rank2=15;break;

}

return rank2;

}

/**************显示记录函数***********/

void record( )

{

FILE *p; //文件指针

int a[10],j;

char b[10][10];

fp=fopen(“记录。dat”,”rb”); //打开文件

for (j=0;j10;j++)

{

fread(player[j].name,20,1,fp); //读取文件中的信息

fread(player[j].score_,4,1,fp);

}

fclose(fp); //关闭文件

setfont(60,0,”Arial”);

setcolor(RGB(250,250,0));

outtextxy(250,0,”TOP10”);

for(j=0;j10;j++)

{

sprintf(“b[j],%d”,player[j].score_); //把整型转换为字符型

setcolor(RGB(0,100,255));

setfont(40,0,”Arial”);

outtextxy(420,50+40*j,b[j]);

outtextxy(120,50+40*j,player[j].name); //输出名字

/**********游戏函数******************/

void game (int rank2)

{

cleardevice( ); //清屏

score=0; //清除掉原有的分数

outtextxy(0,0,”玩家:”);

outtextxy(90,0,player[10].name);

setfont(20,0,”Arial”);

outtextxy(100,460,” 人生有享受片刻优雅恬适的权力,让打字母游戏放松你一下吧!”);

int i;

char target; //目标字母

char key; //用户的按键

intx,y; //字母的位置

int flag =1; //标记是否按了退出键

int sum=0; //成绩计数

int num =200; //规定下落字母的个数

srand (time(NULL)); //随机时间种子,设置第一个随机函数的值

setfillstyle(BLACK); //设置下面矩形内图的颜色

setcolor(YELLOW); //

line(0,450,640,450); //用3条线规定一下工作区

line(0,440,640,440); //用3条线规定一下工作区

line(0,40,640,40); //用3条线规定一下工作区

while (flagnum)

{

setfont(40,0,”宋体”); //设置字母的字体和大小

i=rand()%2; //rand()函数返回0~32767之间的一个整数

if(i)

target=97+rand()%26; //产生任意小写字母

else

target=65+rand()%26; //产生任意大写字母

x=rand()%610; //产生任意下落位置

for (y=41;y380;y++)

{

setcolor (RGB(255,0,255));

outtextxy(x,y,target); //显示字母

if(kbhit())

{

key=getch(); //获取用户按键

if ((key==target)||( key==target-32)||( key==target+32))

{

score++; //分数统计

sprintf(s,”%d”score);

setfont(30,0,”Arial”);

outtextxy(500,0,“分数”);

outtextxy(600,0,s); //输出分数

bar(x-10,y-10,x+35,y+50); // 击中用黑框形擦去字母

break; //跳出循环,进行下一个字母

}

else if (key==27) //判断是否按了

{

flag=0; //若果按ESC,退出游戏主循环

break;

}

}

Sleep(rank2); //控制清除字母的时间爱你也就是控制下落速度

bar(x,y,x+35,y+60); //擦最下面的字符

}

num--; //计数

}

}

急求一份C语言打字游戏代码,要求单词从屏幕上方落下,打字正确字母变为绿色。

#includetime.h

#includestdlib.h

#includegraphics.h

#includeconio.h

#includedos.h

#includemath.h

#define R 10

#define ESC 0x011b

#define LOW 0x5000

#define FAST 0x4800

int draw_car(int x,int y,char *ch);

double dalta=20,angle;

void *image;

int step=20;

main()

{

int gdriver=DETECT,gmode;

static int startx=60;

static int starty=20;

int maxy,maxx,l=1,n=1;

char ch,play, str[2];

int size,temch;

int ok,y=50;

clrscr();

printf("\n\n\n\n\n*****************************************\n");

printf(" 1.play only number 0-9 .\n");

printf(" 2.play only char a-z .\n");

printf(" 3.exit\n");

printf("*****************************************\n");

while(1){

printf("\nPls enter choice:");

play=getche();

if((play=='1')||(play=='2'))

break;

if(play=='3')

return;

}

registerbgidriver( EGAVGA_driver ); /*注册vga驱动*/

initgraph(gdriver,gmode,"d:\\tc3\\bgi"); /*初始化图形界面*/

cleardevice(); /*清除屏幕*/

setbkcolor(BLUE); /*将背景色设置成蓝色*/

size=imagesize(startx,starty,startx+60,starty+60); /*计算生成60×60个象素的图需要的字节数*/

image=(unsigned char *)malloc(size); /*分配内存*/

maxx=getmaxx();

maxy=getmaxy();

randomize();

printf("Press ESC to exit game! ");

printf(" %c to fast speed,%c to low speed!",24,25);

do{

ok=0;

if(play=='1')

ch=random(9)+48;

if(play=='2')

ch=random(26)+65;

str[0]=ch;

do{

while(bioskey(1)==0) /*如果没有按键就不停的循环*/

{

if(l==1) /*从左到右*/

{

n++;

angle=-1*(n*step)/M_PI*180/R;

if((int)(-1*angle)%360dalta)

angle-=dalta;

if(n(maxx-180)/step){

if(startymaxy-100)

starty=20;

else

starty+=y;

l=0;

}

}

if(l==0) /*从右到左*/

{

--n;

angle=-1*(n*step)/R/M_PI*180;

if((int)(-1*angle)%360dalta)

angle-=dalta;

if(n==1){

if(startymaxy-100)

starty=20;

else

starty+=y;

l=1;

}

}

draw_car(startx+n*step,starty,str);

}

temch=bioskey(0);

if(temch==FAST){

step+=10;

y+=10;

}

if(temch==LOW){

step-=10;

y-=10;

}

ok=temch0x00ff;

if((ok==ch)||(ok==ch+32)){

ok=1;

starty=20;

break;

}

}while(temch!=ESC);

if(ok!=1)

break;

}while(1);

free(image);

closegraph();

return;

}

int draw_car(int x,int y,char *ch){

setcolor(YELLOW); /*设置前景色为黄色*/

rectangle(x,y,x+60,y+40); /*画车厢*/

pieslice(x+15,y+50,angle,angle-dalta,10); /*画轮上的小片扇形部分*/

pieslice(x+45,y+50,angle,angle-dalta,10);

setfillstyle(SOLID_FILL, YELLOW); /*设置填充模式为实填充,颜色为黄色*/

circle(x+15,y+50,10); /*画车轮*/

circle(x+45,y+50,10);

circle(x+15,y+50,3);

circle(x+45,y+50,3);

setcolor(WHITE);

settextstyle(1,0,4);

outtextxy(x+25,y,ch);

getimage(x,y,x+60,y+60,image); /*获取当前的图片*/

delay(200);

putimage(x,y,image,XOR_PUT); /*使用异或模式将图片显示上去*/

return;

}

C语言简易文字冒险游戏源代码

记忆游戏

#includestdio.h

#includetime.h

#includestdlib.h

#includewindows.h

#define N 10

int main(  )

{int i,k,n,a[N],b[N],f=0;

srand(time(NULL));

printf("  按1开始\n  按0退出:_");

scanf("%d",n);

system("cls");

while(n!=0)

{for(k=0;kN;k++)a[k] = rand( )%N;

printf("\n\t\t[请您牢记看到颜色的顺序]\n\n");

for(k=0;kN;k++)

{switch(a[k])

{case 0:system("color 90");printf("  0:淡蓝色\n");break;  //淡蓝色

case 1:system("color f0");printf("  1:白色\n");break;  //白色

case 2:system("color c0");printf("  2:淡红色\n");break;  //淡红色

case 3: system("color d0");printf("  3:淡紫色\n");break;  //淡紫色

case 4: system("color 80");printf("  4:灰色\n"); break;  //灰色

case 5: system("color e0");printf("  5:黄色\n");break;  //黄色

case 6: system("color 10");printf("  6:蓝色\n"); break;  //蓝色

case 7: system("color 20");printf("  7:绿色\n");break;  //绿色

case 8: system("color 30");printf("  8:浅绿色\n");break;  //浅绿色

case 9: system("color 40");printf("  9:红色\n");break;  //红色

}

Sleep(1500);

system("color f");  //单个控制 文字颜色

Sleep(100);

}

system("cls");

printf(" 0:淡蓝色,1:白色,2:淡红色,3:淡紫色,4:灰色,5:黄色,6:蓝色7:绿色,8:浅绿色,9:红色\n");

printf("\n\t请输入颜色的顺序:");

for(k=0;kN;k++)scanf("%d",b[k]);

for(k=0;kN;k++)if(a[k] == b[k]) f++;

if(f==0) printf("  你的记忆弱爆了0\n");

else if(f==1) printf("  你的记忆有点弱1\n");

else if(f5) printf("  你的记忆一般5\n");

else printf("  你的记忆力很强!\n");

Sleep(2000);

system("cls");

printf("\t\t按0退出\n\t\t按任意键继续游戏:\n");

scanf("%d",n);

system("cls");

}

return 0;

}

注:DEVc++运行通过,每输入一个数字要加入一个空格。

求c语言打字游戏程序,要求如下:

//头文件stdio.h,conio.h,time.h

int main()

{//首先打印信息

getch();

char a,b;

int t,s;

s=time();//获取系统时间,以秒为单位,存入s中

for(;;)

{t=time();

if(t-s=60)break;//假设规定时间是60秒

a=(char)rand();//随机生成数字(返回int型,需要强制转换)

/*rand每次生成的随机数相同,

需要用系统时间初始化随机数生成器,

相关内容可以到百度查*/

for(a'a'||a'z')a=(char)rand();//如果不是小写字母,重新生成

printf("%c",a);

b=getch();

if(a==b);//正确

else printf("\b_");//\b代表backspace,错误时打印_

}

getch();//结束

}

//当然,如有兴趣,可以定义两个int型变量,分别记录总字数和敲对的字数

怎样用C语言编写一个小游戏?

“贪吃蛇”C代码:

#include stdio.h

#include stdlib.h

#include conio.h

#include time.h

#include Windows.h

#define W 78  //游戏框的宽,x轴

#define H 26  //游戏框的高,y轴

int dir=3;    //方向变量,初值3表示向“左”

int Flag=0;   //吃了食物的标志(1是0否)

int score=0;  //玩家得分

struct food{ int x;  //食物的x坐标

                  int y;  //食物的y坐标

                 }fod;  //结构体fod有2个成员

struct snake{ int len;  //身长

                   int speed;  //速度

                   int x[100];

                   int y[100];

                  }snk;  //结构体snk有4个成员

void gtxy( int x,int y)  //控制光标移动的函数

{ COORD coord;

coord.X=x;

coord.Y=y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

}

void gtxy( int x,int y);  //以下声明要用到的几个自编函数

void csh( );  //初始化界面

void keymove( ); //按键操作移动蛇

void putFod( );  //投放食物

int  Over( );   //游戏结束(1是0否)

void setColor(unsigned short p, unsigned short q); //设定显示颜色

int main( )   //主函数

{ csh( );

  while(1)

    { Sleep(snk.speed);

      keymove( );

      putFod( );

      if(Over( ))

       {system(“cls”);

        gtxy(W/2+1,H/2); printf(“游戏结束!T__T”);

        gtxy(W/2+1,H/2+2); printf(“玩家总分:%d分”,score);

        getch( );

        break;

       }

   }

   return 0;

}

void csh( )  //初始化界面

{ int i;

gtxy(0,0);

CONSOLE_CURSOR_INFO cursor_info={1,0};  //以下两行是隐藏光标的设置

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),cursor_info);

for(i=0;i=W;i=i+2)  //横坐标要为偶数,因为这个要打印的字符占2个位置

{ setColor(2, 0);  //设定打印颜色为绿字黑底

  gtxy(i,0);  printf("■");  //打印上边框

  gtxy(i,H); printf("■");  //打印下边框

}

for(i=1;iH;i++)

{ gtxy(0,i); printf("■");  //打印左边框

   gtxy(W,i); printf("■");  //打印右边框

}

while(1)

  { srand((unsigned)time(NULL));  //初始化随机数发生器srand( )

  fod.x=rand()%(W-4)+2;  //随机函数rand( )产生一个从0到比”(W-4)”小1的数再加2

  fod.y=rand()%(H-2)+1;  //随机函数rand( )产生一个从0到比”(H-2)”小1的数再加1

  if (fod.x%2==0) break;  //fod.x是食物的横坐标,要是2的倍数(为偶数)

}

setColor(12, 0);  //设定打印颜色为淡红字黑底

gtxy(fod.x,fod.y); printf("●");  //到食物坐标处打印初试食物

snk.len=3;      //蛇身长

snk.speed=350;  //刷新蛇的时间,即是移动速度

snk.x[0]=W/2+1;  //蛇头横坐标要为偶数(因为W/2=39)

snk.y[0]=H/2;    //蛇头纵坐标

setColor(9, 0);  //设定打印颜色为淡蓝字黑底

gtxy(snk.x[0], snk.y[0]);  printf("■");  //打印蛇头

for(i=1;isnk.len;i++)

    { snk.x[i]=snk.x[i-1]+2;  snk.y[i]=snk.y[i-1];

      gtxy(snk.x[i],snk.y[i]);  printf("■");  //打印蛇身

   }

setColor(7, 0);  //恢复默认的白字黑底

return;

}

void keymove( )  //按键操作移动蛇

{ int key;

if( kbhit( ) )    //如有按键输入才执行下面操作

   { key=getch( );

     if (key==224)  //值为224表示按下了方向键,下面要再次获取键值

       { key=getch( );

         if(key==72dir!=2)dir=1;  //72表示按下了向上方向键

         if(key==80dir!=1)dir=2;  //80为向下

         if(key==75dir!=4)dir=3;  //75为向左

         if(key==77dir!=3)dir=4;  //77为向右

       }

   if (key==32)

      { while(1) if((key=getch( ))==32) break; }  //32为空格键,这儿用来暂停

  }

if (Flag==0)  //如没吃食物,才执行下面操作擦掉蛇尾

  { gtxy(snk.x[snk.len-1],snk.y[snk.len-1]);  printf("  "); }

int i;

for (i = snk.len - 1; i 0; i--)  //从蛇尾起每节存储前一节坐标值(蛇头除外)

{ snk.x[i]=snk.x[i-1];  snk.y[i]=snk.y[i-1]; }

switch (dir)  //判断蛇头该往哪个方向移动,并获取最新坐标值

{ case 1: snk.y[0]--; break;   //dir=1要向上移动

  case 2: snk.y[0]++; break;  //dir=2要向下移动

  case 3: snk.x[0]-=2; break;  //dir=3要向左移动

  case 4: snk.x[0]+=2; break;  //dir=4要向右移动

}

setColor(9, 0);

gtxy(snk.x[0], snk.y[0]); printf("■");  //打印蛇头

if (snk.x[0] == fod.x snk.y[0] == fod.y)  //如吃到食物则执行以下操作

   { printf("\007"); snk.len++; score += 100; snk.speed -= 5; Flag = 1; } //007是响铃

else Flag = 0;   //没吃到食物Flag的值为0

if(snk.speed150) snk.speed= snk.speed+5;  //作弊码,不让速度无限加快

}

void putFod( )  //投放食物

{ if (Flag == 1)  //如吃到食物才执行以下操作,生成另一个食物

   { while (1)

  { int i,n= 1;

   srand((unsigned)time(NULL));  //初始化随机数发生器srand( )

   fod.x = rand( ) % (W - 4) + 2;  //产生在游戏框范围内的一个x坐标值

   fod.y = rand( ) % (H - 2) + 1;  //产生在游戏框范围内的一个y坐标值

   for (i = 0; i snk.len; i++)   //随机生成的食物不能在蛇的身体上

 { if (fod.x == snk.x[i] fod.y == snk.y[i]) { n= 0; break;} }

   if (n fod.x % 2 == 0) break;  //n不为0且横坐标为偶数,则食物坐标取值成功

  }

 setColor(12, 0);

      gtxy(fod.x, fod.y);  printf("●");   //光标到取得的坐标处打印食物

   }

return;

}

int Over( )  //判断游戏是否结束的函数

{ int  i;

setColor(7, 0);

gtxy(2,H+1); printf(“暂停键:space.”);  //以下打印一些其它信息

gtxy(2,H+2); printf(“游戏得分:%d”,score);

if (snk.x[0] == 0 || snk.x[0] == W) return 1;  //蛇头触碰左右边界

if (snk.y[0] == 0 || snk.y[0] == H) return 1;  //蛇头触碰上下边界

for (i = 1; i snk.len; i++)

{ if (snk.x[0] == snk.x[i] snk.y[0] == snk.y[i]) return 1; }  //蛇头触碰自身

return 0;   //没碰到边界及自身时就返回0

}

void setColor(unsigned short ForeColor = 7, unsigned short BackGroundColor = 0)

{  HANDLE  handle = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleTextAttribute( handle, ForeColor + BackGroundColor * 0x10 );

}   //用来设定颜色的函数

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

# include "Typer.h"

# include stdio.h

# include stdlib.h

# include graphics.h

//download by

void main()

{

BOOL bQuit=FALSE; /* 是否退出 */

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

int tm1,tm2;

BYTE Key;

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

SetGraphMode();

SelectLevel();

ShowBar();

tm1=CreateTimer(1,MoveLetter); /* 创建移动字符对象时钟 */

tm2=CreateTimer(Interval,CreateLetter); /* 创建产生字符对象时钟 */

CreateLetter();

Key=AscKey();

while (!bQuit)

{

TimerEvent();

switch (Key)

{

case NULL:

break;

case KEY_ESC:

bQuit=TRUE;

break;

case KEY_SPACE:

bPause=!bPause;

tmTM[tm1].Enable=!bPause;

tmTM[tm2].Enable=!bPause;

break;

default:

if (!bPause) Check(Key);

}

Key=AscKey();

}

CloseGraphMode();

}

void SetGraphMode()

{

int Device=VGA,Mode=VGAHI;

initgraph(Device,Mode,"");

settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);

setfillstyle(SOLID_FILL,0);

setcolor(7);

}

void CloseGraphMode()

{

restorecrtmode();

}

/* 从键盘缓冲区内直接读出ASC码 */

BYTE AscKey(void)

{

int start,end;

WORD key=0;

start=peek(0,0x41a);

end=peek(0,0x41c);

if (start==end) return(0);

else

{

key=peek(0x40,start);

start+=2;

if (start==0x3e) start=0x1e;

poke(0x40,0x1a,start);

return(key0xff);

}

}

void MoveLetter(void)

{

int i;

for (i=0;iMAX_LETTER;i++)

{

if (Letter[i].Used)

{

HideLetter(i);

Letter[i].y+=Step;

ShowLetter(i);

/* 字符对象下落到最底部 */

if (Letter[i].yMAX_HEIGHT) KillLetter(i);

}

}

}

void KillLetter(int LetterID)

{

if (Letter[LetterID].Used)

{

Letter[LetterID].Used=FALSE;

LetterUsed--;

HideLetter(LetterID);

}

/* 删除字符对象后马上再创建一个 */

CreateLetter();

}

void CreateLetter()

{

int i=0;

int x;

BYTE val;

if (LetterUsed==MAX_LETTER) return; /* 无字符对象可用则返回 */

while (Letter[++i].Used); /* 找到第一个空闲的字符对象,产生一个字符对象 */

x=i;

Letter[i].x=x*640/MAX_LETTER;

Letter[i].y=0;

Letter[i].val=random(26)+'A';

Letter[i].Used=TRUE;

LetterUsed++;

}

void HideLetter(int ID)

{

/* 用填充矩形来消隐字符 */

bar(Letter[ID].x,Letter[ID].y,Letter[ID].x+16,Letter[ID].y+20);

}

void ShowLetter(int ID)

{

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

str[0]=Letter[ID].val;

outtextxy(Letter[ID].x,Letter[ID].y,str);

}

void Check(BYTE Key)

{

int i;

char str[6];

Hits++;

for (i=0;iMAX_LETTER;i++)

/* 击中 */

if (Letter[i].UsedLetter[i].val==toupper(Key))

{

sound(1000);

delay(10);

KillLetter(i);

Right++;

nosound();

}

/* 显示状态 */

setfillstyle(SOLID_FILL,5);

bar(260,430,320,450);

bar(410,430,470,450);

setcolor(2);

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

outtextxy(260,430,str);

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

outtextxy(410,430,str);

setcolor(7);

setfillstyle(SOLID_FILL,0);

}

void ShowBar()

{

FILE *bmp;

BYTE r,g,b,t;

int i,x,y;

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

fseek(bmp,54,SEEK_SET);

for (i=0;i16;i++)

{

setpalette(i,i);

b=fgetc(bmp)2;

g=fgetc(bmp)2;

r=fgetc(bmp)2;

t=fgetc(bmp)2;

setrgbpalette(i,r,g,b);

}

for (y=0;y80;y++)

for (x=0;x320;x++)

{

t=fgetc(bmp);

putpixel(x*2,479-y,t4);

putpixel(x*2+1,479-y,t15);

}

fclose(bmp);

}

void SelectLevel()

{

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

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

int Sel=0;

FILE *bmp;

BYTE r,g,b,t,Key;

int i,x,y;

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

fseek(bmp,54,SEEK_SET);

for (i=0;i16;i++)

{

setpalette(i,i);

b=fgetc(bmp)2;

g=fgetc(bmp)2;

r=fgetc(bmp)2;

t=fgetc(bmp)2;

setrgbpalette(i,r,g,b);

}

for (y=0;y200;y++)

for (x=0;x160;x++)

{

t=fgetc(bmp);

putpixel(x*2+160,339-y,t4);

putpixel(x*2+161,339-y,t15);

}

fclose(bmp);

while (TRUE)

{

Key=toupper(AscKey());

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

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

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

if (Sel) break;

}

Step=Steps[Sel-1];

Interval=Intervals[Sel-1];

cleardevice();

}

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

/* 文件:TIMER.H */

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

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

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

# define MAXTIMER 10

# ifndef NULL

# define NULL 0

# endif

/* 计时器结构 */

struct TM

{

DWORD Interval; /* 间隔 */

DWORD LastTimer; /* 上次事件发生时间*/

BOOL Enable; /* 活动 */

BOOL Used; /* 可用 */

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

};

struct TM tmTM[MAXTIMER+1];

int TimerUsed=0;

/* 获取BIOS计数器数值 */

DWORD BiosTimer(void)

{

DWORD BIOSTIMER=0;

BIOSTIMER=peek(0x0,0x46e);

BIOSTIMER=8;

BIOSTIMER+=peek(0x0,0x46c);

return (BIOSTIMER);

}

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

void TimerEvent()

{

int i;

DWORD TimerDiff;

for (i=1;i=MAXTIMER;i++)

{

if (tmTM[i].UsedtmTM[i].Enable)

{

TimerDiff=BiosTimer()-tmTM[i].LastTimer;

if (tmTM[i].Interval=TimerDiff)

{

tmTM[i].Pointer();

tmTM[i].LastTimer=BiosTimer();

}

}

}

}

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

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

{

int i=0;

if (TimerUsed==MAXTIMER) return NULL;

while (tmTM[++i].Used);

tmTM[i].Pointer=Pointer;

tmTM[i].Interval=Interval;

tmTM[i].Enable=TRUE;

tmTM[i].Used=TRUE;

tmTM[i].LastTimer=BiosTimer();

TimerUsed++;

return i;

}

/* 删除一个时钟 */

void KillTimer(int *TimerID)

{

if (tmTM[*TimerID].Used)

{

TimerUsed--;

tmTM[*TimerID].Used=FALSE;

}

*TimerID=0;

}

/* 删除所有时钟 */

void KillAllTimer()

{

int i;

for (i=0;i=MAXTIMER;i++) tmTM[i].Used=FALSE;

TimerUsed=0;

}