Proto invasores del espacio (¿puedes hacerlo?)

18

Proto invasores del espacio

Este es un desafío de salida gráfica donde la tarea es dar el código más corto por idioma.

Tarea

Su código debe permitir al usuario mover al siguiente alienígena por la pantalla / ventana.

ingrese la descripción de la imagen aquí

Su código simplemente puede cargarlo desde un archivo local. Siéntase libre de convertirlo a otro formato de imagen estándar o incluso corregir los pequeños errores de píxeles en la imagen que se señalaron en los comentarios.

El fondo debe ser blanco y la ventana / pantalla debe tener al menos 400 píxeles por 400 píxeles. Si su idioma no admite ventanas / pantallas tan grandes, utilice el tamaño más grande que sí admite, siempre que no sea inferior a 200 por 200.

Para mover al alienígena por la pantalla, el código debe ser compatible con arriba / abajo / izquierda / derecha usando las teclas de flechas en un teclado estándar.

Su código debe ser un programa completo .

Restricciones / restricciones

El alienígena debería detenerse en las fronteras. También debe moverse a una velocidad uniforme sin problemas, sin parpadeos ni tartamudeos visibles, y debe mostrarse al menos a 24 fps. Debería llevar entre 2 y 5 segundos pasar de un lado de la pantalla / ventana al otro.

Idiomas y bibliotecas

Puede usar cualquier idioma o biblioteca que desee (que no fue diseñada para este desafío). Sin embargo, me gustaría poder probar su código si es posible, así que si puede proporcionar instrucciones claras sobre cómo ejecutarlo en Ubuntu, sería muy apreciado.

Catalogar

El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

## Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntuación, se puede mantener viejas cuentas en el título, golpeándolos a través. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:

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


fuente
2
¿Podemos construir el extraterrestre nosotros mismos? Si es así, ¿tenemos que incluir los errores de píxeles (supongo?) De la imagen?
mınxomaτ
@ mınxomaτ ¡No se limita a Linux! Tenga en cuenta "si es posible".
@nimi Gracias. Agregó que puede cargarlo desde un archivo local.
@ mınxomaτ Puede construirlo usted mismo o simplemente cargarlo desde un archivo local. No me había dado cuenta de los errores de píxeles, pero supongo que cargarlo será menos código en cualquier caso.
¿Puedes definir "parar en las fronteras"? ¿Es necesario que todo el alienígena sea visible en todo momento, o puede detenerse parcialmente fuera de la frontera?
timothymh

Respuestas:

12

Scratch , 221 217 bytes

Haga clic en la imagen para verla en acción. El movimiento está determinado por las pulsaciones de teclas , por lo que será más suave cuanto más rápido se configure la repetición de la tecla.

La imagen se incluye dentro del proyecto, pero los bytes de Scratch generalmente se cuentan a partir de la representación textual de golf , según esta meta publicación . Si hay desacuerdo sobre si esto es aceptable (o si el movimiento es lo suficientemente suave), avíseme y trataré de solucionarlo.

timothymh
fuente
¡Esta respuesta es muy divertida!
¿Cómo midió el tamaño de este programa?
@Lembik ver el segundo párrafo.
timothymh
1
genera en 217 bytes: scratchblocks.github.io/…
ev3commander
1
@Mauris Sí, de eso se ocupa el comando "si está en el borde, rebota". ¡Puedes jugar la demo haciendo clic en la imagen!
timothymh
7

Procesamiento 2, 219 199 241 220 219 bytes

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);}

Requiere que la imagen se guarde .pngen el mismo directorio que el .pde

TheDoctor
fuente
6

Python 2, 262 253 246 240 bytes

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))))

Guau. Qué cantidad de piratería.

Utiliza el módulo 'pygame' que se encuentra en http://pygame.org .

Explicación

key.set_repeat(1) - Enviar eventos clave repetidos a través del sistema de eventos cada milisegundo

c=d.set_mode((400,)*2) - Crear la superficie de visualización 400x400

while c.fill((255,)*3):- Efectivamente while 1:pero también limpia la pantalla

e=event.get(2);c.blit(image.load("I"),p);d.flip()- Solo recopila eventos del teclado, carga la imagen almacenada en un archivo png llamado Iy dibuja. Actualiza la pantalla

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)))) - Si hubo un evento, calcule qué tecla de flecha se presionó (hace cosas extrañas si presiona otras teclas) y luego cambie la posición de la superficie dependiendo de la tecla que presionó.

Azul
fuente
Realmente me gusta tu solución.
@Lembik ¿Entonces se permite un solo nombre de archivo de byte? (Es decir, sin extensión?). Si es así, sugiero excluir completamente los nombres de archivo del recuento de bytes.
mınxomaτ
@ mınxomaτ El nombre de archivo de un solo byte está permitido, pero no quiero inventar un nuevo esquema de puntuación.
@Lembik Processing no puede manejar nombres de archivos de un solo byte ... así que esto es injusto.
TheDoctor
2
@TheDoctor Esto solo en: ¡Los diferentes idiomas son diferentes! Propongo que también desafíos disallow que tienen de entrada de la entrada estándar, ya sabes, porque es injusto que se necesita tantos personajes de hacerlo en Python ...
Aleksi Torhamo
5

Haskell, 410 bytes

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)

La imagen del alienígena se espera en un archivo llamado ben .bmpformato.

Soy nuevo en la biblioteca Gloss, así que tal vez esto no sea óptimo. ¿Alguien sabe si puedo verificar si se presiona una tecla en lugar de seguimiento KeyUp/ KeyDowneventos?

Cómo funciona: los últimos cuatro parámetros playson el estado mundial (inicializado con ((0,0),id), una función para dibujar una imagen de un estado ( #), un controlador de eventos ( e) y una función que cambia el estado con el tiempo ( %).

El estado es un par de coordenadas xy y una función de cómo cambiarlas cada vez que %se llama.

#mueve el mapa de bits ( b) a las coordenadas actuales y lo dibuja.

ebusca los KeyDowneventos de las teclas del cursor y establece las funciones apropiadas en el estado o KeyUpcualquier tecla para restablecer la función en el estado a la función de identidad.

% aplica la función del estado a las coordenadas actuales y verifica los límites.

nimi
fuente
Siempre me sorprende que incluso puedas hacer este tipo de cosas en Haskell. ¡Gracias!
4

Olmo, 240 bytes

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)

Pruébalo aquí . El recuento de bytes es después de reemplazar la URL con .png.

Lynn
fuente
Puede que tenga que aprender Elm ahora. Gracias.
3

AutoIt , 269 267 bytes

#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

Requiere que la imagen se guarde como b.bmp en el directorio del script. Si desea utilizar una imagen con transparencia real, debe convertirla de PNG a un mapa de bits de 32 bits (OT: un formato realmente poco apreciado).

Explicación

Necesitamos importar Misc.au3para acceder _IsPressed. Una función que acepta un código de tecla y regresa Trueo Falsecuando se presiona la tecla.

La especificación del desafío es bastante buena en la forma en que tenemos que crear una ventana cuadrada de 400 px. Los parámetros de tamaño predeterminados (indicados como -1o Default) son 400x400. El estilo de Windows extendido se establece en 34078728. Esto obliga a que la ventana tenga doble búfer y se dibuje de abajo hacia arriba. Esto es necesario para eliminar el parpadeo según el requisito de desafío. En Windows 10, esta combinación inusual (y algo indocumentada) de estilos rompe la barra de título de la ventana (todos los efectos de desplazamiento están deshabilitados).

$1y $2se declaran y mantendrán el desplazamiento xey de la imagen cargada por el control $0. $3se convierte en un puntero a la función _IsPressedpara acortar significativamente el código.

Como no es necesario poder salir del programa, este script se ejecuta en un bucle infinito ( Until 0).

$1+=$3("27")-$3("25")abusa del tipo de datos variante en AutoIt al convertir dinámicamente el valor booleano devuelto desde _IsPressedun entero que se puede agregar o sustituir del desplazamiento x. Lo mismo para y. $1=($1>336)?336:($1<0)?0:$1usa el operador ternario conocido de lenguajes tipo C para realizar una verificación de límites para detener al alienígena en las fronteras.

GuiCtrlSetPos mueve el control de imagen a las nuevas coordenadas.

Aquí hay una captura de pantalla con un extraterrestre transparente (incluso puedes moverte en diagonal):

captura de pantalla

mınxomaτ
fuente
¡Tu fondo no es blanco!
sergiol
2

Lua + LÖVE, 291 caracteres

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

Utiliza una ventana de 400 x 400 que no se puede cambiar de tamaño. No tuve éxito con el ajuste love.keyboard.setKeyRepeat()para acelerar la lectura de la clave, así que hice la forma recomendada, sondeando el estado de cada clave.

Como mi relación con Lua forno es la mejor, ni esta vez logró hacer que el bucle sea más corto que el volcado de la condición de cada clave.

hombre trabajando
fuente
2

SpecBAS - 285 255 bytes

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

Carga la imagen: el color 15 es blanco brillante, por lo que se vuelve transparente.

El uso de la imagen original y la paleta predeterminada de SpecBAS hizo que saliera un poco extraño, por lo que la línea 2 los cambia para que coincidan con la imagen de entrada. La imagen de abajo muestra cómo se ve sin la línea 2 y después.

ingrese la descripción de la imagen aquí

El comando CLAMP limita el gráfico entre 1 y 400 en ambas direcciones, guarda en varias declaraciones IF ... THEN.

La línea 9 solo espera que las cosas se pongan al día y evita el parpadeo.

Se mueve un píxel a la vez en función de una comprobación booleana de qué tecla se presiona, por lo que lleva un poco más de 5 segundos ir de lado a lado.

Brian
fuente
2

Rubí con zapatos, 252 243 caracteres

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}}

Esto utiliza una ventana de tamaño variable que comienza por defecto en 600 x 500. Si cambia el tamaño de la ventana para que el invasor quede fuera, volverá cuando se presione la siguiente tecla de movimiento.

El truco para satisfacer los requisitos es que la posición del invasor se cambia en incrementos de 4, pero el movimiento real se realiza con un incremento de 1 a 99 cuadros por segundo.

hombre trabajando
fuente
2

Tcl / Tk , 242 bytes

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}"}
sergiol
fuente
Para ejecutarlo en cualquier Linux: debe tener instalado Tcl y Tk; luego copie el código a un archivo, digamos invaders.tcl; También debe tener la imagen guardada como .pngen la misma carpeta. Para ejecutar el script, escriba wish invaders.tcl en un shell. PD: Se puede jugar mejor si el código se pega en un shell interactivo, ya que admite comandos abreviados de forma predeterminada.
sergiol
1

JavaScript (usando paper.js), 215 bytes

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 es un marco de gráficos JS, lo que significa que presenta muchas características útiles con respecto a la manipulación de imágenes. Para correr, simplemente copie lo anterior en la sección de la izquierda aquí , luego, para mover al alienígena, haga clic una vez en la sección derecha para enfocarlo. Si su navegador puede manejarlo, debería ejecutarse a 60 fps.

ivzem
fuente