Báo cáo môn học xây dựng trò chơi bằng ngôn ngữ Java có kèm source code. Trong báo cáo có trình bày chi tiết giải thuật sinh ô số Sudoku với các trường hợp khác nhau, giải thuật kiểm tra Sudoku,... Chúc các bạn học tốt.
TRƯờNG ĐạI HọC BáCH KHOA Hà NộI VIệN CÔNG NGHệ THÔNG TIN Và TRUYềN THÔNG BO CO MễN PROJECT §Ị TµI: XÂY DỰNG CHƢƠNG TRÌNH SUDOKU Giảng viên hướng dẫn: Sinh viên thực hiện: Lớp: MSSV: Vũ Thị Hương Giang Nguyễn Việt Anh KSTN CNTT K57 20121227 Hà Nội, 12-2014 Xây dựng chương trình trị chơi Sudoku Mục lục: Lời nói đầu Tổng quan vấn đề liên quan: A Tổng quan toán: I Yêu cầu chƣơng trình: Chức chƣơng trình: Lập trình Java: II Phân tích thuật tốn sử dụng chƣơng trình: B Thuật toán kiểm tra Sudoku 9x9: Thuật toán sinh Sudoku 9x9: Thuật toán tự động giải Sudoku 9x9: Thiết kế chi tiết chƣơng trình: C Thiết kế liệu chƣơng trình: Gói models: Gói views: Gói Controller: 10 Giao diện chƣơng trình: 10 D Giới thiệu giao diện chƣơng trình: 10 I Chi tiết hoạt động chƣơng trình: 12 II New Game: 12 PauseGame: 13 TestGame: 13 Save Game: 14 Load Game: 14 Button Check: 15 Button Solve: 15 Button Clear: 15 Button Undo Redo: 15 10 Hint: 16 Kết luận đánh giá: 16 E Kết đạt đƣợc: 16 Đánh giá việc hoàn thành yêu cầu: 16 Hạn chế: 17 Kết luận: 17 Nguyễn Việt Anh – KSTN CNTT K57 Page Xây dựng chương trình trị chơi Sudoku Tài liệu tham khảo: 18 Nguyễn Việt Anh – KSTN CNTT K57 Page Xây dựng chương trình trị chơi Sudoku Lời nói đầu Project mơn giúp sinh viên bắt đầu làm quen với việc lập trình tạo sản phẩm theo yêu cầu Với môn học giúp sinh viên rèn luyện kỹ làm việc độc lập, kỹ phân tích thiết kế chương trình, kỹ lập trình hướng đối tượng, kỹ tìm hiểu tài liệu để hồn thành u cầu đề Với đề tài viết chương trình trị chơi Sudoku giúp em hoàn thiện thêm kỹ kể Do làm quen với lập trình hướng đối tượng nên chương trình viết cịn nhiều hạn chế Em mong cô đánh giá rút học kinh nghiệm để em hồn thiện thêm kiến thức kỹ Em xin chân thành cảm ơn cô Nguyễn Việt Anh – KSTN CNTT K57 Page Xây dựng chương trình trò chơi Sudoku A Tổng quan vấn đề liên quan: I Tổng quan toán: Yêu cầu chƣơng trình: Xây dựng chương trình trị chơi Sudoku 9x9 Sử dụng mơ hình MVC Hệ thống túy hướng đối tượng Chức chƣơng trình: - - - Trò chơi cung cấp cho người chơi chức bản: Tự động sinh ô số sudoku với mức độ khó/dễ khác nhau: mức độ dễ 35/81 có sẵn giá trị Mức độ trung bình: 27/81 có sẵn giá trị Chỉ rõ phương pháp đánh giá mức độ khó dễ sử dụng chương trình (phụ thuộc nhiều tham số: số lượng số có sẵn, phân bố ơ, …) Tổ chức lưu trữ thông tin ô số cho chức tạm dừng / tiếp tục (save/load) Xây dựng chức undo/redo trình chơi Trong trình người chơi giải số chương trình có chức hỗ trợ: loại bỏ số không phù hợp ô thay đổi sau bước chơi, kiểm tra xem người dùng nhập có xác,… Xây dựng chức cho người dùng tự nhập ô số chương trình tính tốn để đưa tất đáp án Thiết kế giao diện đồ họa cho trò chơi II - - Lập trình Java: Các kỹ viết lớp, tạo đối tượng Java Các kỹ lập trình giao diện Java: xử lý JTextField, xử lý kiện với JButton, JMenu, JPopupMenu, xử lý kiện với chuột xử lý kiện nhập từ bàn phím Tạo stack ArrayList có sẵn Java Nguyễn Việt Anh – KSTN CNTT K57 Page Xây dựng chương trình trị chơi Sudoku B Phân tích thuật tốn sử dụng chƣơng trình: Thuật tốn kiểm tra Sudoku 9x9: - - Một Sudoku 9x9 giải ta kiểm tra hàng, cột, khối chứa 3x3 ô điền đầy số từ đến Đầu vào thuật toán mảng 9x9 chứa Sudoku Đầu true mảng tuân theo luật Sudoku, false không Ý tưởng ta đưa vào xâu A=“123456789” kiểm tra theo hàng cột khối 3x3, lần ta kiểm tra ô lấy giá trị xóa bỏ giá trị xâu, qua lần xóa xâu đầu có giá trị độ dài có nghĩa hàng(cột khối 3x3 giải đúng) ngược lại sai Ta xây dựng ba hàm để kiểm tra theo hàng theo cột theo khối 3x3 Thuật toán sinh Sudoku 9x9: Đầu vào : mảng ô số Sudoku 9x9 giải Đầu : mảng ô số Sudoku 9x9 sinh với mức độ : mức độ dễ có 35 điền, mức độ khó có 27 điền, cịn lại khác gán giá trị - Thuật toán bao gồm bước sau: + Tráo đổi ngẫu nhiên các ô theo hàng cột tráo đổi khối 3x3 với để tạo ngẫu nhiên + Chọn ngẫu nhiên ô theo yêu cầu đề mức độ dễ hay khó 2.1 Phân tích thuật tốn: 2.1.1 Tráo đổi ngẫu nhiên ơ: - Việc tráo đổi ngẫu nhiên hàng cột tráo đổi khối 3x3 với - Việc tráo đổi giúp sinh ô số Sudoku giải khác với ô số Sudoku đầu vào - Khi tráo đổi theo hàng ta chia mảng Sudoku làm cụm gồm hàng đầu, hàng hàng cuối Việc tráo đổi theo hàng thực cụm Ta chọn ngẫu nhiên hàng hàng cụm hốn đổi số tương ứng hai hàng với Việc chương trình thực lần cụm Việc thực đảm bảo khơng tính khối 3x3 ô Nếu ta không chia tạo ô số Sudoku sai - Việc tráo đổi theo hàng thực tương tự - Khi tráo đối theo khối ta chia làm cụm chứa sau tráo đổi theo hàng theo cột dựa theo nguyên tắc sau: hàng(cột) thứ i cụm tráo đổi cho hàng(cột) thứ i cụm Việc chọn cụm để tráo đổi cách ngẫu nhiên sử dụng random java - Như với cách thức thực ta tạo mảng ô số Sudoku giải khác hoàn toàn so với mảng nhập ban đầu 2.1.2 Chọn ngẫu nhiên số theo yêu cầu: - Với đề đặt tạo ô số Sudoku với mức độ dễ, khó có ngẫu nhiên lựa chọn ngẫu nhiên người chơi số tối thiểu cần có khối 3x3 việc random ngẫu nhiên để chọn khác - Nguyễn Việt Anh – KSTN CNTT K57 Page Xây dựng chương trình trị chơi Sudoku Với ngẫu nhiên chọn ta việc random 81 ô số kiểm tra xem có bị trùng với số đằng trước không - Với việc lựa chọn số ô tối thiểu khối 3x3 ta chia Sudoku 9x9 làm khối lựa chọn ô tối thiểu theo định, số cịn lại sinh theo kiểu random 81 ô lại kiểm tra xem có bị trùng với số lấy trước khơng 2.2 Đánh giá: Do chưa tối ưu nên thuật tốn cịn chậm cụ thể không loại bỏ ô chọn trước để tiến hành việc lựa chọn cho - Thuật toán tự động giải Sudoku 9x9: - Đầu vào : mảng ô số Sudoku chưa giải Đầu ra: mảng ô số Sudoku giải Thuật toán xây dựng dựa nguyên lý vét cạn thuật toán quay lui Mã giả thuật tốn: a[][] mảng chiều số Sudoku nhập vào Function Try(k): while(a[k/n][k%n]!=0) k++; // bỏ qua số đề row=k/n; column=k%n; for(value=1; value=0; row ) for(column=8; column>=0; column ) if(a[row][column]==0) then lastk=row*9+column; endif endfor endfor - Đánh giá thuật toán: thuật toán nêu chưa tối ưu việc lựa chọn ô mà phải kiểm tra xem số từ đến có phù hợp để điền vào C Thiết kế chi tiết chƣơng trình: Thiết kế liệu chƣơng trình: - Để lưu trữ liệu Sudoku ta sử dụng mảng hai chiều 9x9 Nguyễn Việt Anh – KSTN CNTT K57 Page Xây dựng chương trình trị chơi Sudoku - Để sử dụng stack ta sử dụng ArrayList Java(giống với danh sách liên kết) Việc lưu trữ SaveGame lưu trữ thành mảng 9x9 file txt Gói models: - Trong gói chứa Class Cell, Sudoku, GenerateSudoku, PopupMenu Class Cell: tạo đối tượng ô 81 ô Class Sudoku : nơi lưu trữ thông tin Sudoku 9x9, giải thuật kiểm tra, tự động giải Sudoku Class GenerateSudoku: thuật tốn sinh Sudoku Gói views: Nguyễn Việt Anh – KSTN CNTT K57 Page Xây dựng chương trình trị chơi Sudoku - Class SudokuGUI: giao diện chương trình Class HelpPanel: chứa button Undo Redo Class CommandPanel: chứa button chức Clear, Solve Check Class GameMenu: chứa menu lựa chọn NewGame, SaveGame, LoadGame, PauseGame, TestGame Class SudokuPanel: chứa 81 đối tượng cell Nguyễn Việt Anh – KSTN CNTT K57 Page Xây dựng chương trình trị chơi Sudoku Gói Controller: - Class ActionButton: bắt kiện thực Clink vào Button Class ActionGameMenu: bắt kiện chọn vào menu chương trình Class ActionMouse: bắt kiện thực chuột Class ActionKey : bắt kiện thực nhập từ bàn phím D Giao diện chƣơng trình: I Giới thiệu giao diện chƣơng trình: Chương trình có giao diện sau: Nguyễn Việt Anh – KSTN CNTT K57 Page 10 Xây dựng chương trình trị chơi Sudoku Giao diện chương trình chia làm phần: phần đầu menu chương trình, phần số Sudoku, phần phía Button Phần Menu bao gồm: - NewGame: tạo Game với lựa chọn dễ khó Easy Gaame hay - Difficult Game PauseGame: tạm dừng chương trình TestGame: kiểm tra xem Sudoku giải chưa SaveGame: lưu game chơi dở LoadGame: tải lại game lưu Phần Button bao gồm Button với chức sau: - Check: kiểm tra xem nhập vào có hợp lệ hợp lệ giữ ngun khơng hợp - lệ tự động loại bỏ Solve: tính tự động giải Sudoku Clear: xóa tất hình Undo: chức quay lại bước vừa nhập Redo: chức quay lại ngược với Undo Ngồi cịn có thêm Frame mơ đồng hồ dùng để tính thời gian game Nguyễn Việt Anh – KSTN CNTT K57 Page 11 Xây dựng chương trình trị chơi Sudoku II Chi tiết hoạt động chƣơng trình: New Game: - - Với chức có lựa chọn : Easy Game Difficult Game Trong chức có phần lựa chọn số tối thiểu cho khối 3x3 Khi lên thơng báo sau: - Như có lựa chọn cho người chơi 1, 2, 3, random Khi chọn ramdom sinh ô số Sudoku ngẫu nhiên mà khối 3x3 khơng u cầu phải có có sẵn Giả sử ta tạo số Sudoku dạng khó sau: - Khi chọn số ô tối thiểu khối 3x3 1, 2, chương trình sinh số Sudoku mà khối 3x3 có tối thiểu 1, 2, có sẵn.Giả sử ta chọn dạng khó để so sánh với hình Nguyễn Việt Anh – KSTN CNTT K57 Page 12 Xây dựng chương trình trị chơi Sudoku PauseGame: - Với chức người dùng chọn PauseGame thơng báo chương trình tạm dừng nhấn OK tiếp tục lại - Khi chức kích hoạt đồng nghĩa với việc thời gian game tạm dừng nhấn OK thời giant rong game tiếp tục hoạt động TestGame: - Chức dùng để kiểm tra xem bạn giải ô số Sudoku chưa giải thông báo: - Khi giải Sudoku đồng hồ game dừng lại Nếu giải sai chưa giải xong thơng báo: Nguyễn Việt Anh – KSTN CNTT K57 Page 13 Xây dựng chương trình trị chơi Sudoku Save Game: - Sau chọn SaveGame thơng báo giúp người chơi lựa chọn vào vùng liệu muốn lưu: - Hiện chương trình cung cấp cho người chơi vùng để lưu trữ tạm thời Khi lựa chọn vùng muốn lưu vùng có liệu có thơng báo: - Thơng báo có nghĩa người chơi có muốn ghi đè lên vùng có liệu khơng Nếu chọn OK chương trình tiến hành lưu liệu vào phần vùng đó, chọn cancel thơng báo giúp người chơi chọn lại phần vùng muốn lưu Khi lưu thành cơng có thơng báo sau: Load Game: - Khi chọn Load Game thông báo chọn vùng liệu muốn load: Nguyễn Việt Anh – KSTN CNTT K57 Page 14 Xây dựng chương trình trị chơi Sudoku - Chọn vùng liệu muốn load, chưa có liệu lên thơng báo: - Nếu vùng có liệu load lên hình, có thơng báo hiển thị: Button Check: Khi lựa chọn Check chương trình kiểm tra xem dùng nhập vào có hợp lệ hay khơng, khơng hợp lệ loại bỏ Để thực điều số có xâu Hint gợi ý nhập vào trừ ô đề bài, sau lần nhập chương trình loại bỏ gợi ý cho ô khác hàng, cột nằm khối 3x3 Nếu ô nhập vào nằm ô gợi ý giữ lại khơng loại bỏ Button Solve: Khi chọn Solve chương trình tự động giải đáp án số Sudoku hồn chỉnh lên hình đáp án Button Clear: Khi chọn Clear chương trình xóa hết số Button Undo Redo: - - Việc xây dựng chức undo redo xây dựng dựa cấu trúc liệu ngăn xếp( ngăn xếp cấu trúc liệu mà phần tử đẩy vào đẩy cuối cùng, cịn phần tử đẩy vào cuối đẩy Trong ngăn xếp cài đặt dạng ArrayList Java ArrayList có dạng danh sách liên kết, ta đẩy phần tử sử dụng hàm remove(*.size()-1); size hàm tính độ dài danh sách liên kết hàm Nguyễn Việt Anh – KSTN CNTT K57 Page 15 Xây dựng chương trình trị chơi Sudoku remove loại bỏ phần tử thứ i, loại bỏ phần tử đuôi Do sử dụng kiểu nên số lần lưu trữ không giới hạn 10.Hint: - Chức nhằm gợi ý cho người chơi cho việc nhập vào Ví dụ sau: E Kết luận đánh giá: Kết đạt đƣợc: - Xây dựng chương trình hồn chỉnh Hồn thiện kỹ lập trình hướng đối tượng Java, kỹ lập trình giao diện với Java Swing Kỹ đọc tìm tài liệu mạng Đánh giá việc hoàn thành yêu cầu: Nguyễn Việt Anh – KSTN CNTT K57 Page 16 Xây dựng chương trình trị chơi Sudoku u cầu Tạo game Sudoku với mức độ dễ khó có lựa chọn nhẫu nhiên không ngẫu nhiên Đã kiểm thử với trường hợp 0, 1, 2, 3, random Tổ chức lưu trữ thông tin ô số cho chức tạm dừng (tiếp tục), save(load) Xây dựng chức undo redo Xây dựng chức tự động loại bỏ số cho chương trình Xây dựng chức gợi ý cho người chơi Xây dựng chức tự động giải Sudoku Chương trình có giao diện đồ họa - Đánh giá mức độ hoàn thành(%) 100% 50% 50% 100% 100% 70% 100% Hạn chế: Chưa tối ưu thuật tốn chương trình Giao diện chương trình cịn đơn giản Vẫn cịn tồn đọng nhiều vấn đề cần giải việc xử lý chức Undo Redo chương trình Kết luận: Sau tập này, điều mà em thu kinh nghiệm lập trình Java Hiểu tầm quan trọng việc tự tìm đọc tài liệu Do lần đầu có sản phẩm hồn chỉnh nên nhiều khiếm khuyết Một lần nữa, em xin cảm ơn cô hướng dẫn em thời gian vừa qua để giúp em hoàn thành tập lớn Nguyễn Việt Anh – KSTN CNTT K57 Page 17 Xây dựng chương trình trị chơi Sudoku Tài liệu tham khảo: Programing Sudoku – WeiMengLee Java Swing 2nd – O.Relly Thinking in Java Tài liệu mạng internet Nguyễn Việt Anh – KSTN CNTT K57 Page 18 ... (tiếp tục), save(load) Xây dựng chức undo redo Xây dựng chức tự động loại bỏ số cho chương trình Xây dựng chức gợi ý cho người chơi Xây dựng chức tự động giải Sudoku Chương trình có giao diện đồ... Việt Anh – KSTN CNTT K57 Page Xây dựng chương trình trị chơi Sudoku A Tổng quan vấn đề liên quan: I Tổng quan toán: Yêu cầu chƣơng trình: Xây dựng chương trình trị chơi Sudoku 9x9 Sử dụng mơ hình... Anh – KSTN CNTT K57 Page Xây dựng chương trình trị chơi Sudoku Tài liệu tham khảo: 18 Nguyễn Việt Anh – KSTN CNTT K57 Page Xây dựng chương trình trị chơi Sudoku Lời nói đầu Project