目录
游戏内容
伪代码
main 函数
随机字符串
匹配逻辑
用户决定是否继续或退出游戏
完整代码
从0开始记录我的学习历程,我会尽我所能,写出最最大白话的文章,希望能够帮到你,谢谢。
提示:文章作者为初学者,有问题请评论指正,感谢。
游戏内容
今天的话是讲解一个打字的小游戏这是它的内容喽,可以想一下要做到这个内容我们可能会用到哪些代码。
-
显示欢迎信息:
- 程序首先清空屏幕并显示一些欢迎和鼓励的信息,提示用户按任意键开始测试。
-
开始游戏:
- 用户按下任意键后,程序开始生成一个随机的50个小写字母组成的字符串。
- 这个字符串显示在屏幕上,用户的任务是尽可能快且准确地输入这个字符串。
-
输入测试:
- 用户开始输入字符,每输入一个字符,程序就会检查它是否与随机字符串中相应位置的字符匹配。
- 如果匹配,输入的字符会显示在屏幕上;如果不匹配,屏幕上会显示一个下划线
_
。
-
计分和时间:
- 程序会计算用户正确输入的字符数量,并在用户完成输入后显示出来。
- 同时,程序也会计算用户完成输入所用的总时间,并显示出来。
-
重复或退出:
- 用户可以选择按空格键重新开始游戏,或者按
Esc
键退出游戏。
- 用户可以选择按空格键重新开始游戏,或者按
伪代码
现在我们已经知道这个游戏的具体内容和流程了,下面我们就需要对各个模块进行拆分,然后编写伪代码。
函数 help()
清屏
显示欢迎信息和指导
主函数 main()
初始化变量
进入无限循环
调用 help() 函数
等待用户按键开始
如果是第一次按键,记录开始时间
生成一个随机的50个字符的字符串
显示字符串给用户
重置正确输入的计数器
对于字符串中的每个字符
等待用户输入
如果输入正确
增加计数器
显示输入的字符
否则
显示下划线
记录结束时间
显示用户的正确输入数量
显示用户用时
等待用户按空格键继续或Esc键退出
好的现在我们已经把伪代码给搞定了,下面我们根据这个伪代码来写代码喽。
首先,我们从定义 help
函数开始,这个函数负责显示游戏的欢迎信息和指导。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
// 显示游戏指南的函数
void help() {
system("cls"); // 清屏
printf("****************************************\n");
printf("* 喊你打字看看你有多牛逼! *\n");
printf("* 牛逼! *\n");
printf("* 按任意键开始测试,看看自己有多牛逼 *\n");
printf("***************************************\n\n");
}
好的,我相信这串代码大家都能搞定,需要注意啥呢,主要就是这个清屏的system("cls");这个玩意,他需要一个头文件#include <stdlib.h>不然没有头文件的话函数将无法被识别和使用,也是恼火是不是。
main
函数
接下来,我们将编写 main
函数的框架,这是程序的入口点。我们会在这个框架中添加游戏的主要逻辑。
int main() {
// 初始化变量
char ch;
char str[51] = "";
int count = 0;
int i = 0;
time_t start_time, end_time;
while (1) { // 无限循环,直到用户决定退出
help(); // 显示游戏指南
ch = _getch(); // 等待用户按键开始
// 游戏的其他逻辑将在这里实现
}
return 0; // 程序正常退出
}
stdio.h
:标准输入输出头文件。它提供了输入输出函数,如printf
和scanf
。在这个游戏中,printf
用于显示信息到控制台。
stdlib.h
:标准库头文件。它提供了各种通用函数,如malloc
、free
和system
。在这个游戏中,system("cls")
用于清屏,这个函数就是由stdlib.h
提供的。
time.h
:时间库头文件。它提供了处理日期和时间的函数,如time
。在这个游戏中,time
函数用于计算用户打字的开始和结束时间,以此来计算总用时。
conio.h
:控制台输入输出头文件。它是一个非标准的头文件,主要用于MS-DOS和Windows环境。它提供了_getch
函数,用于读取用户的按键输入,而不会在控制台上显示这些字符。在这个游戏中,_getch
用于获取用户的输入,同时不回显输入的字符。char ch;
:这是一个字符变量,用于存储用户从键盘输入的单个字符。char str[51] = "";
:这是一个字符数组,能够存储最多50个字符的字符串(加上一个空字符'\0'
来表示字符串的结束)。它被初始化为空字符串,用于后续存储随机生成的字符串。int count = 0;
:这是一个整型变量,用于计数用户正确输入的字符数量。它被初始化为0。int i = 0;
:这是一个整型变量,通常用作循环的计数器。在这里,它被初始化为0,用于后续的循环中。(这个后面写到了具体的往前面补一个就好了)time_t start_time, end_time;
:这两个变量是time_t
类型,用于存储时间信息。start_time
用于记录游戏开始的时间,而end_time
用于记录游戏结束的时间。这样可以计算出用户完成游戏所需的总时间。
随机字符串
现在,我们将在 main
函数中添加生成随机字符串的逻辑。这个字符串将由用户尝试输入。
// ...之前的代码
int main() {
// ...之前的变量初始化
while (1) {
help();
ch = _getch();
if (i == 0) {
start_time = time(NULL); // 记录开始时间
}
srand(time(NULL)); // 设置随机种子
for (i = 0; i < 50; i++) {
str[i] = rand() % 26 + 'a'; // 生成随机字符串
}
str[50] = '\0'; // 确保字符串以空字符结尾
printf("%s\n", str); // 显示字符串给用户
// 用户输入的匹配逻辑将在这里实现
}
// ...之后的代码
}
while (1) { ... }
:这是一个无限循环,意味着下面的代码会不断重复执行,直到程序被外部方式(如用户按下退出键)终止。
help();
:调用help
函数,该函数会清屏并显示游戏一开始的打印内容。
ch = _getch();
:使用_getch
函数从用户那里获取一个按键输入,但不会在控制台上显示这个字符。
if (i == 0) { start_time = time(NULL); }
:如果i
等于0(意味着这是第一次通过循环),则记录当前时间作为游戏开始的时间。
srand(time(NULL));
:设置随机数生成器的种子。这里使用当前时间作为种子,以确保每次运行游戏时生成的随机字符串都不同。
for (i = 0; i < 50; i++) { str[i] = rand() % 26 + 'a'; }
:这是一个for
循环,用于生成一个随机的50个小写字母组成的字符串。rand() % 26
生成一个0到25的随机数,然后加上'a'
(ASCII码中的小写字母a)得到一个随机的小写字母。
str[50] = '\0';
:在字符串的末尾添加空字符'\0'
,这是C语言中表示字符串结束的标准方式。
printf("%s\n", str);
:将生成的随机字符串打印到控制台上,供用户查看并输入。
匹配逻辑
接下来,我们添加用户输入的匹配逻辑,并计算正确输入的字符数。
// ...之前的代码
int main() {
// ...之前的代码
while (1) {
// ...之前的代码
count = 0; // 重置正确输入的计数器
for (i = 0; i < 50; i++) {
ch = _getch(); // 等待用户输入
if (ch == str[i]) {
count++; // 如果输入正确,增加计数器
printf("%c", ch); // 显示输入的字符
} else {
printf("_"); // 否则,显示下划线
}
}
end_time = time(NULL); // 记录结束时间
printf("\ncount=%d\n", count); // 显示用户的正确输入数量
printf("用时%ld秒 \n", (long int)end_time - start_time); // 显示用户用时
// 等待用户按空格键继续或Esc键退出的逻辑将在这里实现
}
// ...之后的代码
}
count = 0;
:在每轮游戏开始前,将正确输入的字符计数器重置为0。
for (i = 0; i < 50; i++) { ... }
:这是一个循环,用于逐个读取用户的输入,并与预先生成的随机字符串中的字符进行比较。
ch = _getch();
:使用_getch
函数从用户那里获取一个按键输入,但不会在控制台上显示这个字符。这通常用于读取用户的打字输入。
if (ch == str[i]) { ... } else { ... }
:这是一个条件语句,用于检查用户输入的字符是否与随机字符串中相应位置的字符匹配。
如果输入正确(
ch == str[i]
),则:
count++;
:计数器增加1。printf("%c", ch);
:在控制台上显示用户输入的字符。如果输入不正确,则:
printf("_");
:在控制台上显示一个下划线,表示输入错误的位置。
end_time = time(NULL);
:在用户完成50个字符的输入后,记录当前时间作为结束时间。
printf("\ncount=%d\n", count);
:显示用户在这一轮游戏中正确输入的字符数量。
printf("用时%ld秒 \n", (long int)end_time - start_time);
:计算并显示用户完成游戏所用的总时间,即结束时间减去开始时间。
// 等待用户按空格键继续或Esc键退出的逻辑将在这里实现
:这是一个注释,表明接下来应该实现等待用户决定是否继续游戏或退出游戏的逻辑,但在这段代码中尚未实现。
用户决定是否继续或退出游戏
最后,我们添加等待用户决定是否继续或退出游戏的逻辑。
// ...之前的代码
int main() {
// ...之前的代码
while (1) {
// ...之前的代码
while (1) {
ch = _getch(); // 等待用户决定
if (ch == ' ') {
break; // 如果按空格键,重新开始游戏
}
if (ch == 27) {
return 0; // 如果按Esc键,退出游戏
}
}
}
return 0;
}
while (1) { ... }
:这是一个嵌套的无限循环,它确保程序在用户没有明确选择退出之前会一直运行。
ch = _getch();
:这个函数调用等待用户输入一个字符,但不会在控制台上显示。它用于读取用户的按键动作。
if (ch == ' ') { break; }
:如果用户按下空格键(ASCII码为32),内层的while
循环会通过break
语句终止。这意味着游戏将重新开始,因为外层的while
循环会再次执行。
if (ch == 27) { return 0; }
:如果用户按下Esc
键(ASCII码为27),main
函数会通过return 0;
语句结束,程序将退出。
完整代码
ok 搞完这些就可以完结撒花了🌸🌸🌸最后附上完整代码。
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#include<corecrt.h>
void help()
{
system("cls");
printf("***************************************\n");
printf("*看到这里的你真牛逼! *\n");
printf("*牛逼! *\n");
printf("*按任意键开始测试,看看自己有多牛逼 *\n");
printf("***************************************\n\n");
}
int main()
{
char ch;
char str[51] = "";
int count = 0;
int i = 0;
time_t start_time, end_time;
while (1)
{
help();
ch = _getch();
if (i == 0)
{
start_time = time(NULL);
}
srand(time(NULL));
for (i = 0; i < 50; i++)
{
str[i] = rand() % 26 + 'a';
}
str[50] = '\0';
printf("%s\n", str);
count = 0;
for (i = 0; i < 50; i++)
{
ch = _getch();
if (ch == str[i])
{
count++;
printf("%c", ch);
}
else
{
printf("_");
}
}
end_time = time(NULL);
printf("\ncount=%d\n", count);
printf("用时%ld秒 \n", (long int)end_time - start_time);
while (1)
{
ch = _getch();
if (ch == ' ')
{
break;
}
if (ch == 27)
{
return 0;
}
}
}
return 0;
}
运行图:
总结
以上就是今天要讲的内容,本文仅仅简单介绍了C语言写的一个控制台打字小游戏,祝愿你我的朋友在学习的路上一帆风顺,也祝愿我会成为一个优秀的嵌入式工程师。