//包含头文件
#include
#include
#include
#include
#pragma warning(disable:4996)
//全局变量
char g_ch;//屏幕上出现的字符
int g_row, g_col;//行和列的坐标
int correct, error;//输入正确的和错误的字符的数量
int redraw = 0;//是否要重写信息,计算正确率
int running = 1;//运行状态
int pause = 0;//是否暂停状态,1是 2否
HANDLE hout;
//产生一个新的字符,并设置其出现的位置
void GetRandomChar()
{
g_ch = rand() % 26 + 'a';//能够得到从a到z之间的一个随机字符
g_row = 0;//出现在最上面的一行
g_col = rand() % 80;//横坐标的位置随机
}
//线程处理函数
DWORD CALLBACK Proc(LPVOID lpParam)
{
int r, c;
COORD pos = { 0, 0 };//坐标,初始为0,0,表示左上角位置
while (running)
{
if (pause)
continue;
SetConsoleCursorPosition(hout, pos);//把控制台光标位置定位到左上角00的位置
for (r = 0; r < 12; ++r)//共12行
{
for (c = 0; c < 80; ++c)//共80列
{
if (r == 10)//第11行
{
printf("-");
}
else if (r == 11)//第12行
{
if (redraw)
{
printf(" 正确:%d 错误:%d 正确率:%6.2lf%%", correct, error,
(double)correct / (correct + error) * 100);
redraw = 0;
}
}
else if (r == g_row && c == g_col)
{
printf("%c", g_ch);
}
else
{
printf(" ");
}
}
}
if (g_row++ == 10)
{
++error;//错误的数量加1
GetRandomChar();// 重新产生字符
redraw = 1;//需要重新计算正确率
}
Sleep(300);
}
return 0;
}
int main()
{
int ch;//保存用户输入的按键
HANDLE hThread;//线程的句柄
system("color E0");
hout = GetStdHandle(STD_OUTPUT_HANDLE);
GetRandomChar();
//创建一个线程
hThread = CreateThread(NULL, 0, Proc, NULL, 0, NULL);
while (running)
{
if (ch = getch())
{
if (ch == 27)//按下了键盘上的ESC键
{
running = 0;
}
else if (ch == 13)//按下了键盘上的回车键
{
pause = !pause;
}
else if (ch == g_ch)
{
if (pause == 0)
{
//输入了正确的字符
++correct;//正确的数量加1
GetRandomChar();
redraw = 1;//需要重新计算正确率
}
}
else
{
if (pause == 0)
{
//输入了不正确的字符
++error; //错误数量加1
redraw = 1;//需要重新计算正确率
}
}
}
}
return 0;
}