本文目录一览:
- 1、用C语言编写一个简单的打字母游戏,给出基本思路及完整程序。
- 2、急求一份C语言打字游戏代码,要求单词从屏幕上方落下,打字正确字母变为绿色。
- 3、C语言简易文字冒险游戏源代码
- 4、求c语言打字游戏程序,要求如下:
- 5、怎样用C语言编写一个小游戏?
- 6、求纯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;
}