Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: C - вовремя дождь в терминалу.  (Прочитано 674 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн victor00000

  • Автор темы
  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
C - вовремя дождь в терминалу.
« : 04 Октября 2018, 14:53:42 »
// test_rain_on_time.c
// victor00000 (c) 2018
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <locale.h>
#include <sys/ioctl.h>
// ~$ gcc test_rain_on_time.c -o test_rain_on_time -lpthread
// ~$ ./test_rain_on_time
// exit - 'Enter'

const char *cls_c = "\e[1;1H\e[2J";
int cvadr[] = { L'┏',L'━',L'┓',L'│',L'┛',L'━',L'┗',L'│', 0 };
typedef struct {
int w,h;
}wht;
int **xy;

//=================cls
void cls (){
fwrite (cls_c,1,strlen (cls_c),stdout);
}

//=====================get w h
int getwhterm (int *wt, int *ht){
int e;
struct winsize wl;
e = ioctl ( STDOUT_FILENO,TIOCGWINSZ, &wl );
*ht = wl.ws_row;
*wt = wl.ws_col;
return e;
}

//=================xy_rnd
void xy_rnd (wht wh){
int i,x = wh.w - 2,y = 1;
for (i=1;i < x+1; i++)
xy [y] [i] = L' ';
for (i=0;i< (1+rand()% 16 ); i++){
xy [y] [1 + rand()%x] = cvadr [3];
}
}

//===================xy_down
void xy_down (wht wh){
int x,y;
for (y = wh.h - 2;y > 1;y--){
for (x=1;x<wh.w - 1;x++){
//xy [y] [x] = L'.';
xy [y] [x] = xy [y-1] [x];

}}
}

//===================xy_clear
void xy_clear (wht wh){
int x,y;
for (y=0;y<wh.h;y++){
for (x=0;x<wh.w;x++){
if (x == 0 || x == wh.w - 1)
xy [y] [x] = cvadr [3];
else
xy [y] [x] = L' ';

if (y == 0){
xy [y] [x] = cvadr [1];
if (x == 0)
xy [y] [x] = cvadr [0];
if (x == wh.w-1)
xy [y] [x] = cvadr [2];
}
if (y == wh.h - 1){
xy [y] [x] = cvadr [1];
if (x == 0)
xy [y] [x] = cvadr [6];
if (x == wh.w - 1)
xy [y] [x] = cvadr [4];

//===================1
}
}}
}

//====================xy_init
int **xy_init (wht wh){
int **x_y = 0;
x_y = malloc (sizeof (int) * wh.h);
int i;
for (i=0;i<wh.h;i++){
x_y [ i ] = malloc (
sizeof (int) * wh.w);
}
return x_y;
}


//=================tp
void *tp (void *a){
wht *wh = (wht*)a;
int x,y;
while (1){
xy_rnd (*wh);
xy_down (*wh);
cls ();
for (y=0;y<wh->h;y++){
for (x=0;x<wh->w;x++){
printf ("%lc",xy [y] [x]);
}
// if (y != wh->h - 1)
puts ("");
}
usleep (1000* 100);
}
return 0;
}

//==================m0
int main (){
setlocale (LC_ALL,getenv("LANG"));
int wt,ht,e;
e = getwhterm (&wt,&ht);
if (e != 0){
perror ("Err");
return 1;
}

pthread_t t;
wht wh;
wh.w = wt; wh.h = ht - 1;
xy = xy_init (wh);
xy_clear (wh);
xy_down (wh);
pthread_create (&t,0,tp,&wh);
char cb;
while (fread (&cb,1,1,stdin) != 1){
}
pthread_cancel (t);
pthread_join (t,0);
for (e=0;e<wh.h;e++)
free (xy [e]);
free (xy);
return 0;
}
http://paste.ubuntu.com/p/g9jR8w7TRK/
« Последнее редактирование: 04 Октября 2018, 14:57:42 от victor00000 »
Wars ~.o

 

Страница сгенерирована за 0.024 секунд. Запросов: 21.