linux线程初学之实现打字母功能

前言

近日开始了吾之线程学习,略有所得,与进程相比,其可多线程同时执行代码段的特性,实是魅力巨大。
窃以为编程学习如武艺修炼,学了招式不过两招实在不应该,故做一打字母,实践练习。

主要思路

打字母功能最主要的地方是 “字母不停下落,若按下对应键,字母消失,且在上方出现新的字母,重复此过程”。
简而言之,就是在 向屏幕输出信息时还需要实时接受用户按键 ,而这与我们之前学习的程序设计顺序执行是相冲突的,但线程可以解决这个问题。

流程简述

  1. 关闭输入缓冲区以及输入回显。

  2. 创建全局变量,保存要显示的字符,以及其坐标位置。
    初始化字符串,采用随机数的方式为其赋值,并为其坐标赋值。

  3. 创建新线程,线程对应函数功能为 清屏后输出输出字符于各自对应坐标 并每次循环后,给每个子符的x坐标值加一

  4. 在原线程中也设置一循环,实时接收用户输入,根据用户输入 判断按键是否正确,若正确则重新对该字符随机赋值,否则重新输入。

  5. 实时判断,是否有字母超过下边界,若有,则程序结束

  6. 输入缓存区与输入回显

代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<pthread.h>
#include<unistd.h>
#include<time.h>

char str[10];
char x[10];
char y[10];

int* thread()
{
    int i;

    while(1)
    {
        system("clear");
        for(i=0;i<10;i++)
        {//输出字符于对应坐标
            printf("\033[%d;%dH%c\n",x[i],y[i],str[i]);
            x[i]++;
        }
        sleep(1);
    }

    return NULL;
}

int main()
{
    pthread_t thid;

    int i;
    char c='\0';

    system("stty -icanon");
    system("stty -echo");

    srand((unsigned)time(NULL));

    for(i=0;i<10;i++)
    {//字符串初始化
        str[i] = 'a' + rand()%26;
        x[i] = 2;
        y[i] = i*3+3;
    }
    //创建线程
    if( pthread_create(&thid,NULL,(void*)thread,(void*)&i)
       != 0 )
    {
        printf("Error!\n");
        exit(1);
    }
    while(1)
    {
        c = getchar();
        if(c!='\0')
        {
            for(i=0;i<10;i++)
            {
                if(c == str[i])
                {
                    str[i] = 'a'+rand()%26;
                    x[i] = 2;
                    c='\0';
                    break;
                }
            }
        }
        for(i=0;i<10;i++)
        {
            if(x[i]>=20)
            {
                break;
            }
        }
    }
    system("stty icanonon");
    system("stty echo");

    return 0;
}

结语

因为主要目的是对线程的学习,所以在打字母的基本功能实现后并未实现其他功能。
毕竟是初学,有什么地方有误,欢迎批评指正。

请赐予我钱进的动力吧~
0%