프로토 스페이스 침략자


18

프로토 스페이스 침략자

이는 작업이 언어별로 가장 짧은 코드를 제공하는 그래픽 출력 문제입니다.

직무

코드는 사용자가 화면 / 창 주위에서 다음 외계인을 움직일 수 있도록해야합니다.

여기에 이미지 설명을 입력하십시오

코드는 단순히 로컬 파일에서 코드를로드 할 수 있습니다. 주석을 다른 표준 이미지 형식으로 변환하거나 주석에서 지적한 이미지의 작은 픽셀 오류를 수정하십시오.

배경은 흰색이어야하고 창 / 화면은 400 x 400 픽셀 이상이어야합니다. 언어가 큰 창 / 스크린을 지원하지 않으면 가장 큰 크기를 사용하고 200 x 200 이상인 한 지원합니다.

외계인을 화면 주위로 이동 시키려면 코드가 표준 키보드의 화살표 키를 사용하여 위 / 아래 / 왼쪽 / 오른쪽을 지원해야합니다.

코드는 완전한 프로그램 이어야합니다 .

제한 / 제약

외계인은 국경에서 멈춰야합니다. 또한 깜박 거림이나 끊김 현상이 눈에 띄지 않고 균일 한 속도로 부드럽게 움직여야하며 24fps 이상으로 표시되어야합니다. 화면 / 창의 한 쪽에서 다른쪽으로 가려면 2 ~ 5 초가 걸립니다.

언어와 라이브러리

원하는 언어 나 라이브러리를 사용할 수 있습니다 (이 과제를 위해 설계되지 않았습니다). 그러나 가능한 경우 코드를 테스트하여 우분투에서 코드를 실행하는 방법에 대한 명확한 지침을 제공 할 수 있다면 대단히 감사하겠습니다.

목록

이 게시물의 맨 아래에있는 스택 스 니펫은 답변 a) 언어 당 가장 짧은 솔루션 목록으로, b) 전체 리더 보드로 카탈로그를 생성합니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

## Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

## Ruby, <s>104</s> <s>101</s> 96 bytes

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

## Perl, 43 + 2 (-p flag) = 45 bytes

언어 이름을 링크로 만들면 스 니펫에 표시됩니다.

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


2
외계인을 직접 만들 수 있습니까? 그렇다면 그림의 픽셀 오류를 포함시켜야합니까?
mınxomaτ

@ mınxomaτ 리눅스에만 국한되지 않습니다! "가능한 경우"를 참고하십시오.

@nimi 감사합니다. 로컬 파일에서로드 할 수 있음을 추가했습니다.

@ mınxomaτ 직접 구성하거나 로컬 파일에서로드 할 수 있습니다. 픽셀 오류는 눈치 채지 못했지만로드하면 코드가 적을 것이라고 가정합니다.

"경계 지점"을 정의 할 수 있습니까? 외계인 전체를 항상 볼 수 있어야합니까, 아니면 부분적으로 국경 바깥에서 멈출 수 있습니까?
timothymh

답변:


12

스크래치 , 221 217 바이트

이미지를 클릭하면 실제로 볼 수 있습니다. 움직임은 키 입력 에 의해 결정 되므로 키 반복이 더 빨리 설정 될수록 더 부드럽습니다.

이미지가 프로젝트에 포함되어 있지만, 스크래치 바이트는 일반적으로 golfed에서 계산됩니다 텍스트 표현 에 따라, 이 메타 포스트 . 이것이 수용 가능한지 (또는 움직임이 충분히 매끄럽지 않은지)에 대해 의견이 일치하지 않으면 알려 주시면 해결해 드리겠습니다.


이 답변은 많은 재미입니다!

이 프로그램의 크기를 어떻게 측정 했습니까?

@Lembik은 두 번째 단락을 참조하십시오.
timothymh

1
217 바이트 생성 scratchblocks.github.io/...
ev3commander

1
@Mauris 예, "가장자리에 있으면 바운스"명령이 처리합니다. 이미지를 클릭하여 데모를 재생할 수 있습니다!
timothymh 2016

7

2 처리 219 199 241 220 219 바이트

int a,x=0,y=0;void setup(){size(500,500);}void draw(){background(-1);image(loadImage(".png"),x,y);if(keyPressed){a=keyCode;if(a==38)y--;if(a==37)x--;if(a==40)y++;if(a==39)x++;}x=constrain(x,0,436);y=constrain(y,0,454);}

.png.pde와 동일한 디렉토리에 이미지를 저장해야합니다.


6

파이썬 2, 262 253 246 240 바이트

from pygame import*
init()
key.set_repeat(1)
p=[0,0]
d=display
c=d.set_mode((400,)*2)
while c.fill((255,)*3):
 e=event.get(2);c.blit(image.load("I"),p);d.flip()
 if e:x=e[0].key+1;q=x&2;b=q/2;p[b]=max(0,min(336+b*16,p[b]+(1-q)*(1-(2*x&2))))

와. 정말 많은 해커입니다.

http://pygame.org에있는 'pygame'모듈을 사용 하십시오 .

설명

key.set_repeat(1) -밀리 초마다 이벤트 시스템을 통해 반복 키 이벤트를 보냅니다.

c=d.set_mode((400,)*2) -400x400 디스플레이 표면 만들기

while c.fill((255,)*3):-유효 while 1:하지만 화면을 지 웁니다.

e=event.get(2);c.blit(image.load("I"),p);d.flip()-키보드 이벤트 만 수집 I하고 호출 된 png 파일에 저장된 이미지를로드하여 그 립니다. 화면 업데이트

if e:x=e[0].key+1;q=x&2;b=q/2;p[b]=max(0,min(336+b*16,p[b]+(1-q)*(1-(2*x&2)))) -이벤트가 발생한 경우 어떤 화살표 키를 눌렀는지 확인하고 (다른 키를 누르면 이상한 일이 발생 함) 누른 키에 따라 표면의 위치를 ​​변경하십시오.


나는 당신의 해결책을 정말로 좋아합니다.

@Lembik 따라서 단일 바이트 파일 이름이 허용됩니까? (즉, 확장이 없습니까?). 그렇다면 바이트 수에서 파일 이름을 완전히 제외하는 것이 좋습니다.
mınxomaτ

@ mınxomaτ 단일 바이트 파일 이름은 허용되지만 새로운 점수 체계를 발명하고 싶지 않습니다.

@Lembik Processing은 싱글 바이트 파일 이름을 처리 할 수 ​​없으므로 불공평합니다.
TheDoctor

2
@TheDoctor 이것만으로 : 다른 언어가 다릅니다! 나는 또한 우리가 stdin으로부터 입력을받는 도전을 허용하지
않는다고 제안

5

하스켈, 410 바이트

import Graphics.Gloss
import Graphics.Gloss.Interface.Pure.Game
main=do b<-loadBMP"b";play(InWindow""(400,400)(0,0))white 200((0,0),id)(b#)e(%)
e(EventKey(SpecialKey k)Down _ _)(c,_)|k==KeyUp=(c,fmap(+1))|k==KeyDown=(c,fmap(+(-1)))|k==KeyLeft=(c,((+(-1))?))|k==KeyRight=(c,((+1)?))
e(EventKey _ Up _ _)(c,_)=(c,id)
e _ w=w
_%(c,f)=(s?(s<$>f c),f)
s=min 200.max(-200)
b#((x,y),_)=Translate x y b
f?(a,b)=(f a,b)

외계인의 그림은 형식으로 명명 b된 파일로 예상 .bmp됩니다.

Gloss 라이브러리를 처음 사용하므로 최적이 아닐 수 있습니다. 추적 KeyUp/ KeyDown이벤트 대신 키를 눌렀는지 확인할 수 있는지 아는 사람이 있습니까?

작동 방식 : 마지막 네 개의 매개 변수 play는 세계 상태 (로 초기화 됨, ((0,0),id)상태에서 그림을 그리는 함수 ( #), 이벤트 핸들러 ( e) 및 시간에 따라 상태를 변경하는 함수 ( %))입니다.

상태는 xy 좌표 쌍 %이며 호출 될 때마다 변경하는 방법 입니다.

#비트 맵 ( b)을 현재 좌표로 이동하고 그립니다.

eKeyDown커서 키의 이벤트를 찾고 상태에서 적절한 기능을 설정하거나 상태 KeyUp에서 기능을 ID 기능으로 재설정하는 키를 찾습니다 .

% 함수를 상태에서 현재 좌표로 적용하고 경계를 확인합니다.


하스켈에서도 이런 일을 할 수 있다는 사실에 항상 놀랐습니다. 감사합니다!

4

느릅 나무, 240 바이트

import Graphics.Element as G
import Keyboard as K
import Time
import Signal exposing(..)
c=min 800>>max 64
i(x,y)=G.container x y G.middle(G.image 64 48"http://i.stack.imgur.com/CUweU.png")
main=i<~foldp(\{x,y}(v,w)->(c v+x,c w-y))(99,99)(sampleOn(Time.fps 200)K.arrows)

여기서 사용해보십시오 . 바이트 수는 URL을로 교체 한 후입니다 .png.


지금 엘름을 배워야 할지도 모릅니다. 감사합니다.

3

AutoIt , 269 267 바이트

#include<Misc.au3>
GUICreate(0,-1,-1,-1,-1,-1,34078728)
$0=GUICtrlCreatePic("b.bmp",0,0,64,48)
GUISetState()
Dim $1,$2
$3=_IsPressed
Do
$1+=$3("27")-$3("25")
$2+=$3("28")-$3("26")
$1=($1>336)?336:($1<0)?0:$1
$2=($2>352)?352:($2<0)?0:$2
GUICtrlSetPos($0,$1,$2)
Until 0

그림을 스크립트 디렉토리에 b.bmp로 저장해야합니다. 실제 투명도가있는 그림을 사용하려면 PNG에서 32 비트 비트 맵으로 변환해야합니다 (OT : 정말 감사하지 않은 형식).

설명

Misc.au3액세스 하려면 가져와야 합니다 _IsPressed. 키 코드를 수락 하고 키를 누를 때 True또는 False키를 누를 때 사용되는 기능입니다.

도전 과제의 사양은 400px 정사각형 창을 만들어야하는 방식으로 매우 훌륭합니다. 기본 ( -1또는 로 표시 Default) 크기 매개 변수는 400x400입니다. 확장 윈도우 스타일 로 설정됩니다 34078728. 이렇게하면 윈도우가 이중 버퍼링되고 아래쪽에서 위쪽으로 그려집니다. 이는 챌린지 요구 사항에 따라 깜박임을 제거하기 위해 필요합니다. Windows 10에서이 특이하고 문서화되지 않은 스타일 조합은 창 제목 표시 줄을 손상시킵니다 (모든 호버링 효과는 비활성화 됨).

$1$2선언되고 X를 유지하며, Y는 상기 제어에 의해로드 된 화상의 오프셋 $0. 코드를 크게 단축시키는 $3함수의 포인터가됩니다 _IsPressed.

프로그램을 종료 할 필요가 없으므로이 스크립트는 무한 루프 ( Until 0)로 실행됩니다 .

$1+=$3("27")-$3("25")_IsPressed는 x 오프셋에서 추가되거나 추가 될 수있는 정수 로 반환 된 부울 값을 동적으로 캐스팅하여 AutoIt의 변형 데이터 유형을 악용합니다 . y도 마찬가지입니다. $1=($1>336)?336:($1<0)?0:$1C와 같은 언어로 알려진 삼항 연산자를 사용하여 경계에서 외계인을 막기 위해 경계 검사를 수행합니다.

GuiCtrlSetPos 그림 컨트롤을 새 좌표로 이동합니다.

투명한 외계인의 스크린 샷은 다음과 같습니다 (대각선으로 움직일 수도 있음).

스크린 샷


당신의 배경은 흰색이 아닙니다!
sergiol

2

Lua + LÖVE, 291 자

x=0
y=0
l=love
g=l.graphics
l.window.setMode(400,400)
i=g.newImage("i")
function l.update()d=l.keyboard.isDown
if d("left")and x>0 then x=x-1 end
if d("right")and x<336 then x=x+1 end
if d("up")and y>0 then y=y-1 end
if d("down")and y<352 then y=y+1 end
end
function l.draw()g.draw(i,x,y)end

크기를 조정할 수없는 400 x 400 창을 사용합니다. love.keyboard.setKeyRepeat()키 읽기 속도를 높이는 데 성공 하지 못했기 때문에 각 키의 상태를 폴링하는 권장 방법을 수행했습니다.

Lua와의 관계가 for최고가 아니기 때문에 이번에는 각 키 조건의 덤프 하드 코딩보다 루프를 짧게 만들지 못했습니다.


2

SpecBAS - 285 255 바이트

1 GRAPHIC NEW v LOAD "inv8.bmp" TRANSPARENT 15
2 PALETTE COPY v,0,1 TO 5: GRAPHIC REMAP v
3 LET x,y=100
4 CLS : WINDOW PUT GRAPHIC v,0,x,y
5 LET x=x+KEYST(39)-KEYST(37),y=y+KEYST(40)-KEYST(38)
6 LET x=CLAMP(x,1 TO 400),y=CLAMP(y,1 TO 400)
7 WAIT SCREEN 
8 GO TO 4

이미지를로드합니다. 색상 15는 밝은 흰색이므로 투명 해집니다.

원본 이미지와 기본 SpecBAS 팔레트를 사용하면 약간 이상하게 보이므로 2 행은 입력 이미지와 일치하도록 이미지를 전환합니다. 아래 이미지는 2 행과 그 이후의 모습을 보여줍니다.

여기에 이미지 설명을 입력하십시오

CLAMP 명령은 양방향으로 1에서 400 사이의 그래픽을 제한하고 여러 IF ... THEN 문을 저장합니다.

9 번 줄은 물건이 붙을 때까지 기다렸다가 깜박임을 방지합니다.

어떤 키를 눌렀는지 여부에 따라 한 번에 한 픽셀 씩 이동하므로 좌우로 5 초 이상 걸립니다.


2

신발, 루비 (252) 243 자

Shoes.app{background white
i=image'i'
m=[0,0]
a=[:width,:height]
animate(99){i.left+=m[0]<=>i.left
i.top+=m[1]<=>i.top}
keypress{|k|d,v={?u=>[1,-1],?d=>[1,1],?l=>[0,-1],?r=>[0,1]}[k[0]];m[d]=[[m[d]+v*4,self.send(p=a[d])-i.send(p)].min,0].max}}

기본 크기는 600 x 500으로 시작하는 크기 조정이 가능한 창을 사용합니다. 침입자가 빠져 있도록 창 크기를 조정하면 다음 이동 키를 누를 때 다시 나타납니다.

요구 사항을 충족시키는 요령은 침입자의 위치가 4 씩 증가하지만 실제 움직임은 초당 99 프레임에서 1 씩 증가한다는 것입니다.


2

Tcl / Tk , 242 바이트

grid [canvas .c -w 400 -he 403 -bg #FFF -highlightt 0]
.c cr i 30 24 -i [image c photo -fi .png] -t p
lmap {k b x y} "Up 1]>25 0 -5 Right 0]<368 5 0 Down 1]<376 0 5 Left 0]>30 -5 0" {bind . <$k> "if \[lindex \[.c coo p] $b {.c move p $x $y}"}

Linux에서 실행하려면 Tcl 및 Tk가 설치되어 있어야합니다. 그런 다음 코드를 파일로 복사하십시오 invaders.tcl. 또한 .png동일한 폴더에 이미지를 저장해야 합니다. wish invaders.tcl 쉘에서 스크립트 유형을 실행합니다 . 추신 : 기본 약어 명령을 지원하므로 코드를 대화 형 쉘에 붙여 넣는 경우 더 골치 아픈 일이 될 수 있습니다.
sergiol

1

JavaScript (paper.js 사용), 215 바이트

v=new Raster("http://i.stack.imgur.com/CUweU.png",99,99);p=new Size(4,0)
onFrame=e=>{if(!v.isInside(view.bounds)){p=-p};v.position+=p}
onKeyDown=e=>{p=new Size([[0,-4],[0,4],[-4,0],[4,0]]["udlr".indexOf(e.key[0])])}

paper.js 는 JS 그래픽 프레임 워크이므로 이미지 조작에 관한 유용한 기능이 많이 있습니다. 실행하려면 위의 섹션을 여기 왼쪽에 복사 하십시오. 한 다음 외계인을 움직여 오른쪽 섹션에서 한 번 클릭하여 초점을 맞 춥니 다. 브라우저에서 처리 할 수 ​​있으면 60fps로 실행해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.