C语言的打字小游戏

ops/2024/11/14 13:09:37/

目录

游戏内容

伪代码

main 函数

随机字符串 

 匹配逻辑

 用户决定是否继续或退出游戏

 完整代码


从0开始记录我的学习历程,我会尽我所能,写出最最大白话的文章,希望能够帮到你,谢谢。


提示:文章作者为初学者,有问题请评论指正,感谢。

游戏内容

今天的话是讲解一个打字的小游戏这是它的内容喽,可以想一下要做到这个内容我们可能会用到哪些代码。

  1. 显示欢迎信息

    • 程序首先清空屏幕并显示一些欢迎和鼓励的信息,提示用户按任意键开始测试。
  2. 开始游戏

    • 用户按下任意键后,程序开始生成一个随机的50个小写字母组成的字符串。
    • 这个字符串显示在屏幕上,用户的任务是尽可能快且准确地输入这个字符串。
  3. 输入测试

    • 用户开始输入字符,每输入一个字符,程序就会检查它是否与随机字符串中相应位置的字符匹配。
    • 如果匹配,输入的字符会显示在屏幕上;如果不匹配,屏幕上会显示一个下划线 _
  4. 计分和时间

    • 程序会计算用户正确输入的字符数量,并在用户完成输入后显示出来。
    • 同时,程序也会计算用户完成输入所用的总时间,并显示出来。
  5. 重复或退出

    • 用户可以选择按空格键重新开始游戏,或者按 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:标准库头文件。它提供了各种通用函数,如 mallocfree 和 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语言写的一个控制台打字小游戏,祝愿你我的朋友在学习的路上一帆风顺,也祝愿我会成为一个优秀的嵌入式工程师。 


http://www.ppmy.cn/ops/40023.html

相关文章

数据结构(链表)

文章目录 1.单链表1.基本介绍1.定义2.逻辑结构 2.应用实例1.需求分析2.思路分析3.完成添加和显示链表信息&#xff0c;直接添加到链表的尾部4.根据排名添加&#xff0c;如果排名重复则给出提示5.根据新节点的编号来修改信息6.删除指定id的节点 3.单链表面试题1.题目2.面试题一2…

docker安装部署FastGPT

一&#xff1a;FastGPT介绍 FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01; 官网地址&#xff1a;https://fastgpt.in/zh …

【java】java面试题与题解

1.下列代码的输出是什么 public static void main(String[] args) {int a;a 6;System.out.print(a);System.out.print(a);System.out.print(a); } 答案&#xff1a;667 解析&#xff1a;a运算首先将a进行对应操作(即输出)&#xff0c;然后将a的值1。所以输出仍为6&#xff…

【AI】人工智能的应用及挑战

AI是人工智能&#xff08;Artificial Intelligence&#xff09;的缩写&#xff0c;它是一种模拟人类智能的技术和系统&#xff0c;旨在使计算机能够模仿人类的思维、学习、推理、理解自然语言&#xff0c;并能执行各种任务。AI利用大数据、机器学习、模式识别、自然语言处理等技…

linux性能监控之sar

1.sar命令介绍 sar是一个非常全面的分析工具&#xff0c;可以对文件的读写&#xff0c;系统调用的使用情况&#xff0c;磁盘IO&#xff0c;CPU相关使用情况&#xff0c;内存使用情况&#xff0c;进程活动等都可以进行有效的分析。 sar工具将对系统当前的状态进行取样&am…

map 和 set 的介绍和简单使用

目录 1. 序列式容器和关联式容器 2. 键值对 2.1. make_pair 3. 树形结构的关联式容器 3.1. set (Key 模型) 3.1.1. std::set::find 和 std::set::count 3.2. map (Key-Value 模型) 3.2.1. std::map::insert 3.2.2. std::map::operator[] 3.3. multiset 3.4.1. std::…

设计模式:迭代器模式

迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为设计模式&#xff0c;它提供了一种方法来顺序访问集合对象中的元素&#xff0c;而不需要了解集合的底层表示。迭代器模式将集合的遍历操作&#xff08;即对元素的访问和遍历逻辑&#xff09;从集合对象本身分离出…

docker(二):Centos安装docker

文章目录 1、安装docker2、启动docker3、验证 官方文档&#xff1a;https://docs.docker.com/engine/install/centos/ 1、安装docker 下载依赖包 yum -y install gcc yum -y install gcc-c yum install -y yum-utils设置仓库 yum-config-manager --add-repo http://mirrors…