Kẻ xâm lược không gian Proto (bạn có thể làm mờ nó?)


18

Kẻ xâm lược không gian Proto

Đây là một thách thức đầu ra đồ họa trong đó nhiệm vụ là đưa ra mã ngắn nhất cho mỗi ngôn ngữ.

Bài tập

Mã của bạn sẽ cho phép người dùng di chuyển người ngoài hành tinh sau xung quanh màn hình / cửa sổ.

nhập mô tả hình ảnh ở đây

Mã của bạn chỉ có thể tải nó từ một tệp cục bộ. Vui lòng chuyển đổi nó sang định dạng hình ảnh tiêu chuẩn khác hoặc thậm chí để sửa các lỗi pixel nhỏ trong hình ảnh được chỉ ra trong các nhận xét.

Nền phải có màu trắng và cửa sổ / màn hình phải có ít nhất 400 pixel x 400 pixel. Nếu ngôn ngữ của bạn không hỗ trợ các cửa sổ / màn hình lớn thì hãy sử dụng kích thước lớn nhất, nó sẽ hỗ trợ miễn là không nhỏ hơn 200 đến 200.

Để di chuyển người ngoài hành tinh xung quanh màn hình, mã phải hỗ trợ lên / xuống / trái / phải bằng các phím mũi tên trên bàn phím tiêu chuẩn.

Mã của bạn phải là một chương trình đầy đủ .

Hạn chế / hạn chế

Người ngoài hành tinh nên dừng lại ở biên giới. Nó cũng nên di chuyển với tốc độ đồng đều một cách trơn tru mà không có hiện tượng nhấp nháy hoặc nói lắp và được hiển thị ít nhất 24fps. Sẽ mất từ ​​2 đến 5 giây để đi từ một bên của màn hình / cửa sổ sang bên kia.

Ngôn ngữ và thư viện

Bạn có thể sử dụng bất kỳ ngôn ngữ hoặc thư viện nào bạn thích (không được thiết kế cho thử thách này). Tuy nhiên, tôi muốn có thể kiểm tra mã của bạn nếu có thể vì vậy nếu bạn có thể cung cấp hướng dẫn rõ ràng về cách chạy mã trong Ubuntu sẽ được đánh giá rất cao.

Mục lục

Đoạn trích Stack ở cuối bài đăng này tạo ra danh mục từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

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


2
Chúng ta có thể tự xây dựng người ngoài hành tinh không? Nếu vậy, chúng ta có phải bao gồm các lỗi pixel (tôi đoán không?) Từ hình ảnh?
mınxomaτ

@ mınxomaτ Nó không giới hạn ở linux! Lưu ý "nếu có thể".

@nimi Cảm ơn. Đã thêm rằng bạn có thể tải nó từ một tệp cục bộ.

@ mınxomaτ Bạn có thể tự xây dựng nó hoặc chỉ tải nó từ một tệp cục bộ. Tôi đã không nhận thấy các lỗi pixel nhưng tôi cho rằng việc tải nó sẽ ít mã hơn trong mọi trường hợp.

Bạn có thể định nghĩa "dừng lại ở biên giới" không? Có phải toàn bộ người ngoài hành tinh cần phải được nhìn thấy mọi lúc, hoặc nó có thể dừng lại một phần bên ngoài biên giới không?
timothymh

Câu trả lời:


12

Cào , 221 217 byte

Nhấp vào hình ảnh để xem nó trong hành động. Chuyển động được xác định bằng tổ hợp phím , vì vậy nó sẽ mượt mà hơn khi tốc độ lặp lại phím của bạn được đặt nhanh hơn.

Hình ảnh được bao gồm trong dự án, nhưng các byte Scratch thường được tính từ biểu diễn văn bản được đánh gôn , trên mỗi bài đăng meta này . Nếu có sự bất đồng về việc liệu điều này có được chấp nhận (hoặc liệu chuyển động có đủ trơn tru không) cho tôi biết và tôi sẽ cố gắng làm việc xung quanh nó.


Câu trả lời này rất nhiều niềm vui!

Làm thế nào bạn đo kích thước của chương trình này?

@Lembik xem đoạn thứ hai.
timothymh

1
tạo ra trong 217 byte: scratchblocks.github.io/ Kẻ
ev3commander

1
@Mauris Vâng, đó là những gì lệnh "nếu trên cạnh, nảy" quan tâm. Bạn có thể chơi bản demo bằng cách nhấp vào hình ảnh!
timothymh

7

Xử lý 2, 219 199 241 220 219 byte

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

Yêu cầu hình ảnh được lưu như .pngtrong cùng thư mục với .pde


6

Python 2, 262 253 246 240 byte

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

Ồ Thật là nhiều tin tặc.

Sử dụng mô-đun 'pygame' được tìm thấy tại http://pygame.org .

Giải trình

key.set_repeat(1) - Gửi các sự kiện quan trọng lặp lại thông qua hệ thống sự kiện mỗi mili giây

c=d.set_mode((400,)*2) - Tạo bề mặt hiển thị 400x400

while c.fill((255,)*3):- Hiệu quả while 1:nhưng cũng xóa màn hình

e=event.get(2);c.blit(image.load("I"),p);d.flip()- Chỉ thu thập các sự kiện bàn phím, tải hình ảnh được lưu trữ trong tệp png được gọi Ivà vẽ nó. Cập nhật màn hình

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)))) - Nếu có một sự kiện, hãy tìm ra phím mũi tên nào được nhấn (thực hiện công cụ lạ nếu bạn nhấn các phím khác), sau đó thay đổi vị trí của bề mặt tùy thuộc vào phím nào bạn nhấn.


Tôi thực sự thích giải pháp của bạn.

@Lembik Vì vậy, một tên tệp byte được phép? (Tức là không có phần mở rộng?). Nếu vậy, tôi đề nghị loại trừ hoàn toàn tên tệp khỏi số byte.
mınxomaτ

@ mınxomaτ Tôi cho phép tên tệp byte đơn nhưng tôi không muốn phát minh ra sơ đồ chấm điểm mới.

@Lembik Xử lý không thể xử lý tên tệp byte đơn ... vì vậy điều này không công bằng.
TheDoctor

2
@TheDoctor Điều này chỉ trong: Các ngôn ngữ khác nhau là khác nhau! Tôi đề nghị chúng tôi cũng không cho phép những thách thức lấy đầu vào từ stdin, bạn biết đấy, vì thật không công bằng khi phải mất quá nhiều nhân vật để làm điều đó trong Python ...
Aleksi Torhamo

5

Haskell, 410 byte

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)

Những hình ảnh của những người nước ngoài dự kiến trong một file có tên btrong .bmpđịnh dạng.

Tôi mới sử dụng thư viện Gloss, vì vậy có lẽ điều này không tối ưu. Có ai biết nếu tôi có thể kiểm tra nếu một phím được nhấn thay vì theo dõi KeyUp/ KeyDownsự kiện không?

Cách thức hoạt động: bốn tham số cuối cùng playlà trạng thái thế giới (được khởi tạo với ((0,0),id), một hàm để vẽ một hình ảnh từ trạng thái ( #), một trình xử lý sự kiện ( e) và một hàm thay đổi trạng thái theo thời gian ( %).

Trạng thái là một cặp tọa độ xy và một hàm làm thế nào để thay đổi chúng bất cứ khi nào %được gọi.

#di chuyển bitmap ( b) sang tọa độ hiện tại và vẽ nó.

etìm kiếm KeyDowncác sự kiện của các phím con trỏ và đặt các chức năng phù hợp ở trạng thái hoặc cho KeyUpbất kỳ phím nào để đặt lại chức năng ở trạng thái thành chức năng nhận dạng.

% áp dụng hàm từ trạng thái cho tọa độ hiện tại và kiểm tra các ranh giới.


Tôi luôn ngạc nhiên khi bạn thậm chí có thể làm điều này trong Haskell. Cảm ơn bạn!

4

Elm, 240 byte

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)

Hãy thử nó ở đây . Số byte là sau khi thay thế URL bằng .png.


Tôi có thể phải học Elm ngay bây giờ. Cảm ơn bạn.

3

Tự động , 269 267 byte

#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

Yêu cầu hình ảnh được lưu dưới dạng b.bmp trong thư mục script. Nếu bạn muốn sử dụng một hình ảnh có độ trong suốt thực tế, bạn phải chuyển đổi nó từ PNG sang Bitmap 32 bit (OT: một định dạng thực sự không được đánh giá cao).

Giải trình

Chúng tôi cần phải nhập Misc.au3để có quyền truy cập vào _IsPressed. Hàm chấp nhận mã khóa và trả vềTrue hoặc Falsekhi nhấn phím.

Thông số kỹ thuật của thử thách khá thú vị theo cách chúng ta phải tạo một cửa sổ vuông 400px. Các tham số kích thước mặc định (ký hiệu là -1hoặc Default) là 400x400. Kiểu cửa sổ mở rộng được đặt thành 34078728. Điều này buộc cửa sổ phải được đệm đôi và được vẽ từ dưới lên trên. Điều này là cần thiết để loại bỏ nhấp nháy theo yêu cầu thách thức. Trong Windows 10, sự kết hợp các kiểu khác thường (và hơi không có giấy tờ) này phá vỡ thanh tiêu đề cửa sổ (tất cả các hiệu ứng di chuột đều bị tắt).

$1$2được khai báo và sẽ giữ độ lệch x và y của hình ảnh được tải bởi điều khiển $0. $3trở thành một con trỏ tới hàm _IsPressedđể rút ngắn mã đáng kể.

Vì không bắt buộc phải có thể thoát khỏi chương trình, tập lệnh này chạy trong một vòng lặp vô hạn (Until 0 ).

$1+=$3("27")-$3("25")lạm dụng kiểu dữ liệu biến thể trong AutoIt bằng cách tự động chuyển giá trị boolean được trả về từ _IsPressedmột số nguyên có thể được thêm hoặc thêm vào từ phần bù x. Tương tự cho y. $1=($1>336)?336:($1<0)?0:$1sử dụng toán tử ternary được biết đến từ các ngôn ngữ giống như C để thực hiện kiểm tra giới hạn để ngăn chặn người ngoài hành tinh ở biên giới.

GuiCtrlSetPos di chuyển điều khiển hình ảnh sang tọa độ mới.

Đây là một ảnh chụp màn hình với một người ngoài hành tinh trong suốt (thậm chí bạn có thể di chuyển theo đường chéo):

ảnh chụp màn hình


Nền của bạn không phải là màu trắng!
sergiol

2

Lua + LVE, 291 ký tự

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

Điều này sử dụng một cửa sổ 400 x 400 không thể thay đổi. Tôi đã không thành công với việc điều chỉnh love.keyboard.setKeyRepeat()để tăng tốc độ đọc khóa, vì vậy tôi đã làm theo cách được đề xuất, bỏ phiếu cho từng trạng thái của khóa.

Vì mối quan hệ của tôi với Lua forkhông phải là tốt nhất, nên lần này không quản lý để làm cho vòng lặp ngắn hơn mã hóa kết xuất của điều kiện của mỗi khóa.


2

SpecBAS - 285 255 byte

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

Tải hình ảnh - màu 15 là màu trắng sáng, do đó trở nên trong suốt.

Sử dụng hình ảnh gốc và bảng màu SpecBAS mặc định làm cho nó trở nên hơi kỳ lạ, vì vậy dòng 2 chuyển chúng xung quanh để khớp với hình ảnh đầu vào. Hình ảnh bên dưới cho thấy nó trông như thế nào mà không có dòng 2 và sau đó.

nhập mô tả hình ảnh ở đây

Lệnh CLAMP giới hạn đồ họa trong khoảng từ 1 đến 400 theo cả hai hướng, lưu vào một số câu lệnh IF ... THEN.

Dòng 9 chỉ chờ mọi thứ bắt kịp và ngăn ngừa nhấp nháy.

Nó di chuyển một pixel tại một thời điểm dựa trên kiểm tra boolean về phím nào được nhấn, do đó mất một chút thời gian dài hơn 5 giây để đi từ bên này sang bên kia.


2

Ruby với Giày, 252 243 ký tự

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

Điều này sử dụng một cửa sổ có thể thay đổi kích thước bắt đầu ở mặc định 600 x 500. Nếu bạn thay đổi kích thước cửa sổ để kẻ xâm lược bị bỏ lại, sẽ quay lại khi nhấn phím di chuyển tiếp theo.

Mẹo để đáp ứng các yêu cầu là vị trí của kẻ xâm lược được thay đổi theo gia số 4, nhưng chuyển động thực tế được thực hiện với mức tăng 1 ở 99 khung hình mỗi giây.


2

Tcl / Tk , 242 byte

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

Để chạy nó trong bất kỳ Linux nào: bạn phải cài đặt Tcl và Tk; sau đó sao chép mã vào một tập tin, giả sử invaders.tcl; bạn cũng cần phải lưu hình ảnh .pngtrong cùng một thư mục. Để chạy kiểu script wish invaders.tcl trong shell. PS: Nó có thể được chơi nhiều hơn nếu mã được dán vào một vỏ tương tác, vì nó hỗ trợ bởi các lệnh viết tắt mặc định.
sergiol

1

JavaScript (sử dụng paper.js), 215 byte

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 là một khung đồ họa JS, có nghĩa là nó có nhiều tính năng hữu ích liên quan đến thao tác hình ảnh. Để chạy, chỉ cần sao chép phần trên vào phần bên trái ở đây , sau đó, để di chuyển người ngoài hành tinh xung quanh, nhấp một lần vào phần bên phải để làm cho nó tập trung. Nếu trình duyệt của bạn có thể xử lý nó, nó sẽ chạy ở tốc độ 60fps.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.