Распечатать много строк мультилинии в одном месте

Я хотел бы сделать небольшую анимацию в консольном приложении, и для этого я создал ascii art:

                                   ______
                       ,.:b-'::'     ,`::-/,._
                  _.\\,,-/` /| |     ,' .`| ,_: ,.
               ` -_,'[ ._-|/,'Y      ` `  /  -/,-.:`.
             ,'/[(o _.. _,".`':| ___  ::/|.`][,'/,,/,'`.
           `:-\-. `','\`,-' [:_,.....'__ ^..,|-.'-  ,,\ :.
         ,'-\-.` _ `[.-  --'             '-..`'-[''\ .L-",`.
       ,L< ':],, ,` ,-                       '- , .''Y"-'.-'`
     _'_,::''/-]._,'        _ ..     .._         `.`]'. -,-:,^.
    _'/,[``.-'/'-       _ :].-''`'''''--.[         -.  .|/:L:| \
    '[' ]>] ' /'       _,'                `-  .      ``\'` ,u[<L'
   /,`.  [-' /        ,`                    ,. `.     `.`,,``..| |
  P.P.`[o'),      ,''`__-.                 ,' /'\,      .\'( ; .:]
 /`/  `  .'/XXX  `,'    . -.             ,' ,'   `.       \.>  :,`
 | \.u[/\'|X   X/\'      'v ^,         ,' ,'       \     \ `^/:.-, |
.:-<.. [||/ XXX '/         `\ `\     ,' /'         .\     || \]::`.'
| |::>,-b|     ||            ^. '---' ,'           Y|     || [./.'/\
| /_,[| ||     ||              | ,.  /             ||     || |> --||
Y=]L__`=[|     ||              | ,-  '             ||     | ::_,==:
| |i .| |'.     \            /' ,..._ `'           ||     || /L. ,
|_]L,.'-] |     [\         ,- ,'     ,' '.         ||     'P..L, / |
 v...-L\ \\     `/.      ,' ,'         `. -_      /      /|'Y\-.`::'
 \  -:,'\..,     \`\  _,' /'             ^,      /,        .[-` ,'
  )_  '   '.\     `[`,  /'                 `.'\,''       /`..:-  |
   <`...,`./ `      `[.=                    `= /        ,_/-/.` ''
    \`[,-'.v'\`.      ".`._               _.:'         '-' '.>/ '
      [,_,L!`, [`       '  `-...______.,-'           v /'''|]:.'
      ``\ //'. .`.`.         ' --- -- ''          ',-|' '  b''
       `.Yv-]-, ',-.'-                          ,-'''\ [,.-,'
         `['./,L|'`.],..  .__           _    ,.',. .[ ]'v']
           `v-/|  <." ..`\-.. ::_   |: ,.-\\',.\'-  ' '','
             `.:`[/   / ' > .:',.||::_|/--'. ``,\ '/: '
                -',:.\`[| .'/,[/ L',]   ^  /``,] ``-`
                    -\|, -,: |`-|||/ |``.,..\`_,-'
                       ''--.' ==='|::::\'-''

(Да, это рулетка)

Я создал один и тот же арт ascii с мячом в разных позициях (как и крест на рулетке).

Моя проблема, я думаю, довольно сложная: я хотел бы напечатать рулетку на консоли примерно 4 раза в секунду (может быть, больше, не знаю точно) в одном и том же месте, чтобы это выглядело как гиф:), У меня нет проблем с загрузкой файлов (и преобразованием их в строку), но я не нашел способа переписать в том же месте ("\r" не будет работать для многострочного текста).

Было бы здорово, если бы я мог сделать это без использования какой-либо библиотеки, такой как curses (хотя я большой поклонник ncurses в Python!).

2 ответа

Решение

Я думаю, что проклятия или что-то вроде этого будет необходимо.

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

Проклятия проанализировали желаемый результат, чтобы определить наиболее эффективный способ рисовать вещи - должен ли он позиционировать курсор три раза и рисовать вещи отдельно, или выводить несколько линий и просто рисовать их один раз? И какие последовательности символов были необходимы для позиционирования курсора?

Удачи с этим, независимо.

Чтобы у вас было с чего начать, этот код печатает внешний толстый круг , внутренний тонкий круг и крест в центре вашей фигуры со случайными символами пунктуации ASCII:

                                  *$%,'"++-(                            
                      (,%,(#)&"("%#!'/%*.*)&                      
                %%%&"&'$#'*#/,)$-,/,$/'..*+/*%--#)                
              &.#'''&.(,%)""$'-/.&.".(+)$##,)%.*))'$              
            )-.+,#*'*./&+)"$#,,$+')*%*.")"$(%-)&-$/(-&            
          $(%#/)'*-!%)."#'              *%..&**,*.!%.+/'          
        ('&!"%!-$/#,*/                      !.-&.)+!#!."/!        
      *+#/!)&$'+-$                              &$//)$*/.#(*      
    .$-+&'+).'!%          .'/+,-&#&!%,,%          ($$'),-,&*!'    
    '*"#!/(.&(        /"$%!'%%'+$+$/&-/!(+/!        %".%).%&//    
    $+''.)/&.#      **""**              )&/(*.      /,-%-*(,'&    
  +&*//##+.&      ,'&*&$                  ,+$$)-      $)%$#))!..  
  /'"#!$%.'&      +#/)  (&              -.  ".--      &(/+'#,)%*  
  '$.#-,//      $&'!      &+          "#      !/,'      ,-+&/$#,  
%'%+)&,,$'      ".$(        .!      (-        +$'"      /(&'.*,(&*
!#/%"/.-+)      $+,.          "&  .-          +($#      )'.#!&"(./
%&$"%%/).$      -%"#            &%            $%'$      ,#"$,(-#$.
!$"$#*(#*)      +*&#          &*  $#          ###&      *'$/#,.)(.
"$(*-'.*!(      $""/        ),      %,        $/&(      %*&$$)'-,&
  /,#-$-**      +**-      %$          $-      (.%,      %$(%*)+'  
  #*,**,&(%*      /"*"  &/              #-  '&##      ,./+'$&,&(  
  &!!&*--*+%      /#-.)&                  !"#/%-      ',".&-#!+*  
    '$'"!"*"$"      !.)(,"              .,&,.)      -+)$//$/*+    
    '/#&"+%%-"        ',+*,&&)/!**-$,$/(*!+'        .!#-$'..$(    
    -#&%!-%),"--          --+#-,$!#-#$/+          +/'#*#*#*+./    
      ()$"**!$//'/                              +"+(+/,)%)*"      
        "+#'.$'-!*&"&$                      )/!..,(-&.*/#(        
          )-#%/#!!!.$..#)*              $'/%-/+#+)%.-*'.          
            /'#-+.%#$),)$/**%%&++%#,)"(+/,&((-($*'"+'*            
              *!**!+,#&-&-%"&&..,*/(&'!/&##-/&*+%%,"              
                /."($&$'!!))/&$#%))"/*&&)!"'$%/,+-                
                      (+$.-)%#*#!$.)*###/*&(                      
                            #"*'"*#+(!                            

Java 8:

      int r = 16;
IntStream.rangeClosed(-r, r)
        .map(Math::abs)
        .peek(i -> IntStream.rangeClosed(-r, r)
                .map(Math::abs)
                // printing a kind of thick circle,
                // thin circle and cross in the center
                .mapToObj(j -> i == j && i < r/3 || // cross
                        // outer thick circle
                        Math.abs(i*i + j*j - r*r/1.3) < 4*r ||
                        // inner thin circle
                        Math.abs(i*i + j*j - r*r/4) < r
                        // cast to String
                        ? ""
                        // two random ASCII punctuation
                        // symbols: !"#$%&'()*+,-./
                        + (char) (33 + Math.random() * 15)
                        + (char) (33 + Math.random() * 15)
                        // two whitespaces
                        : "  ")
                .forEach(System.out::print))
        .forEach(i -> System.out.println());

См. Также: Распечатайте круг и оси ASCII

Другие вопросы по тегам