#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>//想一想如何在这上边加入报错机制以及正确率显示
#include<iostream>
#include<windows.h>//如何一个字符一个字符的进行打印,已经实现了,通过一个一个的循环加上sleep函数以达成目的
#include<stdlib.h>
#include<conio.h>//这个是_kbhit和_getch用的头文件
#include <ctime>
using namespace std;
int main() {
const int ESCKEY = 27;
int pos, maxpos = 36;//maxpos这玩意和sleep共同决定了一次循环中的时间
int win = 0, loss = 0;
printf("这是一个打字游戏,游玩过程中可以按esc键退出程序");
getchar();//缓冲?
int key = 0, ch = 0;
srand((unsigned int)time(NULL));//设置一个根据时间决定的随机数种子,得把这玩意记住
while (key != ESCKEY)
{
ch = rand() % ('z' + 1 - 'a') + 'a'; //产生随机字符,记住
for (pos = 0; pos < maxpos && key != ESCKEY; pos++) {
cout << "\b--" << char(ch);//\b的意思是把光标往前一位,确保——输出在了字母的前方
pos++;
Sleep(200);
if (_kbhit() && (key = _getch()) == ch) {//kbhhit和getch已经被废用了,现在要写成这种形式_kbhit和相应的
win++;//kbhit的意思是如果有输入的话为true,没有就返回零,getch好理解
cout << "*\a";//输出*并有彩铃提示
break;
}
}
if (key == ESCKEY) {
cout << "\n要结束游戏吗?(y/n)";
while ((key = tolower(getchar())) != 'y' && ch != 'n')
; //空循环体,在大多数情况下,它的作用就是在程序中设置一次暂停。前面的例子将使程序”暂停”一段时间
//而while(1)这样的就是无限循环体,意义明确
key = (key == 'y' ? ESCKEY : 0); //?的意思是如果输入的key为'y'则输出ESCKEY,用于控制主循环,不为y的话则输出冒号后边的0
}
if (pos >= maxpos) {
loss++;
}
cout << endl;
}
cout << "打字练习的数量:" << win + loss << "正确的数量:" << win;
cout << "感谢您的游玩";
return 0;
}