当前位置:文档之家› C语言程序设计编写的打字母游戏

C语言程序设计编写的打字母游戏

#include
#include
#include //画图头文件
#include //时间头文件

#pragma comment(lib, "Winmm.lib") //引用 Windows Multimedia API(Application Programming Interface)

int score = 0; //全局变量********整型的分数
char s[5]; //全局变量*****字符型的分数

struct player_ //自定义的结构体,并顺便定义一个结构体变量
{
char name[20];
int score_;
}player[11];

/*******************函数声明***************************/
void record_(); //记录本次成绩函数
void welcome(); //欢迎界面函数
void instructions(); //游戏说明界面函数
void game(int rank2); //游戏函数
void record(); //显示记录函数
int rank_(char rank1); //等级选择函数
void goodbye(); //退出界面函数

/**********主函数******************************/
int main()
{
char rank1; //rank1接受从键盘输入的字符,根据字符判断等级
int rank2 = 15; //控制延时时间,从控制速度
int sign = 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)
//消息框含有两个按钮:Yes和No**********问题标记图标出现在消息框
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; i<10;i++)
{
fread(player[i].name,20,1,fp); //读入记录中的成绩和姓名
fread(&player[i].score_,4,1,fp);
}
fclose(fp); //关闭二进制文件


for(j = 0; j<10; j++) //冒泡法排序
for(i = 0; i<10-j; i++)
if(player[i].score_ < player[i+1].score_)
{
t = player[i];
player[i] = player[i+1];
player[i+1] = t;
}
fp = fopen("记录.dat","wb"); //打开文件
for(i = 0; i < 10; i++) //把排好序列的数据存入记录文件
{ fwrite(player[i].name,20,1,fp);
fwrite(&player[i].score_,4,1,fp);
}
fclose(fp); //关闭文件
}


/******************欢迎界面函数***************************/
void welcome()
{
char ch;
mciSendString("open \"res\\Sleep Away.mp3\" alias mymusic", NULL, 0, NULL); //载入音乐 转化为
mciSendString(_T("play mymusic repeat"), NULL, 0, NULL); //播放音乐
//指向接收返回信息的缓冲区,为NULL时不返回信息 缓冲区的大小 指定一个回调窗口的句柄,一般为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()) //kbhit()作用是判断是否有字母输入
{
setcolor(RGB(c, 255, 0)); //设置颜色
setfont(80, 0, "楷体"); //设置字体
outtextxy(140, 130, "请选择等级"); //输出文字
setcolor(RGB(c, 0, 255)); //设置颜色
setfont(100, 0, "Wickenden Cafe NDP"); //设置字体
outtextxy(100, 335, "let's go ! ! !"); //输出文字
c -= 25; //控制颜色的变量自减
if (c < 0) c = 255; //控制颜色的变量小于0时,再把255赋给c
Sleep(20); //延时20毫秒
}
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())
{
setco

lor(RGB(255, 0, c-100)); //设置颜色
setfont(100, 0, "Wickenden Cafe NDP"); //设置字体
outtextxy(400, 90, s); //输出数字
setcolor(RGB(c, 0, 255)); //设置颜色
setfont(48, 0, "黑体"); //设置字体
if(score == 200)
outtextxy(100, 200, "全部击中!!"); //输出文字
else
if(score>190)
outtextxy(100, 200, "不错!继续加油!"); //输出文字
else
outtextxy(100, 200, "不要灰心!继续加油!"); //输出文字
c -= 25; //控制变色的变量自减实现变色
if (c < 0)
c = 255; //控制颜色的变量小于0时,再把255赋给c
Sleep(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 * fp; //文件指针
int a[10], j;
char b[10][10];
fp = fopen("记录.dat","rb"); //打开文件
for(j=0; j<10;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; j<10; 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; // 用户的按键
int x, 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,44

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

while(flag&&num)
{
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; y<380; 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--; //计数
}
}

相关主题
文本预览
相关文档 最新文档