プロトスペースインベーダー(ブリットできますか?)


18

原始宇宙侵略者

これは、タスクが言語ごとに最短のコードを提供することであるグラフィカル出力の課題です。

仕事

コードでは、ユーザーが次のエイリアンを画面/ウィンドウ内で移動できるようにする必要があります。

ここに画像の説明を入力してください

コードは、ローカルファイルから単純にロードできます。別の標準の画像形式に変換したり、コメントで指摘された画像の小さなピクセルエラーを修正したりすることもできます。

背景は白で、ウィンドウ/画面は少なくとも400ピクセルx 400ピクセルでなければなりません。ご使用の言語がそのサイズのウィンドウ/画面をサポートしていない場合は、200 x 200以上である限りサポートする最大サイズを使用してください。

画面上でエイリアンを移動するには、標準キーボードの矢印キーを使用して、コードで上/下/左/右をサポートする必要があります。

あなたのコードは完全なプログラムでなければなりません。

制限/制約

外国人は国境で停止する必要があります。また、目に見えるちらつきやst音のない均一な速度でスムーズに移動し、少なくとも24fpsで表示される必要があります。画面/ウィンドウの一方の側からもう一方の側に移動するには、2〜5秒かかります。

言語とライブラリ

好きな言語やライブラリを使用できます(このチャレンジ用に設計されたものではありません)。ただし、可能な場合はコードをテストできるようにしたいので、Ubuntuでコードを実行する方法について明確な指示を提供できれば非常にありがたいです。

カタログ

この投稿の下部にあるスタックスニペットは、a)言語ごとの最短ソリューションのリストとして、b)全体的なリーダーボードとして、回答からカタログを生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、スニペットに表示することもできます。

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


2
エイリアンを自分で構築できますか?もしそうなら、画像からピクセルエラー(私は推測?)を含める必要がありますか?
mınxomaτ

@mınxomaτLinuxに限定されません!「可能であれば」に注意してください。

@nimiありがとう。ローカルファイルからロードできることを追加しました。

@mınxomaτ自分で作成することも、ローカルファイルからロードすることもできます。私はピクセルエラーに気付いていませんでしたが、それをロードすることはどんな場合でもより少ないコードになると思います。

「国境で止まる」と定義できますか?エイリアン全体を常に見えるようにする必要がありますか、それとも境界の外側で部分的に停止できますか?
-timothymh

回答:


12

スクラッチ221 217バイト

画像をクリックして実際の動作をご覧ください。動きはキーストロークによって決定されるため、キーリピートが速く設定されるほど滑らかになります。

画像はプロジェクト内に含まれていますが、通常、スクラッチバイトはこのメタ投稿ごとにゴルフのテキスト表現からカウントされます。これが許容できるかどうか(または動きが十分にスムーズかどうか)について意見の相違がある場合はお知らせください。回避策を講じます。


この答えはとても楽しいです!

このプログラムのサイズをどのように測定しましたか?

@Lembikは2番目の段落を参照してください。
timothymh

1
:217バイト単位で生成scratchblocks.github.io/...
ev3commander

1
@Maurisはい、「エッジの場合、バウンス」コマンドが処理します。画像をクリックしてデモを再生できます!
-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))))

ワオ。なんというハッカーなのか。

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()-キーボードイベントのみを収集し、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 Processingはシングルバイトのファイル名を処理できません...したがって、これは不公平です。
TheDoctor

2
@TheDoctorこれだけで:異なる言語は異なる!それはそれは... 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イベントの代わりにキーが押されたかどうかを確認できるかどうかは誰にもわかりますか?

仕組み:の最後の4つのパラメーターplayは、ワールド状態(で初期化さ((0,0),id)れ、状態から画像を描画する関数(#)、イベントハンドラー(e)、時間とともに状態を変更する関数(%))です。

状態は、xy座標のペアと、%呼び出されたときにそれらを変更する方法の関数です。

#ビットマップ(b)を現在の座標に移動して描画します。

eKeyDownカーソルキーのイベントを探し、その状態の適切な機能を設定するか、その状態KeyUpの機能を識別機能にリセットするキーを設定します。

% 関数を状態から現在の座標に適用し、境界をチェックします。


Haskellでこの種のことさえできることにいつも驚いています。ありがとうございました!

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

AutoIt269 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。キーコードを受け入れて戻るTrueFalse、キーが押されたときに機能する関数。

チャレンジの仕様は、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行目は、物事が追いつくのを待って、ちらつきを防ぎます。

どのキーが押されたかのブールチェックに基づいて一度に1ピクセルずつ移動するため、左右に移動するのに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から始まるサイズ変更可能なウィンドウを使用します。ウィンドウのサイズを変更して侵略者を除外すると、次の移動キーが押されたときに元に戻ります。

要件を満たす秘trickは、侵略者の位置が4刻みで変更されることですが、実際の動きは1秒ごとに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 は、シェルで入力します。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グラフィックフレームワークです。つまり、画像操作に関する多くの便利な機能を備えています。実行するには、ここの左側のセクションに上記をコピーしてから、エイリアンを移動するには、右側のセクションを1回クリックしてフォーカスします。ブラウザで処理できる場合は、60fpsで実行する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.