1. Trang chủ
  2. » Luận Văn - Báo Cáo

ĐỀ TÀI XÂY DỰNG PHẦN MỀM CHƠI CỜ HEXXAGON

20 370 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 1,03 MB

Nội dung

2 3 MỤC LỤC CHƯƠNG I. GIỚI THIỆU VÀ MÔ TẢ BÀI TOÁN ...................................... 4 I. Đề tài ....................................................................................................... 4 II. Mô tả bài toán ......................................................................................... 4 CHƯƠNG II. PHƯƠNG PHÁP GIẢI QUYẾT BÀI TOÁN ......................... 6 I. Game tree (cây biểu diễn trò chơi) ........................................................ 6 II. Thuật toán Minimax ............................................................................. 7 III. Thuật toán AlphabetaPrunning .......................................................... 7 CHƯƠNG III. CHỨC NĂNG VÀ CÁCH SỬ DỤNG HỆ THỐNG ........... 11 CHƯƠNG IV. CÁC VẤN ĐỀ GẶP PHẢI VÀ HƯỚNG GIẢI QUYẾT .... 15 I. Giao diện chương trình ....................................................................... 15 II. Thuật toán AI ...................................................................................... 15 III. Một số lỗi phát sinh khi chạy chương trình ..................................... 16 IV. Hướng phát triển của bài toán .......................................................... 16 CHƯƠNG V. KẾT QUẢ ................................................................................. 17 CHƯƠNG VI. CÔNG NGHỆ VÀ THUẬT TOÁN SỬ DỤNG ................... 18 I. Ngôn ngữ lập trình Java ...................................................................... 18 II. Lập trình hướng đối tượng trong Java ............................................... 18 III. Game engine JGame ........................................................................... 19 Tài liệu tham khảo ............................................................................................ 20 4 CHƯƠNG I. GIỚI THỆU VÀ MÔ TẢ BÀI TOÁN I. ĐỀ TÀI  Xây dựng phần mềm chơi cờ Hexxagon.  Về cờ Hexxagon Hexxagon là một biến thể của Ataxx, được chơi trên bàn cờ hình lục giác thay vì hình vuông của Ataxx. Bản chính thức được viết bởi Argo Games vào năm 1992. Năm 1993 nó được phát hành dưới dạng PC Game bởi công ty Software Creations, luật chơi vẫn được giữ như của Ataxx. Hiện nay nó được phát triển và cập nhật trên web bởi Neave. http:www.neave.comgameshexxagon

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG ĐỒ ÁN MÔN HỌC TRÍ TUỆ NHÂN TẠO ĐỀ TÀI: XÂY DỰNG PHẦN MỀM CHƠI CỜ HEXXAGON GIẢNG VIÊN HƯỚNG DẪN: TS. Nguyễn Nhật Quang NHÓM SINH VIÊN: SHSV 1. Nguyễn Thị Hồng Giang 20070910 2. Nguyễn Hồng Hải 20071008 3. Nguyễn Xuân Tiệp 20072913 4. Tray Youheng 20073938 Tháng 11/2010 - 2 - - 3 - MỤC LỤC CHƯƠNG I. GIỚI THIỆU VÀ MÔ TẢ BÀI TOÁN 4 I. Đề tài 4 II. Mô tả bài toán 4 CHƯƠNG II. PHƯƠNG PHÁP GIẢI QUYẾT BÀI TOÁN 6 I. Game tree (cây biểu diễn trò chơi) 6 II. Thuật toán Minimax 7 III. Thuật toán AlphabetaPrunning 7 CHƯƠNG III. CHỨC NĂNG VÀ CÁCH SỬ DỤNG HỆ THỐNG 11 CHƯƠNG IV. CÁC VẤN ĐỀ GẶP PHẢI VÀ HƯỚNG GIẢI QUYẾT 15 I. Giao diện chương trình 15 II. Thuật toán AI 15 III. Một số lỗi phát sinh khi chạy chương trình 16 IV. Hướng phát triển của bài toán 16 CHƯƠNG V. KẾT QUẢ 17 CHƯƠNG VI. CÔNG NGHỆ VÀ THUẬT TOÁN SỬ DỤNG 18 I. Ngôn ngữ lập trình Java 18 II. Lập trình hướng đối tượng trong Java 18 III. Game engine JGame 19 Tài liệu tham khảo 20 - 4 - CHƯƠNG I. GIỚI THỆU VÀ MÔ TẢ BÀI TOÁN I. ĐỀ TÀI  Xây dựng phần mềm chơi cờ Hexxagon.  Về cờ Hexxagon Hexxagon là một biến thể của Ataxx, được chơi trên bàn cờ hình lục giác thay vì hình vuông của Ataxx. Bản chính thức được viết bởi Argo Games vào năm 1992. Năm 1993 nó được phát hành dưới dạng PC Game bởi công ty Software Creations, luật chơi vẫn được giữ như của Ataxx. Hiện nay nó được phát triển và cập nhật trên web bởi Neave. http://www.neave.com/games/hexxagon/ II. MÔ TẢ BÀI TOÁN 1. Mục đích:  Tạo ra một trò chơi đối kháng giữa hai đối thủ máy tính và con người. 2. Yêu cầu:  Đưa ra thuật toán giúp giải quyết bài toán đặt ra: Sao cho khả năng để máy tính thắng là lớn nhất.  Hoàn thiện chương trình, đồng thời tối ưu hoá thuật toán đưa ra sao cho chương trình làm việc hiệu quả.  Khắc phục lỗi phát sinh trong quá trình giải quyết bài toán. 3. Cách thức chơi:  Ban đầu mỗi bên có 3 quân khác màu được bố trí xen kẽ tại sáu đỉnh của bàn cờ hình lục giác.  Máy sẽ được đi nước đầu tiên, sau đó thay phiên nhau đi các nước.  Ở mỗi lần đi nếu di chuyển trong 1 ô quân đó sẽ được nhân đôi, nếu di chuyển 2 ô quân đó sẽ thực hiện nhảy mà ko nhân đôi.  Sau khi đi tất cả quân của đối phương bên cạnh mà cách 1 ô sẽ biến thành quân cùng màu với nó. - 5 -  Ở mỗi nước đi tác tử máy luôn chọn nước đi tốt nhất có thể đó là ăn được nhiều quân của đối phương nhất và để các nước đi tiếp theo đối phương ăn được ít quân nhất của nó nhất.  Khi bàn cờ đầy bên nào có nhiều quân trên bàn cờ hơn thì thắng hoặc khi một bên nào đó không còn nước đi thì các ô trống còn lại trên bàn cờ sẽ thuộc về đối phương, trò chơi kết thúc và so sánh số quân hai bên để tìm người thắng. - 6 - CHƯƠNG II. PHƯƠNG PHÁP GIẢI QUYẾT BÀI TOÁN Đây là một chò trơi đối kháng hai tác tử, thuật giải hiều quả để giải quyết bài toán là các thuật giải tìm kiếm thông minh Minimax/Maximin. Với yêu cầu là một PC game nên thuật toán cần phải có thời gian thực hiện trong khoảng thời gian chấp nhận được đối với gamer, nhưng với bàn cờ này khi độ sâu của cây tìm kiếm là 5 thì số lượng nút cần xét có thể lên đến 3-4 triệu nút, thời gian chạy của máy tính có thể lên đến hàng phút. Vậy nên để được kết quả hiệu quả hơn thì cài đặt thuật toán cải tiến AlphaBetaPrunning là điều bắt buộc. Chi tiết về phương pháp: I. GAME TREE (CÂY BIỂU DIỄN TRÒ CHƠI) Xem xét vấn đề thực hiện một chương trình máy tính để chơi một trò chơi. Để đơn giản hoá, chúng ta chỉ xem xét trò chơi với hai thuộc tính sau:  Trò chơi đối kháng với hai người chơi.  Chỉ có một người thắng duy nhất, còn người chơi còn lại là người thua, không có bất cứ sự hợp tác nào giữa hai người chơi. Các loại trò chơi này thường có các bàn cờ cổ điển, như cờ caro (tic tac toe), cờ vua (chess), cờ tướng (checkers),… Với loại trò chơi này, chúng ta có thể mô hình hoá chúng bằng cách sử dụng cây biểu diễn trò chơi (game tree). Trên đây là một phần cây biểu diễn trò chơi của trò cờ caro (tic tac toe). Mỗi nút đại diện cho một trạng thái của bàn cờ và các con của mỗi nút là các trạng thái hợp lệ khi thực hiện nước đi tiếp theo. Để điểm từng trạng thái, chúng ta sẽ gán cho mỗi trạng thái là thuận lợi với người chơi thứ nhất một số dương (càng dương thì càng thuận lợi). Tương tự, chúng ta sẽ gán cho mỗi trạng thái đó - 7 - là thuận lợi đối với người chơi thứ hai một số âm (càng âm thì càng thuận lợi). Trong thí dụ này, người chơi thứ nhất đánh dấu “X”, còn người chơi thứ hai đánh dấu “O”, và chỉ với ba điểm (-1, 0, +1), chúng ta sẽ có +1 cho chiến thắng của “X”, -1 cho chiến thắng của “O”, và 0 nếu không ai thắng (hoà). Lưu ý ở đây, các điểm màu xanh chỉ có thể được gán cho trạng thái hiện tại. Để tính điểm cho các vị trí khác, chúng ta phải quan sát các trạng thái nút con của nó, và chúng ta sẽ sử dụng thuật toán dưới đây: II. THUẬT TOÁN MINIMAX Bây giờ, chúng ta có một cách để diễn tả trò chơi trong chương trình của chúng ta, làm thế nào để có thể tính toán được nước đi tối ưu? Giả định rằng đối thủ luôn có thể tính toán được nước đi như chúng ta, và đối thủ sẽ luôn chọn nước đi tối ưu nhất. (Tương phản với điều này, ví dụ như, người chơi đầu tiên sẽ tạo ra một cái bẫy với hy vọng rằng đối thủ sẽ mắc bẫy và giành được chiến thắng một cách nhanh chóng. Tuy nhiên, nếu đối thủ không mắc bẫy, người chơi này sẽ nhận thấy rằng vị trí của mình hiện đang bị giảm sút). Một thuật toán để tính toán nước đi tốt nhất là thuật toán Minimax: Thuật toán này sẽ diễn ra trong bao lâu? Với các trò chơi phức tạp như Cờ vua hay Cờ vây thì để tìm kiếm lời giải đến khi kết thúc trò chơi sẽ phải trả một giá rất đắt về thời gian. Trên thực tế, nếu làm như vậy đối với Cờ vua, trong thời gian để phân tích một nước đi đó có lẽ mặt trời và trái đất cũng không còn tồn tại. Tuy nhiên, có một cách tối ưu hoá để cho thuật toán đơn giản ở trên tiết kiệm rất nhiều việc tìm kiếm và cho phép chúng ta tăng tối đa độ sâu tìm kiếm. Thuật toán tối ưu hoá đựa trên Minimax đó là AlphaBetaPrunning. III. THUẬT TOÁN AlphaBetaPrunning Với các trò chơi cờ đối kháng như trên, ý tưởng về cơ bản được thể hiện như sau: giả sử đến lượt chúng ta đi nước cờ của mình và chúng ta tính được nước đi A cho chúng ta một lợi thế lớn. Bây giờ chúng ta tính đến một nước đi B và thấy rằng nước đi đáp trả đầu tiên của đối thủ chúng ta đoán trước đối thủ có thể ép chúng ta về thế hoà! Vậy thì chúng ta cần gì phải xét đến nước đi B này nữa, bởi ở thời điểm này ta biết rằng nếu ta đi nước B thì kết quả tốt nhất mà ta đạt được chỉ là một nước đi hoà cho cả hai và chúng ta lại đã biết nước đi A sẽ cho ta lợi thế hơn nếu chúng ta đi nước đó. minimax(player, board) if(game over in current board position) return winner children = all legal moves for player from this board if(max's turn) return maximal score of calling minimax on all the children else (min's turn) return minimal score of calling minimax on all the children - 8 - Để hình thức hoá ý tưởng, chúng ta sẽ theo dõi hai con số, alpha và beta cho mỗi nước đi mà chúng ta phân tích. Alpha sẽ là giá trị của nước đi tốt nhất có thể mà chúng ta đi được chúng ta tính toán xa nhất có thể (tức là số nước đi của hai bên xa nhất mà ta tính được). Beta là giá trị của nước đi tốt nhất có thể của đối thủ mà chúng ta tính được xa nhất có thể. Nếu một lúc nào đó alpha >= beta thì nước đi tốt nhất của đối thủ có thể ép chúng ta vào thế tồi hơn là nước đi tốt nhất của chúng ta lúc đó, do đó ta không cần phải phân tích xa hơn nước đi đó nữa. Điều kiện cắt tỉa cũng được áp dụng tương tự nếu chúng ta là người chơi ở vị trí min, nhưng thay vì tìm nước đi lợi cho alpha thì ta tìm nước đi lợi cho beta. Sau đây là thuật toán thực hiện alpha beta cắt tỉa. ( http://www.ocf.berkeley.edu/~yosenl/extras/alphabeta/alphabeta.html) Dựa trên thuật toán này nhóm em đã thực hiện thuật toán trên bàn cờ của mình như sau: //AlphaBetaPrunning Algorithm alpha-beta(player, board, alpha, beta) if(game over in current board position) return winner children = all legal moves for player from this board if(max's turn) for each child score = alpha-beta(other player,child,alpha,beta) if score > alpha then alpha = score (we have found a better best move) if alpha >= beta then return alpha (cut off) return alpha (this is our best move) else (min's turn) for each child score = alpha-beta(other player,child,alpha,beta) if score < beta then beta = score (opponent has found a better worse move) if alpha >= beta then return beta (cut off) return beta (this is the opponent's best move) - 9 - public int alphaBetaPrunning(GameBoard currentBoard, int depth, int alpha, int beta, boolean returnBestMove) { if (currentBoard.isEndGame() || depth == 0) { return evaluate(currentBoard); } ArrayList<Move> validMoves = currentBoard .getAllValidMoves(currentBoard.getCurrentPlayer()); if (returnBestMove) { prunned = 0; call = 0; this.bMove = null; if (validMoves.size() > 0) { this.bMove = validMoves.get(0); } } if (call >= 1000000){ return evaluate(currentBoard); } if (currentBoard.getCurrentPlayer() == Piece.COMPUTER) { for (int i = 0; i < validMoves.size(); i++) { GameBoard copy = currentBoard.copyBoard(); Move move = validMoves.get(i); copy.move(move.getPFrom(), move.getPTo()); copy.setCurrentPlayer(Piece.HUMAN); call++; int score = alphaBetaPrunning(copy, depth - 1, alpha, beta, false); if (score > alpha) { alpha = score; if (returnBestMove) { this.bMove = move; } } if (alpha >= beta) { prunned++; return alpha; } } return alpha; } else { for (int i = 0; i < validMoves.size(); i++) { GameBoard copy = currentBoard.copyBoard(); Move move = validMoves.get(i); copy.move(move.getPFrom(), move.getPTo()); copy.setCurrentPlayer(Piece.COMPUTER); call++; int score = alphaBetaPrunning(copy, depth - 1, alpha, beta, false); copy.setCurrentPlayer(Piece.HUMAN); - 10 - Hàm alphaBetaPrunning trả về 1 giá trị là số nguyên, có 5 tham số đầu vào:  currentBoard: Trạng thái hiện tại của bàn cờ.  Độ sâu tìm kiếm: (int depth) được chọn = 3.  Giá trị alpha: (int alpha) giá trị của nước đi tốt nhất đối với máy.  Giá trị beta: (int beta) giá trị của nước đi tốt nhất đối với người.  Boolean returnBestMove: dùng để chặn không cho các lần gọi alphabetaPrunning ghi đè giá trị bestMove, nên ở lần gọi đầu tiên giá trị của nó là true nhưng trong các lần gọi đệ quy, giá trị của nó là false  Với trạng thái bàn cờ hiện tại copy ra 1 bàn cờ khác, lấy ra 1 mảng bao gồm tất cả các nước đi hợp lệ đối với người chơi hiện tại, với từng nước đi thực hiện di chuyển nó trên bàn cờ copy, cập nhật trạng thái mới của bàn cờ, đánh giá giá trị của bàn cờ mới bằng cách gọi hàm alphaBetaPrunning với độ sâu giảm đi 1.  Nếu là nước đi của máy, nó sẽ luôn chọn giá trị ứng với alphaBetaPrunning là lớn nhất, ngược lại người sẽ chọn ứng với giá trị nhỏ nhất.  Kiểm tra nếu alpha >= beta thì nhánh tìm kiếm đó được cắt đi.  Hàm đánh giá trạng thái bàn cờ (int evaluate(board)) trả lại giá trị của bàn cờ đối với một người chơi (người hoặc máy): Số quân của máy * Số quân của máy - Số quân của người * Số quân của người if (score < beta) { beta = score; } if (alpha >= beta) { prunned++; return beta; } } return beta; } } [...]... Máy được đi trước (do yêu cầu chơi với chương trình chơi cờ khác) Cách chơi Để đi quân cờ nào ta kích chuột vào quân cờ đó, khi đó trên bàn cờ sẽ hiển thị các ô cờ có viền (được phép đi): Viền màu xanh: Nếu đi vào các ô cờ có viền màu xanh thì quân cờ sẽ được nhân đôi, tức ngoài quân cờ ở vị trí ô cờ cũ, ta được thêm một quân cờ ở vị trí ô cờ mới đi (Số lượng các quân cờ của ta tăng thêm 1) - 12 -... trí quân cờ) Toạ độ con trỏ (screen) Vị trí của con trỏ trên bàn cờ (index) Thời gian (timer) Để vào chơi ta nhấn phím cách (space) - 11 - Khi bắt đầu trò chơi Mỗi bên (máy – người) sẽ có ba quân cờ được bố trí sole đối xứng như hình dưới Máy có quân cờ màu caro trắng-đỏ Người có quân cờ màu xanh Trên cùng bên trái hiển thị số quân cờ của người chơi (You) Trên cùng bên phải hiển thị số quân cờ của máy... sẵn J2SE 1.4 trở lên Chạy trực tiếp bằng file Hexxagon. jar trong thư mục AIHexxagon \Hexxagon\ src\dist Game hexxagon có giao diện khá đơn giản Bàn cờ gồm các ô cờ màu tím Mỗi một ô cờ là một hình lục giác (hexagon) Hai góc trên thể hiện số quân cờ đang có của mỗi bên Góc dưới bên trái thể hiện việc trỏ chuột của người chơi, thông báo đến lượt đi của người chơi hay của máy tính Góc phía dưới bên phải... - Viền màu vàng: Nếu đi vào các ô cờ có viền màu vàng thì quân cờ sẽ được di chuyển tới ô cờ đó (số lượng các quân cờ của ta vẫn được giữ nguyên) Với mỗi nước đi, tất cả các quân cờ của đối phương nằm ngay cạnh nước đi đó sẽ bị “ăn”, tức sẽ chuyển màu và biến thành quân cờ của mình Game over! Lượt đi của người và máy xen kẽ nhau, cứ thế ta đi hết bàn cờ Khi các ô cờ đã kín hoặc một bên không thể đi... máy tính ăn được quân của người chơi nhưng trên bàn cờ cũng như trong bộ nhớ lưu trữ bàn cờ không thể hiện điều này 4 Phương thức evaluate hoạt động không được hiệu quả khi đánh giá bàn cờ đối với mỗi nước đi của người chơi nên thỉnh thoảng còn có những nước đi bằng mắt thường có thể nhận xét là chưa được tốt (thấy rõ khi để depth = 4 và cho hai bên đều là máy chơi cờ với nhau) Hướng giải quyết: 1... >= beta 2 Về giao diện chương trình o Viết thêm các thành phần thể hiện sự di chuyển của các quân cờ giống như trong trò chơi của Neave o Cải tiến đồ hoạ, có thể là cài đặt trên openGL để hình ảnh được đẹp hơn, thiết kế lại hình dạng quân cờ 3 Về các chức năng chương trình o Viết thêm menu chọn độ khó cho trò chơi o Thêm chức năng chọn chế độ chơi Người - Người, Máy - Máy - 16 - CHƯƠNG V KẾT QUẢ Chương... động khá tốt, không gặp lỗi trong quá trình sử dụng, máy tính khá thông minh, nếu ai mới chơi cờ này thì chỉ có thể chơi với độ sâu tìm kiếm bằng 1, để chơi với độ khó cao hơn (độ sâu tìm kiếm từ 3 trở lên) và thắng được máy là một điều khá khó khăn Khi cho chương trình này chơi với các chương trình trên web khác nó đều có thể dễ dàng thắng các chương trình trên web đó Chương trình đã hoạt động thành... engine for 2D games JGame là một công cụ mã nguồn mở dùng để xây dựng trò chơi 2D (Game engine), có thể chạy trên mọi nền tảng Java 1.2 + JRE, cũng như J2ME Nó cung cấp một framwork bậc cao cho phép phát triển các trò chơi arcade loại “cổ điển” Các trò chơi có sử dụng JGame có thể chạy bằng rất nhiều cách mà không yêu cầu bất kỳ thay đổi nào trong các mã:... như hàm evalute cũ III LỖI VÀ HẠN CHẾ CỦA CHƯƠNG TRÌNH Hiện tại khi chạy chương trình vẫn chưa phát hiện lỗi Hạn chế: Phần đồ hoạ biểu diễn bàn cờ chưa được dễ theo dõi cho lắm do ko thể hiện rõ ràng nước đi của máy nên người chơi khó đoán biết máy đã đi như thế nào Giải quyết: Viết thêm phần hiển thị đánh dấu quân đã đi của máy IV HƯỚNG PHÁT TRIỂN CỦA BÀI TOÁN 1 Về thuật toán AI sử dụng o Để có thể cắt... do đã bị đối phương vây kín thì trò chơi kết thúc Khi đó bên nào có số quân cờ chiếm đa số (nhiều hơn đối phương) thì giành chiến thắng - 13 - Vì giải thuật có độ sâu tìm kiếm lớn nên bạn rất khó có thể thắng được máy Và đây là kết cục… - 14 - CHƯƠNG IV CÁC VẤN ĐỀ GẶP PHẢI VÀ HƯỚNG GIẢI QUYẾT I GIAO DIỆN CHƯƠNG TRÌNH Khó khăn: Vì chưa có kinh nghiệm lập trình trò chơi do đó lúc đầu nhóm em chưa tìm

Ngày đăng: 15/08/2015, 12:28

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w