Tải bản đầy đủ (.pdf) (25 trang)

Bài tập lớn lập trình hướng đối tượng thầy cao tuấn dũng 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ữ

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 (986.81 KB, 25 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: De05A

Sinh viên thực hiện: Nguyễn Huy Đức (Nhóm trưởng)
Phạm Duy Hồn
Giang Tuấn Anh
Dương Tự Cơn
Nhóm sinh viên
: N
Lớp
: ICT-K54
Giáo viên hướng dẫn : TS. Cao Tuấn Dũng
Hà Nội, tháng 04 năm 2012


Mục lục
Lời nói đầu .......................................................................................................................2
PH N : T NG QUAN................................................................................................3
Kiến thức nền tảng phục vụ cho bài toán:....................................................................3
PH N : PH N T CH THI T K M C KI N TR C C A BÀI TỐN ..................3
. Mơ tả yêu cầu bài toán ...........................................................................................3
. Biểu đồ lớp ............................................................................................................4


. Biểu đồ tr nh tự .................................................. Error! Bookmark not defined.
PH N : THI T K CHI TI T VÀ GIẢI PHÁP K THUẬT
Y D NG CÁC
LỚP VÀ CH C N NG CH NH C A N : ...................................................................5
. Mô tả lớp thuộc phần chơi .....................................................................................5
. Mô tả lớp thuộc phần câu đố ..................................................................................6
. Mô tả các giải thuật ................................................................................................7
Phần : Kết luận và đánh giá. .........................................................................................8
Phân cơng cơng việc nhóm: .........................................................................................8
TÀI LIỆU THAM KHẢO .............................................................................................10

2


L

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 đố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 giải các ô chữ hang ngang theo g i và từ đó đốn ơ chữ
khố chính. Chương tr nh đư c viết bởi ngơn ngữ thuần đối tư ng java.
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 đề tài khác.

3


PHẦN 1:
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

PH

2: H

H H

2.1 Mơ tả u cầu bài tốn
Mơ tả trị chơi ơ chữ: Trị chơi ơ chữ gồm có các phần
 Phần : Tạo ô chữ

 Phần cho phép người dùng soạn thảo câu đố. Giao diện soạn thảo là
giao diện đồ h a tương tác người dùng có thể kéo thả d ch các ô chữ
sang trái phải lên hay xuống. Khi d ch chuyển ô mà ko th a m n tạo
khóa th thao tác thả xuống ko có tác dụng
 Phần : Chơi
 Cho phép người dùng ch n câu đố và thực hiện giải đố. Phần chơi đư c
giới hạn về thời gian.

2.2 Biểu đồ lớp

4


CrossWord (Lớp Play)
// Dữ liệu của từng hàng
- question, answer, hint1, hint2: String
- x, y: int
// Đồng hồ và điểm
- Clock, point, totalPoint, ran: int
- qColumn, aColumn: Jbutton
- rowButtonQ, rowButtonA: JButton
- cross: Matrix
- table[13]: Row
+ Crossword()
+ actionPerformed(ActionEvent)
+ aColumnActionPerformed(ActionEvent)
+ qColumnActionPerformed(ActionEvent)
+ q1ActionPerformed(ActionEvent)
+ a1ActionPerformed(ActionEvent)
……………………………………………………………….

+ q12ActionPerformed(ActionEvent)
+ a12ActionPerformed(ActionEvent)
+ selectColumn(Event),
compleColumn(Event),
deselectColunm(Event),
+ selectRow(Event), deselectRow(Event),
completeRow(Event)
+ hintActionPerformed(Event),
resetActionPerformed(Event)
+ OkActionPerformed(Event)
+ okKeyTyped(Event)

Matrix (Lớp matrix)
- Matrix[12][16] : String

1

+ Matrix()
Row (Lớp hàng)

1
1
1
1

1

1

- question, answer, hint1,

hint2 : String
- x, y : int
+ setRow(String, String, String,
String, int, int)
Clock (Lớp đồng hô)
- timeup: boolean
- labelTime: JLabel
- i, j: int
+ Clock(JLabel)
+ Clock(int)
+ Run(), Reset(), timePlay()
Cau_Do(Lớp câu đố)
- butt_Ok : Jbutton
- textfield[4] : TextField
- Cell[10] : int
- label[] : Jlabel[10]
- num_row : int
- ch[10] : char
- count: int
+Cau_Do(int, MouseDrag)
+actionPerformed(ActionEvent)
+ getQuestion()
+ getAnswer()
+ getHint1()
+ getHint2()
+ partSpace(String)
+checkKey(String, int, String, int)

H nh :Biểu đồ lớp mô tả hệ thống


m

Create (Lớp Nhập câu đố)
// Mảng chứa câu hỏi, câu trả lời
- string, answer[10], question[10],
hint1[10], hint2[10]: String
// Biến check điều kiện đi tiếp
- OK, Continue_butt2,
Continue_butt3,
Continue_Key, lock : Boolean
//Ma trận button
- butt[10][10], key[10]: JButton
// Các button trong phần chơi
- butt1, butt2, butt3, butt4, butt5,
butt6: Jbutton
// Tọa độ của các hàng
- x_pos[10], y_pos[10], count_db: int
// Tọa độ của từ khóa
- Cell[10], row, x_key, y_key, x, y: int
+ Create()
+ actionPerformed(ActionEvent)
+ Display(Jbutton, int)
+ mousePressed(MouseEvent)
+ mouseDragged(MouseEvent)
+ setRow(int, char[], int)
+ partSpace(String)


H N 3: H


H
H

H
H

H
H

6


CHƯƠNG 1. II. Sơ đồ UML

7


class new crossw ...
JPanel
MouseMotionListener
MouseListener

JPanel
draw Matrix
~
~
~
~
~
~

+
~
~
~
~
~

Cell: int ([])
ch: char ([]) = new char[10]
ch_temp: char ([]) = new char[1]
ch_temp1: char ([]) = new char[10]
cur_X: int = 0
cur_Y: int = 0
puzzle: CreatePuzzle
start_X: int = 0
start_Y: int = 0
str_tmp: String
x: int ([])
y: int ([])

+
+

drawMatrix(CreatePuzzle, int)
paint(Graphics) : void
+matrix

JFrame
ActionListener
MouseListener

MouseMotionListener

draw Key
MouseDrag

~
~
~
~
~

cur_X: int
cur_Y: int
puzzle: CreatePuzzle
start_X: int
start_Y: int

+
+
+
+
+
+
+
+
+

addMouseMotionListener(drawKey) : void
drawKey(CreatePuzzle)
mouseClicked(MouseEvent) : void

mouseDragged(MouseEvent) : void
mouseEntered(MouseEvent) : void
mouseExited(MouseEvent) : void
mouseMoved(MouseEvent) : void
mousePressed(MouseEvent) : void
mouseReleased(MouseEvent) : void
paint(Graphics) : void
+keyPanel

+puzzle
JFrame
ActionListener
MouseListener
MouseMotionListener
CreatePuzzle
+
~
~
~
~
~
~
~
~
~
+
~
~
~
~

~
~
~
~
+
+
~
+
+
+
+
+
~
~
+
+
+
~
~
~
~
~
~
~
+
+
~
~
+
+

~

answer: String ([]) = new String[10]
butt: JButton ([][]) = new JButton[10][10]
butt1: JButton = new JButton("T á...
butt2: JButton = new JButton("T á...
butt3: JButton = new JButton("OK")
butt4: JButton = new JButton("KEY")
butt5: JButton = new JButton("RESET ")
butt6: JButton = new JButton("Guide")
canDrag: boolean = false
cau_do: Cau_Do
Cell: Integer ([]) = new Integer[10]
cell: int = 0
conn: Connection = null
Continue_butt2: boolean = false
Continue_butt3: boolean = false
Continue_key: boolean = false
count: int = -1
count_db: int = -1
cur_X: int
cur_Y: int
hint1: String ([]) = new String[10]
hint2: String ([]) = new String[10]
key: JButton ([]) = new JButton[10]
keyAnswer: String
keyHint1: String
keyHint2: String
keyPanel: drawKey
keyQuestion: String

lock: boolean = false
mark: int = -1
matrix: drawMatrix
OK: boolean = false
question: String ([]) = new String[10]
row: int = 0
row_temp: int = 0
start_X: int
start_Y: int
string: String = new String()
tmp: int = 0
x: int = 0
x_key: int
x_pos: int ([]) = new int[10]
x_pos1: int = 100
y: int = 0
y_key: int
y_pos: int ([]) = new int[10]
y_pos1: int = 70

+
+
+
+
+
+
+
+
+
+

+
+
+

actionPerformed(ActionEvent) : void
connect_db() : void
CreatePuzzle()
insert_answer(String, String, String, String, int, int) : void
insert_key(String, String, String, String, int, int) : void
main(String[]) : void
mouseClicked(MouseEvent) : void
mouseDragged(MouseEvent) : void
mouseEntered(MouseEvent) : void
mouseExited(MouseEvent) : void
mouseMoved(MouseEvent) : void
mousePressed(MouseEvent) : void
mouseReleased(MouseEvent) : void

~puzzle

-puzzle

+
~
~
~
~
~
~
~

~
~
~
~
~
~
~
~
~
~
+
+
~
~
~
+
+
~
~
~
~
~
~
~
~
~
~
~
~
~

~

answer: String ([]) = new String[10]
butt: JButton ([][]) = new JButton[10][10]
butt1: JButton = new JButton("T á...
butt2: JButton = new JButton("T á...
butt3: JButton = new JButton("OK")
butt4: JButton = new JButton("KEY")
butt5: JButton = new JButton("RESET ")
butt6: JButton = new JButton("Guide")
canDrag: boolean = false
cau_do: Cau_Do
Cell: Integer ([]) = new Integer[10]
conn: Connection = null
Continue_butt2: boolean = false
Continue_butt3: boolean = false
Continue_key: boolean = false
count: int = -1
count_db: int = 0
cur_X: int
cur_Y: int
hint1: String ([]) = new String[10]
hint2: String ([]) = new String[10]
key: JButton ([]) = new JButton[10]
lock: boolean = false
mark: int = -1
OK: boolean = false
question: String ([]) = new String[10]
row: int = 0
row_temp: int = 0

start_X: int
start_Y: int
string: String = new String()
tmp: int = 0
x: int = 0
x_key: int = 17
x_pos: int ([]) = new int[10]
x_pos1: int = 100
y: int = 0
y_key: int = 30
y_pos: int ([]) = new int[10]
y_pos1: int = 70

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+


actionPerformed(ActionEvent) : void
connect_db() : void
Display(JButton, int) : void
insert_answer(String, String, String, String, int, int) : void
insert_key(String, String, String, String, int, int) : void
mouseClicked(MouseEvent) : void
MouseDrag()
mouseDragged(MouseEvent) : void
mouseEntered(MouseEvent) : void
mouseExited(MouseEvent) : void
mouseMoved(MouseEvent) : void
mousePressed(MouseEvent) : void
mouseReleased(MouseEvent) : void
partSpace(String) : char[]
setAnswer() : void
setRow(int, char[], int) : void

~cau_do
JFrame
ActionListener
Cau_Do

~cau_do

~
~
~
~
~
~

~
~

butt_Ok: JButton = new JButton("OK")
Cell: int ([]) = new int[10]
ch: char ([]) = new char[10]
count: int
label: JLabel ([]) = new JLabel[10]
num_row: int
panel: JPanel = new JPanel()
puzzle: CreatePuzzle
textfield: T extField ([]) = new T extField[4]

+
+
+
+
+
+
+
+

actionPerformed(ActionEvent) : void
Cau_Do(int, CreatePuzzle)
checkKey(String, int, String, int) : boolean
getAnswer() : String
getHint1() : String
getHint2() : String
getQuestion() : String
partSpace(String) : char[]


Thread
Matrix

Row

Clock

~

matrix: String ([][]) = new String[12][16]

+

Matrix()
-cross

+
+
~
+

i: int = 0
j: int = 0
lblT ime: JLabel
timeup: boolean

+
+
+

+

Clock(JLabel)
reset() : void
run() : void
T imePlay() : String

~
~
~
~
~
~

answer: String
hint1: String
hint2: String
question: String
x: int
y: int

+

setRow(String, String, String, String, int, int) : void
-table

-clock
javax.swing.JPanel
Crossw ord
-


aColumn: JButton = new JButton("Key")
answer: String
answerT ext: javax.swing.JT extField
aPanel: javax.swing.JPanel
botPanel: javax.swing.JPanel
clock: Clock = null
completed: boolean ([]) = new boolean[13]
conn: Connection = null
count: int
cross: Matrix = new Matrix()
hint: javax.swing.JButton
hint1: String
hint2: String
hintNumber: int
jLabel1: javax.swing.JLabel
jLabel2: javax.swing.JLabel
jScrollPane1: javax.swing.JScrollPane
mainPanel: javax.swing.JPanel
ok: javax.swing.JButton
pLabel: javax.swing.JLabel
point: int = 0
qColumn: JButton = new JButton("Key")
qPanel: javax.swing.JPanel
question: String
questionT ext: javax.swing.JT extArea
ran: Random = new Random()
ranID: int
reset: javax.swing.JButton
rowButtonA: JButton ([]) = new JButton[12]

rowButtonQ: JButton ([]) = new JButton[12]
rowSelected: int
showMatrix: JLabel ([][]) = new JLabel[12][16]
table: Row ([]) = new Row[13]
time: javax.swing.JLabel
topPanel: javax.swing.JPanel
totalPoint: int = 0

+
+
+
+
-

a10ActionPerformed(java.awt.event.ActionEvent) : void
a11ActionPerformed(java.awt.event.ActionEvent) : void
a12ActionPerformed(java.awt.event.ActionEvent) : void
a1ActionPerformed(java.awt.event.ActionEvent) : void
a2ActionPerformed(java.awt.event.ActionEvent) : void
a3ActionPerformed(java.awt.event.ActionEvent) : void
a4ActionPerformed(java.awt.event.ActionEvent) : void
a5ActionPerformed(java.awt.event.ActionEvent) : void
a6ActionPerformed(java.awt.event.ActionEvent) : void
a7ActionPerformed(java.awt.event.ActionEvent) : void
a8ActionPerformed(java.awt.event.ActionEvent) : void
a9ActionPerformed(java.awt.event.ActionEvent) : void
aColumnActionPerformed(java.awt.event.ActionEvent) : void
answerT extKeyPressed(java.awt.event.KeyEvent) : void
compleColumn() : void
compleRow(int) : void

connect_db() : void
Crossword(int)
Crossword()
deselectColunm() : void
deselectRow() : void
hintActionPerformed(java.awt.event.ActionEvent) : void
initComponents() : void
okActionPerformed(java.awt.event.ActionEvent) : void
okKeyT yped(java.awt.event.KeyEvent) : void
print_table(int) : void
print_table_user(int) : void
q10ActionPerformed(java.awt.event.ActionEvent) : void
q11ActionPerformed(java.awt.event.ActionEvent) : void
q12ActionPerformed(java.awt.event.ActionEvent) : void
q1ActionPerformed(java.awt.event.ActionEvent) : void
q2ActionPerformed(java.awt.event.ActionEvent) : void
q3ActionPerformed(java.awt.event.ActionEvent) : void
q4ActionPerformed(java.awt.event.ActionEvent) : void
q5ActionPerformed(java.awt.event.ActionEvent) : void
q6ActionPerformed(java.awt.event.ActionEvent) : void
q7ActionPerformed(java.awt.event.ActionEvent) : void
q8ActionPerformed(java.awt.event.ActionEvent) : void
q9ActionPerformed(java.awt.event.ActionEvent) : void
qColumnActionPerformed(java.awt.event.ActionEvent) : void
resetActionPerformed(java.awt.event.ActionEvent) : void
selectColumn() : void
selectRow(int) : void

GamePlay


-crossword

-

crossword: Crossword = new Crossword(1)
jButtonCreate: javax.swing.JButton
jButtonExit: javax.swing.JButton
jButtonHelp: javax.swing.JButton
jButtonNewgame: javax.swing.JButton
jButtonResume: javax.swing.JButton
jframe: JFrame
jInternalFrame1: javax.swing.JInternalFrame
jLabel1: javax.swing.JLabel
jMenuBar1: javax.swing.JMenuBar
jMenuCreate: javax.swing.JMenuItem
jMenuExit: javax.swing.JMenuItem
jMenuHelp: javax.swing.JMenuItem
jMenuItem1: javax.swing.JMenuItem
jMenuNewGame: javax.swing.JMenu
jMenuResume: javax.swing.JMenuItem

+
+
+
+
-

cretate() : void
GamePlay()
GamePlay(String, GraphicsConfiguration)

GamePlay(GraphicsConfiguration)
help() : void
HelpsActionPerformed(java.awt.event.ActionEv
initComponents() : void
jButtonCreateActionPerformed(java.awt.event.A
jButtonExitActionPerformed(java.awt.event.Acti
jButtonNewgameActionPerformed(java.awt.even
jButtonResumeActionPerformed(java.awt.event
jButtonResumeActionPerformed1(java.awt.even
jMenuExitActionPerformed(java.awt.event.Actio
jMenuHelpActionPerformed(java.awt.event.Acti
jMenuItem1ActionPerformed(java.awt.event.Ac
jMenuNewGameActionPerformed(java.awt.even
jMenuResumeActionPerformed(java.awt.event.
main(String[]) : void
newGame() : void

8


III. Problems and solutions
A. Mơ tả bài tốn
1. Phần chơi
- Khi bắt đầu chơi người chơi chọn chủ đề, dựa vào chủ đề người chơi
chọn thì 1 database tương ứng được kết nối, bắt đầu khởi tạo new
Crossword với tham số truyền vào là topicID(int) và ranID (int).
- Dữ liệu database được load vào table của Crossword bao gồm:
+câu hỏi (String question).
+câu trả lời (String answer).
+gợi ý (String hint1, hint2).

+tọa độ (int x,y).
- Khởi tạo ma trận ô chữ từ table: Sử dụng tọa độ để xác định vị trí
các chữ cái trên ma trận. tách chuỗi (từng chữ cái) phần câu trả lời trong
bảng dữ liệu để lưu vào ma trận.
- Khởi tạo dao diện ô chữ showMatrix: Sử dụng 1 ma trận (mảng 2
chiều) là các JPanel, là 1 ánh xạ từ ma trận crossmatrix.
- Khởi tạo các button chọn câu hỏi va hiển thị câu trả lời tương ứng với ô
chữ:
Các button được lưu vào 1 mảng có độ dài tương ứng với số dịng của ơ
chữ.
- Khi click vào button câu hỏi hàng (cột) tương úng sẽ đổi màu ( dựa
vào dữ liệu của cross), hiển thị câu hỏi trên textarea, thời gian (clock) bắt
đầu chạy (click vào câu hỏi khác clock sẽ reset). Textarea sẽ lấy thông tin
câu hỏi từ question (lưu trữ câu hỏi hiện tại).
- Click vào button hiện câu trả lời thời gian sẽ dừng lại., câu trả lời
được hiển thị lên ô chữ.
- Khi chọn câu hỏi ngươi chơi sẽ nhập câu trả lời vào textfield, người
chơi được trả lời liên tục cho đến khi đúng hoặc hết giờ. Khi người chơi
nhập câu trả lời sau đó nhấn OK (hoặc phím ENTER). Câu trả lời được so
sánh với dữ liệu trong table, nếu đúng người chơi được cộng điểm (200
đối với hàng ngang, 400 đối với cột dọc), người chơi sẽ bị trừ 25% số
điểm của câu hỏi đó với mỗi lần gợi ý (mỗi câu hỏi có tối đa 2 gợi ý).
- Khi chọn câu hỏi câu trả lời của câu hỏi đó được lưu vào 1 String
answer, khi người chơi nhập câu trả lời sẽ so sánh để đưa ra kết quả
đúng hoặc sai. Ngoài ra khi người chơi chọn gợi ý sẽ có 1 biến đếm để
đếm số lần gợi ý và trừ điểm tương úng với số lần gợi ý.
- người chơi muốn chơi lại ô chữ thì ấn vào nút reset, trạng thái ơ chữ
trở về ban đầu.
- Đổi màu ô chữ, điểm, thời gian trở về như ban đầu.



-Khi thốt chương trình người chơi sẽ đc hỏi có lưu lại ơ chữ hay
khơng nếu lưu lại thì các trạng thái của ô chữ sẽ được lưu trong file
save.txt. Các thong số lưu lại bao gồm:
+topicID (chủ đề của ô chữ)
+ranID (id của ô chữ trong database)
+totalPoint (điểm của người chơi)
+iscompletete*+ (là 1 mảng lưu trạng thái từng hàng cột có kiểu
dữ liệu boolean, nếu hàng hay cột đã được giải thì có giá trị true,
cịn khơng sẽ có giá trị false.
- Khi load ơ chữ, chương trình sẽ khởi tạo ô chữ theo topicID và ranID
đã lưu trong file save, sau đó sẽ kiểm tra điểm và các trạng thái của hàng
và cột để nạp vào giao diện.
2. Phần Tạo ô chữ
- Người chơi nhập số lượng hàng đố (số lượng câu đố). Số ô chỉ được
nằm trong khoảng từ 1 đến 10. Nếu khơng nhập gì thì sẽ báo lỗi.
- Nhập số lượng ô cho từng hàng. Số lượng ô cũng chỉ từ 1-10. Nếu
không nhập sẽ báo lỗi.
- Sau khi kết thúc việc nhâp hàng và ô, người dùng có thể kéo thả ô
chữ (lên xuống, trái phải) tới vị trí mong muốn.
- Bắt đầu việc tạo câu đố. Để tạo câu đố, người chơi sẽ phải nhập đầy
đủ 4 thông tin:
+ Câu hỏi
+ Câu trả lời
+ Hint1 và Hint2
- Để chắc chắn rằng người chơi tạo phần câu đố có nghĩa thì chương
trình sẽ kiểm tra tính hợp lệ của câu đố vừa tạo:
+ Đầu tiên nhập từ khóa. Số lượng từ khóa bằng số hàng
+ Nhập từng thông tin cho từng câu đố và check
Chẳng hạn: Nếu từ khóa là “ANH”. Câu đố đang nhập là câu 1

thì vị trí chứa từ khóa của answer*1+ trùng với chữ ‘A’. Nếu ko sẽ
bị báo lỗi.
- Sau khi nhập xong, nhấn OK để kết thúc.
B. Chi tiết các lớp
1. Lớp matrix
a. Mục đích:
Ma trận Cells là một hình vng gồm các ơ, đó là nền để các ơ hàng
chữ chạy trên đó
b. Thuộc tính:

10


S

Thuộc tính

1

start_X

Typ
es
int

2

start_Y

int


tọa độ y lúc nhấp chuột

3

cur_X

int

tọa độ x hiện tại (Lúc kéo chuột)

4

cur_Y

int

tọa độ y hiện tại (Lúc kéo chuột)

5

x[]

int

6

y[]

int


7

Cell[]

int

8

str_tmp

Stri

TT

Mục đích
tọa độ x lúc nhấp chuột

phần tử x[i] chứa tọa độ x của
hàng thứ i
phần tử y[i] chứa tọa độ y của
hàng thứ i
phần tử Cell[i] chứa số lượng ô
chữ trong hàng i
là một xâu kí tự (tạm thời)

ng
9

ch_temp[]


char

là mảng các kí tự được của
str_tmp

c. Cácphương thức
+ Phương thức paint(Graphics g)
* Mục đích:
Vẽ ra ma trận ơ chữ đồng thời vẽ text lên các ô chữ. Ma trận
được cấu tạo gồm có ơ màu xám (ơ chữ ko chứa text), ơ màu vàng
(ơ chữ có chứa text), ơ màu đỏ (ơ chữ thuộc từ khóa)
* Giải pháp:
Để vẽ ma trận các ơ như trên, nhóm đã dùng 2 phương thức
chủ yếu : fillRect() và drawRect().
Để print các kí tự ra các ơ chữ, nhóm sẽ chuyển mỗi string câu
trả lời thành mảng kí tự, sau đó chuyển từng kí tự thành một
chuỗi rồi in ra ô chữ sử dụng phương thức: g2D.drawString()

11


Cụ thể như sau:
for (int i = 0; i < 10; i++) {
// Chuyen string answer thanh mang ki tu
if(i >= puzzle.mark && i < puzzle.mark + puzzle.row)
ch = puzzle.answer[i - puzzle.mark].toCharArray();
for (int j = 0; j < 10; j++) {
// Ve ma tran o
g2d.setColor(Color.GREEN);

g2d.draw3DRect(i * 46, j * 46, 43, 43, true);
// Ve o mau vang
if (j >= puzzle.x_pos[i] / 46 && j < puzzle.x_pos[i] / 46 +
puzzle.Cell[i]) {
ch_temp[0] = ch[j - puzzle.x_pos[i] / 46];
str_tmp = new String(ch_temp);
g2d.setColor(Color.ORANGE);
g2d.fill3DRect(j * 46 + 1, puzzle.y_pos[i] + 1, 42, 42, true);
// Ve chu cho tung hang
g2d.setColor(Color.red);
if(str_tmp.equals("I"))
g2d.drawString(str_tmp, j * 46 + 20, puzzle.y_pos[i] +
28);
else
g2d.drawString(str_tmp, j * 46 + 15, puzzle.y_pos[i] +
28);
// Boi Do tu khoa
if (puzzle.lock == true) {
ch_temp1 = puzzle.keyAnswer.toCharArray();
if (j == puzzle.x_key / 46) {
// Ve O cua tu khoa
g2d.setColor(Color.RED);
g2d.fill3DRect(j * 46 + 1, puzzle.y_pos[i] + 1, 42, 42,
true);
}
// Print chu ra tu khoa
for (int k = puzzle.mark; k < puzzle.row + puzzle.mark;
k++) {
ch_temp[0] = ch_temp1[k - puzzle.mark];
str_tmp = new String(ch_temp);

g2d.setColor(Color.WHITE);

12


g2d.drawString(str_tmp, puzzle.x_key - 2, k * 46 +
28);
}
}
2. Lớp Cau_Do
a. Thuộc tính
S
Tên thuộc
TT
tính
1
Cell
2

Type
int[]

butt_Ok

JButto
n

3

count


int

4

label

JLabel[

Ý nghĩa
Cell[i] chứa số ơ của hàng i
button dùng để kết thúc việc
nhập dữ liệu
Đếm số kí tự có trong một chuỗi
nhãn trên mỗi textField

]
5

num_row

6

textfield

int

số lượng hàng câu đố trong một
ma trận
TextFie

Ô để nhập dữ liệu cho câu hỏi,
ld[]
câu trả lời, hint1 và hint2

b. Mục đích:
Lớp này dùng để cho người dùng tạo câu đố: câu hỏi, câu trả lời,
hint1 và hint2.
c. Phương thức chính:
* actionPerformed(ActionEvent e): tạo sự kiện khi nhấn button OK
* getAnswer(): Lấy câu trả lời từ textField answer.
* getQuestion(): Lấy câu hỏi từ textField question.
* getHint1(): Lấy gợi ý 1 từ textField Hint1.
* getHint2(): Lấy gợi ý 2 từ textField Hint2.
* checkKey(String, int, String, int): Phương thức này sẽ kiểm tra xem
chuỗi answer nhập vào có phù hợp với từ khóa hay khơng. Điều kiện để
phương thức trả về true là kí tự tại vị trí thứ i trong từ khóa phải bằng
trùng với kí tự thứ x_key trong hàng i.
Cụ thể như sau:
public boolean checkKey(String string1, int pos_1, String answer, int
pos_2) {
char[] ch1 = partSpace(string1);
char[] ch2 = partSpace(answer);
if (ch1[pos_1] == ch2[pos_2]) {
return true;
}
return false;
13


}

3. Lớp drawKey
a. Mục đích:
Lớp drawKey tạo ra một panel có chứa khóa. Người dùng có thể
kéo chọn vị trí của khóa theo mong muốn.
b. Thuộc tính:
S
Tên thuộc
Type
Mơ tả
TT
tính
1
cur_X
int
Vị trí tọa độ x của chuột hiện
tại
2
cur_Y
int
Vị trí tọa độ y của chuột hiện
tại
3
int
Vị trí tọa độ x của chuột lúc
start_X
xuât phát
4
start_Y
int
Vị trí tọa độ y của chuột lúc

xuất phát
5
puzzle
CreatePu
Đối tượng puzzle
zzle
c. Các phương thức chính
* mousePressed(): lấy tọa độ của chuột khi nhấp chuột
* paint(): Vẽ hình thìa khóa dựa theo tọa độ hiện thời của khóa
* mouseDrag(): kéo thả chuột
+ Bắt tọa độ của chuột lúc nhấp (start_X) và lúc kéo (cur_X).
+ |cur_X – start_X| >= 35 thì vẽ lại khóa với phương thức repaint()
Solution:
public void mouseDragged(MouseEvent e) {
cur_X = e.getX();
cur_Y = e.getY();
if (start_Y > 30 && start_Y < 60) {
if (start_X >= puzzle.x_key - 20 && start_X <= puzzle.x_key +
30) {
if (puzzle.x_key < 420) {
if (cur_X - start_X >= 35) {
puzzle.x_key += 46;
repaint();
// Swap cur and start x, y
start_X = cur_X;
}

14



}
if (puzzle.x_key >= 23) {
if (cur_X - start_X <= -46) {
puzzle.x_key -= 46;
repaint();
// Swap cur and start x, y
start_X = cur_X;
}
}
}
}
3. Lớp CreatePuzzle
a. Mục đích:
Đây là lớp chính trong phần tạo câu đố. Lớp CreatePuzzle có nhiệm
vụ tạo giao diện cho người dùng khởi tạo ô chữ. Giao diện của một đối
tượng CreatePuzzle gồm có: Panel chứa khóa, panel chứa ô chữ và panel
chứa các button lựa chọn.
b. Thuộc tính
S
Tên
Type
Mô tả
TT
1
Cell
int[]
Cell[i] chứa số lượng ô chữ của hàng thứ i
2
Continue_b
bool

Kiểm tra đk để chọnđược button 2
utt2
ean
3
Continue_b
bool
Kiểm tra đk để chọn được button 3
utt4
ean
4
OK
bool
ean
5
answer
Strin
answer[i] chứa câu trả lời của hàng thứ i
g[]
6
butt1
JBut
Button tạo hàng
ton
7
butt2
JBut
Button tạo câu đố
ton
8
butt3

JBut
Button kết thúc
ton
9
butt4
JBut
Button Reset
ton
9
butt5
JBut
Button Help
ton
1
canDrag
bool
Kiểm tra đk để kéo thả
15


0
1

cau_do

1

ean
Cau
_Do

int

Giao diện cho người dùng nhập dữ liệu về câu
đố

1

count_db

Biến đếm số hàng đã nhập dữ liệu

1

cur_X

int

Tọa độ x hiện tại

1

cur_Y

int

Tọa độ y hiện tại

1

hint1


Strin

hint1[i] chứa từ gợi ý 1 của hàng thứ i

Strin

hint2[i] chứa từ gợi ý 2 của hàng thứ i

Strin

question[i] chứa câu hỏi của hàng thứ i

2
3
4
5

g[]
1

hint2

6

g[]
1

question


7

g[]
1

x_pos

int[]

x_pos[i] chứa tọa độ x của câu đố hàng thứ i

1

y_pos

int[]

y_pos[i] chứa tọa độ y của câu đố hàng thứ i

2

x_key,
y_key

int

Tọa độ x, y của từ khóa

8
9

0

c. Các phương thức chính:
* actionPerformed(ActionEvent e): Lắng nghe sự kiện khi click các
nút
* mousePressed(ActionEvent e): Lấy các tọa độ của chuột khi nhấp
chuột
* mouseDrag(ActionEvent e): Kéo thả các ơ chữ
+ Để có thể kéo ô chữ sang trai hoặc sang phải, ta sẽ bắt tọa
độ start_X và cur_X. Nếu như (cur_X – start_X) >= 35 thì dịch
sang phải bằng cách vẽ lại ma trận ô (repaint).
if (cur_X - start_X >= 35) {
x_pos[i] += 46;
// Ve lai ma tran O
matrix.repaint();
// Swap currrent and starting Co-ordinates
start_X = cur_X;
start_Y = cur_Y;
}
+ Nếu (start_X – cur_X) < -35 thì ơ chữ dịch sang trái.
16


if ((cur_X - start_X <= -35) && (x_pos[i] > 0)) {
x_pos[i] -= 46;
// Ve lai ma tran O
matrix.repaint();
// Swap Cur and Start
start_X = cur_X;
start_Y = cur_Y;

}
+ Để kéo ô lên hoặc xuống, ta sẽ dựa vào tọa độ của start_Y và
cur_Y
+ Nếu (cur_Y - start_Y) >= 43, thì dịch ơ chữ xuống dưới một ô
bằng repaint()
if (y_pos[i] <= 438) {
if (cur_Y - start_Y >= 43) {
int c;
// swap X
c = x_pos[i];
x_pos[i] = x_pos[i + 1];
x_pos[i + 1] = c;
// Swap Cell
c = Cell[i];
Cell[i] = Cell[i + 1];
Cell[i + 1] = c;
// Ve lai ma tran O
matrix.repaint();
// Swap Cur and Start
start_Y = cur_Y;
}
}
+ Nếu (cur_Y – start_Y) <= -43, thì dịch ô chữ lên trên
if (cur_Y - start_Y <= -43) {
int c;
// swap X
c = x_pos[i];
x_pos[i] = x_pos[i - 1];
x_pos[i - 1] = c;
// Swap Cell

c = Cell[i];
Cell[i] = Cell[i - 1];

17


Cell[i - 1] = c;
// Ve lai ma tran O
matrix.repaint();
// Swap Cur and Start
start_Y = cur_Y;
}
}

4. Lớp Row
a. Mục đích:
Là một bản ghi khi nhập dữ liệu từ database, dữ liệu từ database
sẽ được lưu vào mảng table*+, với mỗi phần tử là lớp Row.
b. Thuộc tính
S
Thuộc
Typ
Mơ tả
TT
tính
e
1
question
Stri
Dùng để lưu câu hỏi

ng
2
answer
Stri
Dùng để lưu câu trả lời
ng
3
hint1
Stri
Dùng để lưu gợi ý 1
ng
4
hint2
Stri
Dùng để lưu gợi ý 2
ng
5
x
int
Lưu tọa độ x của hàng câu đố
6
y
int
Lưu tọa độ y của hàng câu đố
c. Phương thức
* setRow(String, String, String, String, int, int): Thiết lập dữ liệu cho
hàng
5. Lớp Matrix
a. Mục đích
là ma trận ô chữ được tạo nên từ dữ liệu trong table*+

b. Thuộc tính
* Matrix*+*+: mảng 2 chiều kiểu String.
c. Phương thức
* Matrix(): Khởi tạo ma trận string, thiết lập tất cả các phần tử có giá
trị là “a”.
6. Lớp Clock (thừa kế lớp Thread)
18


a. Mục đích
Là đồng hồ đếm thời gian khi giải ơ chữ
b. Thuộc tính
S
TT
1
2
3
4

Thuộc
tính
timeLeft
timePass
label
end

Type
int
int
Jlabel

boole

Mơ tả
Thời gian cịn lại
Thời gian đã chạy
Hiển thị thời gian
Kiểm tra đã hết thời gian chưa

an
c. Phương thức
* start(): Bắt đầu đếm thời gian. Sử dụng hàm sleep của Thread của
java là đồng
hồ tính thời gian. Cứ mỗi lần sleep
1 giây thì biến đếm giảm đi 1 cho đến khi biến đếm về 0.
* stop(): Dừng thời gian. Sử dụng hàm stop() có sẵn trong Thread,
khi ngừng hàm run() thì biến đếm sẽ ngừng lại.
* reset(): Khôi phục lại thời gian bằng cách khởi tạo lại biến đếm về
giá trị ban đầu.
7. Lớp CrossWord
a. Mô tả
Lớp này được thừa kế từ lớp Jpanel của java. Đây là lớp chính trong
phần game
Play.
b. Thuộc tính
S
Thuộc
Type
Mơ tả
TT
tính

1
conn
Conne
Dùng để kết nỗi với database
ction
2
ran
rando
Chọn ngẫu nhiên ô chữ trong dâtbase
m
3
ranID
int
ID của ô chữ được chọn
4
table
Row[]
Mảng gồm nhiều Row, dùng để lưu dữ liệu
5
toatalPoin
int
Tổng số điểm của người chơi
t
6
answer
String
Lưu câu trả lời hiện tại
7
question
String

Lưu câu hỏi hiện tại
8
buttons
butto
Dùng để hiện thị câu hỏi, câu trả lời và gợi
n[]
ý, chơi lại ô chữ
9
textField_
textFil
Dùng để hiển thị câu hỏi, gợi ý và câu trả
19


ed
1
0

showMatr
ix

lời
JLabel

Hiển thị ô chữ lên giao diện

[]

c. Phương thức
* selectRow(int row): Lựa chọn ô cần trả lời. Đổi màu ô chọn dựa vào tọa

độ.
Solution:
private void selectColumn() {
hint.setEnabled(true);
deselectRow();
qColumn.setEnabled(false);
hintNumber = 0;
this.rowSelected = 13;
this.question = table[0].question;
this.answer = table[0].answer.toUpperCase();
this.hint1 = table[0].hint1;
this.hint2 = table[0].hint2;
questionText.setText(this.question);
if (!completeted[0]) {
answerText.setText("");
for (int i = 1; i <= table[0].answer.length(); i++) {
showMatrix[i][table[0].x].setBackground(Color.RED);
}
}
if (clock != null) {
clock.stop();
}
clock = new Clock(time);
clock.reset();
clock.start();
}
* deselectRow(): Đổi màu tất cả các hàng như cũ nếu hàng đó chưa
được giải
Solution:
private void deselectRow() {

for (int i = 1; i <= table[0].answer.length(); i++) {
if (!completeted[i]) {

20


for(int j=table[i].x;j{
if (!(j == table[0].x)) {
showMatrix[table[i].y][j].setBackground(Color.YELLOW);
}
}
}
* CompleteRow(int row): Hiện đáp án hàng được chọn
Solution:
void completeRow(int n) {
if ( clock!=null) {
clock.stop();
}
answerText.setText(this.answer);
for (int i = table[n].x; iif (!(i == table[0].x)) {
showMatrix[table[n].y][i].setBackground(Color.ORANGE);
}
showMatrix[table[n].y][i].setText(""+cross.matrix[table[n].y][i]);
}
completeted[n] = true;
rowButtonQ[n - 1].setEnabled(false);
}
8. Phần tạo cơ sở dữ liệu

a. Phần tạo cơ sở dữ liệu:
Gameplay có 3 chủ đề tương ứng cho người chơi lựa chọn:
 Thể thao giải trí
 Văn hố xã hội
 Chủ đề tự chọn
Trong database sẽ có 3 bảng dành cho các từ khố của các chủ đề tương
ứng gồm có:
 Bảng key_question1: dành cho các từ khoá thuộc chủ đề thể
thao giải trí

21


 Bảng key_question2: dành cho các từ khoá thuộc chủ đề
băn hoá xã hội
 Bảng key_user: dành cho các từ khố người chơi đã tạo ra
trước đó
Với các từ khố thuộc bảng key_question1 và key_question2, các từ hảng
ngang để đưa đến từ khoá

đáp án tương ứng sẽ được lưu vào trong bảng

answer trong database. Mỗi từ hàng ngang được lưu trong bảng sẽ có một
keyID là mã số của từ khoá hàng dọc tương ứng.
Tương tự, với các từ khoá thuộc bảng key_user, các từ hàng ngang được
lưu vào bảng answer_key với một keyID là mã số từ khoá hàng dọc tương ứng.

b. Phần chơi:
i.


Phần gameplay

Khi bắt đầu chơi người chơi chọn chủ đề, dựa vào chủ đề người chơi chọn
thì 1 bảng tương ứng trong database sẽ được kết nối, bắt đầu khởi tạo new
Crossword.
Sau đó dữ liệu từ database sẽ được load vào bảng table của crossword. Ở vị
trí hàng thứ “0” ( table*0+) chương trình sẽ load các dữ kiện của từ khoá ở một
trong các bảng từ khoá tương ứng với chủ đề người chơi đã chọn. Sau đó ở các
vị trí tiếp theo ( table*i+ ) sẽ load các dữ kiện của các từ hàng ngang ứng với từ
khoá tương ứng đã chọn.
 Với các chủ đề thể thao giải trí và văn hố xã hội: người chơi
sẽ chọn 1 trong 2 chủ đè tương ứng. Các chủ đề sẽ có một mã số
(topicID). Ứng với mã của từng chủ đề mà chương trình sẽ load
bảng từ khố trong database. Ví dụ: khi người chơi chọn chủ đề
thể thao giải trí với mã topicID trong menu hiện ra tương ứng là 1,
chương trình sẽ tự động load dữ liệu của từ khoá từ trong bảng

22


key_question1 vào table*0+. Sau khi đã load từ khoá, các từ hàng
ngang có mã số từ khố đã được chọn sẽ được load từ trong bảng
answer vào các vị trí table*i+.
 Với chủ đề tự chọn: ứng với mã chủ đề, chương trình sẽ
load dữ liệu trong bảng từ khố key_user trong database vào
table*0+. Sau đó các từ hàng ngang có mã số từ khố tương ứng sẽ
được load từu bảng answer_user vào các vị trí table*i+.
ii.

Phần tạo câu đố


Khi người chơi tạo một câu đố, các dữ liệu của từ khoá của câu đố sẽ
được lưu vào trong bảng key_user. Sau đó một vịng lặp được tạo ứng
với số lượng chữ cái trong từ khoá (số lượng hàng ngang). Khi người
dùng nhập các từ hàng ngang tương ứng cho từ khoá đã được tạo, các
dữ liệu của mỗi từ hàng ngang sẽ được lưu trong các mảng. Sau đó vòng
lặp lân lượt quét các mảng (với mỗi lần lặp, các chỉ số của các mảng
tương ứng sẽ thuộc về một từ hàng ngang tương ứng). Với mỗi lần lặp
như vậy, một từ hàng ngang tương ứng với từ khoá sẽ được lưu vào một
bản ghi trong bảng answer_user với mã từ khoá (keyID) tương ứng.

HẦ 4:





À ĐÁ H

Á

23


- Kết quả đạt đư c: qua quá tr nh làm bài tập lớn nhóm đ cải thiện đư c khá nhiều
tinh thần và k n ng làm việc theo nhóm đồng thời nâng cao r rệt về khả n ng s
dụng ngôn ngữ java vào các ứng dụng khác.
- Khuyết điểm còn tồn tại: tuy b n em đ rất n lực nhưng khơng thể tránh đư c sai
sót một số đoạn gameplay c a phần người chơi kéo thả chưa đư c thể hiện ch nh xác.
Ngoài ra giao diện dành cho người chơi kéo thả tạo ô chữ c ng chưa thân thiện với

người chơi.

 Thảo luận chung để đưa ra đ nh hướng gồm có:
- Phân t ch yêu cầu.
- Thống nhất thuật toán
- Tạo biểu đồ Use Case
- Biểu đồ tr nh tự
 Cá nhân m i người:
1. Nguyễn Huy Đức: code giao diện đồ h a và thuật toán phần dành
cho người chơi kéo thả tạo ơ chữ
2. Phạm Duy Hồn: tạo cơ sở dữ liệu kết nối và truy xuất cơ sở dữ
liệu
3. Giang Tuấn Anh: code giao diện và gameplay phần chơi mới.
4. Dương Tự Côn: code giao diện ch nh
 Kế hoạch làm việc:
Tuần :
- Tạo nhóm và ch n ch đề thực hiện
Tuần -5 :
-

T m hiểu ngôn ngữ java và lập tr nh đồ h a
Phân t ch bài toán
Đưa ra các yêu cầu c a bài toán và thuật toán
Viết các biểu đồ lớp

Tuần -9:
-

Thiết kế giao diện
Ch nh s a thuật toán s dụng trong bài toán


24


Tuần 10-11:
Tuần
-

Ch nh s a giao diện đồ h a
Hoàn thiện chương tr nh và test kiểm soát l i
Test
Viết báo cáo theo đề cương chi tiết
Quay video mô tả hoạt động c a thang máy và các chức n ng c a thang
máy
Ghi đ a CD và in báo cáo mơn h c
Nộp bản tồn bộ chương tr nh và báo cáo

Tuần 3 -15 :
- Bảo vệ đồ án môn h c
- Nghe nhận xét c a thầy và r t ra kinh nghiệm cho bản thân
TÀI LIỆU THAM KHẢO
-

Slide bài giảng cô Nguyễn Th Thu Trang bộ môn Công nghệ phần mềm
ĐHBKHN.

-

Lập tr nh đồ h a trên java D và D nguồn:tailieu.vn


-

Giáo tr nh java sun c a nhóm phát triển phần mềm SSDG

-

Nhiều tài liệu tiếng Việt khác

-

Java™ How to Program SeventhEdition By H. M. Deitel - Deitel &
Associates, Inc., P. J. Deitel - Deitel & Associates, Inc.

25


×