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

Bài tập lớn Lập Trình Hướng Đối Tượng Thầy Cao Tuấn Dũng

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 (763.24 KB, 31 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
MÔN: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Đề 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ã đề tài: De05C


Sinh viên thực hiện: Nguyễn Đức Hiếu (Nhóm trưởng)
Phan Quốc Khánh
Trần Vũ Duy
Nhóm sinh viên : Nhóm 2
Lớp : ICT-K56
Giáo viên hướng dẫn : TS. Cao Tuấn Dũng

Hà Nội, tháng 04 năm 2014

Mục lục
MỤC LỤC HÌNH VẼ
~ 2 ~
Lờ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ơn
nhiề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.
~ 3 ~
PHẦ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
~ 4 ~
PHẦ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 : 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.
~ 5 ~
Ngườ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ác
chủ đề 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.
~ 6 ~
II. Biểu đồ trình tự
1. Phần Soạn Câu hỏi
Hình : Biểu đồ trình tự soạn Câu hỏi
~ 7 ~
3. Phần Soạn Câu đố
Hình : Biểu đồ trình tự soạn Câu đố
~ 8 ~
4. Phần Chơi Game
Hình : 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)
~ 9 ~
Câu đố (PackageGame) Gợi ý (hint) Điểm (score)
Chủ đề (Category) Drag&Drop Thời gian (timer)

Soạn thảo (creating) Chơi game (playing) Câu hỏi (question)
Dữ liệu (database)
Các lớp cần tạo trong lập trình :
- PackageGame
- Row
- Square
- Creating
- Playing
- DBAdapter
5. Biểu đồ lớp
- Biểu đồ lớp của các lớp quan trọng :
Hình : 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
~ 10 ~
6. Biểu đồ trạng thái ( StateChart Diagrams )
Hình : Biểu đồ trạng thái của hàng ngang ( Row ) khi thực hiện kéo thả
Hình : Biểu đồ trạng thái của hàng ngang ( Row ) khi chơi game
~ 11 ~
7. Biểu đồ hoạt động ( Activity Diagrams )
Hình : Mô tả hoạt động khi người dùng tạo một câu hỏi mới
Hình : 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 : Mô tả hoạt động khi người dùng chơi game

~ 13 ~
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Ó
I. Chi tiết các lớp
1. Lớp ActivityDatabase
a) Mục đích:
- Mở rộng lớp Activity, giúp tạo ra các giao diện chính khi chơi game + các phương thức kết nối vs
cơ sở dữ liệu
b) Các thuộc tính:
STT Tên thuộc tính Type Ý nghĩa
1 myDb DBAdapter Instance của csdl để kết nối
c) Các phương thức
- phương thức getDB(): Trả lại instance myDb của csdl
- phương thức openDB(): Mở csdl
- phương thức closeDB(): Đóng csdl
- phương thức onDestroy(): Override phương thức onDestroy() của Activity , nhằm đóng csdl tự
động sau khi dùng
8. Lớp ActivityUtility
a) Mục đích:
- Mở rộng lớp ActivityDatabase, giúp tạo ra các giao diện chính khi chơi game + các phương thức
kết nối vs cơ sở dữ liệu + các phương thức tiện ích mà hầu hết mọi phần của game đều cần
b) Các thuộc tính:
STT Tên thuộc tính Type Ý nghĩa
c) Các phương thức
- 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.
+, Khi chọn để trả lời, hiện màu vàng
~ 14 ~
+, Khi trả lời đúng, hiện tất cả chữ cái
b) Các thuộc tính:
STT Tên thuộc tính Type Ý nghĩa
1 letter String Chữ cái hiện lên từng ô
2 color int Màu của ô chữ để thể hiện trạng thái
3 position int Vị trí của chữ cái trong một từ
4 size int Kích thước của ô chữ
5 colorEdge Int colorEdge
6 colorLetter Int colorLetter
7 colorBackground int colorBackground
8 isAppear boolean Chữ cái có xuất hiện hay ko
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:
STT Tên thuộc tính Type Ý nghĩa
1 word :String Từ tạo thành hàng ngang
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
5 longClick OnClickListener Tạo hiệu ứng kéo thả
~ 15 ~
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:
STT Tên thuộc tính Type Ý nghĩa
1 keyword String Từ hàng dọc ( khóa chính )
2 Rows List<Row> Tập hợp các hàng chữ
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ả
c) Các phương thức
- Phương thức GamePack (Context, String): Khởi tạo GamePackage với mục đích tạo ra một gói
game mới
- phương thức GamePack(Context, String, String[], int[], int, int):Khởi tạo GamePack với mục đích
hiển thị để chơi game đã có sẵn
- 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
- phương thức getKeyWord(): Trả về từ hàng dọc ( khóa chính )
- 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ả
~ 16 ~
- 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:
STT Tên thuộc tính Type Ý nghĩa
1 cursorKeyWord Cursor Trỏ đến đầu bảng chứa keyword và
gamename
2 CursorTopic Cursor Trỏ đến đầu bảng chứa topic và
gamename
3 CursorGame Cursor Trỏ đến đầu bảng chứa topic và

gamename
4 listKeyWord ArrayList<String> listKeyWord
5 listTopic ArrayList<String> listTopic
6 listGameName ArrayList<String> listGameName
7 adapterKeyword ArrayAdapter<String> adapterKeyword phục vụ cho
autoComTextViewKeyword
8 adapterTopic ArrayAdapter<String> adapterTopic phục vụ cho spinner
topic
9 spinner Spinner Spinner cho topic
10 editText EditText editText nhập tên game ,
gamename
11 buttonNewTopic Button Tạo topic mới
12 buttonNewKeyword Button Tạo keyword mới
13 buttonRefTopic Button Refresh danh sách topic
14 buttonRefKeyWord Button Refresh danh sách keyword
15 buttonAddQna Button Tạo câu hỏi mới
16 ButtonNext2 Button Chuyển đến giao diện tạo trò chơi
17 buttonSuggest Button Gợi ý danh sách keyword có sẵn
trong csdl
18 suggestPos int Thứ tự của từ đc gợi ý trong csdl
19 spinnerListener OnItemSelectedListener Listener cho spinner topic
20 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, refresh
topic,
~ 17 ~
c) Các phương thức
- Phương thức onCreate(Bundle): hiện ra giao diện cho tạo main, chọn thêm content hay là tạo game

mới trên content có trước
- 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ó
kế thừa
13. Lớp GWGCreateGame
a) Mục đích:
- giao diện kéo thả để tạo gói câu hỏi
b) Các thuộc tính:
STT Tên thuộc tính Type Ý nghĩa
1 autoComTextViewRow AutoCompleteText Nhập text cho row,
suggest đc những từ có sẵn
trong csdl
2 listKeyWord ArrayList<String>
3 adapterKeyWord ArrayAdapter<String>
4 adapterTopic ArrayAdapter<String>
5 adapterRow ArrayAdapter<String> Adapter cho
autocompletextRow
6 keyword String Keyword của game
7 Topic String Tên topic
8 gameName String Tên game
9 layoutLeft LinearLayout Layout cho 1
gamepackgage
10 tabLayout ViewGroup Layout cho phần tạo
hang ngang
11 vTrash View Thùng rác để vứt hang
ngang tạo nhầm
12 buttonSuggest Button Nút gợi ý từ hang ngang
13 buttonOk Button Nút bấm để sinh ra hang
ngang

14 buttonSave Button Lưu gamepackage sau
khi tạo xong
15 buttonRow Button Tạo nội dung mới cho
hang ngang (answer mới)
16 buttonHideTab Button Hiện ra phần tạo hàng
ngang
17 buttonShơwTab Button ẩn phần tạo hang ngang
~ 18 ~
18 Button
19 buttonClickListenerOk OnClickListener Listener cho nút ok
20 buttonClickListenerRow OnClickListener Listener cho nút more
(row)
21 buttonClickListenerRef OnClickListener Listener cho nút refresh
22 buttonClickListenerSuggest OnClickListener Listener cho nút suggest
23 buttonClickListenerSave OnClickListener Listener cho nút save
24 showHideButtonListener OnClickListener Listener cho nút show và
hide
25 delDragListener OnDragListener Listenter cho thùng rác
vtrash
c) Các phương thức
- 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ó
kế thừa
14. Lớp GWGCreateContent
a) Mục đích:
- tạo câu hỏi và trả lời
b) Các thuộc tính:

STT Tên thuộc tính Type Ý nghĩa
1 editTextAnswer EditText Nhập answer
2 editTextHint1 EditText Nhập hint1
3 editTextHint2 EditText Nhập hint2
4 editTextHint3 EditText Nhập hint3
5 editTextNewTopic EditText Nhập tên topic mới
6 spinner spinner Spinner cho topic
7 listTopic ArrrayList<String> List topic
8 adapterTopic ArrayAdapter<String> Adapter cho spinner topict
9 topic String Tên topic
10 spinnerListener OnItemSelectedListener Listener cho spinner topic
11 buttonListener OnClickListener Button để save content
12
~ 19 ~
c) Các phương thức
- Phương thức onCreate(): Giao diện chính của phần them content cho trò chơi ô chữ
15. Lớp GWGPlay
a) Mục đích:
- tiến hành chơi game (đã đc chọn qua layout selectgame)
b) Các thuộc tính:
STT Tên thuộc tính Type Ý nghĩa
1 CurWord Row Hàng ngang đang đc chọn
2 Score Int Điểm hiện tại
3 bonusPoint int Điểm cộng thêm cho việc trả lời đc
khóa chính
4 btnAnswer Button Nút trả lời hang ngang
5 btnGetHints Button Nút them gợi ý
6 btnFinal Button Nút trả lời khóa chính
7 btnHideHints Button Hide view gợi ý
8 btnShowHints Button Show view gợi ý

9 btnHideAnswer Button Hide view trả lời hang ngang
10 btnShowAnswer Button Show view trả lời hang ngang
11 hintLayout ViewGroup Layout cho gợi ý
12 layout View Layout cho trả lời khóa chính
13 hints String[] Các hint của hang ngang hiện tại
14 hintCount int Đếm số hint người chơi đã dùng cho
hang ngang hiện tại
15 isEnd boolean Game đã kết thúc hay chưa
16 buttonAnswerListener OnClickListner Listener cho các nút tương ứng
17 buttonFinalListener OnClickListner Listener cho các nút tương ứng
18 buttonGetHintsListner OnClickListner Listener cho các nút tương ứng
19 touchListener OnClickListner Listener cho các nút tương ứng
20 showHideButtonListener OnClickListener Listener cho các nút tương ứng
c) Các phương thức
- 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
~ 20 ~
- 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
16. Lớp DBAdapter
a) Mục đích: tạo và thao tác (truy vấn, thêm, sửa,…) vs cơ sở dữ liệu
b) Các thuộc tính:
S
TT
Tên thuộc tính Type Ý nghĩa
1 TAG String Tag cho tên của csdl
Context context Ngữ cảnh tạo csdl

db SQLiteDatabas
e
Instance của csdl, nạp csdl tạo ra đc từ onCreate
của SQliteOpenHelper vào biến này
c) 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
- Phương thức copyDatabase(): copy csdl dựng sẵn của dev vào thư mục csdl mặc định của android.
Phục vụ phương thức createDatabase()
- Phương thức checkDatabase(): Thực hiện check xem csdl đã có sẵn chưa. Phục vụ phương thức
createDatabase()
- Phương thức open(): Mở csdl, phục vụ cho các thao tác vs csdl của các phần chơi trong game
- Phương thức close(): Đóng csdl sau khi dùng xong, tránh rò rỉ dữ liệu.
- Phương thức insertContentRow(String, String, String, String): Insert dữ liệu vào 1 hàng của bảng
content
- Phương thức deleteContentRow(): Xóa dữ liệu khỏi 1 hàng của bảng content
- Phương thức getContentRow(String): Lấy ra 1 hàng của csdl vs answer cho trc của bảng content
- Phương thức khác: tương tự 3 phương thức liền trên, nhưng cho các bảng còn lại của csdl
IV. 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
1. Kéo thả hàng chữ
- Problem: 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.

- Solution:
~ 21 ~
+, Hàng ngang chứa các ô chữ
private ArrayList<Square> squares = new ArrayList<Square>();
+, Gói câu hỏi chứa các hàng ngang
private ArrayList<Row> rows = new ArrayList<Row>();
+, Khi người dùng chọn được “keyword” cho game, chương trình khởi tạo gói câu hỏi ( GamePack )
với các hàng ngang chỉ chứa 1 ô chữ xếp với nhau tạo thành từ khóa theo hàng dọc.
public GamePack(Context context, String keyWord, int keyWordID
, String[] wordInRow, int[] wordInRowID,
int[] posOfKeyWord, int posToColumn, int width) {
super(context);
this.keyWord = keyWord;
this.keyWordID = keyWordID;
for (int i = 0; i < keyWord.length(); i++) {
// createWordWithSpace tạo ra các hàng chữ có các dấu cách để căn các ô
trong từ khóa ra giữa màn hình
Row it = new Row(context, createWordWithSpace(
wordInRow[i], posOfKeyWord[i], posToColumn),
wordInRowID[i] );
//do cac thong so dang set default (o constructor Row) nen phai
set lai
it.setPosOfKeyWord(posToColumn);
it.setLetterInKeyWord(keyWord.substring(i, i+1));
it.setColorBGKeyWord(Color.RED);
it.setColorBGRow(Color.BLUE);
it.setAppear(false);
it.setLayoutParams(new LayoutParams(
width * Square.getSize()
, Square.getSize()));

it.setOnDragListener(dragListener);
rows.add(it);
originalWords[i] = it.getNonSpaceWord();
this.addView(it);
}
+, mỗi hàng chữ sẽ được cài “draglistener” với hàm cài đặt mỗi khi thả vào một object nào đó
@Override
public boolean onDrag(View v, DragEvent event) {
switch(event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
dragged_1 = (Row) event.getLocalState();
if (!rows.contains(dragged_1))
dragged_1.setVisibility(View.INVISIBLE);
break;
case DragEvent.ACTION_DRAG_ENTERED:
Log.i("drag", "enter!");
break;
case DragEvent.ACTION_DRAG_EXITED:
Log.i("drag", "exit!");
break;
case DragEvent.ACTION_DROP:
Row target = (Row) v;
~ 22 ~
Row dragged = (Row) event.getLocalState();
// Gets the data from the item.
inputHangChu(target, dragged, event);
break;
}
return true;
}

+, hàm inputHangChu()sẽ được gọi mỗi khi object được thả vào. Hàm calculatePoints() sẽ tính toán các
điểm tương ứng để thả vào thành công (ví dụ: nếu từ đang kéo có vị trí ô thứ 9 giống với ô chữ từ
khóa và từ dài 10 kí tự. Hàm sẽ lưu
CHAR_KEY_POS + dragged.getNonSpaceWord().length() - it.getPosition()
= vị trí ô màu đỏ + chiều dài từ đang kéo - vị trí ô trùng
= 8 + 10 -8
= 10
vào mảng “points”. Khi người dùng thả vào tọa độ từ ( 9* kích thước của ô chữ) đến (11* kích
thước của ô chữ) thì được chấp nhận biến đổi ).
// Tinh toan vi tri co the keo tha, luu vao mang cac diem
// CHAR_KEY_POS vị trí của ô chữ trong khóa, có màu đỏ
private void calculatePoints(Row target, Row dragged, int pos) {
points.clear();
for (Square it : dragged.getSquares()) {
if ( it.getLetter().equalsIgnoreCase(target.getLetterInKeyWord()) &&
it.getPosition() <= CHAR_KEY_POS) {
points.add(CHAR_KEY_POS + dragged.getNonSpaceWord().length() -
it
.getPosition());
}
}
}
Nếu người dùng thả đúng trong phạm vi nhất định, hàng chữ sẽ được đưa vào trong gói câu
đố. Nếu sai vị trí, hàng chữ hiện lại với vị trí cũ. Nếu hàng chữ kéo thả chỉ chứa 1 chữ cái khớp với
từ trong từ khóa thì chương trình sẽ tự động nhận diện và biến đổi hàng chữ trong gói câu hỏi (game
pack). Người dùng sẽ giữ phần cuối của hàng chữ và điều chỉnh sao cho khớp với chữ cái có trong
gói câu hỏi.
private void inputHangChu(Row target, Row dragged, DragEvent event) {
boolean success = false;
float x = event.getX();

int pos = rows.indexOf(target);
calculatePoints(target, dragged, pos);
if (!points.isEmpty()) {
for (Integer it : points) {
// neu vi tri tha vao phu hop hoac chi co 1 vi tri de keo tha
if ((it - 1) * Square.getSize() <= x
&& x <= (it + 1) * Square.getSize() || points.size() == 1) {
StringBuilder b = new StringBuilder();
b.append(dragged.getNonSpaceWord());
for (int i = 0; i < b.toString().length(); i++) {
~ 23 ~
while (b.charAt(i) == ' ')
b.deleteCharAt(i);
}
+, khi thả vào đúng, thực hiện quá trình biến đổi :điều chỉnh từ hàng ngang cho phù
hợp (đúng chữ cái trong từ khóa), sau đó copy dữ liệu từ hàng ngang người dùng thả
vào
StringBuilder a = new StringBuilder();
// Dieu chinh vi tri cho khớp với ô chữ trong khóa
chính
int cInsertSpace = it- b.toString().length();
for (int i = 0; i < cInsertSpace; i++) {
a.append(" ");
}
a.append(b.toString());
String nWord = a.toString();
target.setWord(nWord);
target.setWordID(dragged.getWordID());
ArrayList<Square> squares = new
ArrayList<Square>();

for (int i = 0; i < nWord.length(); i++) {
square = new Square(getContext(),
nWord.substring(i, i + 1), i);
squares.add(square);
}
target.setSquares(squares);
//do cac thong so dang set default (o constructor
Row) nen phai set lai
target.setPosOfKeyWord(CHAR_KEY_POS);
target.setColorBGKeyWord(Color.RED);
target.setColorBGRow(Color.BLUE);
target.invalidate();
dragged.setVisibility(View.GONE);
success = true;
}
}
}
if (!success) {
// neu khong thanh cong, hang chu se hien lai vi tri cu
dragged.setVisibility(View.VISIBLE);
}
}
+, Hàng chữ để kéo thả vào đòi hỏi phải có “setOnLongClickListener(longListen)” nhằm tạo hiệu ứng liên
quan đến kéo thả (ảnh trong quá trình kéo thả, vị trí người dùng chạm màn hình sẽ là phía cuối hàng
chữ )
OnLongClickListener longListen = new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
ClipData data = ClipData.newPlainText("", "");
DragShadow dragShadow = new DragShadow(v);

v.startDrag(data, dragShadow, v, 0);
return false; } };
~ 24 ~
17. Đếm thời gian - Countdown timer
Problem: Muốn tác động vào các component của Android trong thời gian thực, các process mà
người dùng tùy tạo thì không thể truy cập được. Chính vì vậy, cần phải qua interface
CountDownTimer, tạo một object của class thực thi đầy đủ interface này để tương tác với thành phần
TextView lblTimer để hiển thị thời gian còn lại.
Solution:
// dong ho dem 30s, moi1 tick tuong ung voi 1s
new CountDownTimer(30000, 1000) {
@Override
public void onTick(long milisUntilFinished) {
TextView lblTimer = (TextView)findViewById(R.id.textView_timer);
lblTimer.setText(String.valueOf(milisUntilFinished/1000));
}
@Override
public void onFinish() {
Toast.makeText(getApplicationContext(), "time out!",
Toast.LENGTH_LONG).show();
}
}.start();
18. Xóa từ hàng ngang đã chọn
Khi tạo game mới, người dùng chọn từ và hàng chữ sẽ xuất hiện. Chương trình cho phép
người dùng xóa nếu muốn bằng cách thả vào hình thùng rác.
private View vTrash;
vTrash = (View)findViewById(R.id.image_create_bin);
+, Khi thả vào hình thùng rác hiển thị của hàng chữ sẽ biến mất
vTrash.setOnDragListener(delDragListen);
OnDragListener delDragListen = new OnDragListener() {

@Override
public boolean onDrag(View v, DragEvent event) {
final int action = event.getAction();
switch (action) {
case DragEvent.ACTION_DROP:
// Gets the item containing the dragged data
Row dragged = (Row)event.getLocalState();
// Clear item
dragged.setVisibility(View.GONE);
break;
}
return true;
}
~ 25 ~

×