Với đề tài này, chúng em có thể pháttriể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ế
Trang 1TRƯờ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
Hà Nội, 11 - 2012
Mục lục
Giáo viên hớng dẫn : Cao tuấn dũng
Sinh viên thực hiện
Trang 2Lờ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ấttrong 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ìnhhướng đối tượng thì chúng ta nên dùng các ví dụ mà ranh giới giữa các đốitượ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ệncá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áttriể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 emmong thầy giáo sẽ đánh giá và rút ra những bài học kinh nghiệm, để chúng emhoà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ơnthầy!
Trang 3Mụ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.
Trang 4A. 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
I. Cơ sở dữ liệu.
Cơ sở dữ liệu bao gồm 2 bảng là tblquestion và tbltopic
II. 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:
Trang 5• 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ảnlý" 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));
2. 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
Đ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ớpRescaleOp
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ượngsource 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ụngBufferedImageOp như là một tham số truyền vào phương thứcdrawImage() 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.
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 3ngườ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
Trang 62. 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ữ
3. 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ừngchủ đề
I. Các biểu đồ use case và đặc tả
1. Biểu đồ use case.
Trang 8Hì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ềntê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
b. 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ứcnă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óasau đó chọn chức năng xóa chủ đề,hệ thống hỏi lại có muốnxó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
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ọnchức năng sửa chủ đề
• Đối tác:người chơi
Mô tả kịch bản chính:
Trang 9• 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ủ đề,saukhi nhập tên chủ đề muốn sửa nhấn OK để hoàn thành việcsửa tên ,nhấn CANCEL để hủy bỏ thao tác.
d. 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ọnchức năng thêm câu hỏi
• Đối tác:người chơi
e. 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ứcnăng xóa chủ đề
• 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ọnchứ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ứcnăng sửa câu hỏi ,hệ thống sẽ hỏi lại bạn có muốn chắc thay
Trang 10đổ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
g. 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ơivới nhau
• Tóm lược:người chơi điền tên vào ô người chơi
• 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 ứngvới vòng thi mà mình chơi đầu tiên
• Tên use case:Quay Nón
• Mục đích:quay nón để xác đinh phần thưởng nhận được tạimỗi lượt chơi
• Tóm lược :Người chơi dùng chuột kéo thả trên giao diệnchiế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ườichơ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êngiao diện chiếc nón đến khi chiếc nón dừng lại thì phầnthưởng trên thanh chỉ điểm là của người chơi Nếu là ô mấtlượt thì người chơi sẽ bị mất lượt cho người chơi kế tiếp nếukhông thì người chơi được quyền đoán ô chữ
j. Đ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
Trang 11• 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ượtchơ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êmlượt…)và được tiếp tục chơi.Nếu đoán sai người chơi sẽ mấtlượ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ỗilượ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ỏitại mỗi lượt chơi sử dụng bàn phím
II. Các biểu đồ trình tự
Trang 12
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ủ đề
Trang 13Hì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.
Trang 14Hình 6:Biểu đồ trình tự của ca sử dụng xóa câu hỏi.
Trang 15Bả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
Trang 16Hình 9:Biểu đồ trình tự ca sử dụng chọn chủ đề.
Trang 17Hì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ữ.
Trang 18Hì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 :
Trang 19D. Thiết kế chi tiết và giải pháp kỹ thuật.
truy xuất đến bảng tblquestion trong cơ sở dữ kiệu
II. Gói GameEngine.
Trang 21mang 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ựchiện các thao tác của mình
• Graphics2D dbg2D và Image dbImage dùng để đưa dữ kiệulê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áicủa game :khởi tạo các trạng thái,cập nhật trạng thái hiệntại,chuyển trạng thái mới,thoát game
• 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êmvà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ínhcủa đối tượng GamePanel, và cũng chính là các thao tác màluồng animator thực hiện
Trang 22• StateName NextGame : là tên của trạng thái game kế tiếp Đikè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
• 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áigame 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 đó đặtCurrentState tham chiếu tới StartMenu
• updateCurrentState(): kiểm tra và cập nhật trạng thái mớicho 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
Trang 231. 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
2. Lớp TopicManagerState.
Trang 24Là 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.
Trang 25Kế 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ứcabstract được ghi đè để phù hợp cho trạng thái StartMenu
VI. Gói GameObject.
Trang 26• noChar: đây là thuộc tính tĩnh, là số kí tự trong bảng chữ cái.
• questionID: ID của câu hỏi, dùng để thao tác với CSDL
• hint: gợi ý
• answer: câu trả lời (tiếng Việt, có dấu)
• phrase: cụm từ phân tích từ answer, bỏ đi các dấu và khoảngtrắng
• countChar: đây là mảng kiểu int dùng để lưu trữ số lần xuấthiện của mỗi kí tự trong phrase Truy cập thông qua chỉ số từ
1 đến 26, tương ứng với 26 chữ cái
b.Phương thức
public:
Trang 27• Question() - constructor: tạo đối tượng mới, khởi tạo mảngcountChar.
• Question(String ans, String hint): khởi tạo đối tượng mới vàkhởi gán cho 2 thuộc tính answer, hint
• int[] getCount(int index): tính toán và trả về 1 mảng sốnguyên, với số đầu tiên là n - số lần xuất hiện của kí tự đượcđại diện bởi chỉ số index, n số sau là vị trí trong xâu phrase
• Các hàm lấy dữ liệu: getHint(), getQuestionID(),getAnswer(), getPhrase()
• Các hàm đặt dữ liệu: setHint(), setQuestionID(),setAnswer(), setPhrase()
3. Lớp Player
a. Thuộc tính:
• remainTurn: số lượt đoán sai liên tiếp có thể trước khi bịloại, Mặc định là 3, tức là người chơi chỉ được đoán sai tối
đa 3 lượt liên tiếp, nếu không sẽ bị loại
• Name: tên người chơi
• roundScore: điểm của người chơi riêng tại vòng thi hiện tại
• Score: Tổng điểm của người chơi tính tới vòng thi hiện tại
• Enable: cho biết liệu người chơi có tiếp tục được chơi nữakhông hay đã bị loại
b. Phương thức:
• Player(Player p) – Constructor: nhận đầu vào là 1 đối tượngPlayer, khởi tạo 1 đối tượng Player mới có dữ liệu được saochép từ p
• Disable(): để đặt thuộc tính enable về false, và remainTurn là0
VII. Gói GamePlay
Trang 29• Dimension Size: Kích thước của nón
• int R = 150, D = 300: bán kích và đường kính của nón
• Point Position: vị trí của nón trong không gian tọa độ củamột đối tượng Graphics2D cụ thể, sử dụng để vẽ nón
• Point vctCursor: đây là vector có gốc là tâm nón, ngọn làđiểm click chuột của người dùng trên nón
• double radian: mặc định là 0 Biểu diễn góc mà nón đã quayđược so với vị trí mặc định ban đầu
• double omega: biểu diễn tốc độ góc của nón vào thời điểmngười chơi nhả chuột hoặc kéo chuột ra ngoài phạm vi nón
• double gama: biểu diễn gia tốc của nón, được điều chỉnh đểluôn ngược dấu với omega Mặc định là -0.05
• double ratio = 5: đây là tỷ lệ dùng để tính toán ra omega
• long startRotateTime: thời điểm nón bắt đầu quay tự do
• double timeRotate: Khoảng thời gian quay tự do của nón
• boolean stopRotate: mặc định là false, cho biết nón đã dừngtrạng thái quay tự do hay chưa
• boolean active: Mặc định là true Cho biết người dùng có thểđiều khiển nón được hay không Khi nón quay tự do thìactive là false, người chơi không thể điều khiển nón nữa
• bolean pressed: Cho biết người chơi đã click chuột vào nóntrong trạng thái active hay chưa Nếu pressed = true thì chonón quay dựa theo chuyển động của chuột
• Point cursor: Cho biết vị trí con trỏ khi vẽ nón
• double rotated: cho biết nón đã quay được một góc là baonhiêu kể từ khi nón bắt đầu quay tự do (tính theo rad)
• double er: đây là góc ở đỉnh của mỗi một ô điểm trên nón
• int noElement: Số ô điểm được chia ra trên nón
• private double maxOmega: Mặc định là 2, đây là trị tuyệt đốicủa tốc độ góc lớn nhất khi nón quay tự do mà người chơi cóthể đạt được
• double minOmega: Mặc định là 0.2, là trị tuyệt đối của tốc
độ góc ban đầu nhỏ nhất