运行界面如图:
代码如下:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
#include<graphics.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
const int WIDTH = 640;/*界面宽度*/
const int HEIGHT = 500;/*界面高度*/
int right = 0;/*正确个数*/
int error = 0;/*错误个数*/
IMAGE picture;
/*下坠文字的结构体*/
struct TARGET
{
int x;
int y;
char* str;
}words[3];
/*用户输入的值*/
struct USRKEY
{
int x;
int y;
char str[20];
}userkey = {320,500-30,""};//用户指定位置输入
/*指定位置输出整数*/
void outtextxy_int(int x, int y,const char* format, int num)
{
char str[20] = "";
sprintf(str, format, num);
outtextxy(x, y, str);
}
/*指定位置输出浮点数*/
void outtextxy_double(int x, int y, const char* format, double num)
{
char str[20] = "";
sprintf(str, format, num);
outtextxy(x, y, str);
}
/*绘制界线*/
void divWindow()
{
line(WIDTH - 100, 0, WIDTH - 100, HEIGHT - 40);
line(0, HEIGHT - 40, WIDTH + 50, HEIGHT - 40);
line(WIDTH - 100, 130, WIDTH + 50, 130);
}
/*初始化随机性关键字*/
void initTarget(struct TARGET *words, int n)
{
static char str[32][10] =
{
"auto", "break", "case", "char", "const", "continue","default",
"do", "double", "else", "enum", "extern","float", "for", "goto",
"if", "int", "long","register", "return", "short", "signed", "sizeof",
"static","struct", "switch","typedef","union", "unsigned", "void",
"volatile", "while"
};
words[n].str = str[rand() % 32];
/*字符串时重新初始化*/
while (words[n].str == words[(n + 1) % 3].str || words[n].str == words[(n + 2) % 3].str)
{
words[n].str = str[rand() % 32];
}
words[n].x = rand() % (WIDTH - 200);
words[n].y = -20;
}
/*绘制菜单栏*/
void drawMenu()
{
settextcolor(LIGHTBLUE);
settextstyle(20, 0, "隶书");
outtextxy(WIDTH - 90, 25, "关键字练习");
outtextxy(WIDTH - 90, 50, "程序员专属");
outtextxy(WIDTH - 90, 75, "练习游戏");
outtextxy(WIDTH - 90, 225, "正确数");
outtextxy_int(WIDTH - 90, 250, "%d",right);
outtextxy(WIDTH - 90, 285, "错误数");
outtextxy_int(WIDTH - 90, 310, "%d", error);
outtextxy(WIDTH - 90, 345, "正确率");
//除数不为0 分类讨论
if (right + error == 0)
{
outtextxy_double(WIDTH - 90, 370, "%.2lf%%", 0.00);
}
else
{
double sum = right + error;
outtextxy_double(WIDTH - 90, 370, "%.2lf%%", right/sum*100);
}
}
/*字符串处理*/
void strDispose()
{
//碰线 处理
for (int n = 0; n < 3; n++)
{
words[n].y += 5;
if (words[n].y > (HEIGHT - 40 - textheight(words[n].str)))
{
initTarget(words, n);
}
}
//打印字符串
for (int n = 0; n < 3; n++)
{
settextcolor(RGB(75, 213, 213));
outtextxy(words[n].x, words[n].y, words[n].str);
}
}
/*装载资源*/
void loadResourse()
{
srand(time(NULL));//播种种子
initgraph(WIDTH + 50, HEIGHT);//初始化图形
loadimage(&picture, "1.jpg", 690, 500);//装载背景图
setbkmode(TRANSPARENT);//设置图案背景色透明
mciSendString("open 1.mp3", 0, 0, 0);//打开音乐
mciSendString("play 1.mp3 repeat",0,0,0);
/*初始 随机 字符串*/
for (int n = 0; n < 3; n++)
{
initTarget(words, n);
words[n].y = -15 - n * 30;
}
}
int main()
{
int i = 0;
loadResourse();//装载资源
BeginBatchDraw();
while (1)
{
cleardevice();
putimage(0, 0, &picture);
divWindow();//绘制界线
drawMenu();//绘制菜单栏
strDispose();//字符串处理
/*用户输入*/
if (_kbhit())
{
char target;
if ((target = _getch()) != '\r')
{
userkey.str[i++] = target;
}
else
{
int flagError = 0;
for (i = 0; i < 3; i++)
{
if (strcmp(userkey.str, words[i].str) == 0)
{
initTarget(words, i);
right++;
flagError = 1;
}
}
if (flagError == 0)
{
error++;
}
i = 0;
userkey.x = 320;
memset(userkey.str, 0, 20);
}
}
outtextxy(userkey.x, userkey.y, userkey.str);
FlushBatchDraw();
Sleep(50);
}
getchar();
closegraph();
return 0;
}
源代码资源链接:https://pan.baidu.com/s/1VaR1rzgxbq56mIjOHC9DeQ
提取码:z4wc