C语言的打字小游戏

news2024/11/17 15:40:08

目录

游戏内容

伪代码

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.coloradmin.cn/o/1676220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML常用标签-布局相关标签

布局标签 div标签 俗称"块",主要用于划分页面结构,做页面布局 自己独占一行的元素&#xff0c;设置宽高生效 span标签 俗称"层",主要用于划分元素范围,配合CSS做页面元素样式的修饰 不会自己独占一行的元素&#xff0c;设置宽高不生效 代码 <div style&…

数据库SQL编写规范-SQL书写规范整理(SQL语句书写规范全解-Word原件)

编写本文档的目的是保证在开发过程中产出高效、格式统一、易阅读、易维护的SQL代码。 1 编写目 2 SQL书写规范 3 SQL编写原则 软件全套精华资料包清单部分文件列表&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说…

如何使用AzurEnum快速枚举Microsoft Entra ID(Azure AD)

AzurEnum是一款针对Azure的安全工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以轻松快速地枚举Microsoft Entra ID&#xff08;Azure AD&#xff09;。 该工具基于纯Python 3开发&#xff0c;可以在Windows和Linux系统上运行&#xff0c;但考虑到性能和稳定性&a…

iOS——runtime

什么是runtime 我们都知道&#xff0c;将源代码转换为可执行的程序&#xff0c;通常要经过三个步骤&#xff1a;编译、链接、运行。 C 语言 作为一门静态类语言&#xff0c;在编译阶段就已经确定了所有变量的数据类型&#xff0c;同时也确定好了要调用的函数&#xff0c;以及函…

数据库的存储过程、函数与触发器

使用下面的场景来引入 1.创建表 CREATE DATABASE staff; USE staff; CREATE TABLE employee(id INT NOT NULL AUTO_INCREMENT,userName VARCHAR(255),birthDate DATE,idCard VARCHAR(255),loginName VARCHAR(255),PASSWORD VARCHAR(255),mobile VARCHAR(255),email VARCHAR(2…

【综述】人工智能、机器学习、深度学习

文章目录 前言 概念 算法 训练 性能 应用 参考资料 前言 见《初试人工智能》 概念 人工智能系统&#xff08;artifieial intelligence system&#xff09;&#xff0c;针对人类定义的给定目标&#xff0c;产生诸如内容、预测、推荐或决策等输出的一类工程系统。该工程系…

MPEG-4 AVC/H.264高清编码器 JR3211P

概述 JR3211P MPEG-4 AVC/H.264高清编码器是一款专业的高清音/视频编码产品。该产品支持几乎所有模拟及数字音/视频输入接口&#xff0c;包括CVBS、YPbPr、S-video、SD/HD-SDI、HDMI视频输入接口、平衡模拟音频&#xff08;XLR&#xff09;、非平衡模拟音频&#xff08;RCA&am…

Qwen-VL环境搭建推理测试

引子 这几天阿里的Qwen2.5大模型在大模型圈引起了轰动&#xff0c;号称地表最强中文大模型。前面几篇也写了QWen的微调等&#xff0c;视觉语言模型也写了一篇CogVLM&#xff0c;感兴趣的小伙伴可以移步Qwen1.5微调-CSDN博客。前面也写过一篇智谱AI的视觉大模型&#xff08;Cog…

计算礼品发放的最小分组数目 - 贪心思维

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 本人最近再练习算法&#xff0c;所以会发布自己的解题思路&#xff0c;希望大家多指教 一、题目描述 又到了一年的末尾&#xff0c;项目组让小明负责为使得参加晚…

信创项目推进步骤

信创项目推进步骤 文章目录 信创项目推进步骤1. 制定信创替代计划2. 选择合适的信创产品3. 进行试点验证4. 全面部署和替换5. 加强网络安全建设6. 培训和技术支持7. 持续监督和评估 1. 制定信创替代计划 需要对现有的信息化硬件设备进行全面的梳理和评估&#xff0c;确定哪些设…

Properties配置文件和源码

先对测试类进行get方法复写得到getReqType 判断caseinfo等于get时&#xff0c;就是get请求&#xff0c;反之就不是 这里的url和param都是xxx代替&#xff0c;如果直接写内容&#xff0c;每次都会请求 三目运算优化 为什么要用配置文件 test里时url,可以将ip和端口写在配置文…

openlayer实现ImageStatic扩展支持平铺Wrapx

地图平铺&#xff08;Tiling&#xff09;是地图服务中常见的技术&#xff0c;用于将大尺寸的地图数据分割成许多小块&#xff08;瓦片&#xff09;&#xff0c;便于高效加载和展示。这种技术特别适用于网络环境&#xff0c;因为它允许浏览器只加载当前视图窗口内所需的地图瓦片…

【时隙ALOHA,CSMA(载波侦听多路访问)carrier sense mltiple access,无线局域网: CSMA/CA】

文章目录 时隙ALOHA时隙ALOHA的效率( Efficiency )纯ALOHA(非时隙)----效率低CSMA(载波侦听多路访问)carrier sense mltiple accessCSMA冲突CSMA/CD(冲突检测)边说边听&#xff08;提高了信道利用率&#xff09;以太网就是用的这个无线局域网: CSMA/CA无线局域网中的 MAC&#…

人工智能与机器学习的演进:重塑IT行业的未来

目录 前言一、人工智能与机器学习的最新发展1、算法和硬件的进步2、AI & ML的民主化 二、AI & ML在自动化中的应用1、工业与服务业自动化1.1 实践方式1.2 伪代码样例 2、软件开发与运维自动化2.1实践方式2.2伪代码样例 三、AI & ML在个性化服务中的应用1、推荐系统…

【C++】每日一题 17 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 可以使用回溯法来解决这个问题。首先定义一个映射关系将数字与字母对应起来…

tarjan学习

1.割点&#xff08;必须经过&#xff09;&#xff1a;当时&#xff0c;y是一个割点&#xff0c;x是y的一个子节点&#xff0c;当没有点x时&#xff0c;y无法访问其他点 2.割边&#xff08;必须经过&#xff09;&#xff1a;当时&#xff0c;y不经过这条边无法到达x&#xff0c…

算法-卡尔曼滤波之卡尔曼滤波的第二个方程:预测方程(状态外推方程)

在上一节中&#xff0c;使用了静态模型&#xff0c;我们推导出了卡尔曼滤波的状态更新方程&#xff0c;但是在实际情况下&#xff0c;系统都是动态&#xff0c;预测阶段&#xff0c;前后时刻的状态是改变的&#xff0c;此时我们引入预测方程&#xff0c;也叫状态外推方程&#…

月入8.5k,计算机应届生转行网优,就业难,不妨另辟蹊径!

随着2024年毕业生人数的预计达到惊人的1179万&#xff0c;就业市场的竞争愈发激烈。作为即将踏入社会的毕业生&#xff0c;如何做好准备&#xff0c;减轻自己的就业压力&#xff0c;成为了摆在我们面前的一大难题。 今天主人公是一位刚毕业的22岁大学生小L&#xff0c;河南郑州…

如何轻松获得稳定的静态IP?

在当今互联网时代&#xff0c;静态IP地址对于许多领域至关重要。无论是个人用户还是企业&#xff0c;拥有一个稳定的静态IP地址都能够提供诸多便利。静态IP地址与动态IP地址相比&#xff0c;具有不变性和可追溯性&#xff0c;适用于需要长期稳定通信和追踪的场景。了解静态IP的…

《控制系统实验与综合设计》计控第三次(含程序和题目)

实验七 采样控制系统的分析 一、实验完成任务 1、熟悉用 LF398 组成的采样控制系统&#xff1b; 2、通过本实验理解采样定理和零阶保持器的原理及其实现方法&#xff1b; 3、观察系统在阶跃作用下的稳态误差。 4.、研究开环增益 K 和采样周期 T 的变化对系统动态性能的影响…