Giới thiệu
Xin chào! Đây là bài viết đầu tiên của tôi tại đây. Tôi rất cảm ơn mọi lời khuyên để cải thiện nội dung của mình. Cảm ơn bạn nhiều! Trong bài viết này, tôi sẽ chia sẻ về những khái niệm cơ bản của cờ vua và cách triển khai chúng bằng ngôn ngữ lập trình Scala.
Tóm tắt
Tôi đã lần đầu tiên biết đến Scala hơn mười năm trước khi còn học đại học. Lúc đó, tôi không hiểu rõ sức mạnh của nó, nhưng tôi đã có cảm giác tốt về ngôn ngữ này. Mùa hè này, tôi quyết định cho nó một cơ hội mới. Tôi đã đọc cuốn sách "Programming in Scala, Fifth Edition" và tôi thực sự khuyên bạn nên đọc cuốn sách này nếu bạn quan tâm đến việc học Scala.
Sau khi đọc xong, tôi muốn củng cố kiến thức của mình. Một trong những sở thích của tôi là cờ vua. Tôi đã muốn lập trình một cái gì đó liên quan đến nó trong một thời gian dài. Vậy hãy cùng xem việc triển khai miền cờ vua với Scala dễ dàng (hoặc khó khăn) như thế nào nhé!
Tôi nên làm rõ rằng đây không phải là một hướng dẫn từng bước. Nó giống như một nhật ký về trải nghiệm của tôi, nơi tôi sẽ giải thích mọi khái niệm mà tôi sử dụng. Tôi sẽ ưu tiên việc lập trình theo miền, không phải theo ngôn ngữ. Vì vậy, có thể bạn sẽ thấy điều này hơi hỗn loạn. Tôi hứa sẽ cố gắng làm cho nó rõ ràng nhất có thể.
Tìm mã nguồn
Bạn sẽ tìm thấy toàn bộ mã nguồn trong kho GitHub của tôi. Nó được cấp phép theo GPL v3, vì vậy hãy thoải mái sử dụng!
Các khái niệm chính trong cờ vua
Màu sắc hoặc bên
Điều đầu tiên mà chúng ta nghĩ đến khi nói về cờ vua là một người chơi di chuyển các quân cờ trắng và người kia di chuyển các quân cờ đen. Đây là một khái niệm cơ bản mà chúng ta có thể mô hình hóa dưới dạng một kiểu liệt kê (enumeration). Hãy cùng thực hiện điều này!
Chúng ta có một số từ khóa thông dụng như package
hoặc enum
. Những điều này không mới nếu bạn đã biết Java hoặc các ngôn ngữ khác. Theo cú pháp cơ bản, chúng ta nhận thấy rằng không có dấu ngoặc nhọn {}
hay dấu chấm phẩy ;
. Điều này không bắt buộc trong Scala, vì nó nhạy cảm với việc thụt lề và việc hoàn thành các biểu thức.
Các hàng và cột
Một khái niệm chính khác của cờ vua là tọa độ. Chúng được sử dụng để tham chiếu bất kỳ ô nào trên bàn cờ. Có thể bạn đã thấy một số chữ cái và số xung quanh bàn. Đây là các định danh cho các cột (chữ cái) và hàng (số). Một ô được xác định bởi sự kết hợp của cả hai. Có nhiều cách để biểu diễn chúng, nhưng tôi sẽ sử dụng cả kiểu liệt kê. Quyết định này cho phép chúng ta xử lý chúng như một kiểu đại số hoàn chỉnh.
Kiểu enum Color
rất dễ dàng. Các kiểu File
và Rank
thì phức tạp hơn một chút. Chúng có một tham số. Như bạn thấy, mỗi giá trị của kiểu liệt kê là một sự mở rộng của chính kiểu liệt kê, xác định giá trị của tham số.
Các kiểu enum cũng có thể có các phương thức. Tôi đã định nghĩa next
và previous
để có thể điều hướng trên bàn cờ. Scala không kiểm soát các giá trị null, nhưng nó sử dụng Option
thay vào đó. Option
là một trait có hai triển khai khác nhau: Some
và None
. Trong các phương thức này, bạn có thể thấy cách mà bạn có thể trả về chúng.
Nói về điều này, Scala không cần từ khóa return
! Nó đơn giản trả về biểu thức cuối cùng trong khối mã. Hơn nữa, các biểu thức điều khiển luồng như if/else
cũng trả về giá trị. Điều này cho phép chúng ta viết mã như trong các phương thức previous
và next
trước đó.
Tọa độ
Cuối cùng, tôi kết hợp các cột và hàng trong lớp Coordinate
. Một lớp case trong Scala giống như các record trong Java. Nó định nghĩa một lớp với một hàm khởi tạo mặc định sử dụng các tham số đã cung cấp, phương thức equals
và hashCode
... Trong trường hợp này, tôi ghi đè phương thức toString
để trả về sự kết hợp của cột và hàng. Lưu ý rằng Scala có thể sử dụng interpolation chuỗi. Điều này cho phép chúng ta sử dụng một tham chiếu đến bất kỳ biến nào trong phạm vi với ${}
, nhưng chúng ta phải thêm ký tự 's' trước chuỗi.
Tôi đã triển khai các phương thức để điều hướng xung quanh bàn cờ. Chúng dựa trên các phương thức previous
và next
mà chúng ta đã triển khai trước đó. Hãy xem Scala cung cấp một tính năng pattern matching hoàn chỉnh mạnh mẽ hơn nhiều so với một cấu trúc switch
đơn giản. Các phương thức north
, south
, east
và west
khớp với kết quả Option
từ việc áp dụng các phương thức next
và previous
trên một cột hoặc hàng. Nó khớp với Some(value)
và chúng ta có thể sử dụng giá trị đó trực tiếp, hoặc với None
.
Tuy nhiên, chúng ta có thể xử lý các điều kiện phức tạp hơn. Trong các phương thức còn lại, chúng ta khớp với một tuple của Option
. Hãy tưởng tượng về những gì chúng ta có thể dễ dàng thực hiện với tính năng này.
Kết luận
Chúng ta đã thấy một số tính năng mạnh mẽ của Scala trong những khái niệm chính của cờ vua. Trong chương tiếp theo, tôi sẽ trình bày về các đối tượng và traits để cải thiện thiết kế này thêm một chút. Hẹn gặp lại bạn!