Autor Wątek: Prosta animacja ascii ?  (Przeczytany 6102 razy)

Offline _user

  • Użytkownik

# Maj 14, 2015, 21:34:42
Napisalem taki kod:
#include<stdio.h>

 int main(void){
   char gw='*';
   char kr='.';
   int liczba=0;

   scanf("%i", &liczba);
   int a=1;
   int c=liczba-1;
   int d=liczba;
   int e=0;
   if(liczba==0){
     printf("Program nie moze sie wykonac dla wartosci 0.\n");
     printf("Koncze dzialanie");
     return 1;
   }
   if(liczba>0){
     while(a!=liczba+1){
       for(int i=0;i<a;++i)
printf("%c", gw);
       for(int i=0;i<c;++i)
printf("%c", kr);
       for(int i=0;i<d;++i)
printf("%c", gw);
       for(int i=0;i<e;++i)
printf("%c", kr);
       
       printf("\n");
       ++a;
       --c;
       --d;
       ++e;
     }
     a=1;
     c=liczba-1;
     d=liczba;
     e=0;
     while(a!=liczba+1){
       for(int i=0;i<c;++i)
printf("%c", kr);
       for(int i=0;i<a;++i)
printf("%c", gw);
       for(int i=0;i<e;++i)
printf("%c", kr);
       for(int i=0;i<d;++i)
printf("%c", gw);
     
       
       printf("\n");
       ++a;
       --c;
       --d;
       ++e;
     }
   }
   if(liczba<0){
     liczba=liczba-liczba*2;
     a=1;
     c=liczba-1;
     d=liczba;
     e=0;
     while(a!=liczba+1){
       for(int i=0;i<e;++i)
printf("%c", kr);
       for(int i=0;i<d;++i)
printf("%c", gw);
       for(int i=0;i<c;++i)
printf("%c", kr);
       for(int i=0;i<a;++i)
printf("%c", gw);
       
       printf("\n");
       ++a;
       --c;
       --d;
       ++e;
     }
     a=1;
     c=liczba-1;
     d=liczba;
     e=0;
     while(a!=liczba+1){
       for(int i=0;i<d;++i)
printf("%c", gw);
       for(int i=0;i<e;++i)
printf("%c", kr);
       for(int i=0;i<a;++i)
printf("%c", gw);
       for(int i=0;i<c;++i)
printf("%c", kr);
   
       printf("\n");
       ++a;
       --c;
       --d;
       ++e;
     }
   }
     return 0;
 }
Zaleznie od tego czy podamy liczbe dodatnia czy ujemna wyswietli sie troszke inaczej, oczywiscie jesli zabrac z tamtad te dwa if'y to wyswietli obydwa obrazki, ale zastanawiam sie czy mozna zrobic tak zeby dac to w petle nieskonczona i po wyswietleniu jednego wariantu, nie pod nim tylko w jego miejsce wyswietlal sie drugi i na odwrot i w kolko?
« Ostatnia zmiana: Maj 15, 2015, 12:19:03 wysłana przez _user »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xirdus

  • Moderator

# Maj 14, 2015, 21:38:47
Musisz wyczyścić konsolę. Jest na to wiele metod, jedną z najprostszych i najgorszych jest funkcja system("cls") (dla Windowsa - na Unixach masz system("clear")).

Offline _user

  • Użytkownik

# Maj 14, 2015, 21:40:17
nie o to mi chodzilo dokladnie ;p chcialbym dac kod w petle nieskonczona i tam zeby te dwa "obrazki"  sie zmienialy

Offline CheshireCat

  • Użytkownik

# Maj 14, 2015, 21:59:30
ale zastanawiam sie czy mozna zrobic tak zeby dac to w petle nieskonczona i po wyswietleniu jednego wariantu, nie pod nim tylko w jego miejsce wyswietlal sie drugi i na odwrot i w kolko?

Tak - można tak zrobić.

Btw. ten kod wygląda dość brzydko.

Offline mawpa

  • Użytkownik

  • +4
# Maj 14, 2015, 23:13:18
Z reguły nie lubię dawać gotowców, ale mam dobry dzień.

Kod: (C) [Zaznacz]
#include <stdio.h>
#include <time.h>

int main()
{
  char* wiatrak = "\\|/-";
  int limit = strlen(wiatrak);
  int index = 0;

  while(1)
  {
    printf("\b%c", wiatrak[index++]);
    index %= limit;
    _sleep(100);
  }

  return 0;
}

Edit: Pisze się "ASCII".
« Ostatnia zmiana: Maj 14, 2015, 23:21:14 wysłana przez mawpa »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

  • +5
# Maj 15, 2015, 10:50:35
Taak... też sobie czasem robię wiatraczek, tyle że w bardziej kompaktowej wersji. :)
printf("\b%c","\\|/-"[index++&3]);

Offline _user

  • Użytkownik

# Maj 15, 2015, 12:18:52
ooo, dzieki ! :)
i czemu CheshireCat mowisz ze brzydko wyglada ;c mi tam sie podoba
Okej dalem to sleep ale obrazy sie nie zamieniaja tylko wyswietlaja jeden pod drugim a wrzucilem to tak:
#include<stdio.h>
#include<time.h>
#include <unistd.h>

 int main(void){
   char gw='*';
   char kr='.';
   int liczba=0;

   scanf("%i", &liczba);
   int a=1;
   int c=liczba-1;
   int d=liczba;
   int e=0;
   if(liczba==0){
     printf("Program nie moze sie wykonac dla wartosci 0.\n");
     printf("Koncze dzialanie");
     return 1;
   }
   while(1){
   while(a!=liczba+1){
     for(int i=0;i<a;++i)
       printf("%c", gw);
     for(int i=0;i<c;++i)
       printf("%c", kr);
     for(int i=0;i<d;++i)
       printf("%c", gw);
     for(int i=0;i<e;++i)
       printf("%c", kr);
       
       printf("\n");
       ++a;
       --c;
       --d;
       ++e;
     }
     a=1;
     c=liczba-1;
     d=liczba;
     e=0;
     while(a!=liczba+1){
       for(int i=0;i<c;++i)
printf("%c", kr);
       for(int i=0;i<a;++i)
printf("%c", gw);
       for(int i=0;i<e;++i)
printf("%c", kr);
       for(int i=0;i<d;++i)
printf("%c", gw);
     
       
       printf("\n");
       ++a;
       --c;
       --d;
       ++e;
     }
     sleep(2);
     a=1;
     c=liczba-1;
     d=liczba;
     e=0;
     while(a!=liczba+1){
       for(int i=0;i<e;++i)
printf("%c", kr);
       for(int i=0;i<d;++i)
printf("%c", gw);
       for(int i=0;i<c;++i)
printf("%c", kr);
       for(int i=0;i<a;++i)
printf("%c", gw);
       
       printf("\n");
       ++a;
       --c;
       --d;
       ++e;
     }
     a=1;
     c=liczba-1;
     d=liczba;
     e=0;
     while(a!=liczba+1){
       for(int i=0;i<d;++i)
printf("%c", gw);
       for(int i=0;i<e;++i)
printf("%c", kr);
       for(int i=0;i<a;++i)
printf("%c", gw);
       for(int i=0;i<c;++i)
printf("%c", kr);
     
       printf("\n");
       ++a;
       --c;
       --d;
       ++e;
     }
     sleep(2);
   }
     return 0;
 }
co zrobic zeby sie zmienialy zamiast wyswietlac jeden pod drugim ?
« Ostatnia zmiana: Maj 15, 2015, 12:38:36 wysłana przez _user »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Maj 15, 2015, 12:42:02
Cytuj
co zrobic zeby sie zmienialy zamiast wyswietlac jeden pod drugim ?
Masz: \n - przejście do początku następnej linii
Powinieneś mieć: \r - powrót do początku obecnej linii

Offline _user

  • Użytkownik

# Maj 15, 2015, 12:58:22
Dalem \r ale dalej w linijkach pod spodem sie wszystko wyswietla
#include<stdio.h>
#include <unistd.h>

int main(void){
  char gw='*';
  char kr='.';
  int liczba=0;

  scanf("%i", &liczba);
  int a=1;
  int c=liczba-1;
  int d=liczba;
  int e=0;
  if(liczba==0){
    printf("Program nie moze sie wykonac dla wartosci 0.\n");
    printf("Koncze dzialanie");
    return 1;
  }
  for(;;){
    while(a!=liczba+1){
      for(int i=0;i<a;++i)
printf("%c", gw);
      for(int i=0;i<c;++i)
printf("%c", kr);
      for(int i=0;i<d;++i)
printf("%c", gw);
      for(int i=0;i<e;++i)
printf("%c", kr);

      printf("\n");
      ++a;
      --c;
      --d;
      ++e;
    }
    a=1;
    c=liczba-1;
    d=liczba;
    e=0;
    while(a!=liczba+1){
      for(int i=0;i<c;++i)
printf("%c", kr);
      for(int i=0;i<a;++i)
printf("%c", gw);
      for(int i=0;i<e;++i)
printf("%c", kr);
      for(int i=0;i<d;++i)
printf("%c", gw);


      printf("\r");
      ++a;
      --c;
      --d;
      ++e;
    }
    sleep(1);

    a=1;
    c=liczba-1;
    d=liczba;
    e=0;
    while(a!=liczba+1){
      for(int i=0;i<e;++i)
printf("%c", kr);
      for(int i=0;i<d;++i)
printf("%c", gw);
      for(int i=0;i<c;++i)
printf("%c", kr);
      for(int i=0;i<a;++i)
printf("%c", gw);

      printf("\n");
      ++a;
      --c;
      --d;
      ++e;
    }
    a=1;
    c=liczba-1;
    d=liczba;
    e=0;
    while(a!=liczba+1){
      for(int i=0;i<d;++i)
printf("%c", gw);
      for(int i=0;i<e;++i)
printf("%c", kr);
      for(int i=0;i<a;++i)
printf("%c", gw);
      for(int i=0;i<c;++i)
printf("%c", kr);

      printf("\r");
      ++a;
      --c;
      --d;
      ++e;
    }
    sleep(1);
  }
  return 0;
}
a jesli zrobie tak to sie nic nie wyswietla:
#include<stdio.h>
#include <unistd.h>

int main(void){
  char gw='*';
  char kr='.';
  int liczba=0;

  scanf("%i", &liczba);
  int a=1;
  int c=liczba-1;
  int d=liczba;
  int e=0;
  if(liczba==0){
    printf("Program nie moze sie wykonac dla wartosci 0.\n");
    printf("Koncze dzialanie");
    return 1;
  }
  for(;;){
    while(a!=liczba+1){
      for(int i=0;i<a;++i)
printf("%c", gw);
      for(int i=0;i<c;++i)
printf("%c", kr);
      for(int i=0;i<d;++i)
printf("%c", gw);
      for(int i=0;i<e;++i)
printf("%c", kr);

      printf("\r");
      ++a;
      --c;
      --d;
      ++e;
    }
    a=1;
    c=liczba-1;
    d=liczba;
    e=0;
    while(a!=liczba+1){
      for(int i=0;i<c;++i)
printf("%c", kr);
      for(int i=0;i<a;++i)
printf("%c", gw);
      for(int i=0;i<e;++i)
printf("%c", kr);
      for(int i=0;i<d;++i)
printf("%c", gw);


      printf("\r");
      ++a;
      --c;
      --d;
      ++e;
    }
    sleep(1);

    a=1;
    c=liczba-1;
    d=liczba;
    e=0;
    while(a!=liczba+1){
      for(int i=0;i<e;++i)
printf("%c", kr);
      for(int i=0;i<d;++i)
printf("%c", gw);
      for(int i=0;i<c;++i)
printf("%c", kr);
      for(int i=0;i<a;++i)
printf("%c", gw);

      printf("\r");
      ++a;
      --c;
      --d;
      ++e;
    }
    a=1;
    c=liczba-1;
    d=liczba;
    e=0;
    while(a!=liczba+1){
      for(int i=0;i<d;++i)
printf("%c", gw);
      for(int i=0;i<e;++i)
printf("%c", kr);
      for(int i=0;i<a;++i)
printf("%c", gw);
      for(int i=0;i<c;++i)
printf("%c", kr);

      printf("\r");
      ++a;
      --c;
      --d;
      ++e;
    }
    sleep(1);
  }
  return 0;
}
probowalem tez tak ale tez na nic:
#include<stdio.h>
#include <unistd.h>

int main(void){
  char gw='*';
  char kr='.';
  int liczba=0;

  scanf("%i", &liczba);
  int a=1;
  int c=liczba-1;
  int d=liczba;
  int e=0;
  if(liczba==0){
    printf("Program nie moze sie wykonac dla wartosci 0.\n");
    printf("Koncze dzialanie");
    return 1;
  }
  for(;;){
    while(a!=liczba+1){
      for(int i=0;i<a;++i)
printf("%c", gw);
      for(int i=0;i<c;++i)
printf("%c", kr);
      for(int i=0;i<d;++i)
printf("%c", gw);
      for(int i=0;i<e;++i)
printf("%c", kr);

      printf("\n");
      ++a;
      --c;
      --d;
      ++e;
    }
    a=1;
    c=liczba-1;
    d=liczba;
    e=0;
    while(a!=liczba+1){
      for(int i=0;i<c;++i)
printf("%c", kr);
      for(int i=0;i<a;++i)
printf("%c", gw);
      for(int i=0;i<e;++i)
printf("%c", kr);
      for(int i=0;i<d;++i)
printf("%c", gw);


      printf("\n");
      ++a;
      --c;
      --d;
      ++e;
    }
    sleep(1);
    printf("\r");
    a=1;
    c=liczba-1;
    d=liczba;
    e=0;
    while(a!=liczba+1){
      for(int i=0;i<e;++i)
printf("%c", kr);
      for(int i=0;i<d;++i)
printf("%c", gw);
      for(int i=0;i<c;++i)
printf("%c", kr);
      for(int i=0;i<a;++i)
printf("%c", gw);

      printf("\n");
      ++a;
      --c;
      --d;
      ++e;
    }
    a=1;
    c=liczba-1;
    d=liczba;
    e=0;
    while(a!=liczba+1){
      for(int i=0;i<d;++i)
printf("%c", gw);
      for(int i=0;i<e;++i)
printf("%c", kr);
      for(int i=0;i<a;++i)
printf("%c", gw);
      for(int i=0;i<c;++i)
printf("%c", kr);

      printf("\n");
      ++a;
      --c;
      --d;
      ++e;
    }
     printf("\r");
    sleep(1);
  }
  return 0;
}

@btw a program mawpa wgl mi nic nie pokazuje

sprobowalem tez czegos najprostszego ale tutaj tez mi nic nie wyswietla...
#include<stdio.h>
#include<unistd.h>

int main(void){
  while(1){
  printf("===");
  printf("\r");
  sleep(1);
  printf("---");
  printf("\r");
  sleep(1);
  }
  return 0;
}
« Ostatnia zmiana: Maj 15, 2015, 13:12:26 wysłana przez _user »

Offline Xirdus

  • Moderator

# Maj 15, 2015, 14:51:00
Mówiłem żeby użyć system("cls") :P

Offline _user

  • Użytkownik

# Maj 15, 2015, 15:44:22
"clear" ;)
Ok to jak ktos bedzie wiedzial dlaczego u mnie to nie dziala to czekam

Offline Xirdus

  • Moderator

# Maj 15, 2015, 15:51:16
"clear" ;)
No to jak Unix to zostają jeszcze ANSI Escape Codes (które nota bene zostały stworzone dokładnie do tego co próbujesz zrobić, w przeciwieństwie do \r).

Offline voytech

  • Użytkownik

# Maj 15, 2015, 15:51:40
Sprawdziłem twój ostatni kod pod windowsem (mingw64) w terminalu "msys2" i "cmd", i tylko ten ostatni działa. Wygląda na to, że sporo zależy od ustawień terminala.

dodałem fflush(stdout) i w terminalu msys2 zaczęło wyświetlać '---' na przemian z '===' w tym samym miejscu:
Kod: (c) [Zaznacz]
#include<stdio.h>
#include<unistd.h>

int main(void){
while(1){
printf("===");
printf("\r");
fflush(stdout);
sleep(1);
printf("---");
printf("\r");
fflush(stdout);
sleep(1);
}
return 0;
}

Zastanów się na tym "cls", wtedy można zrobić nawet jakieś proste menu tekstowe, albo lepiej skorzystać z odpowiedniej biblioteki dla terminali tekstowych np. ncurses?

Offline _user

  • Użytkownik

# Maj 15, 2015, 16:58:40
@voytech - dzieki, ten kod dziala :)
@Xirdus - A jak uzywac tych ascii espace codes, gdzie moge o tym przeczytac ?

Offline Xirdus

  • Moderator

# Maj 15, 2015, 17:28:10
@Xirdus - A jak uzywac tych ascii espace codes, gdzie moge o tym przeczytac ?
Tutaj masz trochę info.