当前位置: 首页 > news >正文

数字游戏(继Day 10)

主体:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

#include"mygetch.h"

#define MAX 51 //定义测试字母的最大长度

void help()
{
        printf("\n****************************************");
        printf("\n*输入过程中无法退出,输入错误则以_表示!*");
        printf("\n按任意键开始测试,按下首字母时开始计时!*");
        printf("\n****************************************");
}
void start(char *str)
{
        srand((unsigned int)time(NULL));//随机种子
        int i = 0;
        for(i = 0;i < MAX-1;i++)//打印50个英文字符用于测试
        {
        *(str+i) = rand()%26+'a';
        }
        *(str+MAX-1) = '\0'; //写完字符后补上结束标志位
}
void on_game(char *str)
{
char ch;
int i = 0;
int count = 0;
time_t t_start,t_end;

system("clear"); //先清屏
printf("\n%s\n",str);

count = 0;
for(i = 0;i < MAX-1;i++)
{
        ch = mygetch();
        if(i == 0)
        {
                t_start = time(NULL);
        }
        if(ch == *(str+i))
        {
                printf("%c",ch);
                count++;
        }
        else
        {
                printf("_"); //打印出错标志
        }
}
        t_end = time(NULL); //取结束时间
        printf("\n正确输入!\n用时 %ld s\n",t_end - t_start);
        printf("正确率%lf %%\n",(count*1.0/(MAX-1))*100);
        printf("按下Esc退出,任意键继续!\n\n");
}

int main()
{
        char str[MAX] = {0};
        while(1)
        {
                help(); //游戏说明菜单
                start(str); //产生随机字母
                mygetch();
                on_game(str); //开始游戏
                char ch = mygetch();

                if(ch == 27)//Esc的ascii为27
                {
                        break;
                }
                system("clear"); //先清屏
        }
        return 0;
}

 mygetch.c

#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include "mygetch.h"

int mygetch(void)
{
    struct termios oldt, newt;
    int 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;
}

mygetch.h

#ifndef MYGETCH_H
#define MYGETCH_H

// 声明mygetch函数
int mygetch(void);

#endif


 

相关文章:

  • FreeRTOS临界区
  • mybatis是如何进行分页的?分页插件的原理是什么
  • 【学习笔记】HTTP和HTTPS的核心区别及工作原理
  • w283图书商城管理系统
  • Docker全方位指南
  • 嵌入式---加速度计
  • 原子化 CSS 的常见实现框架
  • 微软 SC-900 认证-考核Azure 和 Microsoft 365中的安全、合规和身份管理(SCI)概念
  • 从光波调制到温度补偿:Lilikoi光纤力传感器的核心技术拆解
  • 麦科信光隔离探头在碳化硅(SiC)MOSFET动态测试中的应用
  • Glowroot 是一个开源的 Java 应用性能监控(APM)工具,专为 低开销、易用性 设计,具体的应用及优势进行分析说明
  • 【Docker基础-镜像】--查阅笔记2
  • MySQL 查询重写怎样把复杂查询变简单,让查询提高一个“速”!
  • TCP三次握手和TCP四次挥手
  • 7-9 用天平找小球
  • HOW - 设计和实现一个动态渲染不同表单类型组件的 DynamicFormItem 组件
  • SpringBoot框架—Logger使用
  • golang 中 make 和 new 的区别?
  • 力扣刷题——2265.统计值等于子树平均值的节点数
  • 国产三维CAD皇冠CAD在机械制造行业建模教程:油泵
  • 爱德华多·阿拉纳宣誓就任秘鲁新总理
  • 王征、解宁元、牛恺任西安市副市长
  • 袁思达已任中国科学院办公厅主任
  • 杭勇已任常州市政协党组成员,此前任常州市委常委、秘书长
  • 白天气温超30℃的北京,晚间下起了冰雹
  • 上海团队在医学顶刊连发两文,率先提出“证据污染”循证概念