Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 39 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
39
Dung lượng
562,58 KB
Nội dung
TRƯỜNG ĐẠI HỌC ĐIỆN LỰC KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO CHUN ĐỀ HỌC PHẦN NHẬP MƠN TRÍ TUỆ NHÂN TẠO ĐỀ TÀI: Áp dụng thuật toán minimax cắt tỉa alpha vào trò chơi cờ tướng Sinh viên thực : LƯƠNG NGỌC HẢI NGUYỄN TIẾN ĐẠT Giảng viên hướng dẫn : PHẠM ĐỨC HỒNG Ngành : CÔNG NGHỆ THÔNG TIN Chuyên ngành : CÔNG NGHỆ PHẦN MỀM Lớp :D14CNPM6 Khóa : D14 Hà Nội, tháng 12 năm 2021 PHIẾU CHẤM ĐIỂM STT Họ tên sinh viên Nguyễn Tiến Đạt19810310528 Lương Ngọc Hải19810310309 Họ tên giảng viên Giảng viên chấm 1: Giảng viên chấm 2: Nội dung thực Chữ ký Điểm Ghi Chữ ký MỤC LỤC LỜI CẢM ƠN LỜI NÓI ĐẦU MỞ ĐẦU I Đặt vấn đề CHƯƠNG 1: THUẬT TOÁN MINIMAX VÀ CẮT TỈA ALPHA .4 1.1 Đặt ý tưởng 1.2 Thuật toán MiniMax AlphaBeta 1.2.1 Thuật toán MiniMax 1.2.2 Thuật toán cắt tỉa AlphaBeta 12 Chương 2: PHÂN TÍCH VÀ LẬP TRÌNH GAME 21 2.1 Mô tả ý tưởng .21 2.2 Xây dựng chương trình 21 2.2.1 Lượng giá 21 2.2.2 Sinh nước 26 2.2.3 Giao diện chương trình 32 2.3 Cài đặt chương trình .32 CHƯƠNG : KẾT LUẬN 33 3.1 Các vấn đề khó khăn cách thức giải .33 3.2 Đánh giá chương trình 33 3.3 Hướng phát triển 33 TÀI LIỆU THAM KHẢO 34 LỜI CẢM ƠN Trong thời gian nghiên cứu và học tâ ̣p mơn Nhập mơn Trí tuệ nhân tạo(Với ngơn ngữ lâ ̣p trình java), mơn đồ họa máy tính cùng với viê ̣c tìm hiểu và đọc các tài liê ̣u thư viê ̣n Trường và viê ̣c tìm hiểu thêm tài liê ̣u học tâ ̣p internet nhóm em đã gă ̣p khơng ít khó khăn về viê ̣c xây dựng và thiết kế game Cờ tướng sử dụng ngơn java ứng dụng đồ họa máy tính kiến thức lập trình hướng đối tượng Với sự giúp đỡ quý báu của các thầy cô giáo và các bạn nhóm em đã hoàn thành game và bài báo cáo môn học Xây game cờ tướng Đồng thời em xin gửi lời cảm ơn đă ̣c biê ̣t về sự hướng dẫn và chỉ bảo nhiê ̣t tình của thầy giáo Phạm Đức Hồng đã tâ ̣n tình giúp đỡ nhóm em suất quá trình hoàn thành game cũng bài báo cáo này Tuy nhiên, kinh nghiê ̣m còn thiếu nên game cũng bài báo cáo này chắn sẽ không tránh khỏi những thiếu sót, hạn chế nhất định Những ý kiến nhâ ̣n xét và góp ý quý báu của thầy cô và các bạn là sở để nhóm em học hỏi thêm và hoàn thiê ̣n thêm kiến thức và củng cố thêm kinh nghiê ̣m của bản thân mình Nhóm em rất mong nhâ ̣n được sự nhâ ̣n xét và góp ý từ thầy cô và các bạn.Mặc dù nỗ lực cố gắng chắn đề tài cịn nhiều thiếu sót,nhóm em mong nhận đuợc góp ý, phê bình các thầy cơ, và bạn để đề tài hồn thiện Em xin chân thành cảm ơn! LỜI NĨI ĐẦU Các chiến lược tìm kiếm sử dụng thơng tin chung tốn, khơng phù hợp với nhiều tốn thực tế sống chúng địi hỏi q nhiều thời gian nhớ Bên cạnh đó, ngày đặt toán thực tế, nhằm giải vấn đề, nhu cầu người, với lượng thông tin, liệu khổng lồ, cần phải đưa chiến lượng giải tối ưu, thơng để đạt hiệu hơn, nên cần nghiên cứu, thiết lập cải thiện chiến lược tìm kiếm với tri thức bổ sung (informed search strategies) sử dụng tri thức cụ thể tốn.Trong đồ án này, nhóm sinh viên chúng em chọn giải thuật tìm kiếm để mơ vào tốn thực tế chương trình “Cờ tướng”, trị chơi quen thuộc với chúng ta.Với mục tiêu đặt hiểu vận dụng giải thuật tìm kiếm tri thức, củng cố kĩ lập trình để tạo nên demo hồn chỉnh Q trình thực báo cáo gặp nhiều khó khăn ngơn ngữ lập trình mới, kinh nghiệm thực tế hạn chế, em mong nhận góp ý, phê bình để đề tài hoàn thiện Em xin chân thành cảm ơn giúp đỡ Thầy! MỞ ĐẦU I Đặt vấn đề Game cờ tướng xuất từ lâu đời, nhiều hệ yêu thích việc chơi cờ việc cần quân đánh trận Hiện nay, Cờ Tướng trở thành trị chơi trí tuệ mang tầm cỡ quốc tế Trị chơi Cờ Tướng (tên phiên âm Trung Quốc XiangQi, tên tiếng Anh Chinese Chess) minh hoạ tốt cho tốn tìm kiếm trị chơi áp dụng thuật toán AlphaBeta Đây trò chơi thú vị tương đối phổ biến Việt nam, châu Á tồn giới Nó tạo cảm giác dường máy tính suy nghĩ đọ sức với người (thực tế tính tốn mà thơi) Cờ Tướng loại cờ có độ phức tạp nhiều mặt tương đương với cờ Vua CHƯƠNG 1: THUẬT TOÁN MINIMAX VÀ CẮT TỈA ALPHA 1.1 Đặt ý tưởng Cờ tướng là trò chơi đối kháng, đó hai người phiên nước của mình Trạng thái bắt đầu là trạng thái khởi tạo bàn cờ, sau mỗi nước của mô ̣t bên, trạng thái bàn cờ sẽ được thay đổi thành mô ̣t trạng thái mới hiê ̣n hành Cờ tướng có luâ ̣t của nó, và trò chơi sẽ kết thúc mô ̣t người có được trạng thái phản ánh sự thắng cuô ̣c hoă ̣c hai người rơi vào trạng thái hòa cờ Ta tìm cách phân tích xem từ mô ̣t trạng thái nào đó sẽ dẫn đến đấu thủ nào sẽ thắng với điều kiê ̣n cả hai có trình đô ̣ Giải thuâ ̣t Minimax sẽ được áp dụng vào trò chơi cờ tướng Hai đấu thủ trò chơi sẽ được gọi là MIN và MAX và hai đấu thủ đều biết rõ thông tin bàn cờ nhau. - MAX đại diê ̣n cho đấu thủ quyết dành thắng lợi hoă ̣c tối đa hóa ưu thế của mình - MIN ngược lại, cố gắng tối thiểu hóa điểm số của MAX Bàn cờ tướng cũng chính là mô ̣t không gian trạng thái với các mức và được biểu diễn bằng trò chơi Mỗi nút của biểu diễn cho mô ̣t trạng thái bàn cờ Nút gốc biểu diễn trạng thái bắt đầu ván cờ Các nút lá thể hiê ̣n trạng thái kết thúc của trò chơi (khi mô ̣t đấu thủ giành phần thắng, thua, hay hai đấu thủ hòa nhau) Hai đấu thủ được gọi là MAX và MIN và luân phiên nước cờ của mình nên mỗi mức được biểu diễn luân phiên là MAX và MIN. Các nút ứng với trạng thái mà từ đó đấu thủ MAX chọn nước ứng với lớp MAX, các nút mà đấu thủ MIN chọn nước ứng với lớp MIN Với mỗi nước bàn cờ, tương ứng với các mức cây, giải thuâ ̣t minimax sẽ định giá trị cho các nút sau: - Nếu nút là nút lá gán cho nút đó mô ̣t giá trị để phản ánh trạng thái thắng, thua hay hòa của các đấu thủ - Sử dụng giá trị các nút lá để xác định giá trị của các nút ở mức nó: + Nút thuô ̣c lớp MAX gán cho nó giá trị lớn nhất các nút lá + Nút thuô ̣c lớp MIN gán cho nó giá trị nhỏ nhất các nút lá Gán giá trị cho từng thế cờ theo quy tắc chỉ rõ giá trị của trạng thái tốt nhất mà mỗi đấu thủ hi vọng đạt được Cũng giống viê ̣c tính toán nước và thực hiê ̣n mô ̣t nước cờ thực sự của đấu thủ Giải thuâ ̣t Minimax thể hiê ̣n viê ̣c tính toán nước tối ưu cho các đấu thủ thông quá giá trị của các nút được gán Trong mô ̣t nước cờ, đấu thủ MAX đến lượt đi, đấu thủ này sẽ chọn nước ứng với trạng thái có giá trị cao nhất các trạng thái con, còn đấu thủ MIN sẽ chọn mô ̣t nước ứng với trạng thái có giá trị nhỏ nhất các trạng thái Tuy nhiên, cờ tướng là mô ̣t trò chơi có thể nói là phức tạp, viê ̣c mở rô ̣ng không gian trạng thái khí áp dụng giải thuâ ̣t Minimax có thể gă ̣p khó khăn Vì thế mà chúng ta chỉ xét đến viê ̣c triển khai giải thuâ ̣t Minimax với trò chơi cờ tướng có mức đô ̣ sâu được định trước (khoảng mức) Viê ̣c định trước mức hay đô ̣ sâu sẽ làm giảm thời gian tính toán cho giải thuâ ̣t và AI (máy) sẽ đưa được mô ̣t nước nhanh và chính xác Phần sau nhóm em sẽ trình bày về quá trình xây dựng giải thuâ ̣t Minimax 1.2 Thuật toán MiniMax AlphaBeta 1.2.1 Thuật tốn MiniMax 1.2.1.1 Mơ tả Giả sử có phân tích cờ áp dụng tất luật, phương pháp đánh cờ khác vào cờ chuyển đổi chúng thành số đại diện (cho điểm cờ) Mặt khác, ta giả sử số dương áp dụng cho cờ đấu thủ (được gọi người chơi cực đại maximizer), âm áp dụng cho đấu thủ bên (được gọi người chơi cực tiểu - minimizer) Q trình tính tốn cho điểm cờ gọi lượng giá tĩnh (static evaluation) Hàm thực việc tính tốn gọi lượng giá tĩnh, giá trị nhận gọi điểm lượng giá tĩnh Cả hai đấu thủ cố gắng để đạt điểm tuyệt đối lớn Người chơi cực đại tìm nước dẫn đến điểm trở nên lớn (hay cao được) hay điểm đối thủ bớt âm (nhỏ giá trị tuyệt đối) Còn đấu thủ anh ta, người chơi cực tiểu, lại sức phản kháng lại, để dẫn tới điểm âm bé hay điểm dương đối thủ nhỏ (hình 1) Ví dụ phần trị chơi hình Người chơi cực đại hi vọng chọn nước bên phải để đạt điểm Thế đến lượt người chơi cực tiểu, cố gắng không cho người chơi cực đại đạt điểm cách chọn nước nhánh bên trái vậy, người chơi cực đại có điểm thay Ngược lại, người chơi cực đại chọn nước bên trái, tình xấu điểm, lớn chọn nước bên phải Nói chung, người chơi cực đại phải tìm cách nhận nước đối phương làm cho điểm giảm xuống Và tương tự vậy, người chơi cực tiểu phải nhận biết nước người chơi cực đại cố gắng làm tăng điểm lên Thủ tục tìm nước tốt trò chơi gọi thủ tục Minimax điểm nút điểm cực đại điểm cực tiểu có thuật tốn sau: 38 hoạch" nhiều điểm - điểm số thuật tốn khơng buồn xem xét trường hợp cịn lại Do tiết kiệm nút không cần phải lượng giá sinh nước cho hai trường hợp 39 Kết luận cuối điểm cao mà người chơi cực đại thu điểm nhờ chọn theo nhánh 22 Chương 2: PHÂN TÍCH VÀ LẬP TRÌNH GAME Chương trình cờ tướng áp dụng thuật tốn Minimax Trị chơi Cờ Tướng (tên phiên âm Trung Quốc XiangQi, têntiếng Anh Chinese Chess) minh hoạ tốt cho tốn tìm kiếm trị chơi áp dụng thuật tốn Minimax AlphaBeta Đây trò chơi thú vị phổ biến Việtnam, châu Á tồn giới Nó tạo cảm giác dường máy tính suy nghĩ đọ sức với người (thực tế tính tốn mà thơi) 2.1 Mơ tả ý tưởng Game có chức năng: - Tạo bàn cờ, với chế độ người đấu với người, người đấu với máy, máy đấu với máy - Trong trường hợp, người đấu với máy, chương trình cho phép người dùng tủy chỉnh độ sâu xét duyệt thuật tốn - (Máy nhìn trước nước đi), độ sâu cao, độ khó tăng thời gian máy tính tốn lâu - Game có hiển thị thời gian tính tốn, số lượng nút lượng giá, hệ số phân nhánh - Cho phép người dùng chuyển qua lại hai thuật toán Minimax AlphaBeta để thấy khác biết tốc độ tính tốn 2.2 Xây dựng chương trình 2.2.1 Lượng giá Đánh giá cờ nhiệm vụ định chương trình chơi cờ bạn có "cao thủ" hay không Căn vào cờ máy gán cho điểm số (lượng giá tĩnh) để đánh giá độ tốt - xấu Nhờ điểm máy so sánh cờ với biết chọn nước tốt Đây nhiệm vụ khó khăn phức tạp khơng tồn thuật tốn tổng qt thống để tính điểm Điểm cờ dựa nhiều yếu tố mà khó số hố hết phụ thuộc vào số lượng giá trị quân cờ tại, phụ thuộc vào tính hãm, tính biến, cơng, thủ quân cờ cục diện trận đấu Ví dụ, cặp Mã giao chân, sát cánh tiến quân tựa lưng phòng thủ thường có giá hai Mã đứng rời Nhưng có lúc hai Mã đứng rời lại tốt hai Mã giao chân Mã lại cản Mã trận Ta biết rằng, "lạc nước hai Xe đành 23 bỏ phí, gặp thời Tốt thành cơng", số hố điều qua hàm lượng giá điều khó sức Chúng ta bắt đầu với việc công nhận giả thuyết sau: Ta biểu diễn chất lượng cờ số Ví dụ, số đánh giá ta xác suất chiến thắng, đa số chương trình số khơng có đặc biệt, số mà mục đích so sánh với Chúng ta nên đo chất lượng cờ tương tự phép đo đối phương (do đó, ta coi đạt tốt đối phương ta phải thấy xấu họ ngược lại) Điều không thật lắm, giúp cho thuật tốn tìm kiếm ta làm việc tốt thực tế gần với thật Trong chương cài đặt phương pháp đơn giản nhất: lượng giá dựa sở giá trị quân cờ Cách tính lấy tổng giá trị qn cờ có bên trừ tổng giá trị quân cờ có đối phương Do đó, cờ cờ chỗ cịn nhiều qn bên hơn, nhiều quân giá trị cao có bắt nhiều quân quân giá trị cao đối phương không Cách làm bỏ qua nghệ thuật, chiến lược chơi cờ (mà điểm để đánh giá người giỏi cờ hay không) Các quân cờ triển khai không theo chiến lược chung hết (vơ định) Nó cịn tạo cảm giác cờ "vồ", nghĩa nhằm nhằm sơ hở đối phương "ăn" mà không cần biết đến hậu (điều không hẳn đúng, lí trình bầy dưới) Tuy nhiên phương pháp tính điểm có ưu điểm sau: Là cách tính điểm nhất, đóng vai trị chủ đạo điểm cờ Nó sở đa số hàm đánh giá Ta nhận thấy phần lớn thời gian diễn trận đấu, hai bên tìm cách tiêu diệt quân Các phương án, chiến lược thường tính điểm cộng thêm vào đóng góp tỷ lệ nhỏ tổng số điểm cờ Việc nhằm "vồ" quân đối phương sau suy nghĩ sâu nhiều nước trở thành "cao cờ" Nói cho cùng, mục đích "vồ" quân có giá trị cao - Tướng đối phương Là cách tính đơn giản nhanh Do tính nhanh, ta tăng thêm độ sâu tìm kiếm Việc tăng thêm độ sâu lại giúp máy có nhìn xa hơn, "cao cờ" nhiều khắc phục nhược điểm cách tính đơn giản 24 Điểm quân cờ đánh giá theo kinh nghiệm cho biết tương quan quân cờ Sau điểm quân mà người thường chấp nhận: Quân cờ Kí hiệu Điểm Tốt PAWN (2 qua sông) Sĩ BISHOP Tượng ELEPHANT2 Mã KNIGHT Pháo CANNON 4.5 Xe ROOK Bạn theo thang điểm khác tuỳ theo hiểu biết sở thích Ví dụ làng cờ Việt nam thường cho điểm quân khác (xem đọc dưới): Tốt - (2 qua sông), Sĩ - 2, Tượng - 2.5, Mã 4.5, Pháo 5, Xe 10 Trong chương trình cờ chúng ta, điểm cụ thể quân cờ số nguyên 10, 20, 20, 40, 45 90 Ta dùng mảng piecevalue để lưu điểm quân cờ Cho điểm giữ nguyên tương quan tránh dùng số thực (tính chậm) mà ta cịn có khoảng cách hợp lí điểm để sau dễ dàng thêm điểm bổ xung "thưởng" "phạt", tức điểm vào yếu tố khác (ví dụ Pháo lúc 40 điểm vị trí "bí", lúc khác lại đến 85 vị trí Pháo trống đe doạ Pháo lồng) Trong bàn cờ, quân Tướng quân quan trọng nhất, dù quân đạt cờ khơng Tướng dẫn đến thua cờ Do đó, Tướng thường cho điểm cao, cách biệt nhiều lần so với quân khác, đảm bảo điểm tổng quân lại đủ loại "thưởng", "thêm" không Tướng Trong chương trình, ta cho 1000 điểm Hàm lượng giá thật đơn giản sau (chú ý ta chưa tăng điểm cho Tốt qua sông): function Eval: integer; const piecevalue:array[1 7]of integer=(10,20,20,40,45,90,1000); var i, s: integer; begin s := 0; for i:=1 to BOARD_SIZE begin 25 if color[i] = side then s := s + piecevalue[piece[i]] else if color[i] = xside then s := s - piecevalue[piece[i]]; end; Eval := s; end; Vấn đề cải tiến hàm lượng giá bàn riêng chương phần sau Tham khảo kiến thức cờ Tướng GIÁ TRỊ CỦA CÁC QUÂN CỜ Khái niệm giá trị quân cờ người chơi cờ từ kỷ trước Từ lâu, làng cờ có câu nhận định sức mạnh quân chủ lực "Xe 10, Pháo 7, Mã 3" đánh giá Xe quân chủ lực mạnh câu "Nhất Xa sát vạn" hay đánh giá Tốt qua hà, sức mạnh nửa Xe (nhất Tốt độ hà, bán Xa chi lực) Thế đánh giá nhận định sức mạnh qn khơng xác khơng đầy đủ Do khái niệm giá trị quân cần xác định rõ hoàn chỉnh Thông thường, theo thời gian ván cờ chia thành ba giai đoạn: khai cuộc, trung tàn Trong ba giai đoạn trung chiếm nhiều thời gian có ý nghĩa đến thắng thua nhiều Do định giá quân cờ thường cho giai đoạn Chúng ta biết loại quân cờ hay binh chủng có đặc điểm, tính tác dụng khác nên sức mạnh chúng khác nhau, giá trị chúng không giống Ngay thân quân cờ lúc sức mạnh giữ nguyên cũ Khi đứng vị trí tốt phát huy tính tác dụng tối đa khác hẳn với đứng vị trí xấu, khơng thể phát huy tính tác dụng được, hay phát huy mức hạn chế Vậy điều trước tiên phải thấy quân cờ có hai giá trị: giá trị vốn có giá trị biến động Giá trị vốn có thường gọi giá trị (giá trị tĩnh), giá trị biến động gọi giá trị tương đối Các nhà nghiên cứu lí luận cờ trao đổi thống với bảng giá trị quân sau: Nếu lấy Tốt chưa qua sông làm chuẩn để xác định giá trị qn lực bàn cờ Khi chưa qua sơng kiểm sốt hay khống chế điểm trước mặt nên tạm cho có giá trị Khi Tốt qua sơng, khống chế đến hay điểm trước mặt bên cạnh (Tốt biên khống chế 2) Bây 26 mang giá trị tương đối, phải thấy mạnh lúc chưa qua sông nên giá trị lúc phải Đối với Sĩ, Tượng loại binh chủng phịng ngự, có nhiệm vụ bảo vệ an tồn cho Tướng, đơi lúc chúng trợ giúp quân khác công Trong giai đoạn trung cuộc, Tốt đối phương qua sông đổi Sĩ Tượng Do người ta đánh giá Sĩ Tượng có giá trị Tốt qua sơng, tức Nhưng so sánh lực Tượng Sĩ thấy Tượng có phần đắc lực nên định giá trị Sĩ Tượng phải 2.5 cơng Qn Mã bàn cờ có khả khống chế tối đa điểm Mỗi bước nhẩy vượt hai tuyến đường ngang hay dọc So Mã mạnh tác chiến tầm cự ly ngắn mà Nếu so với hai Tốt qua sơng cặp kè lực Mã khơng bao nhiêu, định giá trị Mã 4.5 vừa Nên nhớ hai Tốt cặp kè qua sơng phải có giá trị Pháo binh chủng tác chiến tầm xa có hiệu Trên đường dọc, Pháo khống chế tối đa điểm cịn khống chế đường ngang Mặt khác Pháo qn có tính động cao, bước vượt đến tuyến đường Nhưng cự li gần, nhiều Pháo bất lực, khơng làm để khống chế đối phương Do so với Mã phải thấy quân có sở trường riêng, sức mạnh chúng coi tương đương Thế giai đoạn trung quân số hai bên tương đối nhiều, Mã lại dễ bị cản trở, cịn Pháo nhanh nhẹn hơn, dễ phát huy lực nên giá trị Pháo phải Mã chút Đối với Xe rõ ràng binh chủng động mạnh nhất, khống chế ngang, dọc tối đa đến 17 điểm Nếu đem Xe đổi lấy Pháo Mã đối phương thấy có phần thiệt thịi chút, cịn hai Pháo coi cân Do giá trị Xe 10 Cịn Tướng, thân khơng có sức mạnh nhiều dù đơi làm nhiệm vụ trợ giúp cho quân phe cơng có kết Thế giá trị vơ to lớn, khơng quân so sánh Tất quân đổi, hi sinh riêng quân Tướng đánh đổi mà hi sinh, Tướng thua cờ Do không nên định giá trị Tướng định chẳng có ý nghĩa (Sưu tầm) 27 2.2.2 Sinh nước Một việc quan trọng để máy tính chơi cờ phải cho biết nước đi từ cờ Máy tính tốn để chọn nước có lợi cho Các u cầu thủ tục sinh nước là: Chính xác (rất quan trọng) Một nước sai làm hỏng tính tốn Đồng thời chương trình bị trọng tài xử thua Do số lượng nước sinh lớn, luật quân nhiều phức tạp nên việc kiểm tra tính đắn tương đối khó Đầy đủ (rất quan trọng) Sinh nước có từ cờ Nhanh Do chức phải sinh hàng triệu nước máy đến lượt nên giảm thời gian sinh nước có ý nghĩa lớn Sinh nước thuật tốn vét cạn Máy tìm nước hợp lệ có Máy phải sinh từ nước hay nước ngớ ngẩn (như đẩy Tướng vào vị trí khống chế đối phương) Ta hình dung thủ tục sinh nước Gen có đầy vịng lặp for, câu lệnh kiểm tra if rẽ nhánh case, phép tính kiểm tra giới hạn chiếm phần đáng kể Thủ tục sinh nước cho bên tới lượt chơi vào nội dung biến side Đây thủ tục phức tạp dễ sai Một nước có hai giá trị cần quan tâm Đó điểm xuất phát (from) điểm đến (dest) Ta khai báo cấu trúc move sau để dùng nơi cần đến liệu nước type move = record { Định nghĩa cấu trúc nước } from, dest: byte; end; 28 Kiểm tra giới hạn bàn cờ Ví dụ có qn Xe nằm ô số 84 (trong mảng piece) Bây ta sinh thử nước sang trái cho Nước sang trái chuyển thành số 83 vị trí hàng với ô xuất phát nên chấp nhận Một nước khác cần phải xem xét sang trái ba - 81 Ơ 81 có bàn cờ khác hàng nên không chấp nhận Như vậy, muốn biết ô nước sang trái có phép khơng ta phải kiểm tra xem có hàng với xuất phát khơng Việc kiểm tra thực cách chia cho (kích thước dịng) lấy phần ngun (trước lại phải chuyển thứ tự ô gốc cách trừ 1) Ta thấy ((83-1) div 9) = ((84-1) div 9) nên ô 83 chấp nhận; ((81-1) div 9) ((84-1) div 9) nên kết luận nước đến ô 81 khơng hợp lệ (hình 2.5) 29 Các nước vừa sinh đưa vào danh sách nước nhờ gọi thủ tục Gen_push Thủ tục có hai tham số vị trí xuất phát quân cờ nơi đến dest quân cờ Dưới đoạn chương trình dùng để sinh nước sang trái quân Xe, x vị trí quân Xe i := x - 1; { Nước sang trái } while ((i-1) div 9) = ((x-1) div 9) begin if (ô thứ i trống) or (ô thứ i có qn đối phương) then gen_push(vị trí Xe, vị trí xét); if thứ i không trống then break; { Kết thúc trình sinh nước sang trái } i := i - 1; { Xét tiếp vị trí bên trái } end; Việc sinh nước theo chiều khác tương tự (ví dụ để sinh nước theo chiều đứng ta cần cộng trừ bội số 9) điều kiện kiểm tra khác Như vậy, chương trình sinh nước Gen có dạng sau: for Xét quân cờ bên case quâncờ of Xe: begin while Xét tất ô từ bên phải Xe lề trái bàn cờ begin if (ô xét ô trống) or (ô xét chứa quân đối phương) then gen_push(vị trí Xe, vị trí xét) if ô xét không trống then break; end; while Xét tất ô từ bên trái Xe lề phải bàn cờ while Xét tất ô từ bên Xe lề bàn cờ 30 while Xét tất ô từ bên Xe lề bàn cờ end; { Xong quân Xe } Pháo: Phương pháp có nhược điểm chương trình phải viết phức tạp, cồng kềnh, khó tìm lỗi nhanh Trong chương trình mẫu VSCCP, chúng tơi giới thiệu kĩ thuật khác có tên gọi "hộp thư" (mail box - bảng có dạng hộp phân thư) Mục đích kĩ thuật nhằm giảm bớt phép kiểm tra vượt giới hạn bàn cờ làm đơn giản chương trình Mấu chốt thay cho bàn cờ có kích thước bình thường 9x10 = 90, ta dùng bàn cờ mở rộng, chiều có thêm đường (bàn cờ có kích thước 13x14 = 182) Các ô ứng với đường bao mở rộng có giá trị -1, tức giá trị báo vượt biên Các nước bàn cờ 9x10 chuyển tương ứng sang bàn cờ Nếu nước sinh lại rơi vào hai đường bao có nghĩa rơi ngồi bàn cờ rồi, phải bỏ ngừng sinh nước phía Sở dĩ có đến hai đường biên (chứ khơng phải một) qn Mã Tượng nhẩy xa đến hai (hình 2.6) Việc chuyển đổi toạ độ thực nhờ hai mảng Mảng mailbox90 dùng để chuyển từ toạ độ bàn cờ thường sang toạ độ bàn cờ Mảng ứng với bàn cờ - mailbox182 dùng để kiểm tra nước vượt đường biên liệu để chuyển trở lại toạ độ bình thường 31 Ví dụ, vị trí quân Xe nằm ô số 84 (trong mảng piece) hình 2.5, đổi sang bàn cờ mở rộng thành vị trí mailbox90[84] = 148 Có nghĩa ứng với thứ 148 mảng mailbox182 Bây ta sinh thử nước sang trái ô cho quân Xe Việc sinh kiểm tra thực bàn cờ mở rộng, nước ô số 148 - = 147 Do mailbox182[147] = 83 ¹ -1 nên nước chấp nhận Số 83 cho biết kết sang trái vị trí 83 bàn cờ bình thường Tuy nhiên, nước sang trái ba ơ, có số 148 - = 145 mailbox182[145] = -1 cho biết nước khơng hợp lệ Chương trình cần kiểm tra số nước tối đa theo hướng quân cờ xét Chỉ có quân Pháo Xe đến nước đi, cịn qn khác có nhiều Việc quân sang vị trí thực chất ta thay đổi toạ độ cách cộng với số (dương âm) Ở ta thấy để quân Xe sang trái nước ta phải cộng vị trí với -1 Để sinh theo hàng dọc, ta phải cộng với +13 -13 (chú ý, việc sinh nước kiểm tra hợp lệ dựa vào mảng mailbox182 nên giá trị 13 kích thước dịng mảng này) Để sinh nước chéo ta phải cộng trừ với số khác Ta nên lưu số vào mảng offset có chiều Một chiều dựa vào loại quân cờ nên số đánh từ đến Chiều lại số hướng tối đa quân cờ Quân cờ có nhiều hướng quân Mã có tới hướng nên chiều khai báo số từ đến Các qn cờ có số hướng điền vào phần thừa Chú ý nước quân Tốt hai bên khác hướng tiến Để tiết kiệm ta lưu nước tiến Tốt đen, nước tiến Tốt trắng đơn giản lấy ngược dấu Kiểm tra vị trí phép đến Việc chuyển toạ độ từ bàn cờ thường sang bàn cờ mở rộng giúp ta loại bỏ nước vượt biên Ta phải kiểm tra số giới hạn khác Ví dụ Tướng Sĩ khơng thể cung, Tượng phép điểm cố định phía bên mình, Tốt phép tung hồnh đất đối phương, cịn phía bên bị giới hạn ngặt nghèo số ô Để thực phép kiểm tra này, ta dùng mảng legalmove ứng với ô bàn cờ cung cấp thông tin Để kiểm tra qn cờ có phép khơng, ta dùng mặt nạ bít Maskpiece mà tuỳ theo quân có giá trị khác Nếu ô cần kiểm tra có bit trùng với mặt nạ đặt qn cờ phép đến 32 Ví dụ, số có giá trị legalmove[3] = (chuyển thành số nhị phân 00000101) cho biết quân cờ phép đến Tượng, Xe, Pháo, Mã Ngồi ra, ta phải kiểm tra nước bị cản (đối với Tượng Mã) xử lí cách ăn quân quân Pháo trường hợp đặc biệt Như vậy, tổng thể sinh nước cho quân cờ có dạng sau: p := piece[i]; { Sinh nước cho quân cờ p vị trí i } for j := to begin { Số hướng tối đa } if offset[p,j] = then break; x:=mailbox90[i]; { Chuyển sang bàn cờ mở rộng} if p in [ROOK, CANNON] then n := else n := 1; for t:=1 to n { Số nước theo hướng} begin if (p=PAWN) and (side=LIGHT) then x := x - offset[p, j] else x := x + offset[p, j]; { Nước } y := mailbox182[x]; { Chuyển toạ độ bình thường } if side = DARK then t := y else t := 91-y; if (y=-1) or { Ra lề ? } ((legalmove[t] and maskpiece[p])=0) { Được phép ở vị trí khơng ? } then break; { Thốt nước khơng hợp lệ } { Kiểm tra nước cản với Tượng, Mã xử lí Pháo } Một vấn đề luật hai Tướng không đối mặt trực tiếp với Việc kiểm tra thực nhờ hàm kingface Hàm trả lại giá trị true nước vừa gây hở mặt Tướng Hàm đặt thủ tục sinh nước Gen Tuy nhiên đơn giản hơn, ta đặt thủ tục gen_push, hở mặt Tướng thủ tục không đưa nước 33 2.2.3 Giao diện chương trình 2.3 Cài đặt chương trình Chương trình cờ tướng viết C#, sử dụng IDE Visual Studio Toàn Project gồm Source Code file liên quan chứa thư mục China Chess gửi kèm với báo cáo Để sử dụng chạy file ChineseChess.jar 34 CHƯƠNG : KẾT LUẬN 3.1 Các vấn đề khó khăn cách thức giải Mặc dù áp dụng thuật tốn tìm kiếm Minimax AlphaBeta vào để giải toán, nhiên trình làm việc nhóm gặp nhiều khó khăn; từ việc nghiên cứu hiểu giải thuật MiniMax, AlphaBeta đến việc ứng dụng vào toán cụ thể Nhóm nghiên cứu tìm hiểu kết hợp với nguồn tài liệu từ internet để áp dụng vào chương trình Bên cạnh đó, kinh nghiệm lập trình hướng đối tượng thành viên nhóm cịn có chênh lệch, nên việc thống cơng việc đầu cịn khó khăn Trong q trình thực đề tài nhóm em nhận giúp đỡ tận tình bạn lớp, thầy cô khoa đặc biệt thầy Phạm Đức Hồng giúp em hồn thành tốt báo cáo này.Vì kiến thức chưa nắm vực kinh nghiệm thực tế cịn chưa nhiều nên báo cáo khơng tránh khỏi sai sót, mong giúp đỡ góp ý từ thầy Nhóm em xin chân thành cảm ơn! 3.2 Đánh giá chương trình Chương trình mơ thành cơng thuật tốn tìm kiếm MiniMax phương pháp cắt tỉa AlphaBeta Tuy nhiên chương trình dừng lại mục đích học tập nghiên cứu, giao diện chưa thân thiện với người sử dụng 3.3 Hướng phát triển Mặc dù bước đầu ứng dụng thuật tốn tìm kiếm với tri thức bổ sung vào tốn cụ thể, song chương trình mơ chưa thực hoàn thiện mức độ thời gian chất lượng đánh giá tối ưu chương trình nước quân cờ, nên nhóm chúng em tiếp tục hồn thiện chương trình, tối ưu thuật tốn để giúp chương trình phổ biến rộng rãi đến người dùng… tương lai cố gắng phát triển nhiều thiết bị ngồi máy tính, thiết bị smart phone, tablet… 35 TÀI LIỆU THAM KHẢO Trong q trình xây dựng chương trình nhóm sử dụng tài liệu tham khảo sau: - Sách “Thuật toán chơi cờ” Phạm Hồng Nguyên - Tham khảo code số nguồn Internet - Tài liệu mơn nhập mơn trí tuệ nhân tạo 36