Tải bản đầy đủ

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

TR¦êNG §¹I HäC B¸CH KHOA Hµ NéI
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

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. ............................................................................................................................................. 4
Tổng quan về các vấn đề liên quan: ............................................................................................ 5

A.

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

I.
1.

Yêu cầu chƣơng trình: .......................................................................................................... 5

2.

Chức năng của chƣơng trình: .............................................................................................. 5
Lập trình trong Java: ........................................................................................................... 5

II.

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

B.
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
Thiết kế chi tiết chƣơng trình: ..................................................................................................... 7

C.
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
Giao diện của chƣơng trình: ...................................................................................................... 10

D.

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

I.

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

II.
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

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

E.
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

Nguyễn Việt Anh – KSTN CNTT K57

Page 2


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 3


Xây dựng chương trình trò chơi Sudoku
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ô.

Nguyễn Việt Anh – KSTN CNTT K57

Page 4


Xây dựng chương trình trò chơi Sudoku
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.

Nguyễn Việt Anh – KSTN CNTT K57

Page 5


Xây dựng chương trình trò chơi Sudoku
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.
-

Nguyễn Việt Anh – KSTN CNTT K57

Page 6


Xây dựng chương trình trò chơi Sudoku
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.

Nguyễn Việt Anh – KSTN CNTT K57

Page 7


Xây dựng chương trình trò chơi Sudoku
-

Để 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:

Nguyễn Việt Anh – KSTN CNTT K57

Page 8


Xây dựng chương trình trò chơi Sudoku

-

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.

Nguyễn Việt Anh – KSTN CNTT K57

Page 9


Xây dựng chương trình trò chơi Sudoku
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:

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 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.

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 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.

Nguyễn Việt Anh – KSTN CNTT K57

Page 12


Xây dựng chương trình trò chơi Sudoku

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:

Nguyễn Việt Anh – KSTN CNTT K57

Page 13


Xây dựng chương trình trò chơi Sudoku

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:

Nguyễn Việt Anh – KSTN CNTT K57

Page 14


Xây dựng chương trình trò chơi Sudoku

-

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
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

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, ở đâ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:

Nguyễn Việt Anh – KSTN CNTT K57

Page 16


Xây dựng chương trình trò chơi Sudoku
Yêu cầu
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.
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)
Xây dựng chức năng undo và redo
Xây dựng chức năng tự động loại bỏ các
ô số cho chương trình
Xây dựng chức năng gợi ý cho người
chơi
Xây dựng chức năng tự động giải
Sudoku
Chương trình có giao diện đồ họa

3.
-

Đánh giá mức độ hoàn thành(%)
100%

50%

50%
100%
100%
70%
100%

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.

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:
1.
2.
3.
4.

Programing Sudoku – WeiMengLee
Java Swing 2nd – O.Relly
Thinking in Java.
Tài liệu trên mạng internet.

Nguyễn Việt Anh – KSTN CNTT K57

Page 18



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay

×