![e37e72562a7a80d3a7c07d9b46e3d34f.png](https://i-blog.csdnimg.cn/blog_migrate/0fc190630af0bffb5c16321ab4605f37.jpeg)
一、打字游戏的框架
大循环(已知循环条件的)
1.游戏规则
2.按下任意键打印随机的字符串
按下键盘(获取键盘输入)
生成随机的字符串 20个长度
循环的生成一个随机数
打印字符串
3.按照对应的随机字符串进行输入
获取键盘的输入
如果正确就原样输出、并且++
如果错误就打印_
当第一次按下的时候我们计时
4.输入完成后会打印用时、正确率
再次记录结束时间,用时 = 结束时间-开始时间
正确率 = 正确的个数/总个数*100%
5.按下esc退出、按下空格键继续
开发思维:
写中文---非常详细的中文
二、涉及到的C语言知识
1.数据类型:
基本数据类型
构造数据类型
2.数组
3.结构体(链表上用)
4.指针
5.标准的库#include <> " "
stdio.h stdlib.h string.h sys类的
6.格式化输入输出
%s、%d、%u、%c、%p
7.函数(功能代码块)
函数的定义、函数的声明、函数的调用
函数的定义:函数的实现过程
int haha(void)
{
printf("hahahahahan");
return 0;//因为上面写的int,所以才返回0(整数)
}
函数的调用:就是函数的使用
1.函数名称+();表示函数的调用
2.看函数的参数,如果有参数就必须按照参数的个数和数据类型进传参
如果没有就算了
3.看函数的返回值:如果有返回值
int main()
{
int a = haha();//使用一个相同数据类型的变量接返回值
int b = haha() + haha();//直接使用
haha();//不使用
}
8.程序结构
顺序结构
循环结构
选择判断结构
9.文件操作
10.链表
11.其他:
枚举、宏定义........
三、打字游戏的开发(云开发)
需要在当前的环境中去新建一个文件,然后进行开发,写好代码之后上传到云
编译运行,看效果
注意:每次修改代码都需要,保存--上传云(覆盖)--编译---运行
请小伙伴们养成习惯:
代码规范:该换行换行、该空格的空格、该缩进的缩进、分函数、分文件、分文件夹
1.创建一个文件
2.开始敲代码(先做出一个能玩一次的)
游戏规则 -------printf标准输入输出
#include <stdio.h>//包含头文件
//头文件:函数的声明(函数如何使用)
//int haha (char a);
//返回值的数据类型 函数名 参数类型、参数名称
//英文单词+()表示函数,如果()后面有;就是声明或者调用
//如果后面有{}就是定义
int main(int argc, char const *argv[])
{
//打印游戏规则
//因为我要调用打印的函数,这个函数在stdio.h中声明了
//所以我包含这个头文件
printf("欢迎进入盼圆小游戏n");
printf("进入游戏就不能中途离开n");
return 0;
}
当前效果
![1de5f9aba239d390311a300459ebee4a.png](https://i-blog.csdnimg.cn/blog_migrate/c4ea82a3c8cdbec20f6591ca168d3140.png)
按下--生成--打印
生成--按下--打印
获取键盘输入的自定义函数:(无回显、不需要回车的getchar--mygetch)
//----------------------这是一个功能代码--获取键盘 输入的一个键
//----------------------而且是无回显,而且不需要回车
#include <termios.h>
#include <unistd.h>
char mygetch()///-----------功能函数的定义
{
struct termios oldt, newt;
char ch;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}//定义处因为在整个文件的最上面,因此下面的代码中调用这个函数将不用声明
按下任意键、生成随机的字符串、打印
#include <stdio.h>//包含头文件
#include <stdlib.h>
#include <time.h>
//头文件:函数的声明(函数如何使用)
//int haha (char a);
//返回值的数据类型 函数名 参数类型、参数名称
//英文单词+()表示函数,如果()后面有;就是声明或者调用
//如果后面有{}就是定义
//
//----------------------这是一个功能代码--获取键盘 输入的一个键
//----------------------而且是无回显,而且不需要回车
#include <termios.h>
#include <unistd.h>
char mygetch()///-----------功能函数的定义
{
struct termios oldt, newt;
char ch;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}//定义处因为在整个文件的最上面,因此下面的代码中调用这个函数将不用声明
int main(int argc, char const *argv[])
{
//打印游戏规则
//因为我要调用打印的函数,这个函数在stdio.h中声明了
//所以我包含这个头文件
printf("欢迎进入盼圆小游戏n");
printf("进入游戏就不能中途离开n");
//按下任意键
mygetch();//只需要调用这个函数就行
//因为我并不关系你按下的是什么因此我没有去获取,也就是接返回值
//创建一个数组
char haha[21] = "";//预留出一位避免乱码
int i = 0;
//设置随机种子
srand(time(NULL));
for (i = 0; i < 20; ++i)
{
haha[i] = rand()%26 + 'a';//循环的生成放入
}
printf("%sn", haha);//打印字符串
return 0;
}
//
// int main(int argc, char const *argv[])
// {
// printf("欢迎进入盼圆小游戏n");
// printf("进入游戏就不能中途离开n");
// //先生成一个随机数
// //设置一个随机种子
// srand(time(NULL));//获取当前的时间设置为随机种子
// int a = rand();//rand表示生成随机数函数
// printf("%dn", a);
// //然后变成随机的0-25的数
// int b = a%26;//取余数一定小于本身 0-25
// printf("%dn", b);
// //再变成a-z
// char c = b+ 'a';//由于b是0-25,加上a字符就变成了a-z
// printf("%cn", c);
// //然后放入数组
// return 0;
// }
我们做一个能完一次的打字游戏
#include <stdio.h>//包含头文件
#include <stdlib.h>
#include <time.h>
//头文件:函数的声明(函数如何使用)
//int haha (char a);
//返回值的数据类型 函数名 参数类型、参数名称
//英文单词+()表示函数,如果()后面有;就是声明或者调用
//如果后面有{}就是定义
//
//----------------------这是一个功能代码--获取键盘 输入的一个键
//----------------------而且是无回显,而且不需要回车
#include <termios.h>
#include <unistd.h>
char mygetch()///-----------功能函数的定义
{
struct termios oldt, newt;
char ch;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}//定义处因为在整个文件的最上面,因此下面的代码中调用这个函数将不用声明
int main(int argc, char const *argv[])
{
//打印游戏规则
//因为我要调用打印的函数,这个函数在stdio.h中声明了
//所以我包含这个头文件
printf("欢迎进入盼圆小游戏n");
printf("进入游戏就不能中途离开n");
//按下任意键
mygetch();//只需要调用这个函数就行
//因为我并不关系你按下的是什么因此我没有去获取,也就是接返回值
//创建一个数组
char haha[21] = "";//预留出一位避免乱码
int i = 0;
//设置随机种子
srand(time(NULL));
for (i = 0; i < 20; ++i)
{
haha[i] = rand()%26 + 'a';//循环的生成放入
}
printf("%sn", haha);//打印字符串
//按照打印的字符串进行输入
//注意去掉for中的int
int k = 0;//记录正确个数
int s_time = 0,e_time = 0;
for (i = 0; i < 20; ++i)
{
//获取键盘输入
char ch = mygetch();
//判断
if (ch == haha[i])
{
printf("%c", ch);//原样输出
k++;
}
else
printf("_");
if (i == 0)
s_time = time(NULL);
}
e_time = time(NULL);
//当前的for循环结束后
printf("当前游戏以哦就结束n");
printf("用时为%d秒n", e_time - s_time);
printf("正确个数%dn", k);
return 0;
}
效果
![24aae4b2fd2e6157e08ccedff6a02007.png](https://i-blog.csdnimg.cn/blog_migrate/8de5e605e677aa1c770629c9cfb84287.png)
拓展讲解:
//程序开始的时候打印哈哈哈哈哈
//让你按下esc退出按下空格继续
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
char mygetch()///-----------功能函数的定义
{
struct termios oldt, newt;
char ch;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}//定义处因为在整个文件的最上面,因此下面的代码中调用这个函数将不用声明
int main(int argc, char const *argv[])
{
while(1)
{
printf("hahahahahan");//将能够玩一次的代码替换到当前这一行就行
//获取键盘输入
while(1)
{
printf("请输入esc退出、空格继续n");
char ch = mygetch();
if (ch == 27)//27为esc键的ASCII码
{
return 0;
}
else if (ch == 32)//32就是空格
{
//结束当前层循环
break;
}
printf("请按照规则按下谢谢n");
}
}
return 0;
}