Báo cáo đồ án lập trình win the tetris
Trang 1BÁO CÁO ĐỒ ÁN LẬP
TRÌNH WIN
The Tetris
Giảng viên hướng dẫn: PHAN NGUYỆT MINH
Thành viên tham gia:
- Lê Quang Khải – MSSV: 09520134
- Phạm Đình Thanh Quang – MSSV: 09520227
- Huỳnh Minh Tuấn – MSSV: 09520705
Trang 2MỤC LỤC
MỞ ĐẦU 3
CHƯƠNG 1: GIỚI THIỆU 4
1.1 Trình bày ý tưởng, mục tiêu 4
1.1.1 Bối cảnh 4
1.1.2 Giải pháp 4
1.2 Các chức năng chính 5
1.3 Phân tích yêu cầu 6
CHƯƠNG 2: THIẾT KẾ 7
2.1 Cơ sở dữ liệu 7
2.2 Kiến trúc chương trình 7
2.2.1 Giới thiệu khái quát mô hình MVVM 7
2.2.2 Kiến trúc của trò chơi Tetris dựa trên mô hình MVVM 9
2.2.2.1 Model 9
2.2.2.2 ViewModel 10
2.2.2.3 View 15
CHƯƠNG 3: CÀI ĐẶT VÀ THỬ NGHIỆM 19
3.1 Môi trường 19
3.2 Yêu cầu 19
3.2.1 Phần cứng 19
3.2.1 Phần mềm 19
3.3 Đánh giá 19
CHƯƠNG 4: KẾT LUẬN VÀ HƯỚNG MỞ RỘNG 20
4.1 Kết luận 20
4.2 Hướng mở rộng 20
Trang 3MỞ ĐẦU
Nhóm chúng em quyết định chọn đề tài này làm đồ án cho môn lập trình Win của mình được đưa ra vì trong thời gian đăng kí đề tài, 1 thành viên trong nhóm đang xây dựng ứng dụng trên Windows để tham gia cuộc thi ImagineCup 2011 của Microsoft tổ chức (vào đến bán kết) Nhận thấy không đủ thời gian để hoàn thành vừa sản phẩm cho cuộc thi lẫn
đồ án nên chúng em quyết định lấy lại và hoàn thiện thêm ứng dụng đó cho đồ án của mình
Nội dung của ứng dụng này là dựa trên tựa game Tetris (xếp gạch) cổ diển để xây dựng một trò chơi giúp người chơi có thêm hứng thú để học tiếng Anh – loại ngôn ngữ quốc tế rất cần thiết cho học tập và công việc
Xét về tình hình phát triển, ứng dụng ban đầu để tham gia cuộc thi ImagineCup đã hoàn thành cơ bản các yêu cầu đặt ra, tuy nhiên đó chỉ là một ứng dụng WPF (Windows Presentation Foundation) bình thường, cấu trúc lộn xộn, khó nâng cấp, mở rộng và kiểm thử Đến khi phát triển thêm để làm đồ án cho môn lập trình Win, nhóm em quyết định xây dựng lại ứng dụng theo mô hình 3 lớp Model-View-ViewModel (MVVM) của công nghệ WPF Có thể nói nhóm đã hoàn thành tốt mục tiêu đặt ra
Trang 4CHƯƠNG 1: GIỚI THIỆU
1.1 Trình bày ý tưởng, mục tiêu 1
1.1.1 Bối cảnh
Hiện nay, quá trình hội nhập quốc tế đang diễn ra rất mạnh, và một trong số những yêu cầu trong cần thiết đó chính là vấn đề ngôn ngữ Và tiếng Anh là ngôn ngữ phổ biến nhất dùng để giao tiếp giữa các nền văn hóa khác nhau Tuy nhiên, ở một
số nước, trong đó có cả Việt Nam, việc học, sử dụng tiếng Anh vẫn còn là một rào cản khá lớn đối với đa số học sinh, sinh viên cũng như những người đã qua tuổi đi học nhưng lại cần thiết phải biết tiếng Anh để hỗ trợ công việc của mình
Việc thiếu những kĩ năng cơ bản trong việc sử dụng tiếng Anh có thể dẫn tới một
số tác hại không nhỏ Đơn cử như giới học sinh và đặc biệt là sinh viên, việc tìm tòi những kiến thức liên quan đến chuyên ngành của mình là rất quan trọng Và hầu hết những tài liệu hay, chi tiết đều được viết bằng tiếng Anh Do đó, những ai không thể đọc hiểu được những tài liệu này sẽ trở nên thua kém so với những bạn đọc hiểu tốt
Nguyên nhân dẫn đến việc yếu kém về kĩ năng sử dụng tiếng Anh có thể liên quan đến nhiều khía cạnh, có thể vì họ đã mất căn bản từ khi mới bắt đầu học tiếng Anh, một số khác có thể gặp vấn đề về khả năng ngôn ngữ hoặc đơn thuần họ không cảm thấy hứng thú với loại ngôn ngữ quan trọng này Vậy nên, vấn đề đặt
ra ở đây là tìm một phương pháp hỗ trợ việc tự học tiếng Anh thật hiệu quả, tạo hứng thú cao cho người học Những giải pháp để giải quyết vấn đề này không thiếu, nhưng chúng tôi muốn đề cử một giải pháp khác với hi vọng mang lại những tín hiệu tích cực cho thế hệ trẻ trong việc cải thiện vốn tiếng Anh của mình
1.1.2 Giải pháp
Như đã trình bày ở trên, chúng tôi muốn đưa ra giải pháp nhằm tạo cảm hứng cho người học tiếng Anh Ý tưởng của chúng tôi đó là bước đầu xây dựng các trò chơi đơn giản nhưng có thể lồng ghép những cách chơi mới, thông qua đó truyền tải những kiến thức tiếng Anh đến người chơi một cách nhẹ nhàng, hiệu quả Bước đầu tiên, chúng tôi sẽ xây dựng trò chơi xếp gạch – tetris với cách chơi có thêm những cải tiến, đi kèm với việc ứng dụng các công nghệ mạnh mẽ của Microsoft như WPF, NET… để tạo ra giao diện bắt mắt, hấp dẫn Tuy nhiên, chúng tôi muốn khẳng định lại một điều đó là giải pháp của chúng tôi nhắm vào việc tạo cảm hứng cho người học tiếng Anh, không phải là một phương pháp học tiếng Anh mới
1
Nội dung được trích dẫn từ văn bản đề xuất ý tưởng tham gia cuộc thi ImagineCup 2011 – ImagineCup_2011.docx
Trang 51.2 Các chức năng chính
Về nội dung, trò chơi cung cấp 2 chế độ chơi khác riêng biệt cho 2 mục đích khác nhau:
Trò chơi xếp gạch mà chúng tôi đề cập trong phần trình bày ý tưởng là bước đầu tiên trong quá trình thực hiện giải pháp lâu dài mà chúng tôi đã đưa ra Tất nhiên, cách chơi của trò chơi không hề thay đổi Về hình thức, chúng tôi sẽ xây dựng hai chế độ chơi riêng biệt:
Classic mode Trong phần chơi này, người chơi sẽ tham gia vào một game
xếp gạch cổ điển, không có gì thay đổi trong lối chơi Mục đích của chế độ này là giúp người chơi giải tỏa stress, căn thẳng Đây cũng chính là mục đích căn bản của một trò chơi Bên cạnh chế độ chơi đơn, trò chơi còn cung cấp chế độ chơi hai người, qua đó giúp người chơi có thể giải trí hiệu quả hơn khi tham gia thi thố với bạn bè, người thân
Challenge mode Đây chính là điểm nhấn quan trọng nhất trong ý tưởng của
chúng tôi Trong phần chơi này, người chơi hoàn thành các hàng nhanh nhất có thể để làm xuất hiện nội dung câu hỏi dạng trắc nghiệm Lúc này, người chơi có thể có các tùy chọn như bỏ qua hoặc trả lời Nếu bỏ qua, người chơi sẽ bị trừ điểm vì không biết nắm lấy cơ hội của mình Nếu trả lời sẽ có hai trường hợp, trả lời đúng hoặc trả lời sai Tuy nhiên, dù trả lời đúng hay sai, người chơi đều được thưởng điểm vì đã có cố gắng Về độ khó, trong phần chơi này sẽ chia ra làm ba mức độ:
o Easy: các câu hỏi với độ khó ở mức căn bản, phù hợp với trình độ
của người mới học hoặc đã bị mất căn bản từ lâu
o Normal: độ khó của các câu hỏi ở mức bình thường, phù hợp với
giáo trình anh văn của các bạn học sinh cấp trung học phổ thông, trung học cơ sở
o Difficult: mức độ này có độ khó cao nhất Các câu hỏi sẽ nhắm vào
các đối tượng có kiến thức về tiếng Anh nhưng vừa muốn giải trí lại vừa muốn trau dồi thêm kiến thức Nội dung các câu hỏi có thể lấy
từ các tài liệu ôn tập các chứng chỉ anh văn phổ biến như TOELF, TOEIC, IELTS…
Tất nhiên trong chế độ chơi cải tiến này cũng cho phép bạn thi thố cùng với bạn bè, người thân của mình bởi khả năng hỗ trợ chơi 2 người, nhờ đó tăng thêm tính cạnh tranh, hấp dẫn cho trò chơi
Trang 6Trò chơi cung cấp các tính năng save game – lưu lại trạng thái hiện tại của trò chơi, load game – nạp lại phần chơi trước đó, hoặc new game – tạo phần chơi mới
1.3 Phân tích yêu cầu
Trò chơi phải đạt được một số yêu cầu sau:
- Chơi được
- Có chế độ Save và Load ở các phần chơi đơn
- Kết nối được vào cơ sở dữ liệu MS SQL để lấy nội dung câu hỏi
- Đảm bảo xây dựng theo đúng nguyên tắc của mô hình 3 lớp MVVM
- Một số yêu cầu phát sinh trong quá trình xây dựng
Trang 7CHƯƠNG 2: THIẾT KẾ
2.1 Cơ sở dữ liệu
Chương trình sử dụng hệ quản trị cơ sở dữ liệu Microsoft SQL Server Database bao gồm
3 bảng như hình vẽ bên dưới, trong đó bảng Beginner cung cấp nội dung câu hỏi cho mức
độ khó Easy, bảng Mover tương ứng với độ khó Normal và bảng Flyer tương ứng với
Difficult
Thiết kế cơ sở dữ liệu
Về cấu trúc, mỗi bảng đều có số cột và nội dung các cột như nhau:
- idQues: số thứ tự của câu hỏi
- Question: nội dung câu hỏi
- AnswerA, AnswerB, AnswerC và AnswerD: nội dung các đáp án A, B, C và
D
- Result: đáp án chính xác của câu hỏi
- QuestionType: loại câu hỏi Ở đây có 2 loại câu hỏi đó là tìm câu trả lời chính
xác nhất và tìm lỗi sai trong câu cho trước
2.2 Kiến trúc chương trình
2.2.1 Giới thiệu khái quát mô hình MVVM
MVVM là từ viết tắt của Model-View-ViewModel, đây là mô hình 3 lớp này được
áp dụng rộng rãi trong các ứng dụng sử dụng công nghệ WPF (Windows
Presentation Foundation) và Silverlight
Trang 8MVVM Datagram
Trong đó:
Model chính là các thực thể dữ liệu, thông tin mà chúng ta cần phải thao tác
trên ứng dụng của mình Ví dụ như Contact (thông tin liên lạc) với các thuộc tính như số điện thoại, email, địa chỉ nhà… chính là đối tượng mà ta cần thao tác (thêm, xóa, sửa) Các đối tượng này khi đưa vào lập trình chính là các class Một lưu ý đó là model chỉ lưu giữ thông tin mà thôi, nó không quan tâm đến các hoạt động hay dịch vụ có thể thay đổi, điều khiển các thông tin đó Ví dụ như nó không
có trách nhiệm phải định dạng đoạn văn bản hiển thị như thế nào, hay làm sao để lấy một danh sách các item về từ remote server
ViewModel là class định nghĩa cách dữ liệu tương tác với người dùng thông
qua View Nói cách khác ViewModel là model của View Một lưu ý quan trọng đó
Trang 9là ViewModel không mô tả giao diện sẽ trông như thế nào Nó chỉ mô tả cách mà view hoạt động và thông tin nào sẽ được cung cấp cho người dùng ViewModel có thể được xem như là thông dịch viên giữa View và Model vì những thay đổi từ
View lên Model được thực hiện dán tiếp thông qua nó
View là thành phần duy nhất mà người dùng có thể tương tác được trong
chương trình, nó chính là thành phần mô tả dữ liệu Trong WPF, view có thể là một UserControl, Window hay Page, tuy nhiên cần lưu ý mặc dù View chính là UserControl nhưng không nhất thiết UserControl phải là View View thực hiện việc kết nối dữ liệu đến ViewModel thông qua DataContext của nó
Việc áp dụng pattern này vào lập trình đem lại một số lợi ích cho developer như khả năng tương tác hiệu quả và làm việc với tính độc lập cao hơn giữa designer và coder, khả năng sử dụng lại các components (lợi ích này được thể hiện rất rõ ngay trong đồ án), thiết kế lại giao diện ứng dụng mà không cần hoặc chỉ cần thay đổi một tí về code Một lợi ích lớn nữa của MVVM pattern đó là đơn giản hóa công đoạn Unit Testing
2.2.2 Kiến trúc của trò chơi Tetris dựa trên mô hình MVVM
2.2.2.1 Model
Trong trò chơi Tetris, các đối tượng dữ liệu mà chương trình thao tác được đặt trong folder Model Một số class quan trọng bao gồm:
- PieceType: mỗi khối gạch (chúng em gọi là Piece) trong game được mô
tả bằng một mảng trạng thái 2 chiều có kích thước 5x5 Mỗi viên gạch (block) của khối gạch tương ứng với một phần tử trong mảng Tùy theo giá trị của mảng trạng thái đó để tạo nên hình dạng của một khối gạch nhất định Ở đây
có 7 kiểu khối gạch, mỗi kiểu tương ứng có 4 kiểu xoay khác nhau, vì vậy nên một mảng 4 chiều được dùng để lưu trữ thông tin trạng thái của từng kiểu khối gạch và từng kiểu xoay tương ứng Các fields còn lại như brush là mảng lưu trữ đường dẫn đến hình ảnh của tình viên gạch, mảng 3 chiều initPos lưu trữ vị trí khởi tạo đầu tiên của từng kiểu gạch với các kiểu xoay khác nhau
- GameInfo lưu trữ các thông tin của game như Score, Level, Interval (tốc
độ rơi của khối gạch)… Các phương thức để tính toán số điểm cần thiết để lên level, reset lại các thông tin
- Một số class khác lưu trữ các thông tin dùng để save game, thông tin về highscore…
Trang 102.2.2.2 ViewModel
ClassicSinglePlayerGame:
ClassicSinglePlayerGameViewModel class diagram
ClassicSinglePlayerGameViewModel chính là ViewModel của
ClassicSinglePlayerGame – giao diện của phần chơi đơn mode classic
Là một ViewModel, đối tượng thuộc kiểu này có nhiệm vụ cung cấp các thuộc
tính cho phép View kết nối tới thông qua data binding và hiển thị dữ liệu ra
bên ngoài cho người dùng Class này kế thừa từ class BaseGameViewModel,
trong đó BaseGameViewModel lại kế thừa từ BaseViewModel nên nó sẽ có
thêm một vài phương thức và thuộc tính để quản lí việc lưu, load các tùy chọn
về âm thanh, điều khiển của người chơi Các thuộc tính quan trọng nhất (cũng
là các ViewModel) bao gồm
GameBoard (thuộc kiểu BoardViewModel) Một số fields, properties và
methods chính của class này bao gồm:
o private byte[,] playBoard – mảng 2 chiều kiểu byte (kích thước 20x14) lưu trữ trạng thái của toàn bộ vùng chơi Mỗi cell tương ứng với 1
Trang 11viên gạch sẽ được hiển thị trên màn hình Giá trị 0 tương ứng với vị trí chưa
có viên gạch nào và giá trị khác 0 tương ứng với vị trí đã có gạch
o ObservableCollection<BlockViewModel> InternalBlocks – Đây
là collection lưu trữ DataContext của từng viên gạch (BlockView) sẽ được hiển thị ở vùng chơi Collection này có 20x14 phần tử, mỗi phần tử có kiểu BlockViewModel, những thay đổi đối với collection này sẽ ngay lập tức được hiển thị trên màn hình Lúc khởi tạo, từng phần tử BlockViewModel
sẽ được gán giá trị cho các thuộc tính row, column của nó tương ứng với số hàng, số cột của các đối tượng BlockView sẽ được hiển thị trên grid
o Class này có 2 constructor, một constructor mặc định dùng để khởi tạo đối tượng mới hoàn toàn, constructor còn lại dùng để khởi tạo đối tượng mới dựa trên dữ liệu đã có sẵn
o public void SetBoard(PieceControl piece) – đây là phương thức dùng để thay đổi mảng trạng thái playBoard mỗi khi một khối gạch không thể nào rơi xuống nữa Hàm này đóng vai trò rất quan trọng để biết khi nào thì game over, người chơi vừa ăn được bao nhiêu hàng… Tham số truyền vào chính là khối gạch vừa mới rơi xuống
o public void UpdateBoard(int rows) – Cập nhật lại mảng trạng thái khi có một hay nhiều hàng vừa được lấp đầy
o public int?[][] CheckGameStatus(PieceControl piece) –
Kiểm tra tình trạng hiện tại của game Nếu game over, kết quả trả về null Ngược lại, mảng jagged 2 chiều chứa các phần thử int nullable này sẽ trả về
số hàng mà người chơi vừa ăn được cùng với số thứ tự của hàng đó trong mảng trạng thái
o Cùng một số phương thức khác liên quan đến điều khiển giao diện người chơi (HideBlock, DrawBlock, UpdateVisibility…)
CurrentPiece (thuộc kiểu PieceControl) Đối tượng này có các thuộc tính, phương thức chính sau:
o byte[,] blocks – Mảng 2 chiều kích thước 5x5 lưu trữ trạng thái các viên gạch thuộc khối gạch Hình bên dưới là ví dụ về hình dạng lúc hiển thị
và các giá trị được lưu trong mảng trạng thái
Trang 12o BoardViewModel board – Reference đến đối tượng BoardViewModel
của game để kiểm tra tính hợp lệ khi di chuyển (sang trái, sang phải, rơi xuống)
o Các biến lưu trữ kiểu gạch, kiểu xoay hiện tại của đối tượng
o Constructors
PieceControl(int type, int rotation, BoardViewModel
board) – khởi tạo đối tượng mới, cung cấp các thông tin về kiểu, kiểu xoay và tham chiếu đến GameBoard cho đối tượng đó Từ các thông tin về kiểu và kiểu xoay sẽ xác định được mảng trạng thái tương ứng dựa vào mảng static pType của class PieceType
PieceControl(PieceSaveData savedData, BoardViewModel
board) – khởi tạo đối tượng mới dựa vào thông tin đã được lưu lại trong tham số truyền vào hàm savedData
o Các phương thức di chuyển khối gạch sang trái, phải, rơi xuống
Menu (thuộc kiểu DynamicMenuViewModel) Đối tượng này dùng để quản lí menu bên trái trên giao diện của người chơi (hiện ra khi nhấn Escape) Các thuộc tính quan trọng bao gồm:
o ObservableCollection<CustomButtonViewModel> ButtonList –
Danh sách các Button sẽ được hiển thị trên Menu Ứng với mỗi đối tượng CustomButtonViewModel được add vào danh sách sẽ có một Button được hiển thị Giao diện của mỗi button được quy định bằng thuộc tính Type
o ObservableCollection<KeyBoardSettingControlViewModel> KeySettings – Danh sách các đối tượng KeyBoardSettingControl (là View của KeyBoardSettingControlViewModel) sẽ được hiển thị trong phần
lập về control của người chơi trong game Trong đó các phím bấm điều khiển sẽ được lưu trữ bằng một collection loại Dictionary Ở đây vì