前言
近日开始了吾之线程学习,略有所得,与进程相比,其可多线程同时执行代码段的特性,实是魅力巨大。
窃以为编程学习如武艺修炼,学了招式不过两招实在不应该,故做一打字母,实践练习。
主要思路
打字母功能最主要的地方是 “字母不停下落,若按下对应键,字母消失,且在上方出现新的字母,重复此过程”。
简而言之,就是在向屏幕输出信息时还需要实时接受用户按键,而这与我们之前学习的程序设计顺序执行是相冲突的,但线程可以解决这个问题。
流程简述
- 关闭输入缓冲区以及输入回显。
- 创建全局变量,保存要显示的字符,以及其坐标位置。
初始化字符串,采用随机数的方式为其赋值,并为其坐标赋值。- 创建新线程,线程对应函数功能为 清屏后输出输出字符于各自对应坐标 并每次循环后,给每个子符的x坐标值加一
- 在原线程中也设置一循环,实时接收用户输入,根据用户输入 判断按键是否正确,若正确则重新对该字符随机赋值,否则重新输入。
- 实时判断,是否有字母超过下边界,若有,则程序结束
- 输入缓存区与输入回显
代码
#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;
}
结语
因为主要目的是对线程的学习,所以在打字母的基本功能实现后并未实现其他功能。
毕竟是初学,有什么地方有误,欢迎批评指正。