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)
Ответ на: комментарий от madcore

Я бы не стал из этого делать такой вывод. У меня к ИИ больше прохладное отношение. Не особо вижу применения для себя. Технический перевод?! Генерация справочной информации по администрированию?! Проверка грубых ошибок в скриптах?! Проверка орфографии и опечаток?! Всё… И все это не очень часто нужно. Игрушка больше, для простого пользователя вроде меня.

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

Да. С usleep оно получше.

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

int snow(int  str[]) {
    int a, x, b, i, j, z;

    for (i = 0; i < 10; i++) {
	/*Обновление*/
		usleep(100000);
		printf("\033[2J\033[H");
/*Сдвиг по оси Y. Движение вниз*/
        for (b = 0; b != i; b++)
        printf("\n");

/*Cлучайное число для  сдвига*/
for (z = 0; z < 2; z++) {
	x = rand() % 4;
	/*Случайный сдвиг по X вправо*/
	for (b = 0; b != x; b++)
	printf(" ");
	/*Сама снежинка*/
    printf("     \u2744     ");
    }
    printf("\n");
	}
}


int main(void) {
int str[2] = {0};
int  i = 0 ;
while (i < 2, i++) {
str[i] = rand() % 100;
}
while (1)
snow(str);
}

AnonymUser
() автор топика

снег летом - не к добру!
вот вам камнепадик, как в boulder dash

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

#define FG_DIAMOND "\033[36;1m"
#define FG_STONE "\033[30;1m"
#define FG_RESET "\033[0m"

#define WIDTH 32
#define HEIGHT 22
#define MAX_STONES HEIGHT * WIDTH * 2

const uint32_t TARGET[HEIGHT] = {
    0b01001110011110000011000110111110, 0b11001110011111100011000110110011,
    0b11001110011001110011001100110011, 0b11001110001000000011001100110011,
    0b11001110001100000011001100110011, 0b11111110001100000011001100110011,
    0b11111110001111110110001100110011, 0b11000110001100000110001100110011,
    0b10000110001100000110001100110011, 0b10000110001100000110001100011011,
    0b11000110001111110110001100011110, 0b00000010000001110011001100000000,
    0b00000000000000000001000111000000, 0b01100000000111111100000111111000,
    0b01100000000110000111000110001111, 0b00110000000011000001100110000111,
    0b00110000000011100000110011111110, 0b00011000000001110000110011111000,
    0b00011000001100110000110011011100, 0b00001100111100011100110011000111,
    0b00001111100000001111110011000001, 0b00001110000000000011000011000000};

const char uline[][8] = {"\033[41m-", "\033[42m+", "\033[43m>", "\033[44m>"};

const char dline[][8] = {"\033[42m+", "\033[41m-", "\033[44m<", "\033[43m<"};

const char lline[][8] = {"\033[42m+", "\033[41m|", "\033[44m^", "\033[43m^"};

const char rline[][8] = {"\033[41m|", "\033[42m+", "\033[43mv", "\033[44mv"};

int frame = 0;

int GLASS[HEIGHT][WIDTH];
int ID_MAP[HEIGHT][WIDTH];

uint8_t IS_DIAMOND_ID[MAX_STONES];

void hline(int col, const char line[][8]) {
  for (int x = 0; x < WIDTH + 2; x++) {
    printf("%s", line[col]);
    col = (col + 1) & 3;
  }
  printf(FG_RESET "\n");
}

void draw_glass() {
  hline(3 - (frame & 3), uline);
  int lcol = frame & 3;
  int rcol = 3 - lcol;
  for (int y = 0; y < HEIGHT; y++) {
    printf("%s" FG_RESET, lline[lcol]);
    for (int c = 0; c < WIDTH; c++) {
      if (GLASS[y][c] == 1 || GLASS[y][c] == 4)
        printf(FG_STONE "O" FG_RESET);
      else if (GLASS[y][c] == 2 || GLASS[y][c] == 5)
        printf(FG_DIAMOND "*" FG_RESET);
      else
        printf(" ");
    }
    printf("%s" FG_RESET "\n", rline[rcol]);
    lcol = (lcol + 1) & 3;
    rcol = (rcol + 1) & 3;
  }
  hline(frame & 3, dline);
}

int is_target_set(int r, int c) {
  if (r < 0 || r >= HEIGHT || c < 0 || c >= WIDTH)
    return 0;
  return (TARGET[r] & (1U << (31 - c))) ? 1 : 0;
}

int main() {
  unsigned int seed = (unsigned int)time(NULL);
  srand(seed);

  int glass_full = 0;
  int current_id = 1;
  int spawn_timer = 0;

  while (!glass_full) {
    int moving = 0;
    for (int r = HEIGHT - 1; r >= 0; r--) {
      for (int c = 0; c < WIDTH; c++) {
        int type = GLASS[r][c];
        if (type == 3) {
          moving = 1;
          int id = ID_MAP[r][c];

          if (r < HEIGHT - 1 && GLASS[r + 1][c] == 0) {
            GLASS[r][c] = ID_MAP[r][c] = 0;
            GLASS[r + 1][c] = 3;
            ID_MAP[r + 1][c] = id;
          } else if (r < HEIGHT - 1 && c > 0 && GLASS[r + 1][c - 1] == 0 &&
                     GLASS[r][c - 1] == 0) {
            GLASS[r][c] = ID_MAP[r][c] = 0;
            GLASS[r][c - 1] = 3;
            ID_MAP[r][c - 1] = id;
          } else if (r < HEIGHT - 1 && c < WIDTH - 1 &&
                     GLASS[r + 1][c + 1] == 0 && GLASS[r][c + 1] == 0) {
            GLASS[r][c] = ID_MAP[r][c] = 0;
            GLASS[r][c + 1] = 3;
            ID_MAP[r][c + 1] = id;
          } else {
            GLASS[r][c] = 4;
          }
        }
      }
    }

    if (spawn_timer == 0 && current_id < MAX_STONES) {
      int start_c = rand() % WIDTH;
      if (GLASS[0][start_c] == 0) {
        GLASS[0][start_c] = 3;
        ID_MAP[0][start_c] = current_id++;
        spawn_timer = 1;
      } else {
        int full = 1;
        for (int i = 0; i < WIDTH; i++) {
          if (GLASS[0][i] == 0) {
            full = 0;
            break;
          }
        }
        if (full && !moving)
          glass_full = 1;
      }
    } else if (spawn_timer > 0) {
      spawn_timer--;
    }
  }

  for (int r = 0; r < HEIGHT; r++) {
    for (int c = 0; c < WIDTH; c++) {
      if (GLASS[r][c] == 4) {
        int final_id = ID_MAP[r][c];
        if (is_target_set(r, c)) {
          IS_DIAMOND_ID[final_id] = 1;
        }
      }
    }
  }

  memset(GLASS, 0, sizeof(GLASS));
  memset(ID_MAP, 0, sizeof(ID_MAP));

  srand(seed);
  draw_glass();

  glass_full = 0;
  current_id = 1;
  spawn_timer = 0;

  while (!glass_full) {
    int moving = 0;

    for (int r = HEIGHT - 1; r >= 0; r--) {
      for (int c = 0; c < WIDTH; c++) {
        int type = GLASS[r][c];
        if (type == 1 || type == 2) {
          moving = 1;
          int id = ID_MAP[r][c];

          if (r < HEIGHT - 1 && GLASS[r + 1][c] == 0) {
            GLASS[r][c] = ID_MAP[r][c] = 0;
            GLASS[r + 1][c] = type;
            ID_MAP[r + 1][c] = id;
          } else if (r < HEIGHT - 1 && c > 0 && GLASS[r + 1][c - 1] == 0 &&
                     GLASS[r][c - 1] == 0) {
            GLASS[r][c] = ID_MAP[r][c] = 0;
            GLASS[r][c - 1] = type;
            ID_MAP[r][c - 1] = id;
          } else if (r < HEIGHT - 1 && c < WIDTH - 1 &&
                     GLASS[r + 1][c + 1] == 0 && GLASS[r][c + 1] == 0) {
            GLASS[r][c] = ID_MAP[r][c] = 0;
            GLASS[r][c + 1] = type;
            ID_MAP[r][c + 1] = id;
          } else {
            GLASS[r][c] = (type == 1) ? 4 : 5;
          }
        }
      }
    }

    if (spawn_timer == 0 && current_id < MAX_STONES) {
      int start_c = rand() % WIDTH;
      if (GLASS[0][start_c] == 0) {
        int spawn_type = (IS_DIAMOND_ID[current_id] == 1) ? 2 : 1;

        GLASS[0][start_c] = spawn_type;
        ID_MAP[0][start_c] = current_id++;
        spawn_timer = 1;
      } else {
        int full = 1;
        for (int i = 0; i < WIDTH; i++) {
          if (GLASS[0][i] == 0) {
            full = 0;
            break;
          }
        }
        if (full && !moving)
          glass_full = 1;
      }
    } else if (spawn_timer > 0) {
      spawn_timer--;
    }

    printf("\033[%dA", HEIGHT + 2);
    draw_glass();
    fflush(stdout);
    frame++;
    struct timespec delay = {0, 50000000L};
    nanosleep(&delay, NULL);
  }

  return 0;
}

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

Спросил нейросеть, кто писал этот код «человек или нейронная сеть», вот ответ:

"Этот код выглядит очень сложным, содержит множество низкоуровневых операций, работу с цветами и графикой в консоли, а также использует рандомизацию и структуру данных. Стиль его написания — это довольно профессиональный, оптимизированный и технически сложный код, который мог бы быть написан опытным программистом.  
Однако, он также вполне может быть результатом генерации нейросетью, особенно если учитывать современные возможности нейросетей по написанию кода, способных создавать сложные программы с использованием структур данных, рандомизации и графических эффектов.  
Тем не менее, по стилю и уровню сложности, а также по использованию техник, характерных для профессиональных разработчиков (например, управление буферами, структурирование данных, использование низкоуровневых функций), вероятнее, что этот код писал человек, обладающий глубокими знаниями в области программирования.  
Если бы это был код, сгенерированный нейросетью, он, скорее всего, был бы чуть менее оптимальным или имел бы меньшую структурированность, хотя современные нейросети могут создавать очень сложные и качественные программы.  
Общий вывод: скорее всего, этот код написал человек.
"
AnonymUser
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 2)
Ответ на: комментарий от madcore

Спросил deepai.org (похоже, сеть справилась):

«Можешь наисать программу на языке С89 которая имитирует снегопад в терминалле Linux»

Конечно! Вот пример программы на языке C89, которая имитирует снегопад в терминале Linux. Она будет рисовать падающие снежинки с помощью символов '*' или '❄', случайно меняя их положение и скорость.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

#define WIDTH 80
#define HEIGHT 24
#define SNOWFLAKES 100

typedef struct {
    int x;
    int y;
    int speed;
    char symbol;
} Snowflake;

Snowflake snowflakes[SNOWFLAKES];

void init_snowflakes() {
    int i;
    for (i = 0; i < SNOWFLAKES; i++) {
        snowflakes[i].x = rand() % WIDTH;
        snowflakes[i].y = rand() % HEIGHT;
        snowflakes[i].speed = 1 + rand() % 3; // скорость 1-3
        snowflakes[i].symbol = (rand() % 2) ? '*' : '❄';
    }
}

void clear_screen() {
    // ANSI-код для очистки экрана
    printf("\033[2J");
    // Перемещение курсора в начало
    printf("\033[H");
}

void draw_snow(Snowflake snowflakes[], int count) {
    char screen[HEIGHT][WIDTH + 1];

    int i, x, y;

    // Заполняем экран пробелами
    for (i = 0; i < HEIGHT; i++) {
        for (x = 0; x < WIDTH; x++) {
            screen[i][x] = ' ';
        }
        screen[i][WIDTH] = '\0';
    }

    // Рисуем снежинки
    for (i = 0; i < count; i++) {
        y = snowflakes[i].y;
        x = snowflakes[i].x;
        if (y >= 0 && y < HEIGHT && x >= 0 && x < WIDTH) {
            screen[y][x] = snowflakes[i].symbol;
        }
    }

    // Выводим экран
    for (i = 0; i < HEIGHT; i++) {
        printf("%s\n", screen[i]);
    }
}

void update_snowflakes() {
    int i;
    for (i = 0; i < SNOWFLAKES; i++) {
        // Перемещение снежинки вниз с учетом скорости
        snowflakes[i].y += snowflakes[i].speed;

        // Если снежинка вышла за границы, перезапускаем ее сверху
        if (snowflakes[i].y >= HEIGHT) {
            snowflakes[i].x = rand() % WIDTH;
            snowflakes[i].y = 0;
            snowflakes[i].speed = 1 + rand() % 3;
            snowflakes[i].symbol = (rand() % 2) ? '*' : '❄';
        }
    }
}

int main() {
    int i;

    // Инициализация генератора случайных чисел
    srand(time(NULL));

    // Инициализация снежинок
    init_snowflakes();

    while (1) {
        clear_screen();
        draw_snow(snowflakes, SNOWFLAKES);
        update_snowflakes();

        // Пауза 100 миллисекунд
        usleep(100000);
    }

    return 0;
}
AnonymUser
() автор топика
Ответ на: комментарий от AnonymUser

Спросил deepai.org (похоже, сеть справилась):

а ты проверял?
её не смутило, что в char не влезет '❄'?
и зачем там захардкожены размеры терминала

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

Но в целом работает. Алиса тоже в общем справилась, но вместе со снегом сбрасывает ещё какой-то брусок или кирпич раз несколько секунд (ААА.. это курсор! У Алисы, кстати, код довольно понятный):

«Можешь написать программу на языке С89 которая имитирует снегопад в терминалле Linux»

Алиса

Вот простая программа на C89, которая имитирует снегопад в терминале Linux. Она использует ANSI‑escape‑последовательности для очистки экрана и позиционирования курсора, а также 


/* snow.c - простой снегопад в терминале (стандарт C89) */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

#define WIDTH 80
#define HEIGHT 24
#define SNOW_DENSITY 50   /* количество снежинок за кадр */

/* Очистить экран и вернуть курсор в (1,1) */
void clear_screen(void) {
    printf("\033[2J\033[H");
    fflush(stdout);
}

/* Установить позицию курсора (row, col), 1-based */
void move_cursor(int row, int col) {
    if (row < 1 || col < 1) return;
    printf("\033[%d;%dH", row, col);
    fflush(stdout);
}

int main(void) {
    int i, j;
    int snow_x[SNOW_DENSITY];
    int snow_y[SNOW_DENSITY];

    /* Инициализация генератора случайных чисел */
    srand((unsigned int)time(NULL));

    /* Начальные позиции снежинок */
    for (i = 0; i < SNOW_DENSITY; ++i) {
        snow_x[i] = rand() % WIDTH + 1;
        snow_y[i] = rand() % HEIGHT + 1;
    }

    clear_screen();

    /* Основной цикл анимации */
    while (1) {
        clear_screen();

        /* Отрисовка снежинок */
        for (i = 0; i < SNOW_DENSITY; ++i) {
            move_cursor(snow_y[i], snow_x[i]);
            putchar('*');
        }

        /* Обновление позиций */
        for (i = 0; i < SNOW_DENSITY; ++i) {
            snow_y[i] += 1;
            if (snow_y[i] > HEIGHT) {
                snow_y[i] = 1;
                snow_x[i] = rand() % WIDTH + 1;
            }
        }

        usleep(50000); /* ~20 FPS */
    }

    return 0;
}
AnonymUser
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 3)
Ответ на: комментарий от madcore

Почему у меня собирает?! gcc -v

Модель многопоточности: posix Supported LTO compression algorithms: zlib gcc версия 11.3.0 (Gentoo 11.3.0 p7)

Код Алисы проверь (я добавил только шатание снежинок рандомно… мой gcc собирает):

/* snow.c - простой снегопад в терминале (стандарт C89) */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

#define WIDTH 80
#define HEIGHT 24
#define SNOW_DENSITY 50   /* количество снежинок за кадр */

/* Очистить экран и вернуть курсор в (1,1) */
void clear_screen(void) {
    printf("\033[2J\033[H");
    fflush(stdout);
}

/* Установить позицию курсора (row, col), 1-based */
void move_cursor(int row, int col) {
    if (row < 1 || col < 1) return;
    printf("\033[%d;%dH", row, col);
    fflush(stdout);
}

int main(void) {
    int i, j, x, x2;
    int snow_x[SNOW_DENSITY];
    int snow_y[SNOW_DENSITY];

    /* Инициализация генератора случайных чисел */
    srand((unsigned int)time(NULL));

    /* Начальные позиции снежинок */
    for (i = 0; i < SNOW_DENSITY; ++i) {
        snow_x[i] = rand() % WIDTH + 1;
        snow_y[i] = rand() % HEIGHT + 1;
    }

    clear_screen();

    /* Основной цикл анимации */
    while (1) {
	/*Рандом от 0 - 3 для случайного смещения*/
	x = rand() % 3;
        clear_screen();

        /* Отрисовка снежинок */
        for (i = 0; i < SNOW_DENSITY; ++i) {
            move_cursor(snow_y[i], snow_x[i]);
            	/*Добавлено случайное смещение снежинок по x*/
		if (x !=0 && i%x==0)
		move_cursor(snow_y[i], snow_x[i]+x);
            printf(" \u2744 ");
        }

        /* Обновление позиций */
        for (i = 0; i < SNOW_DENSITY; ++i) {
            snow_y[i] += 1;
            if (snow_y[i] > HEIGHT) {
                snow_y[i] = 1;
                snow_x[i] = rand() % WIDTH + 1;
            }
        }

        usleep(200000); /* ~20 FPS */
    }

    return 0;
}

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

Почему у меня собирает?!

потому что, как повелось, ты не читаешь, что тебе пишут и не указал при сборке -Werror

gcc версия 11.3.0 (Gentoo 11.3.0 p7)

и, кроме того, что сейчас актуальная - 15 ветка, в слоте 11 такой версии тоже давно нет

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

Ладно. Если это:

snowflakes[i].symbol = (rand() % 2) ? '*' : '❄';

махнуть на это:

snowflakes[i].symbol = '*';

то собирает даже с -Werror .

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

Ну тупое -Werror ставить это тоже плохо, он будет на логических выражениях падать если в них не расставлены лишние скобки.

Но у меня gcc (10.2.1 из дебиана 11 дефолтный) даже с -Wall только про unused variable j пишет.

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

clang version 21.1.8 без всяких ключей еррорит

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

madcore ★★★★★
()

=)

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

/*Кошка*/
void main () {
	int i =0;
	while (i < 5) {
		i++;
     printf("\033[2J\033[H");
    printf("  ^  ^ \n");
    printf(" (- -)\n");
    printf("\\/    \\\n");
    printf("  | | \n");
    printf("   \\ \\ \n");
     usleep(500000);
    printf("\033[2J\033[H");
    printf("  ^  ^ \n");
    printf(" (+ +)\n");
    printf("\\/    \\\n");
    printf("  | | \n");
    printf("   \\ \\ \n");
      usleep(500000);
    printf("\033[2J\033[H");
    printf("  ^  ^ \n");
    printf(" (o o)\n");
    printf("\\/    \\\n");
    printf("  | | \n");
    printf("   \\ \\ \n");
      usleep(500000);
    printf("\033[2J\033[H");
    printf("  ^  ^ \n");
    printf(" (O o)\n");
    printf("\\/    \\\n");
    printf("  | | \n");
    printf("   \\ \\ \n");
      usleep(500000);
    printf("\033[2J\033[H");
    printf("\033[2J\033[H");
    printf("  ^  ^ \n");
    printf(" (O O)\n");
    printf("\\/    \\\n");
    printf("  | | \n");
    printf("   \\ \\ \n");
     usleep(900000);
	}
}

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

Переписал нагенерированное Алисой, и код стал понятен. Точнее не только код, но и алгоритм. 1-ый - цикл формирует значения по x и y. Далее while и в нем: 2-ой - печать, обновление, сброс курсора в конец. 3-ий - обновление позиций

  • добавлено шатание снежиники по x. И всего 50+ строк.
/* Снегопад. C (POSIX). Переписанный код после генерации нейросетью Алиса */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>  // Добавлен для использования time()

#define SNOWFLAKES_AMOUNT 500
#define WIDTH 180
#define HEIGHT 60

int main(void) {
    int snow_x[SNOWFLAKES_AMOUNT];
    int snow_y[SNOWFLAKES_AMOUNT];
	int i, x;
    srand((unsigned int)time(NULL));

    /* Начальные позиции снежинок */
    for ( i = 0; i < SNOWFLAKES_AMOUNT; ++i) {
        snow_x[i] = rand() % WIDTH + 1;
        snow_y[i] = rand() % HEIGHT + 1;
    }

    while (1) {
		/*Рандом от 0 - 3 для случайного смещения*/
		x = rand() % 3;
        /* Очистка экрана и возврат курсора в начало */
        printf("\033[2J\033[H");
        fflush(stdout);

        /* Печать снежинок */
        for (i = 0; i < SNOWFLAKES_AMOUNT; ++i) {
			/*Добавлено случайное смещение снежинок по x*/
			if (x !=0 && i%x==0)
            printf("\033[%d;%dH", snow_y[i], snow_x[i]+x);
            else
            printf("\033[%d;%dH", snow_y[i], snow_x[i]);
            fflush(stdout);
            printf("*");
        }
        /* Обновление — движение снежинок */
        for (i = 0; i < SNOWFLAKES_AMOUNT; ++i) {
            snow_y[i] += 1;
            if (snow_y[i] > HEIGHT) {
                snow_y[i] = 1;
                snow_x[i] = rand() % WIDTH + 1;
            }
        }
        usleep(100000);
    }
}


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

Может, оно так однажды и будет … Не хотелось бы, правда, чтобы с неба мусорный дождь шел…

А камнепад - это прямо, как в игре БК или Ультима Онлайн.

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

а что не так со шрифтами?
cairo и freetype уже везде пропатчены(?).
правильный порядок субпикселей для монитора + высокое разрешение(больше пикселей - плавнее кривые которые рисуют шрифты).

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