Đề tài: “Phát triển hệ thống phần mềm soạn thảo các câu đố chữ và trò chơi đố chữ” Mục lục Lời nói đầu3 PHẦN 1: TỔNG QUAN4 PHẦN 2 :PHÂN TÍCH THIẾT KẾ MỨC KIẾN TRÚC CỦA BÀI TOÁN5 I.Phân tích bài toán bằng biểu đồ use-case:5 1.Phần thứ nhất (Soạn Game) cho phép người dùng soạn thảo câu đố.6 2.Phần thứ hai (Chơi Game) cho phép người dùng chọn câu đố và thực hiện giải đố.6 II.Biểu đồ trình tự7 1.Phần Soạn Câu hỏi7 2.Phần Soạn Câu đố8 3.Phần Chơi Game9 III.Xây dựng các lớp10 1.Các lớp cần thiết10 2.Biểu đồ lớp10 3.Biểu đồ trạng thái ( StateChart Diagrams )11 4.Biểu đồ hoạt động ( Activity Diagrams )12 PHẦN 3 : THIẾT KẾ CHI TIẾT VÀ GIẢI PHÁP KỸ THUẬT XÂY DỰNG CÁC LỚP VÀ CHỨC NĂNG CHÍNH CỦA NÓ14 I.Chi tiết các lớp14 II.Các vấn đề khó khăn, hay, thú vị trọng tâm cần vượt qua và cách giải quyết22 1.Kéo thả hàng chữ22 2.Đếm thời gian - Countdown timer25 3.Xóa từ hàng ngang đã chọn26 4.Lưu và sắp xếp điểm người chơi ( Rank )26 III.Mô hình thiết kế theo MVC28 PHẦN 4: KẾT LUẬN VÀ ĐÁNH GIÁ30 I.Kết quả đạt được30 II.Phân công công việc nhóm30 III.TÀI LIỆU THAM KHẢO31
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
MÔN: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
đố chữ và trò chơi đố chữ”
Mã đề tài: De05C
Sinh viên thực hiện: Nguyễn Đức Hiếu (Nhóm trưởng)
Trang 2Mục lục
Lời nói đầu 3
PHẦN 1: TỔNG QUAN 4
PHẦN 2 :PHÂN TÍCH THIẾT KẾ MỨC KIẾN TRÚC CỦA BÀI TOÁN 5
I Phân tích bài toán bằng biểu đồ use-case: 5
1 Phần thứ nhất (Soạn Game) cho phép người dùng soạn thảo câu đố 6
2 Phần thứ hai (Chơi Game) cho phép người dùng chọn câu đố và thực hiện giải đố 6
II Biểu đồ trình tự 7
1 Phần Soạn Câu hỏi 7
2 Phần Soạn Câu đố 8
3 Phần Chơi Game 9
III Xây dựng các lớp 10
1 Các lớp cần thiết 10
2 Biểu đồ lớp 10
3 Biểu đồ trạng thái ( StateChart Diagrams ) 11
4 Biểu đồ hoạt động ( Activity Diagrams ) 12
PHẦN 3 : THIẾT KẾ CHI TIẾT VÀ GIẢI PHÁP KỸ THU T XÂY DỰNG CÁC LỚP VÀ CHỨC NĂNG CHÍNH ẬT XÂY DỰNG CÁC LỚP VÀ CHỨC NĂNG CHÍNH CỦA NÓ 14
I Chi tiết các lớp 14
1 Lớp ActivityDatabase 14
2 Lớp ActivityUtility 14
3 Lớp Square 14
4 Lớp Row 15
5 Lớp GamePack 16
6 Lớp GWGCreateMain 17
7 Lớp GWGCreateGame 18
8 Lớp GWGCreateContent 19
9 Lớp GWGPlay 20
10 Lớp DBAdapter 21
II Các vấn đề khó khăn, hay, thú vị trọng tâm cần vượt qua và cách giải quyết 22
1 Kéo thả hàng chữ 22
2 Đếm thời gian - Countdown timer 25
Trang 33 Xóa từ hàng ngang đã chọn 26
4 Lưu và sắp xếp điểm người chơi ( Rank ) 26
III Mô hình thiết kế theo MVC 28
PHẦN 4: KẾT LUẬN VÀ ĐÁNH GIÁ 30
I Kết quả đạt được 30
II Phân công công vi c nhómệc nhóm 30
III TÀI LIỆU THAM KHẢO 31
MỤC LỤC HÌNH VẼ Hình 1: Biểu đồ use-case góc nhìn người dùng 5
Hình 2: Biểu đồ trình tự soạn Câu hỏi 7
Hình 3: Biểu đồ trình tự soạn Câu đố 8
Hình 4: Biểu đồ trình tự chơi game 9
Hình 5: Biểu đồ lớp của các lớp quan trọng 10
Hình 6: Biểu đồ trạng thái của hàng ngang ( Row ) khi thực hiện kéo thả 11
Hình 7: Biểu đồ trạng thái của hàng ngang ( Row ) khi chơi game 11
Hình 8: Mô tả hoạt động khi người dùng tạo một câu hỏi mới 12
Hình 9: Mô tả hoạt động khi người dùng tạo một gói câu hỏi mới 12
Hình 10: Mô tả hoạt động khi người dùng chơi game 13
Hình 11: Gói Model 25
Hình 12 : Gói View 25
Hình 13: Gói Controller 26
Trang 4Lời nói đầu
Có lẽ ai học công nghệ thông tin đều biết,các ngôn ngữ lập trình hướng đối tượng ưu việt hơnnhiều so với các ngôn ngữ hướng thủ tục,điều này đã được kiểm nghiệm và chứng minh.Nhưng nhờ đâu các nhà thiết kế lại có thể nghĩ ra ngôn ngữ lập trình hướng đối tượng,có lẽ tên mà ta hay gọi cho nó cũng đã bao hàm câu trả lời cho câu hỏi trên rồi,đối tượng là một khái niệm không hề có trong lập trình hướng thủ tục,mà đối tượng chính là các thực thể trong thế giới thực.Khi mới bắt đầu làm quen với lập trình hướng đối tượng chúng thì cách tiếp cận khá tốt là đi vào các ví dụ mà ở đó ranh giới giữa các đối tượng rõ ràng Giải đoán ô chữ đang là một trò chơi rất phổ biến trên các tờ báo, hay các gameshow truyền hình được đông đảo mọi người theo dõi như Olympia, Chiếc nón kỳ diệu,…Chúng em thấy đây là một trò chơi rất hay và bổ ích, đồng thời cũng không khó khăn để xác định các thực thể trong hệ thống trò chơi này, vì lý do đó nhóm sinh viên bọn em lựa chọn đề tài
“Phát triển hệ thống soạn thảo các câu đố chữ và trò chơi đố chữ”, đề tài thực hiện chương trình mô phỏng trò chơi đố chữ, cho phép người dùng soạn thảo và giải đáp các ô chữ hang ngang theo gợi ý
và từ đó đoán ô chữ khoá chính Chương trình được viết bởi ngôn ngữ lập trình Android - một ngôn ngữ lập trình cho ứng dụng chạy trên nền tảng mobile Android, là sự kết hợp của ngôn ngữ lập trình thuần đối tượng Java và ngôn ngữ thiết kế XML
Do mới làm quen với ngôn ngữ Java và việc xử lý các kỹ thuật trong lập trình hướng đối tượng nên trong chương trình còn có nhiều hạn chế Nhóm chúng em mong nhận được các nhận xét của thầy về đề tài này của nhóm để nhóm em có thể khắc phục các hạn chế trong đề tài này để có thểlàm tốt hơn trong những đề tài tiếp theo
Trang 5PHẦN 1: TỔNG QUAN
Kiến thức nền tảng phục vụ cho bài toán:
- Phân tích và thiết kế hướng đối tượng,bao gồm :
+ Tư duy lập trình hướng đối tượng
+ Các nguyên lý cơ bản trong lập trình hướng đối tượng (đóng gói, kế thừa, sử dụng các
giao diện, đa hình, chồng phương thức )
+ Biết sử dụng ngôn ngữ lập trình java
+ Tìm hiểu cách thức lập trình game bằng phương pháp hướng đối tượng
+ Kiến thức cơ bản về cơ sở dữ liệu và thiết kế cơ sở dữ liệu cho game
Trang 6PHẦN 2 :PHÂN TÍCH THIẾT KẾ MỨC KIẾN TRÚC CỦA BÀI TOÁN
Yêu cầu:
Trò chơi đố chữ rất phổ biến trong mục giải trí của một số tờ báo, hay trên các
gameshow như đường lên đỉnh Olympia Mục đích của người chơi là giải từng ô chữ theo hàng ngang theo các gợi ý và từ đó đoán ô chữ theo hàng dọc Yêu cầu tối thiểu là chương trình cho phép tạo ô chữ có một khóa chính Cần tạo ra một chương trình phần mềm bao gồm:
- Phần thứ nhất cho phép người dùng soạn thảo câu đố Chú ý là với mỗi ô chữ hàng ngang hay dọc ta có thể có nhiều cấp độ gợi ý Nếu người chơi chỉ từ gợi ý đầu tiên đã đoán đúng
được ô chữ thì được điểm cao nhất – nếu càng cần nhiều gợi ý thì điểm số bị trừ dần Có thể quản lý các câu đố theo từng chủ đề Giao diện soạn thảo câu đố là giao diện đồ họa tương tác, người dùng có thể kéo, dịch các ô chữ sang trái, phải hay lên, xuống Khi dịch chuyển ô chữ mà không thỏa mãn điều kiện tạo khóa chính thì thảo tác thả xuống không có tác dụng.
- Phần thứ hai cho phép người dùng chọn câu đố và thực hiện giải đố Trò chơi cần được giới hạn về thời gian
I Phân tích bài toán bằng biểu đồ use-case:
Từ yêu cầu của đề bài, chương trình cho phép người dùng “soạn thảo câu đố” ,“chọn câu đố vàthực hiện giải đố”
Hình 1: Biểu đồ use-case góc nhìn người dùng
+ Tác nhân của hệ thống : người chơi
Trang 7Người chơi có thể soạn thảo trò chơi và chơi trò chơi.
+ Các Use case chính : Soạn Game và Chơi Game
1 Phần thứ nhất (Soạn Game) cho phép người dùng soạn thảo câu đố.
Phần soạn thảo chia ra làm 2 bước cho phép người dùng lựa chọn:
- Bước 1: Tạo câu hỏi
Mỗi câu hỏi sẽ có 1 câu hỏi và 1 câu gợi ý tương ứng Các câu hỏi được người dùng xếp và cácchủ đề phù hợp
- Bước 2: Tạo câu đố
Mỗi ô chữ hàng ngang hay dọc sẽ lấy dữ liệu câu hỏi từ bước 1 Người dùng chọn chủ đề cho game đố, giao diện tạo game sẽ mở ra Chương trình có 1 panel tìm kiếm câu hỏi ở bên phải màn hình cho phép người dùng truy cập dữ liệu câu hỏi
Đầu tiên người dùng được yêu cầu chọn khóa chính Chương trình sẽ tạo ra 1 cột hàng dọc ở giữa màn hình và thông báo mời người dùng lựa chọn các câu hàng ngang Các câu hàng ngang được tạo ra sẽ có khả năng kéo và thả vào cột khóa chính tương ứng Người dùng có thể kéo, dịch các ô chữ sang trái, phải hay lên, xuống Khi dịch chuyển ô chữ mà không thỏa mãn điều kiện tạo khóa chính thì thảo tác thả xuống không có tác dụng
Sau khi tạo đủ các từ hàng ngang phù hợp với từ khóa chính, chương trình sẽ hiện nút Lưu để người dùng lưu câu đố với tên nhất định
2 Phần thứ hai (Chơi Game) cho phép người dùng chọn câu đố và thực hiện giải đố.
Giao diện chương trình có panel bên trái cho phép người dùng chọn chủ đề Khi bấm vào 1 chủ
đề nhất định, tên các câu đố sẽ hiện ra trong vùng bên trái
Giao diện phần chơi sẽ có các ô chữ ở bên trái Người chơi bấm chọn hàng hang hoặc dọc để trả lời Câu hỏi và textbox để nhập câu trả lời sẽ hiện ở panel bên phải Nếu người chơi chỉ từ gợi ý đầu tiên đã đoán đúng được ô chữ thì được điểm cao nhất – nếu càng cần nhiều gợi ý thì điểm số bị trừ dần Trò chơi cần được giới hạn về thời gian Nếu hết thời gian không trả lời được thì coi như là trả lời sai Nếu người chơi đoán đúng câu hàng dọc, với mỗi từ hàng ngang chưa được mở ra, người chơi sẽ được cộng thêm điểm, các ô chữ được lật hết ra và kết thúc trò chơi Còn nếu trả lời sai thì không được gì cả, trò chơi vẫn kết thúc
Chương trình có khả năng lưu điểm cao của người dùng và được tổ chức theo mô hình MVC
Trang 8II Biểu đồ trình tự
1 Phần Soạn Câu hỏi
Hình 2: Biểu đồ trình tự soạn Câu hỏi
Trang 93 Phần Soạn Câu đố
Hình 3: Biểu đồ trình tự soạn Câu đố
Trang 104 Phần Chơi Game
Hình 4: Biểu đồ trình tự chơi game
III Xây dựng các lớp
1 Các lớp cần thiết
Ô chữ (Square) Khóa chính (keyWord) Câu hỏi (Row)
Trang 11Câu đố (PackageGame) Gợi ý (hint) Điểm (score)
Soạn thảo (creating) Chơi game (playing) Câu hỏi (question)
- Biểu đồ lớp của các lớp quan trọng :
Hình 5: Biểu đồ lớp của các lớp quan trọng
( chi tiết cụ thể các lớp được viết ở phần 3 : Thiết kế chi tiết các lớp)
- Đối tượng của lớp Row sẽ chứa các đối tượng của lớp Square Đối tượng của lớp Square không thể tồn tại độc lập
- Lớp GamePack là kết tập của lớp Row Mối quan hệ thể hiện một câu đố có thể có nhiều câu hỏi
- GWGCreateGame là lớp điều khiển hoạt động tạo câu đố từ người dùng, chứa một câu đố cho người dùng thả câu hỏi vào và chứa nhiều câu hỏi để kéo
- GWGPlay là lớp điều khiển hoạt động khi người dùng chơi game, có chứa một câu đố để hiển thị cho người dùng chọn chơi
Trang 126 Biểu đồ trạng thái ( StateChart Diagrams )
Hình 6: Biểu đồ trạng thái của hàng ngang ( Row ) khi thực hiện kéo thả
Hình 7: Biểu đồ trạng thái của hàng ngang ( Row ) khi chơi game
Trang 137 Biểu đồ hoạt động ( Activity Diagrams )
Hình 8: Mô tả hoạt động khi người dùng tạo một câu hỏi mới
Hình 9: Mô tả hoạt động khi người dùng tạo một gói câu hỏi mới
Trang 14Hình 10: Mô tả hoạt động khi người dùng chơi game
Trang 15PHẦN 3 : THIẾT KẾ CHI TIẾT VÀ GIẢI PHÁP KỸ THUẬT XÂY DỰNG CÁC LỚP VÀ CHỨC NĂNG CHÍNH CỦA NÓ
- phương thức addWordToList(ArrayList<String>, Cursor): Add các từ từ csdl vào arrayList
- phương thức isInList(String, ArrayList<String>): Từ cho trc có trong arrayList hay ko
- phương thức showDiscardDialog(String, String, String, boolean): Hộp thoại khi thoát game, thoát phần chơi game, thoát phần tạo trò chơi…
9 Lớp Square
a) Mục đích:
- Hiển thị từng chữ cái của hàng ngang Cho phép thay đổi màu theo từng trường hợp sử dụng:
+, Khi chưa active (chưa đc chọn để trả lời) sẽ không hiện chữ cái lên, có màu xanh
Trang 16+, Khi trả lời đúng, hiện tất cả chữ cái
b) Các thuộc tính:
9 rectPaint Paint Style (màu sắc background, letter,…) cho ô
chữc) Các phương thức
- phương thức Square(Context, letter, position)
Tạo ô chữ vs giá trị mặc định:
- colorEdge = white
- ColorBackground = BLUE
- colorLetter = WHITE
- size = height/12
- phương thức getSize(): trả về kích thước ô
- phương thức setSize(int) : đặt kích thước ô
- phương thức getters, setters:
- phương thức onDraw(Canvas) Vẽ ra ô chữ trong ngữ cảnh trò chơi
10 Lớp Row
a) Mục đích:
- Hiển thị toàn bộ từ hàng ngang, chứa các ô chữ
- Có tác dụng kéo thả để tạo game
- Quản lý các ô chữ của nó: hiển thị và đổi màu các ô chữ cùng lúc
b) Các thuộc tính:
2 letterInKeyWord : String Chữ cái trong từ khóa chính
3 squares List<Square> tập hợp các thành phần thuộc lớp Square
4 posOfKeyWord : int Vị trí chữ cái trong từ khóa chính
Trang 175 longClick OnClickListen
er
Tạo hiệu ứng kéo thả
c) Các phương thức
- phương thức Row(Context, String): Khởi tạo Row với mục đích tạo ra một từ hàng ngang mới
- phương thức Row(Context, String, String[]):Khởi tạo Row với mục đích hiển thị để chơi game
- phương thức getNonSpaceWord(): Trả về từ hàng ngang để lưu vào csdl
- phương thức getWordWithSpace(): Trả về từ lưu trong hàng ngang
- phương thức getPosOfKeyWordNonSpace():Vị trí xuất hiện của khóa chính trong hang ngang, để lưu vào database
- phương thức getters setters khác: tương ứng vs các giá trị của thuộc tính
- phương thức guessWord(String): Trả về kêt quả dạng boolean khi đoán hàng ngang
- phương thức onDraw(Canvas) : Vẽ ra hàng chữ trong ngữ cảnh trò chơi
11 Lớp GamePack
a) Mục đích:
- Chứa các hàng ngang, từ khóa chính
- Có khả năng kết thúc game, hiện tất cả các câu trả lời
b) Các thuộc tính:
3 oriWords String[] Mảng các hàng chữ ban đầu để so sánh
khi lưu một gamePackage mới
4 CHAR_KEY_POS int Giá trị vị trí của khóa chính trong hang
ngang mặc định
5 dragListener OnDragListener Tạo hiệu ứng kéo thả
6 points ArrayList<Integer> Offset (vị trí) để kéo thả
- phương thức GamePack(Context, String):Khởi tạo ô chữ để phục vụ phần tạo trò chơi
- phương thức createWordWithSpace(String, int, int): Tạo hàng chữ với dấu cách chìm để tạo thành được cột dọc chứa khóa chính
- phương thức finishGame(): Kết thúc game : hiện tất cả hàng chữ, tổng kết điểm
Trang 18- phương thức guessWord(String): Trả về kêt quả dạng boolean khi đoán
- phương thức canBeSaved(): Kiểm tra xem đã đủ các hàng ngang trong GamePack hay chưa
- phương thức calculatePoints(): Tính offset kéo thả
- phương thức inputHangChu(Row, int, int):Set giá trị cho Row khi kéo thả thành công
- phương thức getters, setters khác:tương ứng với các thuộc tính
12 Lớp GWGCreateMain
a) Mục đích:
- phần chọn keyword và đặt gamename
b) Các thuộc tính:
7 adapterKeyword ArrayAdapter<String> adapterKeyword phục vụ cho
autoComTextViewKeyword
8 adapterTopic ArrayAdapter<String> adapterTopic phục vụ cho
spinner topic
gamename
Trang 1920 buttonClickListenerQna OnClickListener Listener cho buttonqna
21 buttonClickListeneNext OnClickListener Listener cho buttonNext
22 buttonClickListenerKeyWord OnClickListener Listener cho
buttonNewKeyword,refKeyword, suggest
23 buttonClickListener OnClickListener Listener cho button Topic,
1 autoComTextViewRow AutoCompleteText Nhập text cho row,
suggest đc những từ có sẵn trong csdl
gamepackgage
hang ngang
Trang 2012 buttonSuggest Button Nút gợi ý từ hang
ngang
hang ngang
sau khi tạo xong
cho hang ngang (answermới)
hàng ngang
ngang
19 buttonClickListenerOk OnClickListener Listener cho nút ok
20 buttonClickListenerRow OnClickListener Listener cho nút
- Phương thức onCreate(Bundle): tạo giao diện create game chính
- Phương thức showHideView(ViewGroup, boolean): ẩn và hiện phần tạo hàng ngang
- Phương thức onBackPressed(): Override nút back của android Nhằm tạo dialog người dung có thực sự muốn thoát hay không
Sử dụng phương thức showDiscardDialog(String, String, String, boolean) của ActivityUtility mà nó
Trang 212 editTextHint1 EditText Nhập hint1
7 listTopic ArrrayList<String> List topic
8 adapterTopic ArrayAdapter<String> Adapter cho spinner
topict
10 spinnerListener OnItemSelectedListener Listener cho spinner
lời đc khóa chính
Trang 22dùng cho hang ngang hiện tại
- Phương thức onCreate(Bundle): Giao diện chính của phần chơi game
- Phương thức openGame(String): Mở 1 gói câu hỏi vs keyword cho trc lấy từ csdl
- Phương thức enableDisableView(View, boolean): Enable hay disable layout, button cho trc
- Phương thức refreshScore(): Cập nhật điểm cho người chơi
- Phương thức getPoint(): Tính điểm cho người chơi
- Phương thức showHideView(ViewGroup, boolean): ẩn hay hiện layout cho trc
- Phương thức addHints(String): Lấy ra hints từ answer cho trc Get từ csdl
base
Instance của csdl, nạp csdl tạo ra đc từ onCreate của SQliteOpenHelper vào biến nàyc) Các phương thức
- Phương thức DBAdapter(Context): Ghi đè phương thức trong sqliteOpenHelper để tạo các bảng của Csdl nếu chưa có, và copy csdl dựng sẵn bởi developer vào thư mục csdl mặc định của android
- Phương thức onCreate(SQLiteDatabase): Tạo csdl vs các bảng mới lưu vào db của sqliteDatabase
- Phương thức onUpgrade(SQLiteDâtabase, int , int): Nâng cấp csdl nếu cần, ở đây chỉ là xóa các bảng csdl cũ và create bảng mới
- Phương thức openDatabase(): Mở csdl, vào lưu vào biến db của DBAdapter
- Phương thức createDatabase(): Thực hiện check xem csdl đã có sẵn chưa, nếu chưa thì copy csdl dựng sẵn của dev vào thư mục csdl mặc định của android