コンソール/ターミナルで「Snake」ゲームを再作成する


25

ゲームは楽しいです

このコードゴルフはとても楽しかったので、他の古典的なゲームの複雑さも似たバージョンを作らなければなりませんでした。Pythonで基本的なSpace Invadersゲームを作成する最短の方法

ただし、今回はクラシックな「Snake」ゲームを再現してみてください。小さなゲームとしてスタートし、常にピースを集めてスコアを上げていきます。ピースを集めると、あなたの「しっぽ」が大きくなり、あなたが作った道を辿ります。目的は、あなた自身の尾や壁に衝突することなく、最も長く続くことです

資格:

  • あなた、あなたが尾を構成するキャラクター、壁、あなたが集めるピースはすべて異なるキャラクターでなければなりません
  • スコア付きのHUDを表示します。収集するピースごとにスコアが1ポイント増加します
  • プレイヤーが自分の尻尾や壁に衝突すると負けます
  • ゲームの開始時はもちろん、ピースが収集された直後にランダムな領域にピースが出現します
  • 一貫性がある限り、ゲームの速度は重要ではありません。
  • ブロック文字の高さは幅の2倍であるため、「セル」は2x1文字である必要があります。
  • 方向を変更するためのキーはawsd、それぞれ、左、上、下、右である必要があります
  • 開始方向は常に上でなければなりません
  • 壁の端を表示する必要があります。スコアは壁に重なる場合があります

上記の基準を満たす最短のコードが優先されます。創造性のための想像上のボーナスポイント


ヘビは食べるときに成長するはずがないのですか?
反時計回りを回すのをやめた

え?「ピースを集めると、あなたの作った道をたどる「尾」が伸びます。」そう、そう、ヘビは成長します。
ブレイザー

2
なければawsdstarting direction should always be up要件、M-x snake働くだろう
scrblnrd3

1
@ scrblnrd3 M-: (progn(define-key snake-mode-map"a"'snake-move-left)...(setq snake-initial-velocity-x 0 snake-initial-velocity-y 1)(snake))がそのトリックを行います。
ジョナサンリーチペピン

関連:
ブルズ

回答:


32

JavaScript(553 512バイト)

再生可能なバージョンへのリンク

c=0;a=b=d=-1;e=[f=[20,7],[20,8]];i=Math.random;~function n(){if(c&&(87==a||83==a
))c=0,d=87==a?-1:1;if(d&&(65==a||68==a))d=0,c=65==a?-1:1;p([j=e[0][0]+c,k=e[0][1
]+d])||!j||39==j||!k||10==k?b+=" | GAME OVER":(e.unshift([j,k]),p(f)?(f=[1+38*i(
)|0,1+9*i()|0],b++):e.pop());for(m=h="";11>h;h++){for(g=0;40>g;g++)l=g+","+h,m+=
!g||39==g||!h||10==h?"X":e[0]==l?"O":p(l)?"*":f==l?"%":" ";m+="\n"}x.innerHTML=m
+b;!b.sup&&setTimeout(n,99)}();onkeydown=function(o){a=o.keyCode};function p(o){
return e.join(p).indexOf(p+o)+1}

最初に実際のコンソールに出力しようとしましたが(console.logconsole.clear)、ちらつきが大きすぎたため、コンソールのようなHTMLに入れました。これで動作します:

<pre id=x>

また、最初に2x1セルで実装しましたが、1x1よりも悪く見えました。ただし、これは小さな変更になります。

awsdキーボードのキーを使用します。

更新:

テール検索を改善し、さらに魔法をかけることで、512(正確には0x200)バイトに削減することができました。

ピースが尻尾にスポーンすると2ポイントを獲得します(これは機能です)。ヘビが噛んだときの重なりも修正しました。


1
綺麗な!そして、あなたは正しい、それは2x1よりも1x1のように見えます。私が実際に抱えていた唯一の心配は、左右よりもはるかに速いことでしたが、制約を考慮すると実行可能です。コンソールの点滅はあまり気にしません(私のスペースインベーダープログラムを見て、かなりちらつきます)が、プレーンテキストのWebページも動作すると思います!しかし、1つの問題...リフレッシュする必要なく再起動する方法はありますか?:(
ブレイザー

動作しないawsd
ニール

@Blazerそれは13文字以上かかります:-/ ...とにかくF5キーがあります。
コピー

@ニールうん私は矢印キーを使用しましたが、今それを修正しました。
コピー

@copy私はそれを要件にしなかったと思う
ブレイザー

21

x86マシンコード(128バイト)

Mandlebrotフラクタル生成するための私の提出物によく似ていますはスネークゲームのを128バイトで書きました。チャレンジの要件を完全には満たしていません(すべての壁が描かれているわけではなく、正しく動き始めています)が、興味深い創造的なソリューションだと思うので投稿しています。スコアは右側にバイナリで表示され、矢印キーは動きの方向を制御し、「食べ物」はランダムにドロップされ、自分自身、壁、または画面の端を打つと終了します。

実行可能ファイルとソースコードのリンク

Screenshot

また、dosboxが不正行為であるかどうかについての以前のコメントに関しては、それが単なるdos端末であるため、テキストベースの表示モードである限り、完全に受け入れられると思います。


DOSBoxが不正行為と見なされるのはなぜですか?それは完全に合法的なプラットフォームです。
dfeuer

9

16ビット8086

526バイト/ 390バイト

Base64デコーダーを使用しこれをデコードし「snake.com」と呼び、Windowsコマンドプロンプトから実行します。WinXPでテストした場合、DosBoxを使用して適切なビデオモードを取得する必要がある場合があります。コントロールキーは「wasd」であり、終了するスペースです。「w」を押して開始します。

uBMAzRC5AD+2AOipAb1AAbgAoI7Auf//v4sMsAHzqrgAtLksAfOqg8cU/sx19OgsAYs+8gKwAuj4
ALQAzRpCiRYOA4kWEAPouAC0C80hCsB0IbQIzSG+ygKDxgOAPAB0EjgEdfSLRAGzAP/Qo1cBiB7w
AulqAIEGdAGu/7P+uNECgMMEw7MCuNsCgMMGw4s+8gKLHvACisPolwADv+YCJoo16I0AiT7yAoD+
A775AnREiz70AiaKHbAA6HUAA7/mAok+9AKA/gB0FscGVwHNAoEudAGu/zPJtj/o2QDofQC0AM0a
OxYOA3X2/wYOA+lZ/8YEAE7+BIA8CnT16F4AaOAB6EQAM9K5LQD38YvCweACBQoA9+WL+OguALlL
ADPS9/HB4gKDwgsD+iaAPQB10rADiMRXq4HHPQGrq4HHPAGrq4HHPQGrX8OhEAO62wD34rntf/fx
iRYQA4vCw772Ar8K9bUEshCstACL2AHDi4f6ArMDtwXR+LEAwNEC/smA4Q8miA0p7/7PdevoIQA6
xHQE/st13ugKAP7NdcroAwB1+8O3BSbGBQEp7/7PdfaBx0EG/srDuBAQM9uAwwLNEID7CnX2w7gD
AM0QzSB3dgEgxgIAYYcBZIUBIMYCAHd8AXN+ASDGAgAA+wAF/P8EAAIAH4ofigAAAADRxeD/TJlO
gQPvQrVA4++BVdVjgQ==

以下は、390バイト長の文字モードバージョンです。

uAMAzRC4ALiOwLlQADP/uCCf86uzF6u4AA+xTvOruCCfq7LdfCxUPOr6BgBiz5+AqF8Aqu0AM0aQ
okWhgKJFogC6MUAtAvNIQrAdCG0CM0hvlYCg8YDgDwAdBI4BHX0i0QBswD/0KNSAYgefALpdgCBB
m8Bov+z/rhdAoDDBMOzArhnAoDDBsOLPn4Cix58AiaJHQOclgmijUmiR2JPn4CgP4DvoUCdFOLPo
ACJoodJscFAAADv3JYiT6AAoD+AHQkxwZSAVkCgS5vAaL/vwEAudAHJoA9qnUEJsYFzIPHAuLx6F
4AtADNGjsWhgJ19oMGhgIC6Uz/xgQATv4EgDwKdPXoPgBo5wHoIgC5FwD38Wn6oADoFgC5TgD38U
ID0gP6JoA9AHXhJscFA93DoYgCutsA9+K57X/38YkWiAKLwjPSw76CAr8CALkEALSfrAQwq+L6w8
0gd3EBIFcCAGGCAWSAASBXAgB3dwFzeQEgVwIAYP+gAP7/AgACqtAH0AcAAAAA

このキャラクターモードは3バイト長くなります(ただし、ヘビの方が優れています)。

uAMAzRC4ALiOwLlQADP/uCCf86uzF6u4AA+xTvOruCCfq/7LdfCxUPOr6BsBiz6BAibHBQEKtADN
GkKJFokCiRaLAujHALQLzSEKwHQhtAjNIb5ZAoPGA4A8AHQSOAR19ItEAbMA/9CjUwGIHn8C6XgA
gQZwAaD/s/64YAKAwwTDswK4agKAwwbDiz6BAosefwImiR0Dv3VYJoo1JscFAQqJPoECgP4DvogC
dFOLPoMCJoodJscFAAADv3VYiT6DAoD+AHQkxwZTAVwCgS5wAaD/vwEAudAHJoA9qnUEJsYFzIPH
AuLx6F4AtADNGjsWiQJ19oMGiQIE6Ur/xgQATv4EgDwKdPXoPgBo6gHoIgC5FwD38Wn6oADoFgC5
TgD38UID0gP6JoA9AHXhJscFA93DoYsCutsA9+K57X/38YkWiwKLwjPSw76FAr8CALkEALSfrAQw
q+L6w80gd3IBIFoCAGGDAWSBASBaAgB3eAFzegEgWgIAYP+gAP7/AgACqtAH0AcAAAAA

創造性のポイントですが、dosboxではなくasciiコンソールまたは端末でゲームを動作させることが課題なので、dosboxの使用は不正行為だと思います。また、ゴルフをバイナリではなくソースコードにすべきではありませんか?
ブレイザー

7
@Blazer:それがソースコードです-16進エディターを使用してマシンコードを入力しました-それが私がl337である方法です!;-) DosBoxのことは、ビデオドライバーがモード13のグラフィックスに問題がある場合にのみ必要です(マイカードはそれで問題ありません)。アスキーバージョン(おそらく小さい)を行うことは難しくありません
スキッツ

「390バイト」バージョンは、388バイトのみにデコードされ、dosboxで実行するとハングします。送信中に何かが失われた可能性があります。:(それでも、他の2つのバージョンが非常にクールさ!
イルマリKaronen

コードの未使用バージョンはありますか?(私はこの言葉を知っていない)
AL

1
@ n.1:プログラムは8086マシンコードです。ラベル名がなくても、デバッガ(D86)にロードして、記述されたコードを表示できます。
スキズ14

6

shell / sh、578文字

私はPOSIX準拠にしようとしました(可能な限り移植性が高く、バシズムを避けます。乱数ジェネレーターでも/ procは必要ありません)。たとえば、ネイティブターミナルまたはSSHセッションで再生できます。「dash -c ./snake」を使用して実行します

いくつかの注意:シェルスクリプトはゲームのコーディングには適していません8-)

  • 公平を期すために、いわゆる「ビルトイン」のみを使用しました。
    • 「clear」、「stty」、「tput」などのプログラムの外部呼び出しはありません
    • そのため、移動するたびに画面全体を再描画します
    • 使用される組み込みコマンド(ネイティブコマンド)は次のとおりです。
      • エコー、eval、while-loop、let、break、read、case、test、set、shift、alias、source
  • 乱数ジェネレーター(PRNG)はないため、独自に作成する必要があります
  • キーストロークブロックを取得するため、別のスレッドを生成する必要があります
    • 親タスクでイベントを取得するには、一時ファイルを使用します((い!)
  • ヘビ自体はリストであり、安価です。
    • 各要素は(x、y)タプルです
    • テールを失うことは、リストを1シフトすることを意味します。
    • (新しい)ヘッドの追加は、文字列を追加することを意味します
  • グリッドは内部的に配列ですが、shell / shはこれを知りません:
    • グローバル変数を持つwithいeval-callを介してarray(x、y)を「エミュレート」しました
  • そして最後に:私たちはとても楽しかったです!
#!/bin/sh
alias J=do T=let E=echo D=done W=while\ let
p(){ eval A$1x$2=${3:-#};}
g(){ eval F="\${A$1x$2:- }";}
r(){
E $((1+(99*I)%$1))
}
X=9
Y=8
L="8 8 $X $Y"
I=41
W I-=1
J
p $I 1
p $I 21
p 1 $I
p 41 $I
D
p 3 3 :
>L
W I+=1
J
E -ne \\033[H
y=22
W y-=1
J
Z=
x=42
W x-=1
J
g $x $y
Z=$Z$F
D
E "$Z"
D
E $B
. ./L
case $D in
a)T X+=1;;d)T X-=1;;s)T Y-=1;;*)T Y+=1;;esac
g $X $Y
case $F in
\ |:)p $X $Y O
L="$L $X $Y"
case $F in
:)W I+=1
J
x=`r 39`
y=`r 19`
g $x $y
[ "$F" = \  ]&&{
p $x $y :
break
}
D
T B+=1;;*)set $L
p $1 $2 \ 
shift 2
L=$@;;esac;;*).;;
esac
D&
while read -sn1 K
J
E D=$K>L
D

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


これは実際に機能しますか?ヘビが右に行って押すaと止まります。奇妙な。
gniourf_gniourf

はい、あなたは自分自身を噛むので-それは私見でなければならない方法です。私たちは社内で議論し、誰もがこれに同意しています。
バスティアンBittorf 14

echo -n間違いなくポータブルではありません。最初のオペランドが-nの場合、またはいずれかのオペランドにバックスラッシュ( '\')文字が含まれている場合、結果は実装定義です。スイッチを使用せずにリテラルテキスト以外のものにエコーを使用することは移植性がありません。pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
nyuszika7h

nyuszika7h:これを回避する方法はありますか?
バスティアンBittorf 14

nyuszika7h:メインの 'echo -n'呼び出しを削除する方法を見つけたので、残っている呼び出しは1つだけです。「ホームポジションに移動(0,0)」のエスケープシーケンスを呼び出しています
バスティアンビットトルフ

4

Ruby 1.9 / Windowsのみ/354 337 355 346バイト)

require'Win32API';G=(W=Win32API).new g="crtdll","_getch",t=[],?I
B=(c=?#*39+h="#
#")+((S=' ')*38+h)*20+c;n=proc{c while B[c=rand(800)]!=S;B[c]=?*;S}
n[h=760];k={97=>-1,100=>1,119=>d=-41,115=>41}
(B[h]=?O;system'cls';$><<B<<$.;sleep 0.1
d=k[G.call]if W.new(g,"_kbhit",[],?I).call>0
t<<h;B[h]=?o;B[h+=d]==?*?B[h]=n[$.+=1]:B[t.shift]=S)while B[h]==S

Windowsコンソールの20x40ボードで再生します。スコアはボードの下に表示されます。WASDヘビを制御するために使用し、他のキーを強制的に終了します(強制的に!)。5行目の終わりのスリープ時間を編集して、速度を制御します。 (または、10個のキャラクターを保存し、スリープを完全に削除することでほぼプレイ不能にします!)

ボーナス機能:ランダムに起動に失敗します(最初のピースがヘビの位置で生成された場合)。

非ブロッキングgetcharの欠如を回避するために、100文字まで必要でした。どうやらRuby 1.9.3には「io / console」ライブラリが含まれており、それらの約半分を節約できたようです。また、このソリューションはWindows固有のものです。* nixシステムで同じタイプのことを行うための公開されたソリューションがありますが、文字数を比較するためにそれらをテストしていません。

編集:

尾は各ステップの後ではなく、食べた後にのみ成長することに気づいた後、18バイトを追加する必要がありました。

編集2 :(おそらく)クラッシュの問題を修正し、1つの食料品に制限することで9バイトを節約しました。


私は一度に複数の食料アイテムのアイデアが好きですが、大きな問題があります:尾はプレイヤーと一緒に移動する必要があり、収集する食料ごとに1キャラクターだけ成長します。
ブレイザー

修正作業中にコメントを追加しました... 1ピースしかないと思われる場合は、を削除して9.times{}9文字節約できます。
AShelly

唯一の要件は、一度に1つ以上の食べ物があることです。そうすると、いくつかのキャラクターを保存して、一度に1つだけ作ることができます。
ブレザー

ゲームは140ポイントでランダムにクラッシュしましたが、その理由はわかりません。それ以外の点では非常に良い
ブレイザー

クラッシュを修正したと思います。再度クラッシュする場合は、ルビーのエラーメッセージをお知らせください。
AShelly

4

Applesoft Basic-478(462)

これは私の初めてのコードゴルフでしたが、1989年に書き直され、ほとんどの要求に応じてヘビゲームを実装します(ただし、食物がなければ、ヘビは成長し続け、実際には1人ではなく2人のプレイヤーです)。 Applesoft Basic。

当時、ドブス博士のジャーナルなど、2行のプログラムコンテストが数多くありました。私はこれを255文字の制限がある2つの行(そして1つのブランチのみ)に合わせる方法を見つけるのに6ヶ月を費やしました

詳細情報:http : //davesource.com/Projects/SpeedWaller/

入力するプログラムは、正確に2行です。

1ONSCRN(X,Y)<>7ANDB<>0ANDSCRN(U,V)<>7GOTO2:HOME:GR:X=10:Y=20:U=30:V=Y:I=201:J=202:K=203:M=205:W=215:A=193:S=211:Z=218:O=1:Q=-1:P=49152:COLOR=7:HLIN0,39AT0:HLIN0,39AT39:VLIN0,39AT0:VLIN0,39AT39:VTAB22: ?"WASZ IJKM  "C:ONB=0GOTO2:CALL-678:RUN
2PLOTX,Y:PLOTU,V:B=PEEK(P):G=B<>ZANDB<>W:H=B<>AANDB<>S:O=G*(O*H+(B=S)-(B=A)):L=H*(L*G+(B=Z)-(B=W)):G=B<>IANDB<>M:H=B<>JANDB<>K:Q=G*(Q*H+(B=K)-(B=J)):R=H*(R*G+(B=M)-(B=I)):X=X+O:Y=Y+L:U=U+Q:V=V+R:FORN=1TO99:NEXT:C=C+1:VTAB22:HTAB12:?C:GOTO1

フォーマット時のリストは次のようになります。

1 ONSCRN(X,Y)<>7 AND B<>0 AND SCRN(U,V) <> 7 GOTO 2: HOME : GR :
  X=10 : Y=20 : U=30 : V=Y : I=201 : J=202 : K=203 : M=205 : W=215 :
  A=193 : S=211 : Z=218 : O=1 : Q=-1 : P=49152 : COLOR=7 : HLIN 0,39
  AT 0 : HLIN 0,39 AT 39 : VLIN 0,39 AT 0 : VLIN 0,39 AT 39 : VTAB 22 :
  ? "WASZ IJKM  "C : ON B=0 GOTO 2 : CALL -678 : RUN
2 PLOT X,Y : PLOT U,V : B=PEEK(P) : G= B<>Z AND B<>W: H=B<>A AND B<>S :
  O=G*(O*H+(B=S)-(B=A)) : L=H*(L*G+(B=Z)-(B=W)) : G=B<>I AND B<>M :
  H=B<>J AND B<>K : Q=G*(Q*H+(B=K)-(B=J)) : R=H*(R*G+(B=M)-(B=I)) :
  X=X+O : Y=Y+L : U=U+Q : V=V+R : FOR N=1 TO 99 : NEXT : C=C+1 :
  VTAB 22 : HTAB 12 : ? C : GOTO 1

ゲームは実際には2人のプレーヤーであり、ページの下部にキーとカウンターを表示する「指示」が含まれているため、生き残った歩数を確認できます。これは478文字で、そのうち16文字は命令とカウンタの出力です。したがって、これらを削除する場合は462文字です。


4

C#.NET Framework 4.7.2コンソール(2,456 2,440 2,424 2,408 2,052 1,973 1,747 1,686バイト)

これは楽しかったのですが、変数は1文字に過ぎないため、どの変数が何であるかを本当に考えなければなりませんでした。

using m=System.Console;using System;using System.Collections.Generic;using System.Threading;class s{static void Main(){m.CursorVisible=0>1;new s()._();}int l;Action<string> w=(x)=>m.Write(x);Action<int,int>n=(x,y)=>m.SetCursorPosition(x,y);(int x,int y)d,c,a;int h,u;List<(int x,int y)>p;void _(){while(1>0){f();h=25;u=25;p=new List<(int x,int y)>();l=0;d=(0,-1);c=(u/2,h/2);e();m.SetWindowSize(u+4,h+4);m.SetBufferSize(u+4,h+4);while(1>0){k();if(t())break;g();r();}f();m.SetWindowSize(u+4,h+6);m.SetBufferSize(u+4,h+6);n(1,h+3);w("        Game over,\n   press any key to retry.");f();m.ReadKey(1>0);m.Clear();}}private bool t(){if(c.x<0||c.y<0||c.x>=u||c.y>=h){r();n(c.x+2,c.y+2);w("X");return 1>0;}for(i=0;i<p.Count;i++){for(int j=0;j<i;j++){if(p[i].x==p[j].x&&p[i].y==p[j].y){r();n(c.x+2,c.y+2);w("X");return 1>0;}}}return 0>1;}private void e(){a=(z.Next(u),z.Next(h));l++;}void f(){while(m.KeyAvailable)m.ReadKey(1>0);}int i;void k(){var b=DateTime.Now;while((DateTime.Now-b).TotalMilliseconds<230)Thread.Sleep(10);if(!m.KeyAvailable)return;var a=m.ReadKey(1>0).Key;switch(a){case ConsoleKey.A:if(d.x==0)d=(-1,0);break;case ConsoleKey.W:if(d.y==0)d=(0,-1);break;case ConsoleKey.S:if(d.y==0)d=(0,1);break;case ConsoleKey.D:if(d.x==0)d=(1,0);break;}f();}void g(){c.x+=d.x;c.y+=d.y;p.Add((c.x,c.y));while(p.Count>l)p.RemoveAt(0);if(c.x==a.x&&c.y==a.y)e();}void r(){n(1,1);w("/");w(new string('-',u));w("\\");n(1,h+2);w("\\");w(new string('-',u));w("/");for(i=0;i<h;i++){n(1,i+2);w("|");n(u+2,i+2);w("|");}for(i=0;i<h;i++){for(int j=0;j<u;j++){n(i+2,j+2);w(" ");}}n(a.x+2,a.y+2);w("@");for(i=0;i<p.Count;i++){n(p[i].x+2,p[i].y+2);w("#");}n(2,0);w("Score:"+l);}Random z=new Random();}

いくつかのスクリーンショット:

スコア10のヘビ スネークはスコア4でクラッシュしました

バイナリ:https : //github.com/wooden-utensil/snakeCodeGolf/releases/tag/v1.0.0.0

GitHubリポジトリ:https : //github.com/wooden-utensil/snakeCodeGolf

変更ログ:https : //github.com/wooden-utensil/snakeCodeGolf/releases


1
Console.Write("Score:"+l);Console.WriteLine()->Console.WriteLine("Score:"+l)
スティーブン

1
のようにタプルを試しました(int X,int Y)d; ...; d=(0,-1)か?それはバイトを節約するかもしれません。また、なぜあなたがVector2 d;Vector2 c;Vector2 a;代わりにやっているのかわかりませんVector2 d,c,a。Console.SetCursorPosition関数をAction<...>1文字の変数として保存することもできると思います。-演算子を使用してDateTimeを減算できます。また、ループ変数をグローバルに宣言し、宣言することなく、必要なときに単純にゼロにすることもできます。
私の代名詞は

1
[提案の続き] キーワードを使用する代わりに、変数を使用1>0または保存できますtrue。ループで見事な->演算子を使用できる場合があります。ではDateTime b = DateTime.Now一部、b可能var。を使用して一部のバイトを保存できるdynamic場合とできない場合があります(多くの場合、異なるタイプの宣言をマージできます)。
私の代名詞は

1
引っ張るm.write(String)ことには、自分の一文字長い関数は、おそらくトンを救うだ
Veskah

1
また、使用するいくつかのブロックb.widthb.height、おそらく別の1文字の名前のローカル
変数に

3

Python 3-644

from curses import *
import time
from collections import deque
from random import randrange as R
N,W,S,E=z=119,97,115,100
t=tuple
u=0,0
def m(s):
 a=lambda o,y,x:y.addch(o[0],o[1],x);q=lambda:(R(L-2),R(C-2));L,C=s.getmaxyx();curs_set(0);s.nodelay(1);s.border();s.refresh();r=newwin(L-2,C-2,1,1);n=deque();y,x=[L-2,0];d=N;n.append(u);c=N;p=q();a(p,r,N);a(u,s,48)
 while 1:
  if c in z:d=c
  if d==N:y-=1
  if d==S:y+=1
  if d==W:x-=1
  if d==E:x+=1
  l=n.pop()
  if (y,x) in n:return
  if (y,x)==p:p=q();a(p,r,N);n.append(l);s.addstr(0,0,str(len(n)))
  n.appendleft((y,x));a((y,x),r,S);a(l,r,32);r.refresh();time.sleep(.2);c=s.getch()
wrapper(m)

きれいに終了しません。ヘビの上にスポーンするとピースが消える場合があります。


1

バッシュ(文字が多すぎる:約1522)

t=tput
tc="$t cup"
tr="$t rev"
ts="$t sgr0"
ox=5
oy=5
((w=$($t cols)-2-2*ox))
((h=$($t lines)-2-2*oy))
trap "$t rmcup
stty echo
echo 'Thanks for playing snake!'
" EXIT
$t smcup
$t civis
stty -echo
clear
printf -v hs %$((w+2))s
printf -v v "|%${w}s|"
$tc $oy $ox
printf %s ${hs// /_}
for((i=1;i<=h+1;++i)); do
$tc $((oy+i)) $ox
printf %s "$v"
done
$tc $((oy+h+2)) $ox
printf %s ${hs// /¯}
dx=0
dy=-1
hx=$((w/2))
hy=$((h-2))
l=2
xa=($hx $hx)
ya=($hy $((hy+1)))
$tr
for((i=0;i<${#xa[@]};++i)); do
$tc $((ya[i]+1+oy)) $((xa[i]+1+ox))
printf \ 
done
$ts
print_food() {
$tc $((fy+1+oy)) $((fx+1+ox))
printf "*"
}
nf() {
rf=1
while((rf))
do
rf=0
((fx=RANDOM%w))
((fy=RANDOM%h))
for ((i=0;i<${#ya[@]};++i))
do
if((ya[i]==fy&&xa[i]==fx))
then
rf=1
break
fi
done
done
print_food
}
nf
ps() {
s="SCORE: $l"
$tc $((oy-1)) $((ox+(w-${#s})/2))
printf "$s"
}
ps
while :
do
read -t 0.2 -s -n1 k
if (($?==0))
then
case $k in
w|W)((dy==0))&&{ dx=0;dy=-1;};;
a|A)((dx==0))&&{ dx=-1;dy=0;};;
s|S)((dy==0))&&{ dx=0;dy=1;};;
d|D)((dx==0))&&{ dx=1; dy=0;};;
q|Q)break;;
esac
fi
((hx=${xa[0]}+dx))
((hy=${ya[0]}+dy))
if((hx<0||hy<0||hx>w||hy>h))
then
go=1
break
fi
for((i=1;i<${#ya[@]}-1;++i))
do
if((hx==xa[i]&&hy==ya[i]))
then
go=1
break 2
fi
done
$tc $((ya[-1]+1+oy)) $((xa[-1]+1+ox))
printf \ 
$tr
$tc $((hy+1+oy)) $((hx+1+ox))
printf \ 
$ts
if((hx==fx&&hy==fy))
then
((++l))
ps
nf
else
ya=(${ya[@]::${#ya[@]}-1})
xa=(${xa[@]::${#xa[@]}-1})
fi
ya=($hy ${ya[@]})
xa=($hx ${xa[@]})
done
if((go))
then
$tc 3 3
echo GAME OVER
read -t 3 -s -n1
fi

スクリーンショット

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