Распечатать много строк мультилинии в одном месте
Я хотел бы сделать небольшую анимацию в консольном приложении, и для этого я создал 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