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

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

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

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

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

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à

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

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 ý

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.

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

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>();

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() {


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status