Tải bản đầy đủ (.pdf) (30 trang)

bài tập lớn môn học công nghệ java đề tài trò chơi cờ vua

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (5.04 MB, 30 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢIKHOA CÔNG NGHỆ THÔNG TIN</b>

<b>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</b>

Phạm Tô Thế Anh Nguyễn Tiến Đạt

<b>Lớp: 26.2 </b>

<b>Hà Nội – 2023</b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

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 qn 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

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

3.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

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<b>DANH MỤC HÌNH ẢNH</b>

Ả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ó qn 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

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<b>CHƯƠNG 1: TỔNG QUAN VỀ TRỊ CHƠI</b>

<b>1.1. Mơ tả trị chơi</b>

<b>Cờ vua</b> (tên tiếng Anh: <b>Chess), trước kia còn được gọi là Cờ quốc tế</b>, 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 vng, 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 vng 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ẹ.

<b>1.2. Mục đích của trị chơi</b>

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ể.

<b>1.3. Quy tắc của trò chơi </b>

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 ln đượ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

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

trê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:

<b>Xe (ký hiệu quốc tế R - Rook</b>) 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ó qn 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

<b>Tượng (ký hiệu quốc tế B - Bishop</b>) di chuyển theo đường chéo tới ơ có cùng màu với ngun 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

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

Ảnh 2: Minh họa nước đi quân tượng

<b>Hậu (ký hiệu quốc tế Q - Queen</b>) 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

<b>Mã (ký hiệu quốc tế N - Knight</b>) 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). Qn MãL không bị cản như trong cờ tướng.

6

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

Ảnh 4: minh họa nước đi quân mã trong cờ vua

<b>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</b>

ơ cịn trống (đi mà khơng ăn qn), 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ó qn đố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 qn 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à qn 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

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

nà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

<b>Vua (ký hiệu quốc tế là K - King</b>) 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 qn Xe của mình để qn 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

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

Cá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

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<b>CHƯƠNG 2: PHÂN TÍCH THIẾT KẾ HỆ THỐNG</b>

<b>2.1. Mơ tả hoạt động trị chơi “Cờ vua”</b>

<b>2.1.1. Mơ tả sơ bộ trò chơi</b>

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à thố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.

<b>2.1.2. Thiết kế thế giới trò chơi</b>

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

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<b>2.1.3. Thiết kế cách chơi cơ bản</b>

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 qn cờ nào trên bàn thì đối phương sẽ chiến thắng

<b>2.1.4. Thiết kế khung giao diện cơ bản và </b>

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

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

o 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ị tồ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

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="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

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

Ảnh 13: flow của của hàm checkMateKing

14

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

Function 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ó qn cờ nào phía qn vua bị chiếu có thể chắn giữa quân cờ chiếu vua và quân vua hay không.

15

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

Tham 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. ngồi ra cịn qn tốt và qn mã. Qn tốt thì khơng tạo khoảng trống vì nước đi đặc biệt và qn mã thì khơng thể bị chặn ở giữa được.

Ảnh 15: flow hàm shieldCheckmateKing

16

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="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 qn cờ nào ở giữa không. Nếu tồn tại trả về false

17

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

o 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

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

Xả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ữ ngun, dịng sẽ thay đổi. Và ngược lại khi qn 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

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

Quân tốt có thể ăn 1 quân cờ khi quân cờ đó nằm chéo qn 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ì qn 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

<small> 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</small>

<small> //Bên đen</small>

<small> 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, , ));</small>

20

</div>

×