linuxC实现简单打字游戏(英文)

大致的设计思路是:

1.打字游戏一般都是给出一行随机的字符 。

2.用户按照屏幕上打出的字符进行输入,如果输入正确的话,就显示当前的字符

  如果输入错误的话,就显示一个下划线,代表出错,但是还能继续往下进行,直到字符的结尾。

3.最后的话,向用户反馈一下所用时间和准确率。

下面是具体实现:

 1.首先做一个用户界面,用来给用户进行提示,免得别人不知道这是干什么的。

 void show()

 {

  printf("*******欢迎来到LML的打字游戏*******\n");

  printf("**请按照提示进行输入,输入过程中不能退出\n");

  printf("**按下首字母开始计时\n");

 printf("**输入错误会显示空格\n");

 printf("**完毕后可以看到您所用时间和准确率\n");

 printf("***********************************\n");

 }

 2.要随机一些字符,并存储起来。

char ch[51];

int i;

srand(time(NULL));//用时间给srand做种子,防止有重复的数据存在

for(i = 0;i < 50;i++)

{

 ch[i] = (rand()%26) + 'a';

}

ch[50] = '\0';

 3.获取用户输入

这里就是整个项目的最关键之处,用户输入的字符,我们必须一个一个进行比对

一般我们用的像gets,getc等获取用户输入的函数,都是输入什么就显示什么

显然不符合我们的要求,而且读到\n才算结束,我们的这个项目中用户不可能输完之后再按一个回车键,这样不人性化

这样的话,我们就必须自己写一个函数来满足我们的需求,下面是代码的实现。

char mygetch()
 {
 struct termios oldt,newt;
 char ch;

 tcgetattr(STDIN_FILENO,&oldt);//得到当前终端标准输入的设置
 newt=oldt;

 newt.c_lflag &=~(ICANON | ECHO );//不使用标准输入模式,不显示输入字符

 //TCSANOW:不等数据传输完毕就立即改变属性
 tcsetattr(STDIN_FILENO,TCSANOW,&newt);//设置更改之后的设置

 ch=getchar();
 tcsetattr(STDIN_FILENO,TCSANOW,&oldt);//恢复成原来的模式
 return ch;
 }

结构体原型:

struct termios
 { unsigned short c_iflag; /* 输入模式标志*/-------控制输入数据在传递给程序之前的处理方式
  unsigned short c_oflag; /* 输出模式标志*/-------控制输出字符的处理方式,即由程序发出的字符在传递到串行口或屏幕之前如何处理.
  unsigned short c_cflag; /* 控制模式标志*/-------控制模式控制终端的硬件特性.
  unsigned short c_lflag; /*区域模式标志或本地模式标志或局部模式*/-------通过c_lflag成员控制终端的某些特性
  unsigned char c_cc[NCC]; /* 控制字符特性*/-------标准模式和非标准模式下,c_cc数组的下标有不同的值
 };

函数tcgetattr来初始化一个终端对应的termios结构,该函数的原型如下:

#include<termios.h>  
  int tcgetattr(int fd, struct termios *termios_p);

函数tcsetattr来设置终端对应的termios结构,该函数的原型如下:

#include<termios.h>  
 int tcsetattr(int fd , int actions , const struct termios *termios_h);

 通过c_lflag成员控制终端的某些特性,下面是比较常用的几种:
 ECHO:启用输入字符的本地回显功能
 ECHONL:回显换行符
 ICANON:启用标准输入处理
 ISIG:启用信号

参数actions控制修改方式,共有三种修改方式:
 1.TCSANOW:立刻对值进行修改
 2.TCSADRAIN:等当前的输出完成后再对值进行修改。
 3.TCSAFLUSH:等当前的输出完成之后,再对值进行修改,但丢弃还未从read调用返回的当前的可用的任何输入。

4.进行数据比对,如果匹配了就显示到终端,如果不匹配就打印一个"_"

 

for(i=0;i<50;i++)
{
sh=mygetch();
if(sh==ch[i])
{
printf("%c",sh);
}
else
printf("_");
}

5.所用时间和准确率
 时间的话,在用户输入后才开始计时,并且到末尾结束。设置两个变量分别记录开始时间和结束时间。

准确率的话就是,设置一个变量,如果用户输入的字符匹配的话就进行自增,得到的值除以总数最后就能得到。

for(i=0;i<50;i++)
{
sh=mygetch();
if(i==0)
star_time=time(NULL);
if(sh==ch[i])
{ a++;
printf("%c",sh);
}
else
printf("_");
}
printf("\n");
end_time=time(NULL);
printf("时间=%d\n",end_time-star_time);
printf("准确率= %d%%\n",((a*100)/50));

到这里,程序各个模块全部就已经完成了,组成一个完整的程序跑起来不是什么难事了(虽然这个项目本身就没有什么难度)。

本人水平有限,还望各位多多指点,互相学习。

展开阅读全文

没有更多推荐了,返回首页