import collection.mutable.ArrayBuffer
class ASCIIArt(str:String){
val arr:ArrayBuffer[ArrayBuffer[String]] = new ArrayBuffer[ArrayBuffer[String]]()
if (str != null && !str.trim.eq("")){
str.split("[\r\n]+").foreach{
line =>
val s = new ArrayBuffer[String]()
s += line
arr += s
}
}
def this(){
this("")
}
def +(other:ASCIIArt):ASCIIArt={ //图案横向拼接
val art = new ASCIIArt()
val length = if (this.arr.length >= other.arr.length) this.arr.length else other.arr.length
for(i <- 0 until length){
val s = new ArrayBuffer[String]()
val thisArr:ArrayBuffer[String] = if (i < this.arr.length) this.arr(i) else {var temp=new ArrayBuffer[String]();temp += " "*10;temp}
val otherArr:ArrayBuffer[String] = if (i < other.arr.length) other.arr(i) else {var temp=new ArrayBuffer[String]();temp += " "*11;temp}
thisArr.foreach(s += _)
otherArr.foreach(s += _)
art.arr += s
}
art
}
def *(other:ASCIIArt):ASCIIArt={ //图案纵向拼接,且纵向的优先级高于横向的优先级(即*的优先级高于+的优先级)
val art = new ASCIIArt()
this.arr.foreach(art.arr += _)
other.arr.foreach(art.arr += _)
art
}
override def toString()={
var ss:String = ""
arr.foreach{
ss += _.mkString(" ") + "\n"
}
ss
}
}
object ASCIIArt_ex extends App{
val a = new ASCIIArt(""" /\_/\
| ( ' ' )
| ( - )
| | | |
| (__|__)
|""".stripMargin)
val b = new ASCIIArt(""" -----
| / Hello \
|< Scala |
| \ Coder /
| -----
|""".stripMargin)
println(a + b * b * b)
println(a + (a + b) * b * b)
println(a * b + a)
}
效果如下:
/\_/\ -----
( ' ' ) / Hello \
( - ) < Scala |
| | | \ Coder /
(__|__) -----
-----
/ Hello \
< Scala |
\ Coder /
-----
-----
/ Hello \
< Scala |
\ Coder /
-----
/\_/\ /\_/\ -----
( ' ' ) ( ' ' ) / Hello \
( - ) ( - ) < Scala |
| | | | | | \ Coder /
(__|__) (__|__) -----
-----
/ Hello \
< Scala |
\ Coder /
-----
-----
/ Hello \
< Scala |
\ Coder /
-----
/\_/\ /\_/\
( ' ' ) ( ' ' )
( - ) ( - )
| | | | | |
(__|__) (__|__)
-----
/ Hello \
< Scala |
\ Coder /
-----