LINUX.ORG.RU

Конкурс на лучший анимированный ASCII-ART

 


1

2

Я тут подумал, мне понравилось и я подумал ещё раз: =) а ведь интересная штука - анимированный аски-арт. Можно на разных языках, можно даже полноценный мультфильм. (По следам темы Кратко про нейронные сети. Тестирование) У меня пока на тему Gentoo. И ещё в запасе, но я ее уже публиковал.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (void) {
int i, a, b;
/*Gentoo*/
const char   color_str[] = "         -/oyddmdhs+:.             \n     -odNMMMMMMMMNNmhy+-`         \n   -yNMMMMMMMMMMMNNNmmdhyb+-      \n `omMMMMMMMMMMMMNmdmmmmddhhy/`    \n omMMMMMMMMMMMNhhyyyohmdddhhhdo`   \n.ydMMMMMMMMMMdhs++so/smdddhhhhdm+`\n oyhdmNMMMMMMMNdyooydmddddhhhhyhNd.\n  :oyhhdNNMMMMMMMNNNmmdddhhhhhyymMh\n    .:+sydNMMMMMNNNmmmdddhhhhhhmMmy\n       /mMMMMMMNNNmmmdddhhhhhmMNhs:\n    `oNMMMMMMMNNNmmmddddhhdmMNhs+` \n  `sNMMMMMMMMNNNmmmdddddmNMmhs/.\n /NMMMMMMMMNNNNmmmdddmNMNdso:`     \n+MMMMMMMNNNNNmmmmdmNMNdso/-        \n/hMMNNNNNNNNMNdhs++/-`             \n/hMMNNNNNNNNMNdhs++/-`             \n`/ohdmmddhys+++/:.`                \n";

b=0;
while (b  < 1000) {
sleep(1);
printf("\033[2J\033[H");
/*fflush(stdout);*/
/*system("clear");*/
printf("\n");

for (i=0; color_str[i] != '\0'; i++ ) {

	a = rand() % 1000;

	if (a < b && i < 1000) {
	printf("\033[94m%c", color_str[i]);
	continue;
	}
	printf("\033[0m%c", color_str[i]);

		}
		b = b + 100;
}

	return 0;
}
★

Последнее исправление: AnonymUser (всего исправлений: 3)

Мне что-то подумалось, что константная строка с кучей сходу непонятных символов - хорошее место чтобы спрятать в ней патч Бармина, а затем каким-нить незаметным Си-трюком (например битьём памяти при printf в переменную, которая затем подаётся в system, или битём стека чтобы переставить на неё адрес возврата) запустить его. Но вроде в этой проге такого нет.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)

Свою анимация я не написал, зато пропатчил твою:

@@@
-while (b  < 1000) {
-sleep(1);
-system("clear");
-printf("\n");
+while (b  <= 1000) {
+usleep(400000);
+printf("\033[H\033[2J\033[3J\n");
@@@
-		b = b + 100;
+		b = b + 40;
@@@
+       sleep(1);
+       printf(\033[0m\n");
	return 0;
}
По-моему так красивее.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Круто будет, если кто-нибудь напишет хороший снегопад. Можно с ветром, таянием снежинок.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (void) {
int i, a, b;
/*Снегопал*/

b=0;
while (b  < 1000) {
sleep(1);
printf("\033[2J\033[H");
fflush(stdout);
/*system("clear");*/
printf("\n");

for (i=0; i < 7000; i++ ) {

	a = rand() % 1000;

	if (a < b && i < 7000) {
	printf("\033[94m❄️")	;
	continue;
	}
	printf("\033[0m ");

		}
		b =  100;
}

	return 0;
}

AnonymUser ★
() автор топика
Ответ на: комментарий от AnonymUser

printf(«\033[2J\033[H»);
fflush(stdout);
/*system(«clear»);*/
printf(«\n»);

Зачем тут fflush и зачем в итоге 4 строки вместо одной?

И почему у тебя такое ужасное форматирование кода?

firkax ★★★★★
()
Ответ на: комментарий от firkax

Про fflush мне так Алиса подсказала, но да, он не нужен.

Ибо руками писан код. Во! Придумал задачу для ИИ. Форматирование кода.

AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)
Ответ на: комментарий от AnonymUser

Форматирование от deepai.org

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

int main(void) {
    int i, a, b;

    /* Снегопад */

    b = 0;
    while (b < 1000) {
        sleep(1);
        printf("\033[2J\033[H");
        /* system("clear"); */
        printf("\n");

        for (i = 0; i < 7000; i++) {
            a = rand() % 1000;

            if (a < b && i < 7000) {
                 printf("\033[94m\u2744");
                continue;
            }
            printf("\033[0m ");
        }
        b = 100; // Обновление переменной b (по логике, возможно, нужно изменить)
    }

    return 0;
}
AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)
Ответ на: комментарий от gagarin0
  1. Контейнеров.
  2. ВМ.
  3. Контрольных сумм на файлы.
  4. Открытых репозитариев с исходниками.
  5. Программ (м.б., нейронных сетей), которые способны найти «уязы» в открытом коде.
AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 3)

Вот снегопад:

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

#define W 80
#define H 25

typedef unsigned char uchar;
typedef unsigned int uint;
typedef struct { uchar v,h,p,d; } snow;

static snow arr[H][W];
static int ww, xww;
static char buf[W*H*3];

static void xrand(uchar *v, uchar mask) {
  int v0;
  v0 = (*v) & mask;
  v0 = (v0 + (mask+1)/2)/2;
  mask++;
  v0 += (int)((mask/6+16)*(0.01*(random()%201)-1));
  mask--;
  if(v0<0) v0 = 0;
  if(v0>mask) v0 = mask;
  *v = ((*v) & ~mask) | v0;
}

static int yrand(int mod) { return random()%mod; }
static int zrand(int mod) { return !(random()%mod); }

int main(void) {
  uint j, k, x, y;
  snow *line, *l2;
  char *b;
  
  srandom(getpid());
  printf("\033[8;%u;%ut",H,W); fflush(stdout); ww = 1152;

  while(1) {
    for(j=H; j; ) {
      line = arr[--j];
      for(k=0; k<W; k++,line++) {
        if(!line->v && !line->h) continue;
        line->v = y = line->v + line->p;
        line->h = x = line->h + (line->d&127)*2 + ww;
        if((y/=256)&&j==H-1) { line->h = line->v = 0; continue; }
        if(!line->v && !line->h) line->v = 1;
        xrand(&line->p, 255);
        xrand(&line->d, 127);
        if((x/=256)==5 && !y) continue;
        x = (x+k+W-5)%W;
        l2 = line-k+x+y*W;
        if(!l2->h && !l2->v) *l2 = *line;
        else {
          l2->h = (line->h + l2->h)/2;
          l2->v = (line->v + l2->v)/2;
          l2->p = (line->p + l2->p)/2;
          l2->d = ((line->d&127) + (l2->d&127))/2 + 128;
          if(!l2->v && !l2->h) l2->v = 1;
        }
        line->h = line->v = 0;
      }
    }
    if(zrand(3000)) xww = (yrand(3)-1)*(40+yrand(60)+100*(yrand(4)+
                        (yrand(2)?0:yrand(4))+(yrand(5)?0:yrand(6))));
    if(xww) {
      if(xww<0) xww++; else xww--;
      if(!(xww%100)) xww = 0;
      else if(zrand(30)) ww = 1152 + xww;
    }
    ww = ww + random()%13 - 6;
    if(!xww) {
      if(ww<1088) ww = 1088;
      if(ww>1216) ww = 1216;
    } else {
      if(ww<0) ww = 0;
      if(ww>2304) ww = 2304;
    }
    if(ww<1120 && !(random()%4)) ww++;
    if(ww>1184 && !(random()%4)) ww--;
    for(k=0,line=arr[0]; k<W; k++,line++) {
      if(random()%130 || line->v || line->h) continue;
      line->v = 1; line->h = random()%256;
      line->p = (random()%64) + (random()%64) + (random()%64) + (random()%64);
      line->d = (random()%32) + (random()%32) + (random()%32) + (random()%32);
    }
    
    for(j=W*H-1,line=arr[0],b=buf; j; j--,line++) {
      if(!line->v && !line->h) *(b++) = ' ';
      else if(line->d<128) { b[0]=0xE2;b[1]=0x9D;b[2]=0x84;b+=3; }
      else *(b++) = '@';
    }
    fputs("\033[0m\033[H\033[2J\033[3J\033[94m",stdout);
    fwrite(buf, 1, b-buf, stdout); fflush(stdout);
    usleep(100000);
  }
}

firkax ★★★★★
()
Ответ на: комментарий от firkax
@@ -66,4 +66,4 @@
     if(xww) {
-      if(xww<0) xww++; else xww--;
-      if(!(xww%100)) xww = 0;
+      if(zrand(3)) if(xww<0) xww++; else xww--;
+      if(xww && !(xww%100)) { int tt = abs(xww); if(tt>100 && (tt>yrand(1300) || yrand(2) && tt>yrand(300) || yrand(2) && tt>yrand(600))) xww -= xww/tt*40; else xww = 0; }
       else if(zrand(30)) ww = 1152 + xww;
firkax ★★★★★
()
Ответ на: комментарий от firkax

Хороший снегопад, но есть пара но:

  1. У меня работает идеально только под 1 разрешением терминала. Если расширить окно, то снего идет уже не так правильно.
  2. Не клоссплатформенный, на Андроиде выдает 18 ошибок.
anonymous
()
Ответ на: комментарий от firkax

Крутой у тебя снегопад. У себя добавил увеличение плотности снега. И после 20:00 верчера снегопад уже на черном фоне - ночь.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
int main(void) {
    int i, a, b;

    struct tm t;
    char date[30];
    time_t now;
    struct tm *local_time;
	time(&now);
    local_time = localtime(&now);

    b = 0;
    while (b < 500) {
        sleep(1);
        printf("033[2J\033[H");


        for (i = 0; i < 7000; i++) {
            a = rand() % 1000;

            if (a < b && i < 7000) {
                 printf("\033[94m\u2744");
                continue;
            }


           if(local_time->tm_hour > 20 )
            printf("\033[0m\033[40m ");
           else
            printf("\033[0m ");

        }


        b = b + 1; /* Плотность*.
        /*Для одной плотности*/
        //b =  100;
    }

    return 0;
}

AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)
Ответ на: комментарий от anonymous

Разрешение указано в исходнике вверху, он же сам и ресайзит (пытается по крайней мере) терминал в нужное. Соответственно смени его и перекомпилируй.

#define W 80
#define H 25

Не клоссплатформенный, на Андроиде выдает 18 ошибок.

Именно ошибок? Это каких, интересно? Тут вроде даже линуксизмов не используется.

firkax ★★★★★
()
Ответ на: комментарий от firkax
sn4.c:1:1: error:
      expected identifier or '('
    1 | && !l2->h) l2->v = 1;
      | ^
sn4.c:2:9: error:
      extraneous closing brace ('}')
    2 |         }
      |         ^
sn4.c:3:9: error:
      unknown type name 'line'
    3 |         line->h = line->v = 0;
      |         ^
sn4.c:3:13: error:
      expected identifier or '('
    3 |         line->h = line->v = 0;
      |             ^
sn4.c:4:7: error:
      extraneous closing brace ('}')
    4 |       }
      |       ^
sn4.c:5:5: error:
      extraneous closing brace ('}')
    5 |     }
      |     ^
sn4.c:6:5: error:
      expected identifier or '('
    6 |     if(zrand(3000)) xww = (yrand(3)-...
      |     ^
sn4.c:8:5: error:
      expected identifier or '('
    8 |     if(xww) {
      |     ^
sn4.c:13:5: error:
      type specifier missing, defaults to
      'int'; ISO C99 and later do not
      support implicit int [-Wimplicit-int]
   13 |     ww = ww + random()%13 - 6;
      |     ^
      |     int
sn4.c:13:15: error:
      call to undeclared function 'random';
      ISO C99 and later do not support
      implicit function declarations
      [-Wimplicit-function-declaration]
   13 |     ww = ww + random()%13 - 6;
      |               ^
sn4.c:13:27: error:
      initializer element is not a
      compile-time constant
   13 |     ww = ww + random()%13 - 6;
      |          ~~~~~~~~~~~~~~~~~^~~
sn4.c:14:5: error:
      expected identifier or '('
   14 |     if(!xww) {
      |     ^
sn4.c:17:7: error:
      expected identifier or '('
   17 |     } else {
      |       ^
sn4.c:21:5: error:
      expected identifier or '('
   21 |     if(ww<1120 && !(random()%4)) ww++;
      |     ^
sn4.c:22:5: error:
      expected identifier or '('
   22 |     if(ww>1184 && !(random()%4)) ww--;
      |     ^
sn4.c:23:5: error:
      expected identifier or '('
   23 |     for(k=0,line=arr[0]; k<W; k++,line++) {
      |     ^
sn4.c:30:5: error:
      expected identifier or '('
   30 |     for(j=W*H-1,line=arr[0],b=buf; j...
      |     ^
sn4.c:35:11: error:
      expected parameter declarator
   35 |     fputs("\033[0m\033[H\033[2J\033[...
      |           ^
sn4.c:35:11: error:
      expected ')'
sn4.c:35:10: note: to
      match this '('
   35 |     fputs("\033[0m\033[H\033[2J\033[...
      |          ^
fatal error: too many errors
      emitted, stopping now [-ferror-limit=]
20 errors generated.
AnonymUser ★
() автор топика
Ответ на: комментарий от firkax

Да. Похоже. Так и есть. На Андроиде, на маленьком экране, эффект от моего скрипта сильно не отличим. С работы вернусь ещё что-нибудь покручу… То , что я на работе на телефоне напрограммировал, как-то пока даже хуже.

AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)
Ответ на: комментарий от firkax

Ну, ладно. Ты выиграл конкурс. Предлагаю всем скинуться тебе на МакБук Про. или билет в Хогвардс =)

Но напоследок, после работы, надумал кратковремнный снег с небольшими порывами ветра: Прерывистый, так сказать:

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

/* Кратковременный снег с лёгким порывистым ветром */

int *buffering(int str[], int number_of) {
    int z, a;

    for (z = 0; z < 30; z++) {
        a = rand() % 100;
        str[z] = a;
    }
    return str;
}

int snow(int str[]) {
    int a, b, i, j;
    a = rand() % 10;

    for (i = 0; i < str[i]; i++) {
        for (b = 0; b != str[i]; b++) {
            printf(" ");
        }
        if (a > 3) {
            printf("  ");
        }
        if (a > 5) {
            printf("    ");
        }
        printf("\u2744");
    }
    printf("\n");
}

int main(void) {
    int str[30] = {0};
    int str1[30] = {0};
    int str2[30] = {0};

    int a, b, i, j, k;

    buffering(str, 30);
    buffering(str1, 30);
    buffering(str2, 30);

    for (j = 0; j < 10; j++) {
        if (j == 9) {
            j = 0;
            buffering(str, 30);
            buffering(str1, 30);
            buffering(str2, 30);
            continue;
        }

        sleep(1);
	printf("\033[2J\033[H");
	fflush(stdout);
        k = 0;

        while (k <= j) {
            printf("\n");
            k++;
        }

        if (j > 1) {
            snow(str1);
            printf("\n");
        }
        if (j > 2) {
            snow(str2);
            printf("\n");
        }
        if (j > 0) {
            snow(str);
            printf("\n");
        }
    }
}

AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)
Ответ на: комментарий от AnonymUser

Чего это выиграл, где остальные кандидаты?! Нужно минимум 10 участников.

firkax ★★★★★
()
Ответ на: комментарий от dataman

Во времена царя гороха в оффотпике не работали ескейп последовательности. Вот с тех пор оно и ползёт.

peregrine ★★★★★
()
Ответ на: комментарий от firkax

Зачем тут fflush

Вот и настал момент, когда Алиса и Gemeni стали умнее кожаных. Проверяй (код выдан gemeni)

#include <stdio.h>

// Функция имитации тяжелых вычислений
void heavyCalculations() {
    long long counter = 0;
    // Крутим пустой цикл пару секунд, чтобы занять процессор
    for (long long i = 0; i < 3000000000LL; ++i) {
        counter += i;
    }
    // Используем результат, чтобы компилятор не оптимизировал и не удалил цикл
    (void)counter; 
}

int main() {
    printf("=========================================\n");
    printf(" ТЕКСТ, КОТОРЫЙ ДОЛЖЕН ИСЧЕЗНУТЬ МГНОВЕННО\n");
    printf("=========================================\n");

    // Пауза перед тестом, чтобы вы успели заметить текст
    heavyCalculations();

    // Отправляем команду очистки в БУФЕР (без \n на конце!)
    printf("\x1B[H\x1B[2J");

    // --- РАЗНИЦА ЗДЕСЬ ---
    // Если раскомментировать строку ниже, экран очистится СРАЗУ:
    // fflush(stdout); 

    // Запускаем тяжелые вычисления на несколько секунд.
    // Из-за отсутствия fflush старый текст ВСЁ ЕЩЁ ОСТАНЕТСЯ НА ЭКРАНЕ,
    // пока этот код работает, хотя команда очистки уже была вызвана выше!
    heavyCalculations();

    printf("Вычисления завершены! (Только сейчас буфер сбросился)\n");

    return 0;
}

Хотя, конечно, там многопоток надо по идее. Но даже так разница очевидна. Собери 2 бинаря один с fflush, другой без и запусти их одновременно.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 2)
Ответ на: комментарий от peregrine

Вот и настал момент, когда Алиса и Gemeni стали умнее кожаных. Проверяй (код выдан gemeni)

Не стали. Алиса и deepai исправили один мой код до нерабочего состояния.

AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 2)
Ответ на: комментарий от peregrine

Если ты это всерьёз написал то 🤦

fflush там (в коде который я комментировал) не нужен и ни на что не влияет. А твой пример вообще не в тему, он другой. Выглядит как урок из какого-то учебника, найденный по ключевому слову «fflush». Что такое fflush я ни у кого не спрашивал.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Я про то, что в реальной программе clear надо выносить в функцию, а её делать надо нормально, а не тут работает а тут нет. Ещё и для старых оффтопиков код сделать, потому что они на эскейп последовательности вообще плевать хотели. cmd.exe в них не умеет.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

что в реальной программе clear надо выносить в функцию

В общем случае - нет, не надо.

а её делать надо нормально, а не тут работает а тут нет

Если хочешь, чтобы вся печать в терминал сразу актуализировалась - отключи ему буферизацию (это делается одной строчкой в начале программы). А каких-то причин слать esc-последоватиельности повышенным по отношению к обычному тексту приоритетом нет. Если прога хочет актуализировать - сделает fflush, но нужда в этом известна только вызывающему коду, а никак не clear-у.

Ещё и для старых оффтопиков код сделать

Только если ты планируешь компилировать прогу под оффтоп. «На всякий случай, а вдруг» - нет. В юниксовом терминале очистка экрана может быть частью захардкоженной длинной строки, и «рефакторить» простое puts (оно может и не отдельно стоять, быть каким-нить колбеком или ещё чем-то что просто так не расширишь) в какой-то более сложный код просто ради «а вдруг оффтоп» совсем ни к чему.

cmd.exe в них не умеет

Открою тебе секрет, bash тоже не умеет парсить esc-последовательности. Это не его задача.

firkax ★★★★★
()
Ответ на: комментарий от firkax

conhost.exe тоже не умеет в старых оффтопиках этого, а писать прикладной linux/windows/osx/подставь_тут_другие_ОС-only код это то, за что надо руки отрубать вместе с головами у разработчиков.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

Не «тоже», а как раз именно он.

Твою приверженность к усложнению кода ради гипотетической кроссплатформенности я не разделяю. Бывают случаи когда ты именно специально пишешь кроссплатформенно - там да, но не надо делать вид что это дефолт. И если переносимость между разными юниксами это ещё часто относительно лёгкая задача и сделать её на всякий случай ещё есть резон, то вот совместимость с кардинально другими платформами это уже совсем другое дело.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Вот смотри. Сейчас у нас нет Windows, есть Linux. В теории через N лет весь софт от РФ будет Linux-only. А потом M$ договорится с Intel и AMD и компы станут такими огороженными, что кроме Windows/OSX ничто не сможет загружаться (залочат загрузчик как в андроидах, но с криптой и TPM). А дальше — свои конкурентоспособные компы мы не сможем ни в 2040 ни в 3180. И у нашего государства будет только 3 варианта: жить без электроники (старые машины всё равно сломаются со временем), договариваться с USA и переходить на их огороженные системы (но прикладной софт тоже будет их или с нуля придётся писать), сделать аналоговнет из 1992 года и на тех же технологиях. Смысл резать себе яйца самостоятельно, ограничивая свои же возможности.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

Ты какую-то ерунду пишешь. Ну и в любом случае никто не обязан поддерживать то, что он не считает нужным поддерживать.

firkax ★★★★★
()

Моросящий дождик (и вроде как без церей Маркова, хотя я почитал про них):

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
/*Что-то вроде моросящего дождика*/
int *buffering(int str[], int number_of) {
    int z, a;

    for (z = 0; z < 20; z++) {
        a = rand() % 100;
        str[z] = a;
    }
    return str;
}

int main(void) {
	int x, y, i, j, b;

	int str[20];
	buffering(str, 10);

while (1) {
	    //sleep(1);
		printf("\033[2J\033[H");
 for (j = 0; j < 20; j++) {
	 x= rand() % 2;
	 y= rand() % 3;
  for (i = 0; i < x; i++)
	  printf("  ");
	 for (i = 0; i < y; i++)
	  printf("\n");
	  	 for (i = 0; i < str[j] ; i++)
	  	  printf("  ");
	printf("💧");
		}
b=0;
	printf("\n\n\n");
	while (b < 1000) {
		b++;
		/*если убрать слип, то будет быстро, можно переделать в дождь*/
		    //sleep(1);
 for (j = 0; j < 20; j++) {
	 x= rand() % 2;
	 y= rand() % 3;
  for (i = 0; i < x; i++)
	  printf("  ");
	 for (i = 0; i < y; i++)
	  printf("\n");
	  	 for (i = 0; i < str[j] ; i++)
	  	  printf("  ");
	printf("💧");
		   }

		}
	}
}


AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)
Ответ на: комментарий от AnonymUser

Дождь со снегом быстрый с завершением:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
/*Что-то вроде моросящего дождика*/
int *buffering(int str[], int number_of) {
    int z, a;

    for (z = 0; z < 20; z++) {
        a = rand() % 100;
        str[z] = a;
    }
    return str;
}

int main(void) {
	int x, y, i, j, b, v;

	int str[20];
	buffering(str, 10);
v=0;
while (v < 3) {
v++;
		printf("\033[2J\033[H");
		sleep(1);

 for (j = 0; j < 20; j++) {
	 x= rand() % 2;
	 y= rand() % 3;
  for (i = 0; i < x; i++)
	  printf("  ");
	 for (i = 0; i < y; i++)
	  printf("\n");
	  	 for (i = 0; i < str[j] ; i++)
	  	  printf("  ");
	printf("\u2744");
		}
b=0;
	printf("\n\n\n");
	while (b < 5000 ){
		b++;
		/*если убрать слип, то будет быстро, можно переделать в дождь*/
		    //sleep(1);
 for (j = 0; j < 20; j++) {
	 x= rand() % 2;
	 y= rand() % 3;
  for (i = 0; i < x; i++)
	  printf("  ");
	 for (i = 0; i < y; i++)
	  printf("\n");
	  	 for (i = 0; i < str[j] ; i++)
	  	  printf(" ");
	 if (b%2==0)
	printf("\u2744");
	else
	printf("💧");

		   }

		}
	}
				printf("\n Дождь со снегом кончился!\n ");
}


AnonymUser ★
() автор топика
Ответ на: комментарий от AnonymUser

Я не пойму, ты наугад в случайном порядке комбинируешь разные циклы и символы в printf? У кода не видно какой бы то ни было логики работы, там чисто мешанина из вывода рандомных пробелов, переводов строки и иногда символов. Непрерывный вывод символов в рандомных местах экрана это не анимация.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Что-то вроде того. Подгонка под эффект =) Не совсем наугад. Логика формальная всегда есть, иначе код бы не работал.

Я так, понял вообще этот эффект осадков (в нормальном виде) на цепях Маркова делают? Пока до конца не разобрался, как это реализуется. Как я понимаю на чистом C с printf(" «) и с printf(»\n") нормально не сделаешь. Т.е. x и y нормально не полчится сымитировать.

Там генерируется строка str[10] - массив целых, Каждый символ печатается после n числа пробелов. Это n чило пробелов для каждого символа определяется этим рандомным значением. Если убрать x и y, то капли и снежинки будут каждый раз генерироваться на тех же позициях, второй цикл я добавил, чтобы был эффект заполненности и какого-то движения. С x и y вроде бы получется легкий эффект перемещения - чуток по x чуток по y. Но, похоже, что иногда (естественно для теринала) сильно сдвигаются все строки. И эффект теряется. В нормальном эффекте вроде как должно быть деление на всего поля на линии или квадраты…

AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 3)
Ответ на: комментарий от firkax

На одной снежинки должно быть понятно, что я хотел сделать: (наверное,сдвига в одну сторону достаточно, так как в реальности ветер чаще в одну сторону).

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

void snow(int str) {
    int x, b, i, j;
    for (i = 0; i < str; i++) {
/*Cлучайное число для  сдвига*/
		x = rand() % 4;
		sleep(1);
		printf("\033[2J\033[H");
/*Сдвиг по оси Y. Движение вниз*/
        for (b = 0; b != i; b++)
        printf("\n");
/*Случайный сдвиг по X вправо*/
	if ( x > 0)
	for (b = 0; b != x; b++)
	printf(" ");
/*Снежинка*/
    printf("     \u2744     %d - сдвиг", x);
    printf("\n");
		}
    }

int main(void) {
int str = 30;
snow(str);
}

У тебя, конечно, классно получилось, но очень много вычислений, понять, как работает, - очень трудно.

AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)
Ответ на: комментарий от madcore

Никак! Где я писал, что собираюсь делать это?! Даже не хочу это слово применять =)

Кстати, есть разница: когда разбираешь чужой код и когда ты описываешь задачу для нейронной сети. Т.е. разница ощутима: когда есть проработанная идея в голове и когда перед тобой груда символов.

AnonymUser ★
() автор топика
Ответ на: комментарий от AnonymUser

Твой код очень сложно читать из-за рандомизированных отступов. Я конечно могу их сам исправлять перед чтением, но неужели тебе самому это не доставляет неудобств? Если строка заканчивается открывающей фигурной скобкой ({) - следующая должна быть на 1 отступ больше. После закрывающей скобки (}) становится на 1 отступ меньше. Во всех остальных случаях отступ следующей строки такой же как у предыдущей. Если после if()/for()/while() стоит всего одни строка без { } вокруг неё - не надо её писать отдельно, пиши на той же где if/for/while.

И по самому коду - попробуй теперь сделать для двух снежинок то же самое. И перестань использовать sleep, 1 секунда это слишком большая задержка чтобы видеть движение, а без задержек вообще на экране получается каша. usleep() делает задержки в микросекундах, используй его, например usleep(200000)

firkax ★★★★★
()
Ответ на: комментарий от firkax

Дело в том, что я часто набираю код в редакторе nano (я сам в ужасе) =) Я немного привык к этому кривовому форматированию.

И по самому коду - попробуй теперь сделать для двух снежинок то же самое. 

Понятно, что строка будет сбиваться.

AnonymUser ★
() автор топика
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария