Tải bản đầy đủ (.docx) (32 trang)

thiết kế chương trình chiếc nón kì diệu

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (784.26 KB, 32 trang )

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àI TậP LớN
LậP TRìNH hớng đối tợng
Đề TàI: Chiếc nón kỳ diệu

Giáo viên hớng dẫn

: Cao tuấn dũng

Sinh viên thực hiện

H Ni, 11 - 2012

Mc lc

1


Lời nói đầu
Lập trình hướng đối tượng là một trong những kĩ năng quan trọng nhất
trong lĩnh vực công nghệ thông tin hiện nay. Trong việc học tập môn này thì
việc rèn luyện tư duy hướng đối tượng là quan trọng nhất. Khi mới học lập trình
hướng đối tượng thì chúng ta nên dùng các ví dụ mà ranh giới giữa các đối
tượng là rõ ràng. Có rất nhiều bài tập sẽ giúp chúng ta làm quen và rèn luyện
các kĩ năng, tư duy trong lập trình hướng đối tượng. Điển hình trong đó phải kể
tới bài tập tạo game Chiếc nón kì diệu. Với đề tài này, chúng em có thể phát
triển rất nhiều cách tư duy hướng đối tượng, hiểu được sâu sắc các nguyên lý
của lập trình hướng đối tượng, thêm nữa là rèn luyện và phát triển các kiến thức
về cơ sở dữ liệu và lập trình đồ họa trong game 2D. Chương trình của chúng em


được viết trên ngôn ngữ thuần hướng đối tượng là Java.
Do mới làm quen với cách tư duy hướng đối tượng cũng như kiến thức về
lập trình game nên chắc hẳn trong bài tập sẽ còn nhiều hạn chế. Chúng em
mong thầy giáo sẽ đánh giá và rút ra những bài học kinh nghiệm, để chúng em
hoàn thiện hơn cả về kiến thức và kĩ năng. Chúng em xin trân thành cảm hơn
thầy!.

2


Mục Lục Các Biểu Đồ
Hình 1:Biểu đồ use case
Hình 2:Biểu đồ trình tự của ca sử dụng thêm chủ đề.
Hình 3:Biểu đồ trình tự của ca sử dụng xóa chủ đề.
Hình 4:biểu đồ trình tự cho ca sử dụng sửa chủ đề.
Hình 5:Biểu đồ trình tự của ca sử dụng thêm câu hỏi.
Hình 6:Biểu đồ trình tự của ca sử dụng xóa câu hỏi.
Bảng 7:Biểu đồ trình tự ca sử dụng sửa câu hỏi.
Hình 8:Biểu đồ trình tự ca sử dụng nhập tên
Hình 9:Biểu đồ trình tự ca sử dụng chọn chủ đề.
Hình 10:Biểu đồ trình tự ca sử dụng quay nón.
Hình 11:Biểu đồ trình tự ca sử dụng đoán ô chữ.
Hình 12:Biểu đồ trình tự ca sử dụng trả lời.

3


A.

I.


Tổng quan về vấn đề liên quan.
Chương trình được xây dựng dựa trên ngôn ngữ java và sử dụng cơ sở dữ
liệu MySQL.
Cơ sở dữ liệu.
Cơ sở dữ liệu bao gồm 2 bảng là tblquestion và tbltopic.
Thuộc tính
IdQuestion
Question
Answer
Note
IdTopic
Thuộc tính
IdTopic
Topic

II.

Diễn giải
Mã câu hỏi
câu hỏi
Đáp án
Ghi chú
Mã chủ đề
Diễn giải
Mã chủ đề
Chủ đề

Kiểu dữ liệu
Int


Ghi chú
Khóa chính

VARCHAR(100)
VARCHAR(50)

Text
int

Khóa ngoại

Kiểu dữ liệu
int

ghi chú
Khóa chính

VARCHAR(45)

Lập trình đồ họa 2D trong java
1. Nạp một đối tượng ảnh từ file

Ta có thể sử dụng các đối tượng của lớp BufferedImage. Tại sao lại là
lớp BufferedImage chứ không phải Image? BufferedImage là lớp mở
rộng của Image nên nó kế thừa các khả năng của lớp Image, hơn nữa
nó có 2 lợi thế quan trọng:

4






Các dữ liệu cần thiết cho việc thao tác với ảnh được truy cập dễ
dàng hơn thông qua các phương thức của nó.
BufferedImage được tự động chuyển đổi thành "ảnh được quản
lý" bởi Java Virtual Machine (JVM) ngay khi có thể, nhờ đó
cho phép hỗ trợ bởi phần cứng khi được đưa ra màn hình.

Để nạp một ảnh từ file vào đối tượng BufferedImage, ta có thể
dùng phương thức tĩnh read() của lớp ImageIO:
BufferedImage bimg = ImageIO.read(getClass().getResource(file));
Các hiệu ứng đồ họa bới ảnh
Các thao tác xử lý ảnh trong Java 2D hầu hết nằm trong những lớp
con của dao diện BufferedImageOp
2.

Đoạn mã dưới đây cho thấy cách tạo ra một đối tượng BufferedImage,
sau đó thực hiện thao tác co dãn ảnh nhờ vào một đối tượng của lớp
RescaleOp.
BufferedImage source = ImageIO.read(getClass().getResource(file_name));
RescaleOp = new RescaleOp(-1.0f, 255f, null);
BufferdImage destination = RescaleOp.fillter(source, null);

Hàm fillter() thực hiện thao tác co dãn ảnh, lấy input là đối tượng
source và trả về một thể hiện của lớp BufferedImage.
Có một số phương thức thao tác với ảnh có thể thực hiện "tại chỗ",
tức là không cần phải tạo ra một đối tượng mới để lưu kết quả.
Một cách khác để thực hiện các hiệu ứng với ảnh là sử dụng

BufferedImageOp như là một tham số truyền vào phương thức
drawImage() của đối tượng đồ họa Graphics2D. Đối tượng ảnh sẽ được
xử lý, và kết quả được đưa trực tiếp ra thiết bị đồ họa.
g2d.drawImage(source, negOp, x, y); // g2D là đối tượng Graphics.
B.

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

Yêu cầu chương trình.

Xây dựng trò chơi chiếc nón kỳ diệu.Là một trò chơi đơn giản với 3
người chơi với nhiệm vụ đoán chữ qua 3 vòng chơi.
Ai là người có số điểm cao nhất qua 3 vòng chơi sẽ là người chiến thắng.
5


2.

3.

Chức năng chương trình.
1. Quản lý câu hỏi
Cho phép người chơi thêm ,sửa ,xóa chủ đề.
Cho phép người chơi thêm,sửa ,xóa các câu hỏi thuộc 1 chủ đề.
2. Chơi
3 người chơi lần lượt được chọn chủ đề của từng vòng chơi và
tại mỗi vòng chơi 3 người lần lượt được quay nón để đoán ô
chữ.
Thiết kế chương trình.


Sử dụng ngôn ngữ lập trình java để xây dựng chương trình chính và sử
dụng cơ sở dữ liệu My SQL để quản lý câu hỏi và chủ đề.
Tổ chức chương trình theo mô hình MVC.
Tổ chức chương trình chính thành các package với các chức năng riêng rẽ
của chương trình.
Tổ chức cơ sở dữ liệu quản lý các câu hỏi và đáp án tương ứng theo từng
chủ đề.
C.

Phân tích thiết kế mức kiến trúc.
I.
1.

Các biểu đồ use case và đặc tả
Biểu đồ use case.

6


7


Hình 1:Biểu đồ use case
2.

Đặc tả
a.

Thêm Chủ Đề

Mô tả tóm tắt:
• Tên use case :Thêm Chủ Đề
• Mục Đích:Giúp người chơi thêm 1 chủ đề.
• Tóm lược:Người chơi chọn chức năng thêm chủ đề,rồi điền
tên chủ đề muốn thêm.
• Đối tác:người chơi.
Mô tả kịch bản chính:
Ca sử dụng bắt đầu khi người chơi chạy chương trình và
chọn quản lý câu hỏi,sau đó chọn chức năng thêm chủ đề hệ
thống sẽ đưa ra 1 cửa sổ cho phép người chơi điền tên chủ đề
mình muốn thêm sau đó nhấn OK hệ thống sẽ thêm 1 chủ đề
vào cơ sở dữ liệu.
Xóa Chủ Đề
Mô tả tóm tắt:
• Tên use case:Xóa Chủ Đề.
• Mục đích:giúp người chơi xoá 1 chủ đề.
• Tóm lược:Người chơi chọn chủ đề muốn xóa rồi chọn chức
năng xóa chủ đề.
• Đối tác :người chơi
Mô tả kịch bản chính:
• Ca sử dụng bắt đầu khi người chơi chọn chủ đề muốn xóa
sau đó chọn chức năng xóa chủ đề,hệ thống hỏi lại có muốn
xóa chủ đề ,nếu xóa chủ đề toàn bộ câu hỏi trong chủ đề bị
xóa toàn bộ.Nhấn YES để hoàn thành việc xóa chủ đề đó
trong cơ sở dữ liệu,nhấn NO để hủy bỏ thao tác.
Sửa Chủ Đề
Mô tả tóm tắt:
• Tên use case:Sửa Chủ Đề.
• Mục đích:giúp người chơi sửa 1 chủ đề.
• Tóm lược:người chơi chọn chủ đề muốn sửa sau đó chọn

chức năng sửa chủ đề.
• Đối tác:người chơi.


b.

c.

Mô tả kịch bản chính:

8


Ca sử dụng bắt đầu khi người chơi chọn chủ đề muốn thay
đổi ,hệ thống sẽ hiện ra 1 cửa sổ cho phép sửa tên chủ đề,sau
khi nhập tên chủ đề muốn sửa nhấn OK để hoàn thành việc
sửa tên ,nhấn CANCEL để hủy bỏ thao tác.
Thêm Câu Hỏi
Mô tả tóm tắt:
• Tên use case:Thêm Câu Hỏi.
• Mục đích:giúp người chơi thêm 1 câu hỏi trong 1 chủ đề.
• Tóm lược:người chơi nhập thông tin cho câu hỏi sau đó chọn
chức năng thêm câu hỏi
• Đối tác:người chơi.
Mô tả kịch bản chính:
• Ca sử dụng bắt đầu khi người chơi chọn 1 chủ đề sau đó điền
các thông tin về câu hỏi mà muốn thêm vào chủ đề đó :gợi
ý ,đáp án,ghi chú.Sau đó người chơi chọn chức năng thêm
câu hỏi,hệ thống sẽ hỏi lại xem bạn có muốn chắc thêm câu
hỏi này không.Nhấn OK để hoàn thành việc thêm câu

hỏi,nhấn NO để hủy bỏ thao tác.
Xóa Câu Hỏi
Mô tả tóm tắt:
• Tên use case:Xóa Câu Hỏi
• Mục đích:giúp người chơi xóa 1 câu hỏi trong chủ đề.
• Tóm lược:người chơi chọn chủ đề muốn xóa rồi chọn chức
năng xóa chủ đề.
Mô tả kịch bản chính:
• Ca sử dụng bắt đầu khi người chơi chọn câu hỏi muốn xóa
sau đó chọn chức năng xóa câu hỏi ,hệ thống sẽ hỏi lại bạn
có chắc muốn xóa câu hỏi này .Nhấn YES để hoàn thành
việc xóa câu hỏi,nhấn No để hủy bỏ thao tác.
Sửa Câu Hỏi
Mô tả tóm tắt:
• Tên use case:Sửa Câu Hỏi
• Mục đích:giúp người chơi sửa câu hỏi trong 1 chủ đề.
• Tóm lược: người chơi thay đổi thông tin của câu hỏi rồi chọn
chức năng sửa đổi câu hỏi
Mô tả kịch bản chính:
• Ca sử dụng bắt đầu khi người chơi chọn câu hỏi trong 1 chủ
đề nào đó ,rồi thay đổi các thông tin của nó sau đó chọn chức
năng sửa câu hỏi ,hệ thống sẽ hỏi lại bạn có muốn chắc thay


d.

e.

f.


9


g.

h.

i.

j.

đổi câu hỏi .Nhấn OK để hoàn thành việc sửa câu hỏi,nhấn
NO để hủy bỏ thao tác.
Nhập Tên
Mô tả tóm tắt:
• Tên use case:Nhập Tên
• Mục đích:đặt tên cho người chơi để phân biệt các người chơi
với nhau
• Tóm lược:người chơi điền tên vào ô người chơi.
Mô tả kịch bản chính:
• Người chơi điền tên mình muốn hiển thị vào ô tên người
chơi tương ứng với mình.
Chọn Chủ Đề
Mô tả tóm tắt:
• Tên use case:Chọn Chủ Đề
• Mục đích:chọn chủ đề của vòng thi mà mình là người chơi
đầu tiên.
• Tóm lược:người chơi chọn chủ đề trong ô chủ đề tương ứng
với vòng thi mà mình chơi đầu tiên.
Mô tả kịch bản chính:

• Người chơi chọn chủ đề trong ô chủ đề tương ứng với vòng
thi mà mình chơi đầu tiên.
Quay Nón
Mô tả tóm tắt:
• Tên use case:Quay Nón
• Mục đích:quay nón để xác đinh phần thưởng nhận được tại
mỗi lượt chơi.
• Tóm lược :Người chơi dùng chuột kéo thả trên giao diện
chiếc nón
Mô tả kich bản chính:
• Tại mỗi lượt chơi trước khi người chơi đoán ô chữ,người
chơi phải quay nón để xác định phần thưởng tại lượt chơi đó
nếu mình đoán đúng.Người chơi dùng chuột kéo thả trên
giao diện chiếc nón đến khi chiếc nón dừng lại thì phần
thưởng trên thanh chỉ điểm là của người chơi. Nếu là ô mất
lượt thì người chơi sẽ bị mất lượt cho người chơi kế tiếp nếu
không thì người chơi được quyền đoán ô chữ.
Đoán Chữ
Mô tả tóm tắt:
• Tên use case:Đoán Chữ
• Mục đích:Đoán chữ trong mỗi lượt chơi
10


Tóm lược:Người chơi sử dụng chuột chọn ô chữ mình muốn
đoán trong mỗi lượt chơi.
Mô tả kịch bản chính:
• Tại mỗi lượt chơi người chơi được quyền đoán 1 chữ
cái,người chơi dùng chuột chọn ô chữ trong bảng chữ mà
mình muốn đoán,sau khi quay nón người chơi có 5s để đoán

ô chữ. Nếu sau 5s mà không đoán người chơi sẽ mất lượt
chơi vào người kế tiếp.Nếu đoán đúng chữ cái thì ô chữ đáp
án sẽ hiện các chữ cái tương ứng lên và ngươi chơi sẽ nhận
được phần thưởng tương ứng của mình(cộng điểm,thêm
lượt…)và được tiếp tục chơi.Nếu đoán sai người chơi sẽ mất
lượt cho người chơi kế tiếp.
k. Trả Lời
Mô tả tóm tắt:
• Tên use case:Trả Lời
• Mục đích:ngươì chơi sẽ đoán đáp án của câu hỏi sau mỗi
lượt chơi nếu đã biết kết quả.
• Tóm Lược:Người chơi được quyền đoán đáp án của câu hỏi
tại mỗi lượt chơi sử dụng bàn phím.
Mô tả kịch bản chính:
• Tại mỗi lượt chơi sau khi đã đoán đúng ô chữ nếu người
chơi đã biết đáp án của vòng thi đó khi mà chưa đoán hết các
ô chữ người đó có quyền đoán toàn bộ ô chữ.Nhấn chọn
chức năng Trả Lời,hệ thống sẽ hiện ra 1 cửa sổ cho phép
nhập tên của đáp án vòng chơi đó.Sau khi điền đáp nhấn Trả
lời để xác nhận.Nếu đoán đúng người chơi sẽ được cộng
điểm và vòng chơi đó kết thúc,nếu đoán sai vòng chơi đó
tiếp tục và người chơi bị loại.
Các biểu đồ trình tự


II.

11



Hình 2:Biểu đồ trình tự của ca sử dụng thêm chủ đề.

Hình 3:Biểu đồ trình tự của ca sử dụng xóa chủ đề.

12


Hình 4:biểu đồ trình tự cho ca sử dụng sửa chủ đề.

Hình 5:Biểu đồ trình tự của ca sử dụng thêm câu hỏi.
13


Hình 6:Biểu đồ trình tự của ca sử dụng xóa câu hỏi.

14


Bảng 7:Biểu đồ trình tự ca sử dụng sửa câu hỏi.

Hình 8:Biểu đồ trình tự ca sử dụng nhập tên

15


Hình 9:Biểu đồ trình tự ca sử dụng chọn chủ đề.

16



Hình 10:Biểu đồ trình tự ca sử dụng quay nón.

Hình 11:Biểu đồ trình tự ca sử dụng đoán ô chữ.

17


Hình 12:Biểu đồ trình tự ca sử dụng trả lời.
III.

Biểu đồ Class.
Từ biểu đồ trình tự như trên chúng ta có thể xây dựng biểu đồ class ở
dạng cơ bản như sau :

18


D.

Thiết kế chi tiết và giải pháp kỹ thuật.
I.
Gói DB.

Gói này dùng để kết nối với cơ sở dữ liệu.
Gói DB gồm 3 lớp là :DBconnect,TopicDB,QuestionDB.
1.
2.

Lớp Dbconnect
quản lý quá trình đóng,mở kết nối đến cơ sở dữ liệu.

Lớp TopicDB

truy xuất đến bảng tbltopic trong cơ sở dữ liệu
3.
II.

Lớp QuestionDB
truy xuất đến bảng tblquestion trong cơ sở dữ kiệu.
Gói GameEngine.

19


1.

Lớp GamePanel

Lớp này kế thừa lớp Jpanel.
a.

Thuộc tính:
Private:
• Thread animator :dùng để tạo luồng xử lý thời gian thực cho
game.
• Boolean running,gameOver,isPaused:cho biết trạng thái của
game và điều khiển luồng animator.Khi game đang chạy thì
running mang giá trị là true,khi kết thúc game thì gameOver
20








mang giá trị là true,còn trong khi game tạm dừng thì cả
running và isPaused đều mang giá trị là true.
Int period =10(ms) khoảng thời gian giữa 2 lần game thực
hiện các thao tác của mình.
Graphics2D dbg2D và Image dbImage dùng để đưa dữ kiệu
lên màn hình,áp dụng kỹ thuật anti-conflict bằng cách dùng
1 bộ đệm cho màn hình.
GameManger gamemanager :dùng để quản lý các trạng thái
của game :khởi tạo các trạng thái,cập nhật trạng thái hiện
tại,chuyển trạng thái mới,thoát game.

Public:
Int PWIDTH,PHEIGHT:kích thước của panel
b. Phương thức
• gameUpdate():cập nhật các trạng thái trong game và xử lý
các đối tượng trong game.
• gameRender():vex các đối tượng đồ họa trong game đã được
cập nhật ra bộ đệm.
• paintScreen():dùng để đưa bộ đệm đồ họa ra màn hình.
• startGame():khởi tạo và chạy luồng đồ họa aminator để cử lý
các hoạt đọng trong game.
• getWidth(),getHeight():trả về kích thước của 1 panel cụ thể.
• GamePanel():hàm khởi tạo constructor.
• addNotify():mở rộng phương thức addNotify() gốc và thêm
vào thao tác startGame() để chay đối tượng GamePanel.

• stopGame():dừng game và thoát.
• pauseGame() :tạm thời dừng game.
• run() : là phương thức ghi đè, dùng để đặt vòng lặp chính
của đối tượng GamePanel, và cũng chính là các thao tác mà
luồng animator thực hiện.
Lớp GameState.
Đây là một lớp trừu tượng, dùng để dại diện cho các trạng thái của game,
chứa một số dữ liệu thiết yếu và thao tác cơ bản.
a. Thuộc tính:
Protected:
• StateName stateName: là tên của trạng thái game. Đi kèm là
thao tác getName().
• StatusValue Status: chế độ hiện thời của trạng thái game. Đi
kèm là thao tác getStatus().


2.

21


StateName NextGame : là tên của trạng thái game kế tiếp. Đi
kèm là thao tác getNextState().
• GamePanel gamePanel: đây là thuộc tính sử dụng để thêm,
xóa các đối tượng trong trạng thái game hiện thời, nhờ đó có
thể nghe và phản ứng được với các sự kiện.
b. Phương thức.
• initComponents(): Khởi tạo các thành phần của trạng thái
game.
• addComponents(): Thêm các thành phần cần thiết vào đối

tượng gamePanel.
• Update(): cập nhật và xử lý hoạt động trong game
• Render(): vẽ các đối tượng đồ họa ra bộ đệm
• Clear(): xóa bỏ các đối tượng đã thêm trong thao tác
• addComponents() và cài đặt lại các thông số nếu cần thiết.
3. Lớp GameManager.
a. Thuộc tính.
Private:
• StartMenuState StartMenu: trạng thái menu chính của game
• CreatGameState CreateGame: trạng thái tạo game mới
• TopicManageState TopicManage: trạng thái quản lý dữ liệu.
• PlayingState Playing: trạng thái chơi game.
• FinishState FinishGame: trạng thái kết thúc chương trình
• Player players[]: mảng các đối tượng người chơi trong game
• Question questions[]: mảng các câu hỏi cho các vòng chơi.
• GameState CurrentState: là một tham chiếu tới trạng thái
game hiện tại.
• boolean exitGame: cho biết game đã kết thúc hay chưa.
b. Phương thức
• GameManager() – constructor: Khởi tạo các thuộc tính
(players, questions) và các trạng thái game. Sau đó đặt
CurrentState tham chiếu tới StartMenu.
• updateCurrentState(): kiểm tra và cập nhật trạng thái mới
cho game. Nếu cần thì sẽ chuyển sang trạng thái game mới,
hoặc thoát game nếu CurrentState là rỗng.
III.
Gói GameData


22



1.

2.

Lớp CreatGameState.
Kế thừa từ lớp GameState
Tạo 1 cửa sổ mới để lấy dữ liệu và tạo mới một game.
Kết nối với cơ sở dữ liệu để lấy các câu hỏi cho các vòng chơi.
Lớp TopicManagerState.

23


Là trạng thái game quản lý dữ liệu về các chủ đề và câu hỏi.Kết nối với
cơ sở dữ liệu và cho phép người dùng thêm, sửa, xóa câu hỏi cũng như
các chủ đề.
IV.
Gói GameFinish.

1.

Lớp FinishState
Kế thừa từ lớp GameState.
Trạng thái game kết thúc: đưa ra bảng tổng kết điểm và chờ 1 khoảng
thời gian trước khi thoát chương trình.
V.
Gói GameStart


24


VI.

Kế thừa từ lớp GameState.
Chứa dữ liệu và thao tác cho phần menu chính. Gần như không có
thêm thuộc tính và phương thức so với lớp cha. Các phương thức
abstract được ghi đè để phù hợp cho trạng thái StartMenu.
Gói GameObject.

25


×