在同一个地方打印许多多行字符串

时间:2014-11-01 13:30:42

标签: java console ascii-art

我想在控制台应用程序中制作一个小动画,为此,我创建了一个ascii艺术:

                                   ______
                       ,.: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 \ n”不适用于多行文字)。

如果我不使用任何像curses这样的库就可以做到这一点会很棒(虽然我是Python中ncurses的忠实粉丝!)。

2 个答案:

答案 0 :(得分:2)

我认为诅咒或类似的东西是必要的。

正如我记得的那样(诅咒很久以前),诅咒有两点 - 不同的终端,以及慢速终端连接的效率。您将面临这两个问题,具体取决于终端的连接方式以及您最终想要重新绘制屏幕的频率。

Curses分析了所需的输出以确定绘制内容的最有效方法 - 它应该将光标定位三次并分别绘制内容,还是输出多行并只绘制一次?定位光标所需的字符序列是什么?

祝你好运,无论如何。

答案 1 :(得分:1)

为了让你有一些开始,这段代码打印了一个外粗圆,一个内细圆,以及在你的形状中心的一个kross随机 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());

另见:Print out an ASCII circle and axes