ผู้รุกรานพื้นที่ Proto (คุณสามารถ blit ได้หรือไม่)


18

ผู้รุกรานพื้นที่โปรโต

นี่คือความท้าทายในการแสดงผลกราฟิกที่งานคือการให้รหัสสั้นที่สุดต่อภาษา

งาน

รหัสของคุณควรอนุญาตให้ผู้ใช้ย้ายเอเลี่ยนต่อไปนี้รอบ ๆ หน้าจอ / หน้าต่าง

ป้อนคำอธิบายรูปภาพที่นี่

รหัสของคุณสามารถโหลดได้จากไฟล์ในเครื่อง คุณสามารถแปลงเป็นรูปแบบภาพมาตรฐานอื่น ๆ หรือแม้แต่แก้ไขข้อผิดพลาดของพิกเซลเล็ก ๆ ในภาพที่ชี้ให้เห็นในความคิดเห็น

พื้นหลังควรเป็นสีขาวและหน้าต่าง / หน้าจอต้องมีอย่างน้อย 400 พิกเซลคูณ 400 พิกเซล หากภาษาของคุณไม่รองรับ windows / หน้าจอที่มีขนาดใหญ่ให้ใช้ขนาดที่ใหญ่ที่สุดมันรองรับตราบเท่าที่ไม่น้อยกว่า 200 ถึง 200

ในการเคลื่อนย้ายเอเลี่ยนรอบ ๆ หน้าจอรหัสควรรองรับการขึ้น / ลง / ซ้าย / ขวาโดยใช้ปุ่มลูกศรบนแป้นพิมพ์มาตรฐาน

รหัสของคุณควรจะเป็นโปรแกรมเต็มรูปแบบ

ข้อ จำกัด / ข้อ จำกัด

คนต่างด้าวควรหยุดที่ชายแดน นอกจากนี้ยังควรเคลื่อนไหวในอัตราที่สม่ำเสมออย่างราบรื่นโดยไม่มีการกะพริบหรือการกระตุกและมองเห็นได้อย่างน้อย 24fps ควรใช้เวลาประมาณ 2 ถึง 5 วินาทีในการเลื่อนจากด้านหนึ่งของหน้าจอ / หน้าต่างไปอีกด้านหนึ่ง

ภาษาและห้องสมุด

คุณสามารถใช้ภาษาหรือห้องสมุดที่คุณชอบ (ที่ไม่ได้ออกแบบมาสำหรับความท้าทายนี้) อย่างไรก็ตามฉันต้องการทดสอบโค้ดของคุณถ้าเป็นไปได้ดังนั้นหากคุณสามารถให้คำแนะนำที่ชัดเจนเกี่ยวกับวิธีการเรียกใช้ใน Ubuntu ที่จะได้รับการชื่นชมอย่างมาก

แค็ตตาล็อก

ส่วนย่อยของสแต็กที่ด้านล่างของโพสต์นี้สร้างแคตตาล็อกจากคำตอบ a) เป็นรายการของวิธีแก้ปัญหาที่สั้นที่สุดต่อภาษาและ b) เป็นลีดเดอร์บอร์ดโดยรวม

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## 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τคุณสามารถสร้างมันเองหรือเพียงแค่โหลดจากไฟล์ในเครื่อง ฉันไม่ได้สังเกตเห็นข้อผิดพลาดของพิกเซล แต่ฉันคิดว่าการโหลดมันจะเป็นรหัสน้อยลงในทุกกรณี

คุณสามารถกำหนด "หยุดที่ชายแดน" ได้หรือไม่? มนุษย์ต่างดาวทั้งหมดต้องมองเห็นได้ตลอดเวลาหรือสามารถหยุดนอกเขตบางส่วนได้หรือไม่?
ทิโมธี

คำตอบ:


12

รอยขีดข่วน , 221 217 ไบต์

คลิกที่ภาพเพื่อดูภาพเคลื่อนไหว การเคลื่อนไหวจะถูกกำหนดโดยการกดแป้นดังนั้นมันจะราบรื่นยิ่งขึ้นเมื่อมีการตั้งค่าการทำซ้ำปุ่มของคุณเร็วขึ้น

ภาพจะรวมอยู่ในโครงการ แต่โดยทั่วไปจะมีการนับจำนวนรอยขีดข่วนจากการแสดงข้อความแบบ Golfed ต่อเมตาโพสต์นี้ หากมีความขัดแย้งว่าเป็นที่ยอมรับ (หรือว่าการเคลื่อนไหวราบรื่นพอ) แจ้งให้เราทราบและฉันจะพยายามหลีกเลี่ยง


คำตอบนี้สนุกมาก!

คุณวัดขนาดของโปรแกรมนี้ได้อย่างไร

@ Lembik ดูย่อหน้าที่สอง
ทิโมธี

1
สร้างใน 217 ไบต์: scratchblocks.github.io/...
ev3commander

1
@Mauris ใช่นั่นคือสิ่งที่คำสั่ง "if on edge, bounce" ดูแล คุณสามารถเล่นตัวอย่างได้โดยคลิกที่ภาพ!
Timothymh

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

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

ว้าว. ช่างเป็นแฮกเกอร์มากขนาดไหน

ใช้โมดูล 'pygame' พบได้ที่http://pygame.org

คำอธิบาย

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()- รวบรวมเฉพาะกิจกรรมคีย์บอร์ดเท่านั้นโหลดภาพที่เก็บไว้ในไฟล์ png ชื่อIและวาด อัพเดทหน้าจอ

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 กำลังประมวลผลไม่สามารถจัดการชื่อไฟล์แบบไบต์เดียว ... ดังนั้นนี่จึงไม่เป็นธรรม
TheDoctor

2
@TheDoctor เพียงแค่นี้: ภาษาที่แตกต่างกันจะแตกต่างกัน! ฉันเสนอเรายังไม่อนุญาตให้มีการท้าทายที่รับข้อมูลจาก stdin คุณรู้เพราะมันไม่ยุติธรรมที่ต้องใช้ตัวละครมากมายใน Python ...
Aleksi Torhamo

5

Haskell, 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) ไปยังพิกัดปัจจุบันและวาด

eค้นหาKeyDownเหตุการณ์ของเคอร์เซอร์คีย์และตั้งค่าฟังก์ชั่นที่เหมาะสมในสถานะหรือสำหรับKeyUpคีย์ใด ๆ เพื่อรีเซ็ตฟังก์ชันในสถานะเป็นฟังก์ชันเอกลักษณ์

% ใช้ฟังก์ชันจากสถานะกับพิกัดปัจจุบันและตรวจสอบขอบเขต


ฉันประหลาดใจอยู่เสมอที่คุณสามารถทำสิ่งนี้ใน Haskell ขอขอบคุณ!

4

Elm, 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ด้วย


ฉันอาจต้องเรียนรู้ Elm ตอนนี้ ขอขอบคุณ.

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")ละเมิดประเภทข้อมูลที่แปรปรวนใน AutoIt โดยการส่งค่าบูลีนที่ส่งคืนจาก_IsPressedจำนวนเต็มแบบไดนามิกที่สามารถเพิ่มหรือ sub'ed จาก x offset เหมือนกันสำหรับ y $1=($1>336)?336:($1<0)?0:$1ใช้ผู้ประกอบการที่รู้จักกันดีจากภาษาที่เหมือน C เพื่อดำเนินการตรวจสอบขอบเขตเพื่อหยุดคนต่างด้าวที่ชายแดน

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 ... จากนั้นหลายรายการ

บรรทัดที่ 9 รอสิ่งต่าง ๆ ให้ทันและป้องกันการกะพริบ

มันเคลื่อนที่ทีละหนึ่งพิกเซลโดยอิงจากการตรวจสอบบูลีนของคีย์ที่กดดังนั้นใช้เวลานานกว่า 5 วินาทีในการสลับจากด้านหนึ่งไปอีกด้านหนึ่งเล็กน้อย


2

Ruby with Shoes, 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 แต่การเคลื่อนไหวที่เกิดขึ้นจริงจะเพิ่มขึ้น 1 ที่ 99 เฟรมต่อวินาที


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 ในเชลล์ PS: มันสามารถเล่นกอล์ฟได้มากขึ้นถ้าวางโค้ดลงในเชลล์แบบโต้ตอบแทนเนื่องจากสนับสนุนโดยคำสั่งแบบย่อโดยปริยาย
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.