长大后,我的第一个游戏机系统是一个Atari 2600,我将永远有一个爱的游戏,我是如此喜欢在孩提时代。许多图形仍然令人难忘,甚至是标志性的。
事实证明,这些精灵是非常简单的位图,8像素宽的可变高度,其中二进制表示是像素的排列。
例如,十六进制字节0x18,0x24,0x18将画一个粗圆,如下所示:
0x18: 00011000
0x24: 00100100
0x18: 00011000由于8像素宽创建相当小的图形(甚至按照Atari 2600标准),通常会将同一图像的高度、宽度或两者加倍或四倍,以创建一个更大(但更大的块状和扭曲的)版本。他们通常也会被翻转垂直或水平的球员精灵和操场。游戏战斗就是一个很好的例子。
面临的挑战是,编写代码以ASCII格式将这些精灵显示为“图形”,包括垂直、水平或两者都能拉伸或翻转它们。这必须以完整程序或可调用函数的形式出现。
bmp1 = [ 0x06, 0x0F, 0xF3, 0xFE, 0x0E, 0x04, 0x04, 0x1E, 0x3F, 0x7F, 0xE3, 0xC3, 0xC3, 0xC7, 0xFF, 0x3C, 0x08, 0x8F, 0xE1, 0x3F ]
bmp2 = [ 0x07, 0xFD, 0xA7 ]
bmp3 = [ 0x00, 0x8E, 0x84, 0xFF, 0xFF, 0x04, 0x0E, 0x00 ]
bmp4 = [ 0x00, 0xFC, 0xFC, 0x38, 0x3F, 0x38, 0xFC, 0xFC]注意:上面的示例输入字节数组是以十六进制形式提供的。如果您的平台不接受十六进制字面值的字节表示,您可以将它们转换为本机字节等效文字。
f( bmp1, 1, 1 ) =>
--------
XX
XXXX
XXXX XX
XXXXXXX
XXX
X
X
XXXX
XXXXXX
XXXXXXX
XXX XX
XX XX
XX XX
XX XXX
XXXXXXXX
XXXX
X
X XXXX
XXX X
XXXXXX
--------
f( bmp1, -2, 1 ) =>
----------------
XXXX
XXXXXXXX
XXXX XXXXXXXX
XXXXXXXXXXXXXX
XXXXXX
XX
XX
XXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXX XXXXXX
XXXX XXXX
XXXX XXXX
XXXXXX XXXX
XXXXXXXXXXXXXXXX
XXXXXXXX
XX
XXXXXXXX XX
XX XXXXXX
XXXXXXXXXXXX
----------------
f( bmp2, 1, 2 ) =>
--------
XXX
XXX
XXXXXX X
XXXXXX X
X X XXX
X X XXX
--------
f( bmp2, 2, 1 ) =>
----------------
XXXXXX
XXXXXXXXXXXX XX
XX XX XXXXXX
----------------
f( bmp2, -2, -2 ) =>
----------------
XXXXXX XX XX
XXXXXX XX XX
XX XXXXXXXXXXXX
XX XXXXXXXXXXXX
XXXXXX
XXXXXX
----------------
f( bmp3, 1, -1 ) =>
--------
XXX
X
XXXXXXXX
XXXXXXXX
X X
X XXX
--------
f( bmp3, 3, 3 ) =>
------------------------
XXX XXXXXXXXX
XXX XXXXXXXXX
XXX XXXXXXXXX
XXX XXX
XXX XXX
XXX XXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXX
XXX
XXX
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX
------------------------
f( bmp4, -1, -1 ) =>
--------
XXXXXX
XXXXXX
XXX
XXXXXX
XXX
XXXXXX
XXXXXX
--------
f( bmp4, 4, 2 ) =>
--------------------------------
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
--------------------------------注意:上面和下面的水平线表示输出的开始和结束。它们在输出中并不是必需的,但是在开始和/或结束时需要空行(由所有零/空格表示),如图所示。
注2:这些测试位图的灵感来源于维基百科上被标记为“合理使用”的游戏截图,并重新绘制/编码。
发布于 2019-01-29 14:15:46
发布于 2019-04-05 07:37:01
N+E+R:-N<1,R=[];N-1+E+S,R=[E|S].
N*E*R:-R=E,E=[];N<0,reverse(E,F),-N*F*R;[H|T]=E,N+H+S,N*T*U,append(S,U,R).
N/E/R:-N<1,R=[];(E<N,D=E,F=32;D=E-N,F=35),N/2/D/C,R=[F|C].
[H|T]^X^Y^R:-128/H/A,X*A*B,Y*[[10|B]]*C,append(C,D),(T=[],R=D;T^X^Y^S,append(D,S,R)).N+E+R:-N<1,R=[];N-1+E+S,R=[E|S]. Make `R` a list containing `E` repeated `N` times
N<1,R=[] If `N<1`, let `R` be the empty list
N-1+E+S Else recurse with `N-1`, `E` and `S`
R=[E|S] Let `R` be a new list with `E` as head and `S` as tail
N*E*R:-R=E,E=[];N<0,reverse(E,F),-N*F*R;[H|T]=E,N+H+S,N*T*U,append(S,U,R).
Let `R` be a list
with each element in `E` repeated `N` times
e.g. 2*[3, 6] -> [3, 3, 6, 6]
R=E,E=[] Let `R` be `E` if `E` is the empty list
N<0,reverse(E,F) Else if `N<0`, let `F` be the reverse of `E`
-N*F*R Recurse with `-N`, `F` and `R`
[H|T]=E Else let `H` be the head and `T` be the tail of `E`
N+H+S Let `S` be `N+H+S` (our function, not addition)
N*T*U Recurse with `N`, `T` and `U`
append(S,U,R) let `R` be the concatenation of `S` and `U`
N/E/R:-N<1,R=[];(E<N,D=E,F=32;D=E-N,F=35),N/2/D/C,R=[F|C].
Make `R` the binary representation of `E`
with `N` as the value of the current bit
where 0 and 1 are space and hash respectively
N<1,R=[] If `N<1` let `R` be the empty list
(
E<N,D=E,F=32 If `E<N` the bit isn't set, so `D=E`, `F=space`
D=E-N,F=35 Else `D=E-N`, `F=hash`
)
N/2/D/C Recurse with `N/2`, `D` and `C`
R=[F|C] Let `R` be a new list with `F` as head and `C` as tail
[H|T]^X^Y^R:-128/H/A,X*A*B,Y*[[10|B]]*C,append(C,D),(T=[],R=D;T^X^Y^S,append(D,S,R)).
Make `R` the result,
with inputs being the list `[H|T]`
and the scales `X` and `Y`
128/H/A Let `A` be the binary representation of `H` (8 bits)
X*A*B Let `B` be `A` with each element repeated `X` times
Y*[[10|B]]*C Let `C` be `B` with a newline prepended,
repeated `Y` times
append(C,D) Let `D` be `C` flattened by one level (joining lines)
(
T=[],R=D If `T` is empty, let `R` be `D`
T^X^Y^S Else recurse with `T`, `X`, `Y` and `S`
append(D,S,R) Let `R` be the concatenation of `D` and `S`
)https://codegolf.stackexchange.com/questions/179225
复制相似问题