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ẢI KHOA CÔNG NGHỆ THÔNG TIN
Giảng viên hướng dẫn: GV Đào Thị Lệ Thủy
Nhóm sinh viên thực hiện: Đào Văn Dưỡng
Phạm Tô Thế AnhNguyễn Tiến Đạt
Lớp: 26.2
Hà Nội – 2023
Trang 2MỤC LỤC
MỤC LỤC 1
DANH MỤC HÌNH ẢNH 3
CHƯƠNG 1: TỔNG QUAN VỀ TRÒ CHƠI 4
1.1 Mô tả trò chơi 4
1.2 Mục đích của trò chơi 4
1.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
CHƯƠNG 4: KẾT LUẬN 29
4.1 KẾT QUẢ THU ĐƯỢC: 29
4.2 HẠN CHẾ CẦN KHẮC PHỤC: 29
4.3 HƯỚNG PHÁT TRIỂN: 29
2
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 8: Minh họa bàn cờ 10
Ảnh 9: thiết kế giao diện trong trò chơi 11
Ảnh 10: thiết kế quân cờ 12
Ảnh 11: Thiết kế thuộc tính cho các quân cờ 12
Ảnh 12: Class ChessCheckMate 13
Ả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ơiquố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ữngtrò 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ựctuyế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àunhạ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 đã đixong 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 suynghĩ, 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ơiphù 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ạicầ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ảitrí) 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 hayhà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 đốiphươ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àuvớ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ữ (ănquâ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 độngcủa Xe và Tượng Trong một nước đi nó có thể di chuyển theo đường chéo hoặc đườngthẳ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 đốiphươ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ãLkhô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ộttrong hai ô này có quân đối phương chiếm hoặc di chuyển xuống ô c5 nếu ô này còntrố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ếmgiữ, 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 đầutiê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ự độngmấ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 choTố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ườichơ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ữ haycá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ànhgầ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ếuthì 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 xinthua, 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: dothỏ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ườichơ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 đầuSau 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ámphá 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 địahì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ácvớ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ữngvậ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 13- Package: entity
o Class GamePanel: Lớp ChessPiece lưu trữ các thông tin của một quân cờ baogồ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 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àophí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 racò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 đượcchọ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 ybă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, startcolumn 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
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
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