(Tiểu luận) áo cáo thực tập cơ sở đề tài game cờ vua tích hợp bot tự động

60 4 0
(Tiểu luận) áo cáo  thực tập cơ sở  đề tài game cờ vua tích hợp bot tự động

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Giới thiệu game Game c vua mờ ột người chơi, đối th là bot ủ chơi cờ vua tự động sau đây gọi là Chess bot, có th tể ự đưa ra các nước đi hợp lý tương đương với một người chơi cờvua có ch

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG KHOA CNTT -   - BÁO CÁO THỰC TẬP CƠ SỞ Đề tài: Game cờ Vua tích hợp bot tự động Giảng viên hướng dẫn: ĐỖ THỊ LIÊN Sinh viên thực hiện: BÙI THANH SƠN Mã sinh viên: B20DCCN573 Lớp: D20CQCN09-B Hà Nội, 2023 CỜ VUA Chess game HỌC VI Ệ N CƠNG NGH Ệ BƯU CHÍNH VIỄ N THÔNG Họ tên: BÙI THANH SƠN Mã SV: B20DCCN573 Page | MỤC LỤC MỤC LỤC Danh mục ký hiệu chữ viết tắt Chương I Tổng quan game 1.1 Giới thiệu game 1.2 Ý tưởng 1.3 Pitch 1.4 GDD Gameplay Core loop Game flow Object Chương II: Phương pháp tiếp cận giải vấn đề 2.1 Mơ hình tổng quan hệ thống 2.2 Phương pháp xây dựng phần mềm 2.3 Kiến trúc phần mềm 10 2.4 Công nghệ sử dụng 11 2.1.1 Môi trường khởi chạy phát triển 11 2.1.2 Các ngôn ngữ sử dụng 11 2.1.3 Các thư viện sử dụng 12 Chương III Phân tích thiết kế Game 14 3.1 SAN FEN 14 3.2 Sơ đồ lớp 15 3.3 Khởi tạo dự án 17 3.4 Giao diện (GUI) 19 3.4 Chessboard.js Chess.js API 24 3.5 Cơ sở lý thuyết xây dựng Chess bot 26 Page | 3.5.1 Ý tưởng đưa nước tối ưu 26 3.5.2 Các thuật toán để đưa nước tối ưu 27 3.6 Thiết kế logic cho Chess bot 28 3.6.1 Hệ số lực quân cờ đánh giá trận 28 3.6.2 Cây trị chơi – mở rộng khơng gian trạng thái 35 3.6.3 Lựa chọn nước tối ưu 35 3.6.4 Thuật toán Minimax 36 3.6.5 Thuật toán cắt tỉa Alpha-Beta 40 3.7 Các hàm xử lý kiện (Event handlers) 43 3.7.0 Khởi tạo ván cờ 43 3.7.1 Đánh dấu nước hợp lệ quân cờ 43 3.7.2 Kiểm tra trạng thái ván cờ 44 3.7.3 Cập nhật hiển thị giá trị lợi 45 3.7.4 Tìm kiếm nước tốt từ Chessbot 45 3.7.5 Thực nước Chessbot 46 3.7.6 Chế độ Máy đánh Máy (Computer vs Computer) 47 3.7.7 Gợi ý nước 48 3.7.8 Undo, redo 48 3.8 Xử lý kiện 49 3.8.1 Trỏ chuột vào, di chuột khỏi ô cờ 49 3.8.2 Bắt đầu kéo quân cờ 50 3.8.3 Thả quân cờ 50 3.8.4 Kết thúc kéo quân cờ 51 3.8.5 Lựa chọn khai 51 3.8.6 Bắt đầu, reset chế độ Máy đánh máy 52 3.8.7 Undo, redo 52 Chương IV Kiểm thử 53 4.1 Kiểm thử hộp trắng 53 4.1.1 Kiểm thử trò chơi 53 4.1.2 Kiểm thử giá trị lợi 55 Page | 4.2 Kiểm thử hộp đen 57 4.2.1 Thao tác trò chơi 57 4.2.2 Hành vi quân cờ 57 4.2.3 Lỗi xử lý liệu dẫn đến hiển thị thông tin sai lệch 57 Chương V Đánh giá chung 58 5.1 Ưu điểm 58 5.2 Nhược điểm 58 Tài liệu tham khảo 59 Danh mục ký hiệu chữ viết tắt K Q R N B P b w Quân Vua (King) Quân Hậu (Queen) Quân Xe (Rook) Quân Mã (Knight) Quân Tượng (Bishop) Quân Tốt (Pawn) Quân cờ màu đen (black) Quân cờ màu trắng (white) Page | Chương I Tổng quan game 1.1 Giới thiệu game Game cờ vua người chơi, đối thủ bot chơi cờ vua tự động (sau gọi Chess bot), tự đưa nước hợp lý tương đương với người chơi cờ vua có số elo 1000 – 1500 (thang đo mang tính tương đối) 1.2 Ý tưởng Cờ vua trò chơi dạng boardgame dành cho người Một trận đấu có kết xảy ra: A thắng B thua, A thua B thắng, A B hòa Cờ vua giải từ nước cách tuyệt đối (xác định A thắng hay B thắng) (định lý Zermelo), nhiên ước tính số cờ hợp lệ cờ vua 4x1044 , với độ phức tạp vào khoảng 10123 , q lâu để tính tốn kể với cơng nghệ đại ngày Tuy nhiên, dùng định lý sử dụng thuật tốn để tìm nước đủ tốt độ sâu không phức tạp 1.3 Pitch Trị chơi cờ vua phổ biến tồn giới, giao diện 2D thân thiện, thao tác bấm kéo thả đơn giản, dễ tiếp cận Kết hợp thêm khai phổ biến để người chơi nhanh chóng triển khai cờ, có chức đánh giá lợi nghiêng bên để người chơi cân nhắc chiến thuật, có chức gợi ý nước cho người chơi Đối tượng người chơi: Từ tuổi trở lên, biết chơi cờ vua có thiết bị di động Tiềm phát triển: Giao diện responsive tương thích với thiết bị di động, kết hợp thêm thuật tốn khác api mạnh mẽ Stockfish để tăng hiệu suất xử lý logic game, phát triển thành game online,… Rủi ro biện pháp giảm thiểu: Thuật toán xử lý game phải dừng lại độ sâu hữu hạn, chưa mức độ tốt nước mà Chessbot đưa mong muốn, tăng thêm độ sâu thời gian xử lý lâu (vài phút), gây thời gian người chơi Tuy nhiên cần dừng lại độ rẽ nhánh tính tốn Chessbot đưa nước tốt, dùng ngơn ngữ lập trình thực thi lệnh nhanh ví dụ C, C++ Golang 1.4 GDD Gameplay Bàn cờ vua 8x8 truyền thống quân cờ Người di chuyển quân cờ theo luật cờ vua, suy nghĩ sử dụng chiến lược chiến thuật để dành chiến thắng trước đối thủ (Chessbot) Core loop Từng bước dành chiến thắng cách di chuyển nước có lợi cho thân bất lợi cho đối thủ xuyên suốt ván đấu Mỗi nước có lợi, game thơng báo số điểm lợi giao diện, giúp người chơi dễ dàng theo dõi trạng thái suy nghĩ trận Page | Document continues below Discover more from: nghệ Công thông tin D20 Học viện Công ng… 24 documents Go to course Tham nhũng 11 tượng xã hội Công nghệ thông tin None Báo cáo tổng quát Báo cáo tổng quát Công nghệ thông tin None đề PPL NCKH kỳ (2023 - 2024) Công nghệ thông tin None BTL - Thiết kế môi 15 trường giáo dục ch… Công nghệ thông tin None TÀI LIỆU HỌC TẬP 151 Game flow KHQL NÂNG CAO Công nghệ thông tin None KHDH TỐN -22-23 21 - ddđ Cơng nghệ thông tin None Object Các thành phần game chia làm phần chính: Bàn cờ cài đặt Bàn cờ: Bàn cờ tiêu chuẩn 8x8 Các quân cờ vua (đen trắng) Page | Các cài đặt tùy chọn Thanh thông báo trạng thái Page | Chương II: Phương pháp tiếp cận giải vấn đề 2.1 Mơ hình tổng quan hệ thống Thuộc thể loại boardgame nên đa số chức hệ thống hoạt động dựa tương tác trực tiếp người chơi bàn cờ thực nước thay đổi cài đặt, tương tác ghi nhận xuyên suốt game flow khởi tạo “sự kiện”, kiện gọi đến xử lý kiện tương ứng, chúng thực chức cài đặt sẵn với tham số mà kiện truyền đến 2.2 Phương pháp xây dựng phần mềm Game xây dựng chủ yếu theo phương pháp hướng chức lợi ích phương pháp phù hợp với trình phát triển game, cụ thể: • • • • • Mỗi chức hàm riêng biệt, dễ dàng sửa lỗi hay thêm, xóa, nâng cấp tính game Trong q trình chờ đợi Chessbot đưa nước đi, người chơi thực thao tác khác thay đổi độ khó Chessbot, undo redo nước đi, bắt đầu lại game khai cuộc,… Do cần phải xử lý song song đồng thời, xây dựng game hướng chức đảm bảo thao tác người chơi xử lý độc lập Tăng hiệu suất viết mã nguồn cho nhà phát triển thực độc lập với chức cần xác định liệu đầu vào đầu cụ thể Hỗ trợ tái sử dụng hàm sử dụng chức lồng nhau, ví dụ hàm đưa nước tốt sử dụng để Chessbot đưa nước đi, hoăc sử dụng người chơi chọn chức gợi ý nước Các đối tượng game không nhiều, bao gồm bàn cờ, quân cờ, trạng thái, thông báo, cài đặt Page | 3.7.3 Cập nhật hiển thị giá trị lợi Nếu lợi số dương (Chessbot có lợi thế) thơng báo lợi thuộc bên đen, đồng thời hiển thị số điểm lợi lên giao diện cập nhật thông báo lợi thế: function updateAdvantage() { if (globalSum > 0) { $('#advantageColor').text('Black'); $('#advantageNumber').text(globalSum); } else if (globalSum < 0) { $('#advantageColor').text('White'); $('#advantageNumber').text(-globalSum); } else { $('#advantageColor').text('Neither side'); $('#advantageNumber').text(globalSum); } $('#advantageBar').attr({ 'aria-valuenow': `${-globalSum}`, style: `width: ${((-globalSum + 2000) / 4000) * 100}%`, }); } 3.7.4 Tìm kiếm nước tốt từ Chessbot function getBestMove(chess, color, currSum) Do game có chế độ máy đánh máy nên cần xét xem Chessbot chơi quân màu (tham số color) Mỗi bắt đầu tìm kiếm nước tốt mới, cần phải đặt lại đếm tính tốn số lượng nước positionCount = 0; Nếu Chessbot chơi quân đen lấy giá trị độ sâu tìm kiếm trị chơi từ giá trị input option chọn (:selected) thẻ select đại diện cho độ sâu tìm kiếm nước quân đen giao diện chuyển số nguyên, thực tương tự Chessbot chơi quân trắng if (color === 'b') { var depth = parseInt($('#search-depth').find(':selected').text()); } else { var depth = parseInt($('#search-depth-white').find(':selected').text()) } Tạo biến lưu giá trị thời điểm mà Chessbot bắt đầu thực việc tìm kiếm var d = new Date().getTime(); Tiếp theo, thực thuật toán minimax Chessbot để tiến hành tìm kiếm nước tốt giá trị lợi thực nước đó, tham số truyền vào trình bày phần thuật toán minimax var [bestMove, bestMoveValue] = minimax( Page | 45 chess, depth, Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY, true, currSum, color ); Tạo biến lưu giá trị thời điểm mà Chessbot kết thúc thực việc tìm kiếm Lấy giá trị trừ thời điểm Chessbot bắt đầu thực tìm kiếm để tính thời gian mà Chessbot thực tìm kiếm, đồng thời tính tốc độ tìm kiếm số nước tính tốn khoảng thời gian tìm kiếm (nhân 1000 để tính đơn vị giây) chia cho thời gian tìm kiếm var d2 = new Date().getTime(); var moveTime = d2 - d; var positionsPerS = (positionCount * 1000) / moveTime; Hiển thị thơng số tính tốn giao diện $('#position-count').text(positionCount); $('#time').text(moveTime / 1000); $('#positions-per-s').text(Math.round(positionsPerS)); Cuối trả kết hàm minimax return [bestMove, bestMoveValue]; 3.7.5 Thực nước Chessbot function makeBestMove(color) Do game có chế độ máy đánh máy nên cần xét xem Chessbot chơi quân màu (tham số color) Thực tìm kiếm nước tốt cho Chessbot: if (color === 'b') { var move = getBestMove(chess, color, globalSum)[0]; } else { var move = getBestMove(chess, color, -globalSum)[0]; } Sau thực đánh giá bàn cờ Lưu ý tham số “color” hàm đánh giá cần truyền vào phải “b” (đại diện cho người chơi quân đen) hàm đánh giá trả kết số âm (bất lợi cho đen người chơi quân trắng), từ hàm cập nhật hiển thị giá trị lợi “updateAdvantage” xử lý logic (updateAdvantage kiểm tra giá trị lợi âm hay dương để đưa thông báo giao diện) globalSum = evaluateBoard(chess, move, globalSum, 'b'); updateAdvantage(); Page | 46 Từ nước tốt mà tìm được, Chessbot thực nước Lúc này, phương thức fen Chessbot trả chuỗi fen sau thực nước Từ chuỗi fen đó, đối tượng Chessboard định vị vị trí quân cờ cho với chuỗi fen, từ vị trí qn cờ giao diện game cập nhật chess.move(move); board.position(chess.fen()); Sau cập nhật vị trí quân cờ, thực thay đổi giao diện Nếu nước vừa thực nước người chơi quân đen, thực kiểm tra trạng thái với quân đen, highlight vị trí quân cờ vừa di chuyển, tương tự quân trắng if (color === 'b') { checkStatus('black'); // Highlight black move $board.find('.' + squareClass).removeClass('highlight-black'); $board.find('.square-' + move.from).addClass('highlight-black'); squareToHighlight = move.to; colorToHighlight = 'black'; $board find('.square-' + squareToHighlight) addClass('highlight-' + colorToHighlight); } else { checkStatus('white'); // Highlight white move $board.find('.' + squareClass).removeClass('highlight-white'); $board.find('.square-' + move.from).addClass('highlight-white'); squareToHighlight = move.to; colorToHighlight = 'white'; $board find('.square-' + squareToHighlight) addClass('highlight-' + colorToHighlight); } 3.7.6 Chế độ Máy đánh Máy (Computer vs Computer) Chế độ máy đánh máy chất lặp lại việc thực nước “2 Chessbot”, có color = “w” có color = “b” Vậy nên ta cần tạo vòng lặp, lặp lại việc “Thực nước đi” “Đổi màu lượt đi” ván cờ kết thúc Các nước cách khoảng thời gian nhỏ để người chơi dễ quan sát function compVsComp(color) { if (!checkStatus({ w: 'white', b: 'black' }[color])) { timer = window.setTimeout(function () { makeBestMove(color); if (color === 'w') { color = 'b'; } else { color = 'w'; } compVsComp(color); }, 250); Page | 47 } } 3.7.7 Gợi ý nước function showHint() Game lấy giá trị ô input gợi ý nước xem người chơi có u cầu gợi ý nước hay khơng var showHint = document.getElementById('showHint'); $board.find('.' + squareClass).removeClass('highlight-hint'); Nếu có, Game gọi đến phương thức getBestMove để tìm kiếm nước tốt dành cho trắng (mặc định người chơi chơi quân trắng), sau lấy tọa độ trước sau quân cờ thay đổi màu sắc (highlight) cờ // Show hint (best move for white) if (showHint.checked) { var move = getBestMove(chess, 'w', -globalSum)[0]; $board.find('.square-' + move.from).addClass('highlight-hint'); $board.find('.square-' + move.to).addClass('highlight-hint'); } 3.7.8 Undo, redo Undo Khi kiện undo kích hoạt, gọi đến phương thức undo đối tượng Chess để lấy nước trước đó, đẩy nước vào undo_stack để phục vụ cho việc redo Nếu số lần undo vượt số lượng tối đa stack xóa nước stack Sau cập nhật lại vị trí qn cờ bàn cờ function undo() { var move = chess.undo(); undo_stack.push(move); // Maintain a maximum stack size if (undo_stack.length > STACK_SIZE) { undo_stack.shift(); } board.position(chess.fen()); } Redo Khi kiện redo kích hoạt, ta lấy nước vừa thêm vào undo_stack đối tượng Chess thực nước Sau cập nhật lại vị trí quân cờ bàn cờ function redo() { chess.move(undo_stack.pop()); board.position(chess.fen()); } Page | 48 3.8 Xử lý kiện Mỗi hành động người chơi gây giao diện kích hoạt kiện Ví dụ, người chơi nước đi, hành động “đi nước” bắt đầu việc người chơi click giữ chuột vào quân cờ, sau kéo qn cờ đến vị trí khác bàn cờ, cuối thả quân cờ Mỗi hành động gửi kiện đến hệ thống, với kiện gửi đến, hệ thống kích hoạt hàm xử lý kiện khác trình bày Trong dự án, đối tượng xử lý kiện game đối tượng Game Game điều khiển bàn cờ thơng qua đối tượng Chessboard Như trình bày phần Chessboard API, hàm khởi tạo (constructor) Chessboard có tham số config Đây object cấu hình hàm xử lý bàn cờ có hành động gây từ phía người dùng Hành động hành động tương tác cụ thể giao diện trò chơi vào quân cờ, kéo quân cờ,… 3.8.1 Trỏ chuột vào, di chuột khỏi ô cờ Khi trỏ chuột vào ô cờ, ô cờ có quân cờ, game gợi ý cho người chơi nước hợp lệ cho qn cờ vị trí cờ cách đánh dấu vị trí hợp lệ, di chuột khỏi cờ cờ trở trạng thái ban đầu Khi trỏ chuột vào ô cờ, cần sinh nước qn cờ vị trí cờ Nếu khơng có qn cờ cờ khơng làm Nếu có qn cờ gọi hàm đánh dấu nước hợp lệ từ cờ function onMouseoverSquare(square, piece) { // get list of possible moves for this square var moves = chess.moves({ square: square, verbose: true, }); // exit if there are no moves available for this square if (moves.length === 0) return; // highlight the square they moused over greySquare(square); // highlight the possible squares for this piece for (var i = 0; i < moves.length; i++) { greySquare(moves[i].to); } } Khi di chuột khỏi ô cờ, cần xóa bỏ đánh dấu ô cờ cờ hợp lệ qn cờ cờ function onMouseoutSquare(square, piece) { removeGreySquares(); } Page | 49 3.8.2 Bắt đầu kéo quân cờ Khi người chơi kéo quân cờ, game kiểm tra trạng thái bàn cờ để số tình định, người chơi khơng thể nhấc quân cờ lên, như: Ván đấu kết thúc bị chiếu hết lượt người chơi function onDragStart(source, piece) { // not pick up pieces if the game is over if (chess.game_over()) return false; // or if it's not that side's turn if ( (chess.turn() === 'w' && piece.search(/^b/) !== -1) || (chess.turn() === 'b' && piece.search(/^w/) !== -1) ) { return false; } } 3.8.3 Thả quân cờ function onDrop(source, target) Trong source target ô cờ trước sau quân cờ thả xuống Khi người chơi thả quân cờ, nghĩa người chơi vừa hồn thành nước đi, game phải thực xử lý nhiều cơng việc: - Reset undo_stack, xóa đánh dấu nước hợp lệ: undo_stack = []; removeGreySquares(); - Kiểm tra xem nước có hợp lệ hay khơng: var move = chess.move({ from: source, to: target, promotion: 'q', // Always promote to a queen for example simplicity }); - Nếu nước khơng hợp lệ trả giá trị “snapback” cho thuộc tính OnDrop config object Chessboard Nếu thuộc tính OnDrop có giá trị “snapback”, qn cờ vừa thả quay trở lại vị trí ban đầu if (move === null) return 'snapback'; - Khi nước vừa thực xong phải tiến hành đánh giá trận cập nhật kết lợi giao diện: globalSum = evaluateBoard(chess, move, globalSum, 'b'); updateAdvantage(); - Highlight nước vừa đi: $board.find('.' + squareClass).removeClass('highlight-white'); $board.find('.square-' + move.from).addClass('highlight-white'); Page | 50 squareToHighlight = move.to; colorToHighlight = 'white'; $board find('.square-' + squareToHighlight) addClass('highlight-' + colorToHighlight); - Do người chơi quân trắng đối thủ (hay Chessbot) quân đen, nên kiểm tra trạng thái ván cờ, chưa kết thúc thực tìm kiếm nước tốt cho quân đen thực nước Sau thực nước xong, người chơi chọn chế độ gợi ý nước đi, phải thực tìm kiếm nước tốt cho quân trắng gợi ý cho người chơi if (!checkStatus('black')); { window.setTimeout(function () { makeBestMove('b'); window.setTimeout(function () { showHint(); }, 250); }, 250); } 3.8.4 Kết thúc kéo quân cờ Sự kiện xảy hoạt ảnh “snap” kết thúc, nghĩa sau quân cờ đặt vào vị trí nó, kích hoạt sau kiện “Thả qn cờ” Nó cập nhật lại vị trí quân cờ giao diện theo chuỗi fen Chess function onSnapEnd() { board.position(chess.fen()); } Ngoài ra, giao diện cịn có cài đặt khác, người chơi bấm vào tùy chọn cài đặt đó, kiện kích hoạt gửi hệ thống 3.8.5 Lựa chọn khai Các vị trí quân cờ khai khác nhau, nên chuỗi fen chúng khác Chỉ cần đưa chuỗi fen vào phương thức load Chess, sau dùng phương thức position Chessboard để đưa chúng giao diện Một vài khai kết thúc với việc lượt quân đen, ví dụ khai Ruy-Lopez, Italia, vài khai kết thúc với lượt quân trắng khai phòng thủ Sicilian Với khai mà lượt quân đen (Chessbot), sau đưa quân cờ đến vị trí khai cuộc, quân đen cần phải đưa nước sau $('#ruyLopezBtn').on('click', function () { reset(); chess.load( 'r1bqkbnr/pppp1ppp/2n5/1B2p3/4P3/5N2/PPPP1PPP/RNBQK2R b KQkq - 1' ); board.position(chess.fen()); window.setTimeout(function () { makeBestMove('b'); Page | 51 }, 250); }); $('#italianGameBtn').on('click', function () { reset(); chess.load( 'r1bqkbnr/pppp1ppp/2n5/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R b KQkq - 1' ); board.position(chess.fen()); window.setTimeout(function () { makeBestMove('b'); }, 250); }); $('#sicilianDefenseBtn').on('click', function () { reset(); chess.load('rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 1'); board.position(chess.fen()); }); 3.8.6 Bắt đầu, reset chế độ Máy đánh máy Bắt đầu reset thực công việc reset ván cờ lại từ đầu, nên cần gọi hàm xử lý việc reset ván cờ Khi người chơi chọn chế độ Máy đánh máy, ván cờ reset gọi hàm xử lý chế độ đánh máy, bắt đầu nước quân trắng $('#startBtn').on('click', function () { reset(); }); $('#compVsCompBtn').on('click', function () { reset(); compVsComp('w'); }); $('#resetBtn').on('click', function () { reset(); }); 3.8.7 Undo, redo Undo Khi người chơi bấm vào nút undo, game thực quay lại nước trước đó, nhiên phải lại nước lúc (1 nước quân đen nước quân trắng) Đầu tiên phải kiểm tra xem lịch sử ván cờ có từ nước cờ hay không, có xóa bỏ highlight nước vừa đi, sau gọi hàm undo lần, cách vài ms, gọi hàm showHint để xử lý việc người chơi có chọn gợi ý nước hay khơng Nếu lịch sử ván cờ có nước thơng báo cho người chơi $('#undoBtn').on('click', function () { if (chess.history().length >= 2) { $board.find('.' + squareClass).removeClass('highlight-white'); $board.find('.' + squareClass).removeClass('highlight-black'); $board.find('.' + squareClass).removeClass('highlight-hint'); Page | 52 // Undo twice: Opponent's latest move, followed by player's latest move undo(); window.setTimeout(function () { undo(); window.setTimeout(function () { showHint(); }, 250); }, 250); } else { alert('Nothing to undo.'); } }); Redo Thực tương tự undo: Kiểm tra undo_stack, có từ nước trở lên thực redo lần gợi ý nước đi, đưa thơng báo $('#redoBtn').on('click', function () { if (undo_stack.length >= 2) { // Redo twice: Player's last move, followed by opponent's last move redo(); window.setTimeout(function () { redo(); window.setTimeout(function () { showHint(); }, 250); }, 250); } else { alert('Nothing to redo.'); } }); Chương IV Kiểm thử 4.1 Kiểm thử hộp trắng 4.1.1 Kiểm thử trò chơi Ta kiểm tra xem Chessbot có đánh giá trị chơi độ sâu tìm kiếm xác định hay không Để tiết kiệm thời gian, ta kiểm tra với độ sâu Chỉnh sửa lại cài đặt độ sâu với giá trị thêm vào lệnh in hình (console) thuộc tính piece(qn cờ đi), from(ô bắt đầu), to(ô kết thúc) nước mà Chessbot đánh giá thuật toán minimax const {piece, from, to} = { currPrettyMove} console.log({piece, from, to}) Page | 53 Bắt đầu việc di chuyển quân tốt trắng từ e2 lên e4 Khi thuật toán minimax gọi đến in hình nước sau: {piece: 'p', from: 'd7', to: 'd6'}: quân Tốt từ d7 đến d6 {piece: 'p', from: 'g7', to: 'g6'}: quân Tốt từ g7 đến g6 {piece: 'p', from: 'c7', to: 'c5'}: quân Tốt từ c7 đến c5 {piece: 'p', from: 'h7', to: 'h5'}: quân Tốt từ h7 đến h5 {piece: 'p', from: 'd7', to: 'd5'}: quân Tốt từ d7 đến d5 {piece: 'p', from: 'g7', to: 'g5'}: quân Tốt từ g7 đến g5 {piece: 'n', from: 'b8', to: 'c6'}: quân Mã từ b8 đến c6 {piece: 'p', from: 'e7', to: 'e5'}: quân Tốt từ e7 đến e5 {piece: 'p', from: 'h7', to: 'h6'}: quân Tốt từ h7 đến h6 10 {piece: 'n', from: 'b8', to: 'a6'}: quân Mã từ b8 đến a6 11 {piece: 'p', from: 'b7', to: 'b5'}: quân Tốt từ b7 đến b5 12 {piece: 'p', from: 'e7', to: 'e6'}: quân Tốt từ e7 đến e6 13 {piece: 'p', from: 'a7', to: 'a6'}: quân Tốt từ a7 đến a6 14 {piece: 'n', from: 'g8', to: 'f6'}: quân Mã từ g8 đến f6 15 {piece: 'p', from: 'f7', to: 'f5'}: quân Tốt từ f7 đến f5 16 {piece: 'p', from: 'c7', to: 'c6'}: quân Tốt từ c7 đến c6 17 {piece: 'n', from: 'g8', to: 'h6'}: quân Mã từ g8 đến h6 18 {piece: 'p', from: 'b7', to: 'b6'}: quân Tốt từ b7 đến b6 19 {piece: 'p', from: 'a7', to: 'a5'}: quân Tốt từ a7 đến a5 20 {piece: 'p', from: 'f7', to: 'f6'}: quân Tốt từ f7 đến f6 Page | 54 Chú ý: nước bị xáo tr ộn theo thứ tự ngẫu nhiên để tránh vi ệc Chessbot l ựa chọn lặp lại nước có giá trị lợi Xem xét nước mà quân đen tiếp quân trắng e4: - quân Tốt đen di chuyển từ hàng xuống hàng hàng 5, nghĩa tổng cộng có 14 nước mà Chessbot sinh ra, nước đi: 1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 15, 16, 18, 19 20 - Mỗi quân Mã đen có hướng di chuyển (a6 c6, f6 h6), tổng cộng có nước mà Chessbot sinh ra, nước: 7, 10, 14 17 Vậy Chessbot tính tốn đủ 20 nước hợp lệ mà qn đen quân trắng nước e4 với độ sâu Tiếp theo, cần kiểm tra xem với nước đi, Chessbot có tính tốn giá trị lợi thế cờ hay không »» PASS! 4.1.2 Kiểm thử giá trị lợi Trong hàm minimax, sau thực xong việc đánh giá lợi nước đi, ta thêm lệnh in hình nước giá trị lợi thực nước đó: const {piece, from, to} = { currPrettyMove} console.log({piece, from, to}, newSum) Cũng với độ sâu 1, bắt đầu với nước e4, hình in 20 nước giá trị lợi sau: Xem xét nước {piece: 'p', from: 'd7', to: 'd5'} có giá trị lợi (đen có lợi thế), giá trị lợi lớn giá trị trên, nên Chessbot thực nước cờ Page | 55 Tuy nhiên, ta thực kiểm tra xem giá trị có tính tốn với hàm tính tốn giá trị lợi (evaluateBoard) hay không Khi trắng thực nước Tốt e2 - e4: - Không xảy chiếu, chiếu hết hay hịa cờ - Khơng phải nước ăn quân - Không phải nước phong cấp Vậy nước e2-e4 trắng nước bình thường Chessbot (chơi quân đen) thực tính tốn số điểm lợi cách: lấy số điểm lợi trước trừ giá trị vị trí cờ cũ qn cờ trắng vừa di chuyển cộng thêm giá trị vị trí qn cờ cờ mới, cuối lấy giá trị âm kết (vì sử dụng giá trị vị trí quân trắng nên phải lấy kết đối) - Số điểm lợi trước đó: (do trắng vừa nước đầu tiên) - Giá trị vị trí quân Tốt trắng e2: -36 - Giá trị vị trí quân Tốt trắng lại e4:  Giá trị lợi = - (0 – (-36) + 6) = -42 Vậy sau nước e4, quân trắng có lợi 42 điểm Tiếp theo xét việc đen thực nước Tốt d7 – d5: - Không xảy chiếu, chiếu hết hay hịa cờ - Khơng phải nước ăn quân - Không phải nước phong cấp Vậy nước d7-d5 đen nước bình thường, Chessbot thực tính tốn giá trị lợi theo công thức nêu trên: - Số điểm lợi trước đó: -42 - Giá trị vị trí quân Tốt đen d7: -37 - Giá trị vị trí quân Tốt trắng lại e4:  Giá trị lợi thế: -42 - (-37) + = (khơng cần lấy giá trị âm nước nước bên đen – màu với Chessbot) => Đúng với giá trị lớn mà Chessbot tìm Kết luận, sau trắng e4, Chessbot sinh trò chơi tính tốn giá trị lợi nốt, tìm giá trị lợi lớn nước d5 thực nước hồn tồn xác với logic cài đặt »» PASS! Page | 56 4.2 Kiểm thử hộp đen 4.2.1 Thao tác trò chơi Các thao tác kéo thả trò chơi mượt mà, nút cài đặt dễ tương tác, chọn bỏ chọn có tick bỏ tick ô input thực hành động lập tức, không cần thời gian để load »» PASS! 4.2.2 Hành vi quân cờ Khi nhấc quân cờ lên có highlight chân ô cờ highlight ô cờ kéo đến, người chơi Chessbot Khi nước không hợp lệ, quân cờ snapback ô cờ khơng thực hành vi ngoại lệ Khi quân tốt đến hàng cuối cùng, phong cấp thành quân Hậu cài đặt »» PASS! 4.2.3 Lỗi xử lý liệu dẫn đến hiển thị thông tin sai lệch Trong trị chơi có chức undo redo, cho phép người chơi thực lại tiến tới nước Chức xử lý vị trí quân cờ, đặt chúng vào vị trí nước trước sau đó, đồng thời đặt lại vị trí quân cờ, game hiển thị gợi ý lại nước cho người chơi người chơi bật chế độ gợi ý Tuy nhiên, game chưa xử lý việc cập nhật điểm lợi người chơi undo redo, nên số điểm lợi giữ nguyên người chơi thực hành động Trong tương lai phát triển chức cách tạo stack để lưu trữ giá trị lợi trước đó, nước thực đẩy giá trị lợi vào stack để phục vụ cho việc undo redo »» FAIL! Page | 57 Chương V Đánh giá chung 5.1 Ưu điểm Nhìn chung, Chessbot đưa nước xác nhanh chóng nhờ thuật toán Minimax cắt tỉa Alpha – beta - Kết lý thuyết tuyệt đối: Độ sâu tìm kiếm hữu hạn, nên sử dụng thuật toán minimax cho Chessbot giải pháp tối ưu mặt lý thuyết đánh giá tất nốt trò chơi để tìm nước tốt nhất, ko cần xét đến thứ tự nốt - Hiệu suất tốt: Cắt tỉa Alpha – beta cho phép giảm bớt trường hợp khơng cần tiếp tục tính tốn trị chơi, giúp Chessbot tối ưu mặt hiệu suất tính tốn, giúp đưa kết nhanh tiết kiệm tài nguyên - Trải nghiệm người chơi: Việc đánh giá lợi thế trận xác giúp người chơi biết cờ nghiêng bên nào, giúp người chơi có tính toán hợp lý 5.2 Nhược điểm Mặc dù Chessbot hoạt động tốt, nhiên cịn vài nhược điểm định cho tính chất đặc trưng thuật tốn - Thời gian tính tốn: Thuật tốn Minimax Alpha-beta nhiều thời gian để tìm kiếm tồn trị chơi Đặc biệt phải đánh giá số lượng lớn nước khả thi độ sâu tìm kiếm tăng lên - Hạn chế hàm đánh giá: Thuật toán Minimax Alpha-beta yêu cầu hàm heuristic đủ xác để ước lượng giá trị quân cờ trạng thái ván cờ Tuy nhiên, việc thiết kế hàm đánh giá xác đủ mạnh để mơ tả tồn tình ván cờ thách thức lớn - Khơng phù hợp cho trị chơi lớn: Với trị chơi lớn phức tạp, việc xây dựng tồn game tìm kiếm tồn nước trở nên khó khăn Trong trường hợp này, phương pháp tìm kiếm khác Monte Carlo Tree Search thuật toán học tăng cường sử dụng để giải vấn đề Tuy vậy, với quy mơ trị chơi trung bình trở xuống, Chessbot đủ sức để so sánh với kỳ thủ cờ vua có mức elo 1800 - 1900 đánh bại kỳ thủ có mức elo 1500 Tuy nhiên, so sánh mang tính tương đối việc so sánh logic máy móc với khả chơi cờ người khơng xác hồn tồn, khả chơi cờ người khơng phụ thuộc vào việc tính tốn mà cịn phụ thuộc vào khả suy luận, kinh nghiệm cảm nhận cá nhân kỳ thủ, phần văn hóa chơi cờ vua tồn giới, làm cho nước ván cờ vua mang đậm tính nghệ thuật, chiến thuật, bộc lộ khơn khéo, trí tuệ khả tư vượt trội người Page | 58 Tài liệu tham khảo HTML | Wikipedia CSS | Wikipedia JavaScript | Wikipedia Chessboardjs.com Chess.js | Github Minimax Algorithm | Wikipedia Alpha – beta pruning | Wikipedia Algorithms Explained – minimax and alpha-beta pruning | Sebastian Lague *** HẾT *** Page | 59

Ngày đăng: 26/12/2023, 04:54

Tài liệu cùng người dùng

Tài liệu liên quan