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 Hoà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 TOÁ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 đ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 giải 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ữ 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ả yêu cầu bài toá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 toá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 thoá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 vuông 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
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ừ khoá người chơi đã tạo ra trước đó Với các từ khoá 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 hoá 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ừ khoá 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ừ khoá đã đượ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ừ khoá key_user trong database vào table*0+. Sau đó các từ hàng ngang có mã số từ khoá 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 Hoà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 toà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