สร้างโคลนเกมที่ง่าย 2048


53

2048 เป็นเกมที่สนุกและน่าติดตามซึ่งเป้าหมายคือการสร้างกระเบื้องที่มี 2048

นี่คือคำอธิบายสั้น ๆ ของเกม:


กดปุ่มลูกศรจะเลื่อนบล็อกทั้งหมดในเวทีในทิศทางนั้น ตัวอย่างเช่นถ้าxหมายถึงบล็อกและคุณกดลูกศรขึ้นในกรณีนี้:

...x
.x..
..x.
xx..

จากนั้นคณะกรรมการก็จะกลายเป็น

xxxx
.x..
....
....

2นอกจากนี้บล็อกที่มีเลขเริ่มต้นที่ หากมีการย้ายบล็อกที่มีหมายเลขเดียวกันสองบล็อกเข้าด้วยกันพวกเขาจะรวมเข้าไปในหมายเลขถัดไป ตัวอย่างเช่นการกด "up" ในบอร์ดนี้:

.2..
..22
.2..
....

จะสร้างสิ่งนี้:

.422
....
....
....

จากนั้นหลังจากกดปุ่ม "ถูกต้อง" มันจะกลายเป็น..44ดังนั้นการกดขวาอีกครั้งจะสร้างบล็อก "8" และอื่น ๆ

แต่ละเทิร์นบล็อก "2" ใหม่จะถูกสร้างขึ้นบนจัตุรัสเปิดแบบสุ่ม (จริงๆแล้วมันไม่ได้เป็น "2" เสมอไปแต่เพื่อความเรียบง่ายลองเก็บมันไว้) ถ้าไม่มีการเคลื่อนไหวที่เป็นไปได้ (เช่นกระดานเต็มและคุณไม่สามารถผสานอะไรได้) เกมจะหายไปและถ้า บล็อก 2048 ถูกสร้างขึ้นคุณชนะ!


ความท้าทายของคุณคือสร้างเกมนี้ขึ้นใหม่!

  • สำหรับกรณีขอบเช่นการกด "ขวา" บนกระดานนี้:

    ....
    .222
    ....
    ....
    

    คุณต้องรวมไทล์ใกล้กับขอบของปุ่มลูกศร เช่นนี้จะกลายเป็น..24เพราะที่สองและสาม "2" s อยู่ใกล้กับขอบด้านขวา

  • หากผู้เล่นกดการเคลื่อนไหวที่ไม่ถูกต้อง (เช่น "ขึ้น" บนกระดานเช่น2.2. / .... / .... / ....) คุณต้องละเว้นการเคลื่อนไหว

  • สามารถยอมรับการเคลื่อนไหวได้ทุกทางเช่นการคลิกปุ่มลูกศรULRDฯลฯ

  • แผ่นทั้งหมดจะต้องมีรูปร่างเหมือนกัน - แผ่น "1024" ควรมีขนาดเดียวกันกับแผ่น "2"

  • กระเบื้องจะต้องแยกออกในบางวิธี ตัวอย่างเช่น|1024| 2|1024|1024|เป็นตัวอย่างที่ถูกต้องของแถว (สมมติว่าแผ่นเป็นสี่เหลี่ยม) ในขณะที่1024 210241024ไม่ได้

  • คุณต้องเอาท์พุท "คุณชนะ" หากผู้เล่นสร้างไทล์ 2048 หรือ "คุณแพ้" หากไม่มีการเคลื่อนไหวที่ถูกต้อง

  • นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ!


แทนที่จะยอมรับแถวของอักขระเดี่ยว (ตัวอย่างห้าประการแรก) และ / หรือการแยกแบบเรียงต่อกัน (อันสุดท้าย) ทำไมไม่กำหนดอำนาจการเรียงจากน้อยไปหามากของอักขระสองตัวต่ออักขระเพื่อทำให้เอาต์พุตเป็นมาตรฐาน
millinon

@ millinon เพราะมันควรจะคล้ายกับเกมจริงในปี 2048 (มันจะทำให้ชื่อไม่มีความหมาย) และมันจะขจัดความท้าทายออกไป
Doorknob

1
" ถ้าไม่มีการรวมที่เป็นไปได้เกมจะหายไป " ไม่ควรมี "และบอร์ดเต็ม" ที่นั่นที่ไหนสักแห่ง?
Peter Taylor

พื้นที่ว่างไม่เพียงพอในการแยกกระเบื้อง
John Dvorak

5
ขำ ๆ ว่าภารกิจของคุณทั้งหมดได้รับคะแนนเสียงมากมาย แต่ไม่ได้รับคำตอบมากมาย
TheDoctor

คำตอบ:


7

APL (Dyalog APL) , 153 150 167 156 ไบต์

C←⎕UCS
'you ',{2048∊⍵:'win'
(z/∊n)[?+/z0=∊n←⍵]←2
⎕←4↑¨⍕¨n
1∊(⍉2=⌿n),(2=/n),0=n:∇{⍵≡r←R⍣¯1{4↑C(C¨2/¨t)⎕R(C¨,¨2×t2*⍳11)C⍵~0}¨(R←↓⍉∘⌽⍣⎕)⍵:∇⍵⋄r}n
'lose'}4 40

แจ้งย้าย 0 = ซ้าย, 1 = ขึ้น 2 = ขวา, 3 = ลง

ลองออนไลน์!

Ungolfed ด้วยช่องว่าง

C  UCS
'you ', {
    2048  ⍵: 'win'
    n  
    z  0 = n
    (z / n)[? +/z]  2
      4 ↑¨ ⍕¨n
    1  (⍉ 2 =⌿ n) , (2 =/ n) , 0 = n:  {
        R←↓⍉∘⌽⍣⎕
        r  R⍣¯1 {
            t  2 * 11
            4  C (C¨ 2 t)⎕R(C¨  2 × t) C  ~ 0
         R 
          r:  
        r
    } n
    'lose'
} 4 40

คำอธิบาย

บรรทัดว่างหมายถึงการขึ้นบรรทัดใหม่ในขณะที่บล็อกของบรรทัดอยู่ในบรรทัดเดียว

C ← ⎕UCSกำหนดจุดเปลี่ยนเป็น / จาก UCS เป็นชื่อC (สำหรับC odepoint)

'you ',"คุณ" ผนวกเข้ากับผลลัพธ์ของฟังก์ชัน{...

2048 ∊ ⍵: 'win' ถ้าการโต้เถียง (กระดาน) มี 2048 ให้ส่งคืน "win"

n ← ⍵กำหนดอาร์กิวเมนต์ที่ถูกต้องให้กับn (ดังนั้นจึงอาจแก้ไขได้ในที่)

z ← 0 = ∊n zรับรายการบูลีนโดยที่แบนราบzเป็น 0

(z / ∊n) zกรองค่าแบนn (เพื่อให้มีค่าเป็นศูนย์เท่านั้น)
[? +/z]ใช้ตัวเลขสุ่มระหว่าง 1 ถึงจำนวนศูนย์ (ผลรวมของบูลีนz ) เพื่อเลือกตำแหน่งที่ศูนย์บรรจุ
← 2ได้รับ 2

⎕ ←เอาท์พุทเป็นตัวแทนสตริงการ
4 ↑¨ขยายแต่ละความยาว 4 (พร้อมช่องว่าง)
⍕¨nเป็นตัวแทนของแต่ละหมายเลข

1 ∊หากพบสิ่งใดสิ่งหนึ่งต่อไปนี้
(⍉2=⌿n)ความเท่าเทียมกันในแนวตั้งคู่ตามแนวตั้ง (transposed ให้เป็น concatenable)
,หรือ (concatenated เป็น)
(2=/n)equality แนวนอนตามแนวนอน
,หรือ (ตัดแบ่งเป็น)
0=nศูนย์
:แล้ว:
เรียกใช้ฟังก์ชันนี้กับผลลัพธ์ของฟังก์ชัน{...

R ← R (สำหรับRกระแสของR otated) เป็น
แยกลงในแถว
⍉∘⌽⍣⎕ แจ้งให้สำหรับการป้อนข้อมูลที่เป็นตัวเลขแล้วหมุน (ตัวอักษรสะท้อนแนวนอนแล้วไขว้) อาร์กิวเมนต์ (คณะกรรมการ) -90 °เท่าของจำนวนที่ป้อน

r ← r (สำหรับr esult) รับ
R⍣¯1ค่าผกผันของR (หมุนกลับจากนั้นรวมแถวเป็นเมทริกซ์) ที่ใช้กับผลลัพธ์ของฟังก์ชัน{...

t ← 2 * ⍳11 tรับ2¹, 2², 2³, ... 2¹¹

4↑แผ่นที่มีศูนย์ทางด้านขวาจนกระทั่งความยาว 4
Cแปลงอักขระ UCS ต่อไปนี้เป็นรหัสจุด
(C¨2/¨t)⎕R(C¨,¨2×t)regex แทนที่คู่ของแต่ละtด้วย 2 ครั้งแต่ละtแต่อันดับแรกจะแปลงตัวเลขเป็นอักขระ UCS ที่สอดคล้องกันดังนั้น regex จะทำงาน
C ⍵~0อาร์กิวเมนต์ (บอร์ด) โดยไม่ต้อง ศูนย์ (ย่อไปทางซ้าย) จากนั้นแปลงเป็นคะแนนรหัส UCS

[สิ้นสุดฟังก์ชั่น] นำไปใช้กับแต่ละ
U↓แถว (แต่รวมเข้าด้วยกันในภายหลัง) ของ
R ⍵ R ที่ใช้กับอาร์กิวเมนต์ (กระดาน)

⍵ ≡ r:ถ้าอาร์กิวเมนต์ (สถานะบอร์ดเก่า) เหมือนกับr (สถานะบอร์ดใหม่) ดังนั้น:
∇⍵เรียกใช้ฟังก์ชันนี้บนอาร์กิวเมนต์ที่ไม่ได้แก้ไข (เนื่องจากผู้ใช้ทำการย้ายที่ไม่ถูกต้อง), มิฉะนั้น

rreturn r (สถานะบอร์ดใหม่)

} n[สิ้นสุดฟังก์ชั่น] นำไปใช้กับn (สถานะบอร์ดใหม่), อื่น ๆ

'lose' ส่งคืน "แพ้"

} 4 4 ⍴ 0 [สิ้นสุดฟังก์ชั่น] นำไปใช้กับตารางศูนย์ 4-by-4 (สถานะเริ่มต้น)


20

GolfScript, 323 ตัวอักษร

1,16*{16,{1$=!},.,rand=)/()2++\[]*+4/{.['-----']4*'+'*'++'1/*n+:^\{'|''     ':X'|'+4*n++:Y.@{X\`+-5>'|'\+}%'|'+n+Y+Y+^+}%+puts}:P~"wasd":Q{1$.@{Q\?[{zip}{}{-1%zip-1%}{{-1%}%}]=\1$~{0-[{.2$={+)}*}*0...]4<{1|(}%}%\~}:^~=!},:F{0{;'"#{'9.?rand';STDIN.getc()}"'++~.F\?0<}do^[]*.2048?0<.!{'you win'@@}*}{'you lose'@@*0}if}do 4/P;

กุญแจที่คุณต้องใช้คือwasdแต่คุณสามารถเปลี่ยนค่าคงที่ในรหัสเป็นรหัสที่คุณต้องการ มันละเว้นคีย์ที่ไม่รู้จักหรือการเคลื่อนไหวที่ผิดกฎหมาย น่าเสียดายที่คุณต้องกด Enter หลังจากแต่ละคีย์

ตัวอย่าง 2048ascii

โซลูชัน 256 ตัวอักษร

1,16*{16,{1$=!},.,rand=)/())+\[]*+4/{.{{.9>7*+48+}%n+}%puts}:P~"wasd":Q{1$.@{Q\?[{zip}{}{-1%zip-1%}{{-1%}%}]=\1$~{0-[{.2$={;21+}*}*0...]4<{20%}%}%\~}:^~=!},:F{0{;'"#{'9.?rand';STDIN.getc()}"'++~.F\?0<}do^[]*.10?0<.!{'you win'@@}*}{'you lose'@@*0}if}do 4/P;

นี่ออกเป็นลอการิทึมฐานสิบหกคือ0ย่อมาจาก., 1สำหรับ2, 2สำหรับ4, 3สำหรับ8... สำหรับB 2048เนื่องจากเราทุกคนรู้จักเลขฐานสิบหกและพลังของสองสิ่งนี้จึงไม่ควรเป็นข้อ จำกัด เลย

ตัวอย่างการวิ่ง (การเคลื่อนไหวครั้งแรก):

0000
0000
0010
0000
w
0011
0000
0000
0000
a
2000
0000
0001
0000
s
0000
0000
0100
2001
d
0000
0000
1001
0021
w
1022
0000
0001
0000
a
1301
0000
1000
0000
s
0000
1000
0000
2301
d
0000
1001
0000
0231

กระเบื้องควรจะแยกออกจากกัน แต่งานที่ดี
Teun Pronk

@Tununpronk ฉันกำลังทำงานกับมัน น่าเสียดายที่มันทำลายพลังที่ดีของสองคะแนน
Howard

7
+ ไม่ จำกัด สำหรับการเป็น 256 ตัวอักษรอย่างแน่นอน
SztupY

ใช่ ... 2 ^ 7 ตัวละคร !!
Mukul Kumar

1
ดี! ไม่ทราบวิธีการป้อนข้อมูลใน Golfscript มาก่อน โดยส่วนตัวแล้วฉันชอบ 256 char มากกว่าอ่านง่ายขึ้น และผมจะบอกว่ากระเบื้องจะถูกแยกออกจากกันเพราะกระเบื้องแต่ละเพียง 1 ตัวละครยาว ไม่เคยมีความกำกวมใด ๆ
Claudiu

12

J - 240 230 216 ถ่าน

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

'you ',>lose`win{~$:@".@('o b=:2 t}^:(1-b-:])s ',' b',~1!:1@1:)`w@.((w=:2048 e.,)+(s d-:s u=:l d=:r(&.|:))*s r-:(s=:[:p(2(=/(0,+/^:)@{.,}.),)/@p=:\:=&0)l=:&.|.r=:"1)(o=:[2:1!:2~4<@":"0])b=:2(t=:(?&#{])[:I.0=,)}4 4$0

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

การใช้งาน:

   'you ',>lose`win{~$:@".@('o b=:2 t}^:(1-b-:])s ',' b',~1!:1@1:)`w@.((w=:2048 e.,)+(s d-:s u=:l d=:r(&.|:))*s r-:(s=:[:p(2(=/(0,+/^:)@{.,}.),)/@p=:\:=&0)l=:&.|.r=:"1)(o=:[2:1!:2~4<@":"0])b=:2(t=:(?&#{])[:I.0=,)}4 4$0
+----+----+----+----+
|   0|   0|   0|   0|
+----+----+----+----+
|   2|   0|   0|   0|
+----+----+----+----+
|   0|   0|   0|   0|
+----+----+----+----+
|   0|   0|   0|   0|
+----+----+----+----+
r
+----+----+----+----+
|   0|   0|   0|   0|
+----+----+----+----+
|   0|   0|   0|   2|
+----+----+----+----+
|   0|   0|   0|   0|
+----+----+----+----+
|   0|   2|   0|   0|
+----+----+----+----+
u
+----+----+----+----+
|   0|   2|   0|   2|
+----+----+----+----+
|   0|   0|   0|   0|
+----+----+----+----+
|   0|   0|   0|   0|
+----+----+----+----+
|   0|   0|   0|   2|
+----+----+----+----+
d
+----+----+----+----+
|   0|   0|   0|   0|
+----+----+----+----+
|   2|   0|   0|   0|
+----+----+----+----+
|   0|   0|   0|   0|
+----+----+----+----+
|   0|   2|   0|   4|
+----+----+----+----+
l
+----+----+----+----+
|   0|   0|   0|   0|
+----+----+----+----+
|   2|   0|   0|   0|
+----+----+----+----+
|   0|   0|   2|   0|
+----+----+----+----+
|   2|   4|   0|   0|
+----+----+----+----+
d
+----+----+----+----+
|   0|   0|   0|   0|
+----+----+----+----+
|   0|   0|   0|   0|
+----+----+----+----+
|   0|   2|   0|   0|
+----+----+----+----+
|   4|   4|   2|   0|
+----+----+----+----+
r
+----+----+----+----+
|   0|   0|   0|   0|
+----+----+----+----+
|   0|   0|   0|   2|
+----+----+----+----+
|   0|   0|   0|   2|
+----+----+----+----+
|   0|   0|   8|   2|
+----+----+----+----+
d
+----+----+----+----+
|   0|   0|   0|   0|
+----+----+----+----+
|   0|   0|   0|   0|
+----+----+----+----+
|   0|   2|   0|   2|
+----+----+----+----+
|   0|   0|   8|   4|
+----+----+----+----+

ยิ่งใหญ่ น่าเสียดายที่ขนาดกำลังสองแตกต่างกันเมื่อเนื้อหาเปลี่ยนแปลงและนั่นเป็นข้อกำหนดหนึ่งที่ระบุไว้ในคำถาม
Howard

@Howard ฉันชักชวนที่ทำให้กระเบื้อง squarelike อย่างเหนียวแน่นเป็นที่น่าเกลียดมากกว่าที่จะให้พวกเขา แต่ที่นั่นมันคงที่
algorithmshark

9

Mathematica, 484 ตัวอักษร

น่าเกลียดมาก.

m@l=#//.{{x___,0,a_/;a>0,y___}:>{x,a,0,y},{x___,a_/;a>0,a_,y___}:>{x,2 h@a,0,y}}/.h@a_:>a&;{m@u,m@d,m@r}=Composition[#,m@#2,#]&@@@{{Thread,l},{Reverse,u},{Thread,d}};a=ReplacePart[#,RandomChoice@Position[#,0]->2]&;g=a@ConstantArray[0,{4,4}];EventHandler[Dynamic[GraphicsGrid@Map[Graphics@Text@#&,g,{2}]],(#2<>"ArrowKeyDown":>If[g!=m[#]@g,g=a[m[#]@g];Which[And@@(g==m[#]@g&/@{u,l,r,d}),Print@"you lose",!FreeQ[g,2048],Print@"you win"]])&@@@{{l,"Left"},{r,"Right"},{u,"Up"},{d,"Down"}}]

ควบคุมโดยปุ่มลูกศร

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


Ungolfed:

move[Left] = # //. {{x___, 1, a_ /; a > 1, y___} :> {x, a, 1, y},
      {x___, a_ /; a > 1, a_, y___} :> {x, 2 Hold@a, 1, y}} /. 
    Hold@a_ :> a &;
move[Up] = Composition[Transpose, move[Left], Transpose];
move[Down] = Composition[Reverse, move[Up], Reverse];
move[Right] = Composition[Transpose, move[Down], Transpose];
addTile = ReplacePart[#, RandomChoice@Position[#, 1] -> 2] &;
keyDown = If[grid != move[#][grid], grid = addTile[move[#][grid]];
    Which[And @@ (grid == move[#][grid] & /@ {Left, Right, Up, Down}),
      status = "Can't move...",
     ! FreeQ[grid, 2048], status = "2048!"]] &;
grid = addTile@ConstantArray[1, {4, 4}];
status = "";
EventHandler[Dynamic[ArrayPlot[Log2@grid/11,
   ColorFunction -> "StarryNightColors",
   ColorFunctionScaling -> False,
   Mesh -> All,
   Epilog -> {MapIndexed[
      Text[Style[#1, "Section"] //. 1 -> "", #2 - {0.5, 0.5}] &, 
      Transpose@Reverse@grid, {2}],
     Text[Style[status, "Section"], {2, 2}]}]],
 {"LeftArrowKeyDown" :> keyDown[Left],
  "RightArrowKeyDown" :> keyDown[Right],
  "UpArrowKeyDown" :> keyDown[Up],
  "DownArrowKeyDown" :> keyDown[Down]}]

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


2
ฉันชอบหน้าตาของคนที่ไม่ได้แต่งตัว!
tomsmeding

7

Delphi XE3 (Waaay ไปยังหลาย {whispers} 2.979 bytes -> ungolfed 4.560 bytes)

ฉันชอบเรียกสิ่งนี้ว่า "2048 code the novel"
ใช้จำนวนไบต์มากกว่าที่ฉันชอบ แต่มันใช้งานได้และมันสนุกที่จะทำ

ฉันยังคงพยายามทำให้มันสั้นลงในภายหลัง

เกมกำลังดำเนินการ

เกม

แข็งแรงเล่นกอล์ฟ

uses System.SysUtils,Windows;type TDir=(dUp,dDown,dLeft,dRight,dInv);const t='_____________________________';er='|      |      |      |      |';nr='| %s | %s | %s | %s |';br='|______|______|______|______|';fn='%d';procedure mycls;var S:String;H:DWORD;CO:_COORD;begin H:=GetStdHandle(STD_OUTPUT_HANDLE);CO.X:=0;CO.Y:=0;SetConsoleCursorPosition(H,CO);S:=StringOfChar(Chr(32),2000);Writeln(S);SetConsoleCursorPosition(H,CO);end;var a:array[1..4,1..4]of integer;c,rx,ry,i,j:int8;m:string;GameOver,gs:boolean;function hz:boolean;var b,q:int8;begin for b:=1to 4do for q:=1to 4do if a[b,q]=0 then exit(true);end;function HM:boolean;var b,q:int8;begin if hz then exit(true);for b:=1to 4do for q:=1to 4do begin c:=a[b,q];if c in [a[b-1,q],a[b+1,q],a[b,q-1],a[b,q+1]] then result:=true;end;end;procedure rn(out n,m:int8);var z:int8;begin z:=0;repeat n:=Random(4)+1;m:=Random(4)+1;z:=z+1;until(a[n,m]=0)and(z>=3);end;function gn(n:integer):string;begin if n=0 then exit('    ');Result:=IntToStr(n).PadLeft(4,' ');end;procedure pm(d:TDir;score:boolean);var b,q,z:int8;begin case d of dUp:for z:=1to 3do for b:=1to 4do for q:=1to 3do begin if score then begin if a[q,b]=a[q+1,b] then begin a[q,b]:=a[q,b]+a[q+1,b];a[q+1,b]:=0;end;end else if a[q,b]=0 then begin a[q,b]:=a[q+1,b];a[q+1,b]:=0;end;end;dDown:for z:=1to 3do for b:=1to 4do for q:=2to 4do begin if score then begin if a[q,b]=a[q-1,b] then begin a[q,b]:=a[q,b]+a[q-1,b];a[q-1,b]:=0;end;end else if a[q,b]=0 then begin a[q-1,b]:=a[q,b];a[q-1,b]:=0;end;end;dLeft:for z:=1to 3do for q:=1to 4do for b:=1to 3do begin if score then begin if a[q,b]=a[q,b+1] then a[q,b]:=a[q,b]+a[q,b+1];a[q,b+1]:=0;end else if a[q,b]=0 then begin a[q,b]:=a[q,b+1];a[q,b+1]:=0;end;end;dRight:for z:=1to 3do for q:=1to 4do for b:=2to 4do begin if score then begin if a[q,b]=a[q,b-1] then begin a[q,b]:=a[q,b]+a[q,b-1];a[q,b-1]:=0;end;end else if a[q,b]=0 then begin a[q,b]:=a[q,b-1];a[q,b-1]:=0;end;end;end;end;function gd(s:string):TDir;begin s:=lowercase(s);if s='u'then exit(dUp);if s='d'then exit(dDown);if s='l'then exit(dLeft);if s='r'then exit(dRight);exit(dInv)end;procedure dg;var z:int8;begin writeln(t);for z:=1to 4do begin writeln(er);Writeln(Format(nr,[gn(a[z,1]),gn(a[z,2]),gn(a[z,3]),gn(a[z,4])]));Writeln(br);end;end;function hw:boolean;var b,q:int8; begin for b:=1to 4do for q:=1to 4do if a[b,q]=2048 then result:=true;end;function dm:boolean;var d:Tdir;begin d:=gd(m);if d=dInv then if not gs then exit(false)else exit(true);pm(d,false);pm(d,true);pm(d,false);exit(true);end;begin gs:=true;m:='';for j:=1to 4do for i:=1to 4do begin a[i,j]:=0;end;rx:=0;ry:=0;rn(rx,ry);a[rx,ry]:=2;repeat if (dm) then begin if hz then begin rn(rx,ry);a[rx,ry]:=2;end;gs:=false;end;mycls;GameOver:=true;if hw then WriteLn('You have won!')else if HM then begin GameOver:=false;dg;writeln('Direction: [U]=up, [D]=Down, [L]=Left, [R]=Right');readln(m);end else WriteLn('Game Over, no more possible moves :('#13#10'Try again next time')until GameOver;readln;end.

Ungolfed

uses
  System.SysUtils,Windows;
type
  TDir=(dUp,dDown,dLeft,dRight,dInv);
const
  t='_____________________________';
  er='|      |      |      |      |';
  nr='| %s | %s | %s | %s |';
  br='|______|______|______|______|';
  fn='%d';
procedure mycls;
var
  S:String;
  H:DWORD;
  CO:_COORD;
begin
  H:=GetStdHandle(STD_OUTPUT_HANDLE);
  CO.X:=0;
  CO.Y:=0;
  SetConsoleCursorPosition(H,CO);
  S:=StringOfChar(Chr(32),2000);
  Writeln(S);
  SetConsoleCursorPosition(H,CO);
end;
var
  a:array[1..4,1..4]of integer;
  c,rx,ry,i,j:int8;
  m:string;
  GameOver,gs:boolean;
function hz:boolean;
var b,q:int8;
begin
  for b:=1to 4do
    for q:=1to 4do
      if a[b,q]=0 then exit(true);
end;
function HM:boolean;
var b,q:int8;
begin
  if hz then exit(true);
  for b:=1to 4do
    for q:=1to 4do
    begin
      c:=a[b,q];
      if c in [a[b-1,q],a[b+1,q],a[b,q-1],a[b,q+1]] then
        result:=true;
    end;
end;
procedure rn(out n,m:int8);
var z:int8;
begin
z:=0;
  repeat
    n:=Random(4)+1;
    m:=Random(4)+1;
    z:=z+1;
  until(a[n,m]=0)and(z>=3);
end;
function gn(n:integer):string;
begin
  if n=0 then exit('    ');
  Result:=IntToStr(n).PadLeft(4,' ');
end;
procedure pm(d:TDir;score:boolean);
var
  b,q,z:int8;
begin
  case d of
    dUp:
      for z:=1to 3do
        for b:=1to 4do
          for q:=1to 3do
          begin
            if score then
            begin
              if a[q,b]=a[q+1,b] then
              begin
                a[q,b]:=a[q,b]+a[q+1,b];a[q+1,b]:=0;
              end;
            end
            else
              if a[q,b]=0 then
              begin
                a[q,b]:=a[q+1,b];a[q+1,b]:=0;
              end;
          end;
    dDown:
      for z:=1to 3do
        for b:=1to 4do
          for q:=2to 4do
          begin
            if score then
            begin
              if a[q,b]=a[q-1,b] then
              begin
                a[q,b]:=a[q,b]+a[q-1,b];a[q-1,b]:=0;
              end;
            end
            else
              if a[q,b]=0 then
              begin
                a[q-1,b]:=a[q,b];
                a[q-1,b]:=0;
              end;
          end;
    dLeft:
      for z:=1to 3do
        for q:=1to 4do
          for b:=1to 3do
          begin
            if score then
            begin
              if a[q,b]=a[q,b+1] then
                a[q,b]:=a[q,b]+a[q,b+1];a[q,b+1]:=0;
            end
            else
              if a[q,b]=0 then
              begin
                a[q,b]:=a[q,b+1];a[q,b+1]:=0;
              end;
          end;
    dRight:
      for z:=1to 3do
        for q:=1to 4do
          for b:=2to 4do
          begin
            if score then
            begin
              if a[q,b]=a[q,b-1] then
              begin
                a[q,b]:=a[q,b]+a[q,b-1];a[q,b-1]:=0;
              end;
            end
            else
              if a[q,b]=0 then
              begin
                a[q,b]:=a[q,b-1];a[q,b-1]:=0;
              end;
          end;
  end;
end;

function gd(s:string):TDir;
begin
  s:=lowercase(s);
  if s='u'then exit(dUp);
  if s='d'then exit(dDown);
  if s='l'then exit(dLeft);
  if s='r'then exit(dRight);
  exit(dInv)
end;
procedure dg;
var z:int8;
begin
  writeln(t);
  for z:=1to 4do
  begin
    writeln(er);
    Writeln(Format(nr,[gn(a[z,1]),gn(a[z,2]),gn(a[z,3]),gn(a[z,4])]));
    Writeln(br);
  end;
end;
function hw:boolean;
var b,q:int8;
begin
  for b:=1to 4do
    for q:=1to 4do
      if a[b,q]=2048 then
        result:=true;
end;
function dm:boolean;
var
  d:Tdir;
begin
  d:=gd(m);
  if d=dInv then if not gs then exit(false)else exit(true);
  pm(d,false);
  pm(d,true);
  pm(d,false);
  exit(true);
end;
begin
    gs:=true;m:='';
    for j:=1to 4do
      for i:=1to 4do
      begin
        a[i,j]:=0;
      end;
   rx:=0;ry:=0;
   rn(rx,ry);
   a[rx,ry]:=2;
  repeat
    if (dm) then
    begin
      if hz then
      begin
        rn(rx,ry);
        a[rx,ry]:=2;
      end;
      gs:=false;
    end;
    mycls;
    GameOver:=true;
    if hw then
      WriteLn('You have won!')
    else if HM then
    begin
      GameOver:=false;
      dg;
      writeln('Direction: [U]=up, [D]=Down, [L]=Left, [R]=Right');
      readln(m);
    end
    else
      WriteLn('Game Over, no more possible moves :('#13#10'Try again next time')
  until GameOver;
  readln;
end.

2
ไบต์ 2.979 ? มันควรจะเป็นกิโลไบต์หรือไม่?
Hosch250

9
สถานที่บางแห่งในโลกใช้เครื่องหมายจุลภาคเป็นตัวเลขในแบบที่เราใช้ช่วงเวลาฉันจะไม่แปลกใจถ้าสิ่งที่ตรงกันข้ามเป็นจริง
undergroundmonorail

1
@undergroundmonorail True ในยุโรปหมายเลขหนึ่งพันและสิบสองเครื่องหมายจุลภาคหกมักเขียนเป็น 1.012,6 แทนที่จะเป็นอเมริกัน 1,012.6 :)
tomsmeding

CodeGolf สอนฉันว่าคุณสามารถแลกเปลี่ยน,และเป็น.ตัวเลขได้!
Tejas Kale

1
สิ่งที่ดีคำถามนี้ไม่มีกระดานผู้นำ ...
Patrick Roberts

7

C (มาตรฐาน C89), 881 ไบต์

ใช้ปุ่ม WASD เพื่อย้าย คอมไพล์ใน GCC และเสียงดังกังวานยกเว้นค่าที่กำหนดเป็นมาตรฐาน C99 (ฉันเดา) ใช้ termios.h ทำงานใน Linux และ MacOS X ไม่แน่ใจเกี่ยวกับ Windows

#include<termios.h>
#define R return
#define H while
char t[17],*Q,*W="adws",D,x,y,X;m(x,y){R!D?x+y*4:D==1?3-x+y*4:D==2?y+x*4:y+(3-x)*4;}c(){for(y=0;y<3;++y)for(x=0;x<3;++x){D=t[x+y*4];if(t[x+1+y*4]==D||t[x+4+y*4]==D)x=y=9;}R y>4;}d(){if(strlen(t)==16)R 0;H(t[x=(rand()&15)]);R t[x]=1;}r(x){putchar(x);}b(){y=0;r(10);H(y<21)r(y++%5?45:43);r(10);}f(){for(x=0;x<17;++x)if(X=(t[x]==11))x=32;R x<18;}struct termios z;main(){srand(time(tcgetattr(0,&z)));z.c_lflag&=~ICANON;tcsetattr(0,0,&z);H(f()&&(d()||c())){x=0;H(x<16){if(!(x&3)){b();r('|');}if(y=t[x++])printf("%4u|",1<<y);else printf("    |");}b();r(10);H(!(Q=strchr(W,getchar())));D=Q-W;for(y=0;y<4;++y)for(X=0,x=1;x<4;++x)if(t[m(x,y)]){if(t[m(x,y)]==t[m(X,y)]&&t[m(X,y)]++)t[m(x,y)]=0;X=x;}do{for(y=0;y<4;++y)for(x=0;x<3;++x)if(!t[m(x,y)]&&(X=t[m(x+1,y)])){t[m(x,y)]=X;t[m(x+1,y)]=0;x=y=9;}}H(y>4);}puts(X?"you win":"you lose");}

แตกในบางบรรทัด:

#include<termios.h>
#define R return
#define H while
char t[17],*Q,*W="adws",D,x,y,X;m(x,y){R!D?x+y*4:D==1?3-x+y*4:D==2?y+x*4:y+(3-x)*4;}
c(){for(y=0;y<3;++y)for(x=0;x<3;++x){D=t[x+y*4];if(t[x+1+y*4]==D||t[x+4+y*4]==D)x=y=9;}R y>4;}
d(){if(strlen(t)==16)R 0;H(t[x=(rand()&15)]);R t[x]=1;}
r(x){putchar(x);}
b(){y=0;r(10);H(y<21)r(y++%5?45:43);r(10);}
f(){for(x=0;x<17;++x)if(X=(t[x]==11))x=32;R x<18;}
struct termios z;
main(){srand(time(tcgetattr(0,&z)));z.c_lflag&=~ICANON;tcsetattr(0,0,&z);
H(f()&&(d()||c())){x=0;H(x<16){if(!(x&3)){b();r('|');}if(y=t[x++])printf("%4u|",1<<y);else printf("    |");}
b();r(10);H(!(Q=strchr(W,getchar())));D=Q-W;for(y=0;y<4;++y)for(X=0,x=1;x<4;++x)
if(t[m(x,y)]){if(t[m(x,y)]==t[m(X,y)]&&t[m(X,y)]++)t[m(x,y)]=0;X=x;}
do{for(y=0;y<4;++y)for(x=0;x<3;++x)if(!t[m(x,y)]&&(X=t[m(x+1,y)]))
{t[m(x,y)]=X;t[m(x+1,y)]=0;x=y=9;}}H(y>4);}puts(X?"you win":"you lose");}

รูปลักษณ์:

+----+----+----+----+
|   8|   4|   8|   2|
+----+----+----+----+
|    |  16|    |    |
+----+----+----+----+
|    |   2|    |    |
+----+----+----+----+
|    |    |    |   2|
+----+----+----+----+

สามารถปรับปรุงได้อย่างแน่นอน


5

Java: 1346 1269

แก้ไขดังนั้นแม้ว่าการประกวดนี้จะเสร็จสิ้นบางครั้งฉันก็ไม่สามารถปล่อยให้ไปเมื่อสามารถทำการปรับปรุงได้ รุ่นนี้มีฟังก์ชั่น leaner, Meaner, in-place folding, การขับไล่booleanประเภทส่วนใหญ่ยกเว้นว่ามันจะเป็น verbose มากขึ้นหากไม่มีพวกเขาและเซลล์ขนาดเล็กกว่าเล็กน้อย (4x4 แทนที่จะเป็น 5x5) เพื่อตัดอักขระพิเศษบางส่วนออก

นี่เป็นเรื่องสนุก ขอบคุณสำหรับการโพสต์! Ungolfed นี่คือ 2856 ไบต์ฉันตีมันเป็น 1346 ไบต์ การเป็น Java ฉันจะไม่ชนะ แต่ฉันต้องการแสดงให้เห็นอย่างดี การหาฟังก์ชั่นการม้วน "ทั่วไป" เพื่อจัดการการเชื่อมต่อและการเคลื่อนย้ายเป็นเรื่องสนุก - แน่นอนคุณสามารถตรวจสอบ "ความคืบหน้า" ของฉันได้โดยดูจากข้อผูกพันในที่เก็บ githubของฉันสำหรับวิธีนี้

แข็งแรงเล่นกอล์ฟ:

import java.util.*;class T{public static void main(String[]a){(new T()).s();}int[][]b=new int[4][4];int d,p,i,j,x,y,v,q,r;boolean I,V;void s(){p();do{d();do{char a=(new Scanner(System.in)).nextLine().charAt(0);y=a=='u'?f(0,1):a=='d'?f(1,1):a=='l'?f(0,0):a=='r'?f(1,0):0;}while(y<1);p();}while((x=n())>0);d();c("you "+(x<0?"win":"lose"));}int h(){for(int[]y:b)for(int x:y)if(x<2)return 1;return 0;}int n(){for(y=0;y<4;y++){for(x=0;x<4;x++){i=b[y][x];if(x<3&&i==b[y][x+1]||y<3&&i==b[y+1][x])return 1;if(i>2047)return -1;}}return h();}int f(int w,int z){I=w>0;V=z>0;for(i=d=0;i<4;i++){p=I?3:0;for(j=1;j<4;){v=V?i:j;x=I?3-v:v;v=V?j:i;y=I?3-v:v;q=V?x:p;r=V?p:y;if(b[y][x]==0||p==(V?y:x))j++;else if(b[r][q]==0){d+=b[r][q]=b[y][x];b[y][x]=0;j++;}else if(b[r][q]==b[y][x]){d+=b[r][q]*=2;b[y][x]=0;p+=I?-1:1;j++;}else p+=I?-1:1;}}return d;}int v(){return(new Random()).nextInt(4);}void p(){if(h()<1)return;do{x=v();y=v();}while(b[x][y]>0);b[x][y]=2;}void c(String a){System.out.println(a);}String l(char n,char m){String s=""+n;for(i=0;i<4;i++){for(j=0;j<4;j++)s+=m;s+=n;}return s;}void d(){c(l('+','-'));String p[]=new String[5];for(int[]y:b){p[0]=p[1]=p[3]=l('|',' ');p[2]="";for(x=0;x<4;)p[2]+=String.format("|%4d",y[x++]);p[2]+="|";p[4]=l('+','-');for(String q:p)c(q);}}}

Ungolfed: (ตรวจสอบที่เก็บ github ของฉันสำหรับโครงการนี้สำหรับรุ่นที่อัปเดตรวมถึงการทดสอบตามการยืนยันสำหรับฟังก์ชั่นการพับใหม่)

import java.util.*;
class Twe {
    public static void main(String[] a){
        (new Twe()).start();
    }
    int[][] board=new int[4][4];
    void start(){
        int x;
        placeTwo();
        do{
            drawBoard();
            resolve();
            placeTwo();
        }while((x=notDone())>0);
        drawBoard();
        wrapup(x);
    }
    int hasFree(){
        for(int[]y:board)
            for(int x:y)
                if(x<2)return 1;
        return 0;
    }
    int notDone(){
        int moves,x,y;
        for(moves=y=0;y<4;y++){
            for(x=0;x<4;x++){
                else if(x<3&&board[y][x]==board[y][x+1]||
                        y<3&&board[y][x]==board[y+1][x])moves++;
                if(board[y][x]>2047)return -1;
            }
        }
        return hasFree()+moves;
    }
    void wrapup(int k){
        if(k<0){
            chalk("you win",true);
        }else{
            chalk("you lose",true);
        }
    }
    void resolve(){
        do{
            switch((new Scanner(System.in)).nextLine().charAt(0)){
                case 'u':
                    if (fold(false,true)>0)return;
                    break;
                case 'd':
                    if (fold(true, true)>0)return;
                    break;
                case 'l':
                    if (fold(false,false)>0)return;
                    break;
                case 'r':
                    if (fold(true,false)>0)return;
                    break;
                case 'z':
                    board[0][0]=2048; // instant win;
                    return;
            }
        } while(true);
    }
    // false,true  = up
    // true, true  = down
    // false,false = left
    // true, false = right
    int fold(boolean inv, boolean vert){
        int didMove=0;
        int nextSpot,x,y,v,q,r;
        int[][] nb = new int[4][4];
        for(int i=0;i<4;i++){
            nextSpot=inv?3:0;
            for(int j=0;j<4;j++){
                v=vert?i:j;
                x=inv?3-v:v;
                v=vert?j:i;
                y=inv?3-v:v;
                q=vert?x:nextSpot;
                r=vert?nextSpot:y;
                if(board[y][x]>0){
                    if(nb[r][q]<1){
                        nb[r][q]=board[y][x];
                        didMove+=(inv?-1:1)*(vert?y-r:x-q);
                    }else if(nb[r][q]==board[y][x]){
                        nb[r][q]*=2;
                        nextSpot+=inv?-1:1;
                        didMove++;
                    }else{
                        nextSpot+=inv?-1:1;//suckage
                        q=vert?x:nextSpot;
                        r=vert?nextSpot:y;
                        nb[r][q]=board[y][x];
                        didMove+=(inv?-1:1)*(vert?y-r:x-q);
                    }
                }
            }
        }
        board=nb;
        return didMove;
    }
    int vec(){
        return (new Random()).nextInt(4);
    }
    void placeTwo(){
        if (hasFree()<1) return;
        int x,y;
        do{
            x=vec();y=vec();
        }while(board[x][y]>0);
        board[x][y]=2;
    }
    void chalk(String a, boolean nl){
        System.out.print(a+(nl?"\n":""));
    }
    String fill(char node, char mid){
        String str = ""+node;
        for(int i=0;i<4;i++){
            for(int j=0;j<5;j++)
                str+=mid;
            str+=node;
        }
        return str;
    }
    void drawBoard(){
        chalk(fill('+','-'),true);
        String p[] = new String[6];
        for(int[]y:board){
            p[0]=p[1]=p[3]=p[4]=fill('|',' ');
            p[2]="";
            for(int x=0;x<4;){
                p[2]+=adjust(y[x++]);
            }
            p[2]+="|";
            p[5]=fill('+','-');
            for (String q:p){
                chalk(q,true);
            }
        }
    }
    String adjust(int a){
        return String.format("|%5d",a);
    }
}

การใช้โปรแกรมนั้นง่าย วิธีสร้างและเรียกใช้:

javac T.java
java T

กดuเพื่อพับขึ้นrเพื่อพับไปทางขวาdเพื่อพับลงlเพื่อพับไปทางซ้าย คีย์อื่นใด ๆ จะถูกละเว้นการย้ายที่ไม่ถูกต้อง (ไม่มีผลลัพธ์) จะถูกละเว้น เป็น Java ให้กดปุ่มenterแต่ละปุ่มหลังเพื่อล้างบัฟเฟอร์ของบรรทัด ตามที่กำหนดตามกฎถ้าคุณชนะเอาท์พุทโปรแกรมถ้าคุณสูญเสียผลโปรแกรมyou win you loseใหม่2จะถูกวางแบบสุ่มในกระเบื้องเปิด การผสานเป็นไปตามกฎที่ระบุไว้ เซลล์เป็นตัวอักษร 4x4 โดยมีเส้นขอบล้อมรอบแต่ละเซลล์ แน่นอนฉันจะแสดงความคิดเห็นถ้าฉันทำบางสิ่งบางอย่างสับสนและฉันจะแน่ใจว่าจะแก้ไข

ตัวอย่างผลลัพธ์:

$ java T
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   2|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
u
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   2|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   2|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
l
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   2|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   2|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   2|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
u
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   4|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   2|   2|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
l
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   4|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   4|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   2|
|    |    |    |    |
+----+----+----+----+
u
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   8|   2|   0|   2|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
l
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   8|   4|   2|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
l
u
d
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   2|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   8|   4|   2|   0|
|    |    |    |    |
+----+----+----+----+
d
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   2|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   8|   4|   4|   0|
|    |    |    |    |
+----+----+----+----+
l
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   2|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   2|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   8|   8|   0|   0|
|    |    |    |    |
+----+----+----+----+
l
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   2|   2|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   2|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|  16|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
d
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   2|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   4|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|  16|   2|   0|   0|
|    |    |    |    |
+----+----+----+----+
d
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   0|   0|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|   4|   2|   0|   0|
|    |    |    |    |
+----+----+----+----+
|    |    |    |    |
|    |    |    |    |
|  16|   4|   0|   0|
|    |    |    |    |
+----+----+----+----+

2

Lua, 622 616 615 612 592 590 575 ไบต์

แบบสอบถาม stdin สำหรับ 1,2,3,4 สัมพันธ์กับซ้าย, ลง, ขวา, ขึ้น (ทำสำหรับการป้อนข้อมูล numpad); ขัดข้องถ้าคุณให้อินพุตที่ไม่ถูกต้อง

สี่เหลี่ยมว่างจะถูกพิมพ์เป็น '0'

b={('\0'):rep(16):byte(1,16)}c=1 a=print h=unpack while{}do if c then c=z
e={}for i=1,16 do e[#e+1]=0==b[i]and i or z end _=#e==0 and
a'you lose'b[e[math.random(#e)]]=2 l=('+----'):rep(4)..'+\n'm=l:gsub('-',' ')for
i=1,13,4 do a(l..m..m..m..('+%4d+%4d+%4d+%4d+'):format(h(b,i)))end a(l)end c=z
u,v,w=h({4,1,-4,1,-4,16,4,-1,1,1,4,-4},3*io.read()-2)for i=1,4 do o=-1 for j=2,4
do if 0~=b[u*i+v*j+w]then for k=1-j,o do p=u*i-v*k+w q=p+v r=b[p]if r==0 then
b[p]=b[q]b[q]=r c=1 o=k elseif r==b[q]then _=r==1024 and a'you win'b[p]=r*2
b[q]=0 c=1 o=k-1 break end end end end end end 

ตัวอย่างผลลัพธ์:

+----+----+----+----+
+    +    +    +    +
+    +    +    +    +
+    +    +    +    +
+   2+   0+   0+   0+
+----+----+----+----+
+    +    +    +    +
+    +    +    +    +
+    +    +    +    +
+   0+   0+   0+   0+
+----+----+----+----+
+    +    +    +    +
+    +    +    +    +
+    +    +    +    +
+   0+   0+   0+   0+
+----+----+----+----+
+    +    +    +    +
+    +    +    +    +
+    +    +    +    +
+   0+   0+   0+   0+
+----+----+----+----+

2
+----+----+----+----+
+    +    +    +    +
+    +    +    +    +
+    +    +    +    +
+   0+   2+   0+   0+
+----+----+----+----+
+    +    +    +    +
+    +    +    +    +
+    +    +    +    +
+   0+   0+   0+   0+
+----+----+----+----+
+    +    +    +    +
+    +    +    +    +
+    +    +    +    +
+   0+   0+   0+   0+
+----+----+----+----+
+    +    +    +    +
+    +    +    +    +
+    +    +    +    +
+   2+   0+   0+   0+
+----+----+----+----+

0

Clojure: 599

เรียกใช้ใน REPL

แข็งแรงเล่นกอล์ฟ

(defn i[b](let[f(into[](flatten b))z(seq(keep-indexed #(when(zero? %2)%1)f))]
(cond(some #{2048}f)(pr "you win")(empty? z)(pr "game over"):e(partition 4
(assoc f(rand-nth z)2)))))(def r #(remove zero? %))(loop[b(i (partition 4
(repeat 16 0)))](when((fn[v](doseq[l(for[a v](apply str(map #(format "%5d " %)a)))]
(println l "\n"))v)b)(-> b((apply comp(assoc(into[](repeat 5(fn[v]
(map(fn[n](map #(nth % n)v))[3 2 1 0]))))({"h"4 "k"3 "l"2 "j"1}(read-line))
(partial map(comp #(take 4(concat % [0 0 0 0]))(fn[v]
(r(reduce #(let[l(last %1)](if(= %2 l)(conj(pop %1)(+ l %2) 0)
(conj %1 %2)))[]v)))r)))))i recur)))

ungolfed

(defn insert-2 [board]
  (let [flat (into [] (flatten board))
        zero-indices (seq (keep-indexed
                       #(when (zero? %2) %1)
                       flat))]
    (cond
      (some #{2048} flat) (pr "you win")
      (empty? zero-indices) (pr "game over")
      :else (partition 4 (assoc flat (rand-nth zero-indices) 2)))))

(defn rotate [board]
  (map
    (fn [n]
        (map #(nth % n)
             board))
    [3 2 1 0]))

(defn remove-zeros [row]
 (remove zero? row))

(defn fill [row]
 (take 4 (concat row [0 0 0 0])))

(defn sum-up [acc x]
  (let [l (last acc)]
    (if (= x l)
      (conj (pop acc) (+ l x) 0)
      (conj acc x))))

(defn sum-pairs [v]
  (remove-zeros (reduce sum-up [] v)))

(defn render [v]
  (doseq [line (for [row v]
                 (apply str (map #(format "%5d " %) row)))]
    (println line "\n")) v)

(defn slide [board]
 (map (comp
        fill
        sum-pairs
        remove-zeros
        ) board))

(loop [board (insert-2 (partition 4 (repeat 16 0)))]
  (when (render board)
    (let [input ({"h" 4 "k" 3 "l" 2 "j" 1} (read-line))
          command (apply comp
                         (assoc (into [] (repeat 5 rotate))
                                input slide))] ;; (comp rotate rotate slide rotate rotate)
      (-> board command insert-2 recur))))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.