Quy tắc của trò chơi Khi một ván cờ vua bắt đầu, một người chơi sẽ cầm quân đen và người chơi còn lại cầm quân trắng.. Việc chọn lựa ai sẽ cầm quân đen hay trắng phụ thuộc vào thể thức c
Trang 1TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢIKHOA CÔNG NGHỆ THÔNG TIN Giảng viên hướng dẫn: GV Đào Thị Lệ ThủyNhóm sinh viên thực hiện: Đào Văn Dưỡng
Phạm Tô Thế Anh Nguyễn Tiến Đạt
Lớp: 26.2
Hà Nội – 2023
Trang 21.3 Quy tắc của trò chơi 4
CHƯƠNG 2: PHÂN TÍCH THIẾT KẾ HỆ THỐNG 10
2.1 Mô tả hoạt động trò chơi “Cờ vua” 10
2.1.1 Mô tả sơ bộ trò chơi 10
2.1.2 Thiết kế thế giới trò chơi 10
2.1.3 Thiết kế cách chơi cơ bản 11
Người chơi thực hiện chọn quân cờ muốn di chuyển Tùy vào quân cờ được chọn sẽ có vị trí đi khác nhau Sau khi đã chọn quân cờ, người chơi thực hiện chọn vị trí quân cờ muốn di chuyển đến Sau đó sẽ đến lượt quân cờ đối diện Cứ tiếp tục đến khi 1 trong 2 bên không còn quân cờ nào trên bàn thì đối phương sẽ chiến thắng 11
2.1.4 Thiết kế khung giao diện cơ bản và 11
2.1.5 Thiết kế quân cờ 12
2.2 Xây dựng chương trình trò chơi 12
2.2.1 Xác định các class chính 12
CHƯƠNG 3: GIAO DIỆN VÀ CÁC CHỨC NĂNG CHÍNH 23
3.1 Giao diện của trò chơi 23
3.1.1 Giao diện khởi động trò chơi 23
3.1.2 Giao diện thông báo chưa chọn quân cờ 24
3.1.3 Giao diện thông báo bước đi không hợp lệ 25
3.1.4 Giao diện thông báo sai lượt 26 1
Trang 33.1.5 Giao diện cảnh báo chiếu tướng 27
3.1.6 Giao diện chiến thắng 28
Trang 4DANH MỤC HÌNH ẢNH
Ảnh 1: Minh họa nước đi quân xe 5
Ảnh 2: Minh họa nước đi quân tượng 6
Ảnh 3: minh họa nước đi quân hậu 6
Ảnh 4: minh họa nước đi quân mã trong cờ vua 7
Ảnh 5: minh họa nước đi quân tốt 7
Ảnh 6: minh họa quân tốt thăng cấp 8
Ảnh 7: minh họa nước đi quân vua 9
Ảnh 13: flow của của hàm checkMateKing 14
Ảnh 14: flow của hàm killCheckmateKing 15
Ảnh 15: flow hàm shieldCheckmateKing 17
Ảnh 16: luồng kiểm tra chung 19
Ảnh 17: Giao diện khi khởi động trò chơi 22
Ảnh 18: Giao diện chưa có quân cờ được chọn 23
Ảnh 19: Giao diện thông báo nước cờ không hợp lệ 24
Ảnh 20: Giao diện thông báo sai lượt 25
Ảnh 21: giao diện thông báo chiếu tướng 26
3
Trang 5CHƯƠNG 1: TỔNG QUAN VỀ TRÒ CHƠI
1.1 Mô tả trò chơi
Cờ vua (tên tiếng Anh: Chess), trước kia còn được gọi là Cờ quốc tế, là trò chơi quốc tế và là môn thể thao trí tuệ cho 2 người chơi Ngày nay, cờ vua là một trong những trò chơi phổ biến nhất thế giới với hàng triệu người tại nhà riêng, trong câu lạc bộ, trực tuyến, từ xa và trong các giải đấu Trò chơi này diễn ra trên một bảng hình vuông, gọi là bàn cờ, gồm 8 hàng (đánh số từ 1 đến 8) và 8 cột (đánh các chữ cái từ a đến h), tạo ra 64 ô hình vuông với các màu đậm và nhạt xen kẽ nhau, với mỗi người chơi sẽ có ô màu nhạt ở hàng cuối cùng bên tay phải của mình khi ngồi vào bàn chơi cờ Mỗi người sẽ bắt đầu ván cờ với 16 quân cờ và sẽ lần lượt đi các quân của mình sau khi đối phương đã đi xong một nước (hoàn thành nước đi)
Các quân cờ của mỗi bên bao gồm 8 Tốt, 2 Mã, 2 Tượng, 2 Xe, 1 Hậu và 1 Vua Người cầm quân trắng luôn là người đi đầu tiên; người kia cầm quân đen Các quân Hậu và Xe được gọi là quân nặng, còn Tượng và Mã được gọi là quân nhẹ
1.2 Mục đích của trò chơi
Xây dựng trò chơi có cách chơi đơn giản, dễ tiếp cận, nhưng đồng thời cũng cần suy nghĩ, thêm vào đó, trò chơi phải có giao diện trực quan, đơn giản, dễ dàng tiếp cận và sử dụng.
Giúp giải quyết nhu cầu thực tế người dùng: Nhu cầu giải trí và khám phá trò chơi phù hợp với đa số đối tượng người chơi Khiến người chơi có trải nghiệm chơi tốt nhất có thể.
1.3 Quy tắc của trò chơi
Khi một ván cờ vua bắt đầu, một người chơi sẽ cầm quân đen và người chơi còn lại cầm quân trắng Việc chọn lựa ai sẽ cầm quân đen hay trắng phụ thuộc vào thể thức chơi là giải trí hay thi đấu trong hệ thống có tổ chức Nó có thể là do hai người thỏa thuận (giải trí) hoặc do quyết định của trọng tài trong giải đấu Bên cầm quân trắng luôn luôn được đi trước và do đó có ưu thế nhỏ so với bên cầm quân đen Các quân cờ cần phải xếp
4
Trang 6trên bàn cờ tiêu chuẩn với ô nằm ở hàng cuối cùng bên tay phải người chơi bao giờ cũng có màu nhạt.
Các quân cờ có nước đi khác nhau:
Xe (ký hiệu quốc tế R - Rook) di chuyển theo các đường thẳng dọc theo cột hay hàng tới ô còn trống mà không có quân nào cản trên đường đi hay tới ô bị quân đối phương chiếm giữ (ăn quân) nhưng không thể vượt qua quân đang đứng ở ô đó Ngoại lệ duy nhất là trường hợp nhập thành Khi đó nó có thể nhảy qua quân Vua của mình để đứng cạnh nó Chỉ có Xe mới có nước đi như vậy.
Ảnh 1: Minh họa nước đi quân xe
Tượng (ký hiệu quốc tế B - Bishop) di chuyển theo đường chéo tới ô có cùng màu với nguyên lý tương tự như Xe tới ô còn trống hay ô bị quân đối phương chiếm giữ (ăn quân).
5
Trang 7Ảnh 2: Minh họa nước đi quân tượng
Hậu (ký hiệu quốc tế Q - Queen) có nước đi là tổ hợp đơn giản của chuyển động của Xe và Tượng Trong một nước đi nó có thể di chuyển theo đường chéo hoặc đường thẳng dọc theo cột hay hàng, với nguyên lý đi và ăn quân giống như Tượng và Xe.
Ảnh 3: minh họa nước đi quân hậu
Mã (ký hiệu quốc tế N - Knight) có thể di chuyển tới ô còn trống hay ô bị quân đối phương chiếm giữ (ăn quân) theo dạng hình chữ (hình chữ nhật 3×2 hay 2×3) Quân MãL không bị cản như trong cờ tướng.
6
Trang 8Ảnh 4: minh họa nước đi quân mã trong cờ vua
Tốt (không cần ký hiệu) có thể di chuyển thẳng về phía trước chỉ một ô một lần tới
ô còn trống (đi mà không ăn quân), nhưng khi di chuyển quân để ăn quân đối phương thì đi chéo Ví dụ, Tốt trắng tại ô c4 có quyền ăn quân đối phương tại b5 hoặc d5 nếu một trong hai ô này có quân đối phương chiếm hoặc di chuyển xuống ô c5 nếu ô này còn trống, trừ hai trường hợp sau:
Ảnh 5: minh họa nước đi quân tốt
Nó có thể di chuyển 1 hoặc 2 ô nếu nó đi từ vị trí xuất phát ban đầu tới ô chưa bị chiếm giữ, nhưng không thể nhảy qua một quân khác để tới ô đó Ví dụ Tốt trắng tại g2 có thể đi tới g3 hoặc g4 nếu đây là nước đi đầu tiên của nó và các ô này chưa bị chiếm giữ, nhưng nó không thể đi tới g4 nếu ô g3 đã có một quân nào đó chiếm giữ.
Trong trường hợp khi một quân Tốt nào đó của bên trắng đạt tới hàng 5 (ví dụ tới ô e5) và quân Tốt thuộc một trong hai cột của bên đen nằm ngay bên cạnh cột mà Tốt trắng
7
Trang 9này đang chiếm giữ (trong trường hợp đã cho là cột d và cột f) đi từ vị trí xuất phát đầu tiên (d7 hay f7) nhảy liền 2 ô tới ô d5/f5 thì Tốt trắng tại vị trí e5 ngay tại nước đi sau đó có quyền ăn Tốt đen tại ô d5/f5 và di chuyển tiếp tới ô d6/f6 Quyền này sẽ tự động mất, nếu tại nước đi ngay sau đó quân trắng di chuyển quân khác Tương tự như vậy cho Tốt đen khi nó đã chiếm giữ hàng 4 Đây là trường hợp mà trong cờ vua người ta gọi là bắt tốt qua đường (en passant).
Tốt còn một đặc điểm nữa là khi nó di chuyển đến hàng cuối cùng thì người chơi có quyền phong cấp cho nó thành bất kỳ quân nặng hay nhẹ nào (Hậu, Xe, Tượng, Mã).
Ảnh 6: minh họa quân tốt thăng cấp
Vua (ký hiệu quốc tế là K - King) là quân quan trọng nhất, nếu mất Vua thì người chơi thua cuộc Mỗi lần đi nó có thể ăn quân hoặc di chuyển sang các ô bao quanh ô mà nó hiện tại đang chiếm giữ, nhưng không thể tới ô mà quân của mình đang chiếm giữ hay các ô bị quân đối phương kiểm soát Ngoại lệ duy nhất là trường hợp nhập thành Khi đó nó có thể di chuyển qua hai ô đồng thời với việc di chuyển quân Xe của mình để quân Xe đó đứng bên cạnh nó về phía cột trung tâm Ký hiệu của nhập thành là 0-0 (nhập thành gần) và 0-0-0 (nhập thành xa) Xem thêm nhập thành.
Khi ăn quân đối phương, quân tấn công sẽ di chuyển tới ô đó và thay thế cho quân đối phương tại vị trí này, bắt tốt qua đường (en passant) là ngoại lệ duy nhất Quân bị ăn được loại ra khỏi bàn cờ Vua không thể không bảo vệ khỏi nước chiếu, do đó khi bị chiếu thì người chơi phải thực hiện các biện pháp nhằm cứu Vua (di chuyển Vua khỏi vị trí bị chiếu, ăn quân đang chiếu hay dùng quân khác của mình cản đường chiếu nếu có thể) Nếu không thể có nước đi để cứu Vua thì người chơi bị chiếu bí và thua cuộc.
8
Trang 10Các ván cờ không phải bao giờ cũng kết thúc bằng chiếu bí Có thể một bên xin thua, có thể thua do hết giờ Có thể xảy ra các ván cờ hòa Một ván cờ vua là hòa khi: do thỏa thuận của hai bên do không bên nào dám mạo hiểm hay khi không đủ lực lượng để chiếu hết, rơi vào trạng thái hết nước đi (stalemate), cả hai bên lặp lại nước đi ba lần.
Ảnh 7: minh họa nước đi quân vua
9
Trang 11CHƯƠNG 2: PHÂN TÍCH THIẾT KẾ HỆ THỐNG
2.1 Mô tả hoạt động trò chơi “Cờ vua”
2.1.1 Mô tả sơ bộ trò chơi
Khi khởi chạy trò chơi, người dùng có thể sử dụng các tùy chọn: chơi trò chơi và thoát khỏi trò chơi.
Sau khi chọn phần chơi, người chơi sẽ tiến đến mục chọn nhân vật Ở đây, người chơi có thể chọn nhân vật để chơi game hoặc quay lại màn hình tùy chọn ban đầu
Sau khi tiến hành chọn nhân vật xong, người chơi sẽ điều khiển nhân vật để khám phá thế giới trò chơi đã đã được bố trí sẵn địa hình Để lấy các vật phẩm xuất hiện trên địa hình, nhân vật cần được di chuyển chạm vào chúng Ngoài ra, người chơi có thể tương tác với NPC xuất hiện trong game để thu thập một số thông tin chỉ dẫn giúp tìm kiếm những vật phẩm dễ dàng hơn
Khi người chơi bấm nút tạm dừng trên bàn phím, màn hình sẽ hiện ra một giao diện có các nút chơi tiếp, hoặc quay trở về màn hình tùy chọn ban đầu.
2.1.2 Thiết kế thế giới trò chơi
Trò chơi được chia thành 1 bàn cờ gồm 64 ô, 32 ô trắng và 32 ô đen.
Ảnh 8: Minh họa bàn cờ
10
Trang 122.1.3 Thiết kế cách chơi cơ bản
Người chơi thực hiện chọn quân cờ muốn di chuyển Tùy vào quân cờ được chọn sẽ có vị trí đi khác nhau Sau khi đã chọn quân cờ, người chơi thực hiện chọn vị trí quân cờ muốn di chuyển đến Sau đó sẽ đến lượt quân cờ đối diện Cứ tiếp tục đến khi 1 trong 2 bên không còn quân cờ nào trên bàn thì đối phương sẽ chiến thắng
2.1.4 Thiết kế khung giao diện cơ bản và
Khung giao diện của trò chơi có các thành phần chính như sau: - Bàn cờ: Jpanel kích thước 600x600px
- Các ô cờ: Jpanel được chia đều thành 8 hàng 8 cột
Ảnh 9: thiết kế giao diện trong trò chơi 11
Trang 13o Class Chessgame: Tại hàm tạo tạo ra một đối tượng cửa sổ có kiểu là JFrame, sau đó thêm đối tượng chessBoard vào cửa sổ đó để hiển thị toàn bộ giao diện game.
- Package: entity
o Class GamePanel: Lớp ChessPiece lưu trữ các thông tin của một quân cờ bao gồm loại quân cờ, màu sắc và vị trí
Ảnh 11: Thiết kế thuộc tính cho các quân cờ
o Class ChessCheckMate: lưu trữ đối tượng vua bị chiếu , quân cờ chiếu và vị trí chiếu
12
Trang 14Ảnh 12: Class ChessCheckMate - Package: service
o CheckmateService:
Function checkMateKing(): Mục đích xây dựng để kiểm tra khi có một nước đi thay đổi thì có xảy ra thế cờ chiếu tướng hay không
13
Trang 15Ảnh 13: flow của của hàm checkMateKing
14
Trang 16Function killCheckmateKing(): mục đích kiểm tra xem có quân cờ nào có thể ăn được quân cờ đối thủ đang chiếu quân vua hay không, tham số truyền vào là quân cờ đang chiếu vua
Ảnh 14: flow của hàm killCheckmateKing
Function shieldCheckmateKing (): sử dụng để kiểm tra xem có quân cờ nào phía quân vua bị chiếu có thể chắn giữa quân cờ chiếu vua và quân vua hay không.
15
Trang 17Tham số truyền vào là quân vua bị chiếu và quân đang chiếu quân vua Các quân có khả năng chiếu vua mà tạo khoảng cách ở giữa là quân hậu, xe , tượng ngoài ra còn quân tốt và quân mã Quân tốt thì không tạo khoảng trống vì nước đi đặc biệt và quân mã thì không thể bị chặn ở giữa được.
Ảnh 15: flow hàm shieldCheckmateKing
16
Trang 18- Class StepService:
Bao gồm các function dung để kiểm tra nước đi có hợp lệ đối với quân cờ đang được chọn đặc điểm chung của các hàm đều nhận vào 4 tham số bao gồm trục x băn đầu, trục y băn đầu, trục x muốn di chuyển đến, trục y muốn di chuyển đến Và trong các function đều kiểm tra xem giữa vị trí băn đầu và vị trí muốn di chuyển đến có tồn tại quân cờ nào ở giữa không Nếu tồn tại trả về false
17
Trang 19o Flow chung cho kiểm tra nước đi:
Ảnh 16: luồng kiểm tra chung o Function isValidQuanTuong():
Đối với quân tượng sẽ thực hiện kiểm tra :
Nếu | start_row – end_row | = | start_column – end_column | thì đó là nước đi hợp lệ Trong đó start_row là dòng vị trí băn đầu, end row là vị trí muốn di chuyển đến, start column là cột băn đầu, end column là cột muốn di chuyển đến.
o Function isValidQuanXe():
18
Trang 20Xảy ra 2 trường hợp, quân xe đi ngang và đi dọc khi quân xe đi dọc thì cột giữ nguyên, dòng sẽ thay đổi Và ngược lại khi quân xe đ ingang thì dòng giữ nguyên, cột sẽ thay đổi Dựa vào 2 trường hợp này ta có điều kiện
(start_row – end_row) == 0 thì (start_column – end_column ) != 0 Hoặc
(start_row – end_row) != 0 thì (start_column – end_column ) == 0 o Function isValidQuanHau():
Kiểm tra nước đi cho quân hậu xảy ra 2 trường hợp là giống quân xe hoặc giống quân tượng Ta sử dụng lại 2 hàm kiểm tra cho 2 loại quân cờ này là có thể kiểm tra được nước đi cho quân hậu
o Function isValidQuanMa();
Kiểm tra nước đi hợp lệ cho quân mã Quân mã có nước đi khá đặc biệt Đi hình chữ L nên ta có điều kiện như sau:
| start_row – end_row | = 1 và | start_column – end_column | = 2 Hoặc
| start_row – end_row | = 2 và | start_column – end_column | = 1 o Function isValidQuanVua();
Kiểm tra nước đi hợp lệ cho quân vua Quân vua có thể đi được 9 ô cờ xung quanh bản than nó Nên ta có điều kiện như sau:
| start_row – end_row | = 1 và | start_column – end_column | = 0 Hoặc
| start_row – end_row | = 0 và | start_column – end_column | = 1 o Function isValidQuanTot();
Kiểm tra nước đi hợp lệ cho quân tốt Quân tốt có nước đi khá đặc biệt vì khi lần đầu di chuyển quân tốt có thể đi được 2 nước cờ và có điều kiện là
| start_row – end_row | = 2
Trong các nước đi tiếp theo quân tốt chỉ có thể di chuyển 1 ô cờ và có điều kiện là | start_row – end_row | = 1
19
Trang 21Quân tốt có thể ăn 1 quân cờ khi quân cờ đó nằm chéo quân tốt và không cách bất kỳ ô cờ nào Và có điều kiện là:
| start_row – end_row | = 1 và | start_column – end_column | = 1
Khi quân tốt di chuyển đến vị trí row 0 hoặc 7 thì quân tốt có thể thăng cấp trở thành 1 trong 4 quân cờ: Hậu, xe , tượng, mã
- Class Utils:
o Function InitDefaultChessMan():
Sử dụng để tạo ra các quân cờ khi trò chơi vừa khởi động
chessPieces.add(new ChessPiece("XE", Color.WHITE, 0)); chessPieces.add(new ChessPiece("MA", Color.WHITE 0 1, , )); chessPieces.add(new ChessPiece("TUONG", Color.WHITE 0 2, , )); chessPieces.add(new ChessPiece("HAU", Color.WHITE 0 3, , )); chessPieces.add(new ChessPiece("VUA", Color.WHITE 0 4, , )); chessPieces.add(new ChessPiece("TUONG", Color.WHITE 0 5, , )); chessPieces.add(new ChessPiece("MA", Color.WHITE 0 6, , )); chessPieces.add(new ChessPiece("XE", Color.WHITE 0 7, , )); chessPieces.add(new ChessPiece("TOT", Color.WHITE 1 0, , )); chessPieces.add(new ChessPiece("TOT", Color.WHITE 1 1, , )); chessPieces.add(new ChessPiece("TOT", Color.WHITE 1 2, , )); chessPieces.add(new ChessPiece("TOT", Color.WHITE 1 3, , )); chessPieces.add(new ChessPiece("TOT", Color.WHITE 1 4, , )); chessPieces.add(new ChessPiece("TOT", Color.WHITE 1 5, , )); chessPieces.add(new ChessPiece("TOT", Color.WHITE 1 6, , )); chessPieces.add(new ChessPiece("TOT", Color.WHITE 1 7, , )); //Hết bên trắng
//Bên đen
chessPieces.add(new ChessPiece("TOT", Color.BLACK, 0)); chessPieces.add(new ChessPiece("TOT", Color.BLACK 6 1, , )); chessPieces.add(new ChessPiece("TOT", Color.BLACK 6 2, , )); chessPieces.add(new ChessPiece("TOT", Color.BLACK 6 3, , )); chessPieces.add(new ChessPiece("TOT", Color.BLACK 6 4, , )); chessPieces.add(new ChessPiece("TOT", Color.BLACK 6 5, , )); chessPieces.add(new ChessPiece("TOT", Color.BLACK 6 6, , )); chessPieces.add(new ChessPiece("TOT", Color.BLACK 6 7, , )); chessPieces.add(new ChessPiece("XE", Color.BLACK 7 0, , )); chessPieces.add(new ChessPiece("MA", Color.BLACK 7 1, , )); chessPieces.add(new ChessPiece("TUONG", Color.BLACK 7 2, , )); chessPieces.add(new ChessPiece("HAU", Color.BLACK 7 3, , ));
20