2013-08-01 18 views
5

Tôi cố gắng để viết một phiên bản thu nhỏ của Tetris rằng tuân thủ các nguyên tắc Tetris càng nhiều càng tốt:Miniature Javascript Tetris

Để được chính xác tôi muốn hoàn thành trò chơi được xây dựng ít nhất có thể là 140 byte javascript. Kịch bản lệnh 140 byte đầu tiên sẽ trả về một mảng với 112 giá trị số nguyên đại diện cho 4 hàng của 7 tetrominos trong mỗi 4 vị trí được xoay. Thứ tự vị trí chính xác của phép quay là rất quan trọng.

Tôi đã lấy dữ liệu trong các ký tự unicode 16 bit (chúng được tính là 2 byte) và giải nén chỉ hơn 140 byte.

Có ai biết cách xây dựng mảng thông minh này không?

var s = "ༀ ∢ð 䑄 ࣠ل âьˠцè ౄ 0000 ۀ ѢlࣄӠѤäӄ ౠɤ Æӈ", m = []; for (i = 0; i < 28; i ++) {c = s.charCodeAt (i); for (j = 4; j> 0;) {m.push (c >> (4 * - j) & 15)} return m}

I tetrimino 
    Spawn   Rotate90  Rotate180  Rotate270 
    ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐ 
    │ │ │ │ │  │ │ │■│ │  │ │ │ │ │  │ │■│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │■│■│■│■│  │ │ │■│ │  │ │ │ │ │  │ │■│ │ │ 
    ├─┼─○─┼─┤  ├─┼─○─┼─┤  ├─┼─○─┼─┤  ├─┼─○─┼─┤ 
    │ │ │ │ │  │ │ │■│ │  │■│■│■│■│  │ │■│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │ │ │ │  │ │ │■│ │  │ │ │ │ │  │ │■│ │ │ 
    └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘ 
    Hex: 0F00  Hex: 2222  Hex: 00F0  Hex: 4444 

    J tetrimino 
    Spawn   Rotate90  Rotate180  Rotate270 
    ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐ 
    │ │ │ │ │  │ │ │ │ │  │ │ │ │ │  │ │ │ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │■│ │ │ │  │ │■│■│ │  │ │ │ │ │  │ │■│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │■│●│■│ │  │ │●│ │ │  │■│●│■│ │  │ │●│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │ │ │ │  │ │■│ │ │  │ │ │■│ │  │■│■│ │ │ 
    └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘ 
    Hex: 08E0  Hex: 0644  Hex: 00E2  Hex: 044C 

    L tetrimino 
    Spawn   Rotate90  Rotate180  Rotate270 
    ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐ 
    │ │ │ │ │  │ │ │ │ │  │ │ │ │ │  │ │ │ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │ │■│ │  │ │■│ │ │  │ │ │ │ │  │■│■│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │■│●│■│ │  │ │●│ │ │  │■│●│■│ │  │ │●│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │ │ │ │  │ │■│■│ │  │■│ │ │ │  │ │■│ │ │ 
    └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘ 
    Hex: 02E0  Hex: 0446  Hex: 00E8  Hex: 0C44 

    O tetrimino 
    Spawn   Rotate90  Rotate180  Rotate270 
    ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐ 
    │ │ │ │ │  │ │ │ │ │  │ │ │ │ │  │ │ │ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │■│■│ │  │ │■│■│ │  │ │■│■│ │  │ │■│■│ │ 
    ├─┼─○─┼─┤  ├─┼─○─┼─┤  ├─┼─○─┼─┤  ├─┼─○─┼─┤ 
    │ │■│■│ │  │ │■│■│ │  │ │■│■│ │  │ │■│■│ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │ │ │ │  │ │ │ │ │  │ │ │ │ │  │ │ │ │ │ 
    └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘ 
    Hex: 0660  Hex: 0660  Hex: 0660  Hex: 0660 

    S tetrimino 
    Spawn   Rotate90  Rotate180  Rotate270 
    ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐ 
    │ │ │ │ │  │ │ │ │ │  │ │ │ │ │  │ │ │ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │■│■│ │  │ │■│ │ │  │ │ │ │ │  │■│ │ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │■│●│ │ │  │ │●│■│ │  │ │●│■│ │  │■│●│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │ │ │ │  │ │ │■│ │  │■│■│ │ │  │ │■│ │ │ 
    └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘ 
    Hex: 06C0  Hex: 0462  Hex: 006C  Hex: 08C4 

    T tetrimino 
    Spawn   Rotate90  Rotate180  Rotate270 
    ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐ 
    │ │ │ │ │  │ │ │ │ │  │ │ │ │ │  │ │ │ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │■│ │ │  │ │■│ │ │  │ │ │ │ │  │ │■│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │■│●│■│ │  │ │●│■│ │  │■│●│■│ │  │■│●│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │ │ │ │  │ │■│ │ │  │ │■│ │ │  │ │■│ │ │ 
    └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘ 
    Hex: 04E0  Hex: 0464  Hex: 00E4  Hex: 04C4 

    Z tetrimino 
    Spawn   Rotate90  Rotate180  Rotate270 
    ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐  ┌─┬─┬─┬─┐ 
    │ │ │ │ │  │ │ │ │ │  │ │ │ │ │  │ │ │ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │■│■│ │ │  │ │ │■│ │  │ │ │ │ │  │ │■│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │●│■│ │  │ │●│■│ │  │■│●│ │ │  │■│●│ │ │ 
    ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤  ├─┼─┼─┼─┤ 
    │ │ │ │ │  │ │■│ │ │  │ │■│■│ │  │■│ │ │ │ 
    └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘  └─┴─┴─┴─┘ 
    Hex: 0C60  Hex: 0264  Hex: 00C6  Hex: 04C8 
+0

có thể trùng lặp của [Mã sân gôn: Chơi Tetris] (http://stackoverflow.com/questions/3858384/code-golf-playing-tetris) – Blender

+0

Xin chào Máy xay sinh tố, không có điều gì khác biệt hoàn toàn ở đó. Đó là một cuộc thi đấu tetromino không phải là một trò chơi thực sự. Trân trọng, Jacco – Jacco

+0

Không liên quan trực tiếp, nhưng bạn có nhớ tôi hỏi cuộc thi ở đâu không? Tôi đã không thể tìm thấy bất kỳ nhóm hoạt động nào cho gôn JS. –

Trả lời

2

Bạn có thể muốn ghi nhớ rằng một nhiều lược đồ mã hóa thông minh cho mảng này sẽ dẫn đến logic giải mã dài hơn, do đó, cố gắng tối ưu hóa quá nhiều điều này có thể là khôn ngoan và penny ngu ngốc. Tuy nhiên, khi viết một trò chơi tetris trong JavaScript một lần (mặc dù không được tối ưu hóa kích thước), tôi biết rằng nó không thực sự khó để viết một hàm để xoay từng hình dạng n lần. Giả sử bạn không bị hạn chế tốc độ cao, tại sao không chỉ có một mục LUT cho mỗi hình dạng theo hướng mặc định và xoay chúng theo cách lập trình? Bạn có thể thấy rằng điều này dẫn đến không gian tổng thể ít hơn được sử dụng (cụ thể, nếu kích thước mã xoay/chuyển vị nhỏ hơn 3/4 kích thước mảng).

EDIT: Một lợi ích bổ sung để thực hiện theo cách này là bạn không phải theo dõi trạng thái xoay của hình dạng trên lưới, bạn chỉ cần theo dõi mảng hiện tại của nó. Khi ai đó quay, xoay mảng bằng chức năng của bạn. Điều này giúp loại bỏ sự cần thiết phải thực hiện kiểm tra (ví dụ: nếu xoay vòng> 3, xoay = 0).

+0

Cảm ơn bạn đã bình luận của bạn! Tôi đã thấy các giải pháp như thế và sẽ không khó nếu các trung tâm xoay của tetrominos không khác với một số tertominos (I và O). – Jacco

+0

Tôi đã hy vọng một người nào đó sẽ đưa ra một số con số ma thuật từ lý thuyết trò chơi polynomino hoặc một cái gì đó. Hầu hết tetrominos chỉ cần 3 bit để được luân chuyển từ trạng thái này sang trạng thái khác. Tôi đã thử rất nhiều điều nhưng khi bạn nói khó khăn của nó để đến với một cái gì đó phù hợp với dữ liệu 140 byte + giải nén :-) – Jacco

+0

Đó là một điểm tốt. Nhìn lại mã của tôi, tôi đã lưu trữ từng hình dạng sprite như là mảng phụ hình chữ nhật của riêng nó với một mảng lớn hơn, do đó, mỗi cái được đặt ở hình chữ nhật nhỏ nhất mà nó vừa với bên trong. Điều này cho phép tôi xoay chúng dễ dàng, nhưng tôi không chắc liệu nó có đáp ứng được nhu cầu của bạn hay không. – Troy