1. Trang chủ
  2. » Công Nghệ Thông Tin

Xây dựng chương trình trò chơi Sudoku bằng ngôn ngữ Java

18 865 11
Tài liệu đã được kiểm tra trùng lặp

Đ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 18
Dung lượng 693,92 KB
File đính kèm src_sudoku_java.rar (164 KB)

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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.

Trang 1

VIÖN C¤NG NGHÖ TH¤NG TIN Vµ TRUYÒN TH¤NG

BÁO CÁO MÔN PROJECT 1

§Ò TµI: XÂY DỰNG CHƯƠNG TRÌNH SUDOKU

Hà Nội, 12-2014

Trang 2

Mục lục:

Lời nói đầu 4

A Tổng quan về các vấn đề liên quan: 5

I Tổng quan về bài toán: 5

1 Yêu cầu chương trình: 5

2 Chức năng của chương trình: 5

II Lập trình trong Java: 5

B Phân tích thuật toán sử dụng trong chương trình: 6

1 Thuật toán kiểm tra Sudoku 9x9: 6

2 Thuật toán sinh Sudoku 9x9: 6

3 Thuật toán tự động giải Sudoku 9x9: 7

C Thiết kế chi tiết chương trình: 7

1 Thiết kế dữ liệu của chương trình: 7

2 Gói models: 8

3 Gói views: 8

4 Gói Controller: 10

D Giao diện của chương trình: 10

I Giới thiệu về giao diện chương trình: 10

II Chi tiết về hoạt động của chương trình: 12

1 New Game: 12

2 PauseGame: 13

3 TestGame: 13

4 Save Game: 14

5 Load Game: 14

6 Button Check: 15

7 Button Solve: 15

8 Button Clear: 15

9 Button Undo và Redo: 15

10 Hint: 16

E Kết luận và đánh giá: 16

1 Kết quả đạt được: 16

2 Đánh giá việc hoàn thành các yêu cầu: 16

3 Hạn chế: 17

4 Kết luận: 17

Trang 3

Tài liệu tham khảo: 18

Trang 4

Lời nói đầu

Project 1 là một môn giúp sinh viên bắt đầu làm quen với việc lập trình tạo ra sản phẩm theo yêu cầu Với môn học này giúp sinh viên rèn luyện được kỹ năng làm việc độc lập, kỹ năng phân tích thiết kế chương trình, kỹ năng lập trình hướng đối tượng, kỹ năng tìm hiểu các tài liệu để có thể hoàn thành yêu cầu đề ra Với đề tài là viết chương trình trò chơi Sudoku giúp em hoàn thiện thêm được các kỹ năng kể trên Do mới làm quen với lập trình hướng đối tượng nên chương trình viết ra còn nhiều hạn chế Em mong cô sẽ đánh giá và rút ra những bài học kinh nghiệm để em có thể hoàn thiện thêm kiến thức và kỹ năng của mình Em xin chân thành cảm ơn cô

Trang 5

A Tổng quan về các vấn đề liên quan:

I Tổng quan về bài toán:

1 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 thuần túy là hướng đối tượng

2 Chức năng của chương trình:

Trò chơi cung cấp cho người chơi các chức năng cơ bản:

- Tự động sinh ô số sudoku với các mức độ khó/dễ khác nhau: mức độ dễ nhất 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 trong chương trình (phụ thuộc nhiều tham số: số lượng các số có sẵn, phân bố các ô, …)

- Tổ chức lưu trữ thông tin của các ô số cho chức năng tạm dừng / tiếp tục

(save/load)

- Xây dựng chức năng undo/redo trong quá trình chơi

- Trong quá trình người chơi giải ô số chương trình có chức năng hỗ trợ: loại bỏ các

số không phù hợp trong ô và thay đổi sau mỗi bước chơi, kiểm tra xem một ô người dùng nhập có chính xác,…

- Xây dựng chức năng cho người dùng tự nhập một ô số và chương trình sẽ tính toán

để đưa ra tất cả các đáp án có thể

- Thiết kế giao diện đồ họa cho trò chơi

II Lập trình trong Java:

- Các kỹ năng viết lớp, tạo đối tượng trong Java

- Các kỹ năng lập trình giao diện trong Java: xử lý trong JTextField, xử lý sự kiện với JButton, JMenu, JPopupMenu, xử lý sự kiện với chuột và xử lý sự kiện nhập từ bàn phím

- Tạo stack bằng ArrayList có sẵn trong Java

Trang 6

B Phân tích thuật toán sử dụng trong chương trình:

1 Thuật toán kiểm tra Sudoku 9x9:

- Một Sudoku 9x9 là được giải nếu ta kiểm tra các hàng, các cột, các khối chứa 3x3 ô đều được điền đầy các số từ 1 đến 9

- Đầu vào của thuật toán là mảng 9x9 chứa Sudoku

- Đầu ra là true nếu mảng đó tuân theo luật của Sudoku, false nếu không

- Ý tưởng là ta sẽ đưa vào 1 xâu A=“123456789” rồi lần lượt kiểm tra theo các hàng các cột và các khối 3x3, mỗi lần ta sẽ kiểm tra 9 ô lấy ra giá trị từng ô rồi xóa bỏ giá trị này trong xâu, qua 9 lần xóa này nếu xâu đầu ra có giá trị độ dài bằng 0 có nghĩa

là hàng(cột hoặc khối 3x3 đó đã được giải đúng) nếu ngược lại thì sai

- Ta sẽ xây dựng ba hàm để kiểm tra lần lượt theo hàng theo cột và theo các khối 3x3

2 Thuật toán sinh Sudoku 9x9:

- Đầu vào : mảng ô số Sudoku 9x9 đã được giải

- Đầu ra : mảng ô số Sudoku 9x9 được sinh ra với 2 mức độ : mức độ dễ có 35 ô đã được điền, mức độ khó có 27 ô đã được điền, còn lại những ô khác gán giá trị 0

- Thuật toán bao gồm những bước sau:

+ Tráo đổi ngẫu nhiên các các ô theo các hàng các cột và tráo đổi các khối 3x3 với nhau để tạo ra sự ngẫu nhiên

+ Chọn ra ngẫu nhiên các ô theo yêu cầu đề bài ở mức độ dễ hay khó

2.1 Phân tích thuật toán:

2.1.1 Tráo đổi ngẫu nhiên các ô:

- Việc tráo đổi ngẫu nhiên giữa các hàng các cột và tráo đổi các khối 3x3 với nhau

- Việc tráo đổi này giúp sinh ra 1 ô số Sudoku đã được giải khác với ô số Sudoku đầu vào

- Khi tráo đổi theo hàng ta sẽ chia mảng Sudoku ra làm 3 cụm gồm 3 hàng đầu, 3 hàng giữa và 3 hàng cuối Việc tráo đổi theo hàng sẽ được thực hiện lần lượt trong các cụm này Ta chọn ngẫu nhiên ra 2 hàng trong 3 hàng của cụm đó rồi hoán đổi các số tương ứng trong hai hàng này với nhau Việc này trong chương trình được thực hiện 3 lần trong mỗi cụm Việc thực hiện này đảm bảo không mất tính đúng trong các khối 3x3 ô Nếu ta không chia như thế sẽ tạo ra ô số Sudoku mới sai

- Việc tráo đổi theo hàng cũng được thực hiện tương tự

- Khi tráo đối theo các khối thì ta cũng chia làm 3 cụm chứa lần lượt sau đó tráo đổi theo hàng và theo cột dựa theo nguyên tắc sau: hàng(cột) thứ i của cụm này được tráo đổi cho hàng(cột) thứ i của cụm kia Việc chọn ra các cụm để tráo đổi bằng cách ngẫu nhiên sử dụng random trong java

- Như vậy với cách thức thực hiện như trên ta có thể tạo ra 1 mảng ô số Sudoku mới

đã 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 các số theo yêu cầu:

- Với đề bài đặt ra là tạo ra ô số Sudoku với các mức độ dễ, khó có sự ngẫu nhiên hoặc sự lựa chọn ngẫu nhiên của người chơi về số ô tối thiểu cần có trong 1 khối 3x3 thì việc random ngẫu nhiên để chọn là khác nhau

Trang 7

- Với sự ngẫu nhiên chọn ra các ô thì ở đây ta chỉ việc random lần lượt trong 81 ô số rồi kiểm tra xem có bị trùng với các số đằng trước không

- Với việc lựa chọn số ô tối thiểu trong 1 khối 3x3 thì ta sẽ chia Sudoku 9x9 ra làm 9 khối rồi lựa chọn ra các ô tối thiểu theo chỉ định, số ô còn lại sẽ được sinh ra theo kiểu random trong 81 ô rồi 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 được nên thuật toán vẫn còn chậm cụ thể là không loại bỏ được các

ô đã chọn trước đó để tiến hành việc lựa chọn cho các ô tiếp theo

3 Thuật toán tự động giải Sudoku 9x9:

- Đầu vào : 1 mảng ô số Sudoku chưa được giải

- Đầu ra: các mảng ô số Sudoku đã được giải

- Thuật toán xây dựng dựa trên nguyên lý vét cạn và thuật toán quay lui

- Mã giả của thuật toán: a[][] là mảng 2 chiều của ô số Sudoku nhập vào

Function Try(k):

while(a[k/n][k%n]!=0) k++; // bỏ qua các số đề bài

row=k/n; column=k%n;

for(value=1; value<10; value++)

if (Kiểm tra xem có bị trùng với các ô đã có sẵn trong hàng trong ô hay

trong khối 3x3 chưa.)

then a[row][column]=value;

if(k==lastk)

then in ra màn hình ô số Sudoku đã giải;

else Try(k+1);

endif

endif

endfor

lastk được tính thông qua hàm findLastK();

Funtion findLastK():

for(row=8; row>=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 ra chưa tối ưu được việc lựa chọn các ô mà vẫn

phải kiểm tra xem các số từ 1 đến 9 có phù hợp để điền vào

C Thiết kế chi tiết chương trình:

1 Thiết kế dữ liệu của chương trình:

- Để lưu trữ dữ liệu của Sudoku ta sử dụng mảng hai chiều 9x9

Trang 8

- Để sử dụng stack ta sử dụng ArrayList trong Java(giống với danh sách liên kết)

- Việc lưu trữ SaveGame được lưu trữ thành mảng 9x9 trong file txt

2 Gói models:

Trong gói này chứa các Class là Cell, Sudoku, GenerateSudoku, PopupMenu

- Class Cell: tạo đối tượng là 1 ô trong 81 ô

- Class Sudoku : là nơi lưu trữ thông tin của Sudoku 9x9, các giải thuật kiểm tra, tự động giải Sudoku

- Class GenerateSudoku: thuật toán sinh Sudoku

3 Gói views:

Trang 9

- Class SudokuGUI: giao diện chính của chương trình

- Class HelpPanel: chứa các button Undo và Redo

- Class CommandPanel: chứa các button chức năng Clear, Solve và Check

- Class GameMenu: chứa các menu lựa chọn NewGame, SaveGame, LoadGame, PauseGame, TestGame

- Class SudokuPanel: chứa 81 đối tượng cell

Trang 10

4 Gói Controller:

- Class ActionButton: bắt sự kiện khi thực hiện Clink vào 1 Button

- Class ActionGameMenu: bắt sự kiện khi chọn vào menu chương trình

- Class ActionMouse: bắt sự kiện khi thực hiện chuột

- Class ActionKey : bắt sự kiện khi thực hiện nhập từ bàn phím

D Giao diện của chương trình:

I Giới thiệu về giao diện chương trình:

Chương trình có giao diện như sau:

Trang 11

Giao diện của chương trình được chia làm 3 phần: phần đầu là menu chương trình, phần ở giữa là ô số Sudoku, phần phía dưới là các Button

Phần Menu bao gồm:

- NewGame: tạo một Game mới với 2 sự lựa chọn dễ khó là Easy Gaame hay

Difficult Game

- PauseGame: tạm dừng chương trình

- TestGame: kiểm tra xem Sudoku đã được giải chưa

- SaveGame: lưu game đang chơi dở

- LoadGame: tải lại game đã lưu

Phần Button bao gồm các Button với các chức năng sau:

- Check: kiểm tra xem ô nhập vào có hợp lệ nếu hợp lệ thì giữ nguyên nếu không hợp

lệ thì tự động loại bỏ

- Solve: tính năng tự động giải Sudoku

- Clear: xóa tất cả các ô trên màn hình

- Undo: chức năng quay lại bước vừa nhập

- Redo: chức năng quay lại ngược với Undo

Ngoài ra còn có thêm 1 Frame mô phỏng đồng hồ dùng để tính thời gian trong game

Trang 12

II Chi tiết về hoạt động của chương trình:

1 New Game:

- Với chức năng này có 2 lựa chọn : Easy Game hoặc Difficult Game

- Trong mỗi chức năng này có phần lựa chọn số ô tối thiểu cho 1 khối 3x3 Khi đó sẽ hiện lên thông báo như sau:

- Như vậy sẽ có 3 sự lựa chọn cho người chơi 1, 2, 3, random

- Khi chọn ramdom sẽ sinh ra 1 ô số Sudoku ngẫu nhiên mà trong các khối 3x3 không yêu cầu phải có ít nhất 1 ô có sẵn Giả sử ta tạo được ô số Sudoku dạng khó như sau:

- Khi chọn số ô tối thiểu trong 1 khối 3x3 là 1, 2, 3 thì chương trình sẽ sinh ra ô số Sudoku mà trong các khối 3x3 có tối thiểu 1, 2, hoặc 3 ô có sẵn.Giả sử ta chọn 3 ở dạng khó để so sánh với hình trên đây

Trang 13

2 PauseGame:

- Với chức năng này khi người dùng chọn PauseGame thì sẽ hiện ra thông báo là chương trình đã tạm dừng khi nhấn OK thì sẽ tiếp tục lại

- Khi chức năng này được kích hoạt cũng đồng nghĩa với việc thời gian trong game

sẽ tạm dừng khi nhấn OK thì thời giant rong game sẽ tiếp tục hoạt động

3 TestGame:

- Chức năng này dùng để kiểm tra xem bạn đã giải đúng ô số Sudoku chưa nếu giải đúng sẽ hiện ra thông báo:

- Khi giải đúng Sudoku thì đồng hồ trong game cũng sẽ dừng lại

- Nếu giải sai hoặc chưa giải xong thì sẽ hiện ra thông báo:

Trang 14

4 Save Game:

- Sau khi chọn SaveGame thì sẽ hiện ra thông báo giúp người chơi lựa chọn vào vùng

dữ liệu muốn lưu:

- Hiện tại thì chương trình cung cấp cho người chơi 5 vùng để lưu trữ tạm thời

- Khi lựa chọn được vùng muốn lưu nếu vùng này đã có dữ liệu thì sẽ có thông báo:

Thông báo này có nghĩa là người chơi có muốn ghi đè lên vùng đã có dữ liệu

không Nếu chọn OK thì sẽ chương trình sẽ tiến hành lưu dữ liệu vào phần vùng đó, khi chọn cancel thì sẽ hiện ra 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 thì sẽ có thông báo sau:

5 Load Game:

- Khi chọn Load Game thì sẽ hiện ra thông báo chọn vùng dữ liệu muốn load:

Trang 15

- Chọn một trong 5 vùng dữ liệu muốn load, nếu chưa có dữ liệu ở đó thì sẽ hiện lên thông báo:

- Nếu vùng đó đã có dữ liệu thì sẽ load lên màn hình, có thông báo hiển thị:

6 Button Check:

Khi lựa chọn Check thì chương trình sẽ kiểm tra xem ô dùng nhập vào có hợp lệ hay không, nếu không hợp lệ sẽ loại bỏ nó Để thực hiện điều này mỗi ô số có 1 xâu Hint gợi ý khi nhập vào trừ những ô đề bài, sau mỗi lần nhập đúng thì chương trình

sẽ loại bỏ gợi ý này cho các ô khác cùng hàng, cùng cột hoặc cùng nằm trên một khối 3x3 Nếu ô nhập vào nằm trong các ô gợi ý thì sẽ giữ lại nếu không sẽ loại bỏ

7 Button Solve:

Khi chọn Solve thì chương trình sẽ tự động giải ra đáp án một ô số Sudoku hoàn chỉnh và nó sẽ hiện lên màn hình 1 đáp án

8 Button Clear:

Khi chọn Clear thì chương trình sẽ xóa hết số trong các ô

9 Button Undo và Redo:

- Việc xây dựng chức năng undo và redo được xây dựng dựa trên cấu trúc dữ liệu ngăn xếp( ngăn xếp là một cấu trúc dữ liệu mà các phần tử được đẩy vào đầu tiên thì khi đẩy ra sẽ đi ra cuối cùng, còn phần tử được đẩy vào cuối cùng sẽ được đẩy ra đầu tiên

- Trong bài này ngăn xếp được cài đặt trong dưới dạng ArrayList<Kiểu dữ liệu> trong Java ArrayList có dạng là một danh sách liên kết, khi ta đẩy 1 phần tử ra sử dụng hàm remove(*.size()-1); ở đây size là hàm tính độ dài danh sách liên kết hàm

Trang 16

remove loại bỏ phần tử thứ i, ở đây là loại bỏ phần tử ở đuôi Do sử dụng kiểu này nên số lần lưu trữ không giới hạn

10 Hint:

- Chức năng này nhằm gợi ý cho người chơi cho việc nhập vào một ô bất kỳ

- Ví dụ như sau:

E Kết luận và đánh giá:

1 Kết quả đạt đƣợc:

- Xây dựng được một chương trình hoàn chỉnh

- Hoàn thiện kỹ năng lập trình hướng đối tượng trong Java, kỹ năng lập trình giao diện với Java Swing

- Kỹ năng đọc và tìm tài liệu trên mạng

2 Đánh giá việc hoàn thành các yêu cầu:

Trang 17

Yêu cầu Đánh giá mức độ hoàn thành(%)

Tạo game Sudoku mới với 2 mức độ dễ

và khó có sự lựa chọn nhẫu nhiên và

không ngẫu nhiên Đã kiểm thử với các

trường hợp 0, 1, 2, 3, random

100%

Tổ chức lưu trữ thông tin ô số cho các

chức năng tạm dừng (tiếp tục),

save(load)

50%

Xây dựng chức năng undo và redo 50%

Xây dựng chức năng tự động loại bỏ các

ô số cho chương trình

100%

Xây dựng chức năng gợi ý cho người

chơi

100%

Xây dựng chức năng tự động giải

Sudoku

70%

Chương trình có giao diện đồ họa 100%

3 Hạn chế:

- Chưa tối ưu được các thuật toán trong 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 quyết trong việc xử lý chức năng Undo và Redo trong chương trình

4 Kết luận:

Sau bài tập này, điều mà em thu được là kinh nghiệm lập trình trong Java Hiểu được tầm quan trọng của việc tự tìm và đọc tài liệu Do đây là lần đầu có 1 sản phẩm hoàn chỉnh nên chắc là vẫn còn nhiều khiếm khuyết Một lần nữa, em xin cảm ơn cô đã hướng dẫn em trong thời gian vừa qua để giúp em hoàn thành bài tập lớn này

Trang 18

Tài liệu tham khảo:

1 Programing Sudoku – WeiMengLee

2 Java Swing 2nd – O.Relly

3 Thinking in Java

4 Tài liệu trên mạng internet

Ngày đăng: 27/08/2020, 15:48

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w