2009-06-06 18 views
11

Hôm nay là sinh nhật lần thứ 25 của Tetris. Tôi tin rằng việc viết bản sao Tetris là một trong những cách tốt nhất để làm quen với ngôn ngữ mới hoặc nền tảng. Nó không phải là hoàn toàn tầm thường và nó vay chính nó tốt để học các cấu trúc ngôn ngữ cụ thể như vòng lặp và đóng cửa.Làm thế nào để viết Tetris trong Scala? (xem xét mã)

Tôi đã nghe về Scala và cuối cùng quyết định đọc một số tài liệu và viết một bản sao Tetris. Vì vậy, đây là mã Scala đầu tiên của tôi. Tôi đã cố gắng sử dụng các cấu trúc chức năng, nhưng chắc chắn có rất nhiều điều tôi có thể cải thiện để làm điều đó theo cách Scala hơn. Xin vui lòng cho tôi gợi ý bằng cách sử dụng bình luận. Ngoài ra các bản đệ trình khác của bản sao Tetris trong Scala cũng được chào đón.

Tôi biết rằng câu hỏi thực tế là hơi chủ quan, nhưng tôi nghĩ đây là một số giá trị vì những người khác có thể sử dụng mã này làm ví dụ (hoặc chống ví dụ).

Chỉnh sửa: Hãy để tôi thuật lại câu hỏi. Tôi có thể làm gì để làm cho mã hơn Scala-ish?

+1

Câu hỏi của bạn là gì? SO không phải là trang web đánh giá mã. –

+4

Tôi nghĩ rằng điều này thuộc về refactormycode.com – finnw

+0

Viết một bản sao Tetris tốt, tôn trọng các tiêu chuẩn Tetris không phải là rất dễ dàng. Ví dụ, trong sơ đồ tiêu chuẩn, một số khối xoay quanh các nút giao lưới và một số xoay xung quanh các trung tâm của các tế bào - chỉ để đặt tên một điều. – ziggystar

Trả lời

19

Edit4:

Moved bản gốc (2009) mã tôi đã ở đây để một gist.

Gần đây (tháng 8 năm 2012), tôi đã viết một loạt bài đăng trên blog về viết tetrix ở Scala. Tôi hy vọng nó sẽ trả lời một số câu hỏi tôi đã hỏi ba năm trước.

Sửa: Cập nhật mã để sử dụng Scala của Swing API theo đề nghị của @thatismatt. Ngoài ra, tôi đã thấy rằng cách học viết mã theo phong cách Scala là đọc cuốn sách của Martin Odersky gọi là Programming in Scala. Về bản chất, cách Scala đang dần chuyển từ phong cách bắt buộc để phong cách chức năng bằng cách sử dụng cấu trúc bất biến dữ liệu, chức năng mà không tác dụng phụ, mô hình phù hợp, đặc điểm vv

Edit2: Cập nhật mã để sử dụng cấu trúc dữ liệu bất biến Ví dụ: Block#rotate hiện trả về một đối tượng Block mới thay vì sửa đổi chính nó.

Edit3: Cập nhật mã để hoạt động trên Scala 2.8 RC3.

+1

+1 câu trả lời này gần như tất cả các câu hỏi của tôi về scala, cảm ơn – stacker

+0

Không biên dịch trong Scala 2.8 RC2. Đáng tiếc, nó sẽ là một ví dụ tốt đẹp. –

+1

@ Łukasz Lew, hãy thử ngay bây giờ. Nó sẽ làm việc với RC3. –

3

Một nhận xét nhỏ mà tôi muốn thực hiện là bạn đang sử dụng java.swing thay vì scala.swing. Di chuyển qua có thể giúp bạn có được một trải nghiệm chức năng hơn, nó không phải là hoàn hảo mặc dù, vì nó chỉ là một wrapper quanh libs java. Và đường cong học tập rõ ràng sẽ dốc hơn nếu bạn đến từ một nền Java ... mặc dù có lẽ đó là những gì bạn đang có sau!

+0

Sử dụng javax.swing có thể giúp nó biên dịch tốt hơn. – AlBlue