2.1.1.Giới thiệu về gameGame “Đoán Số” của nhóm chúng tôi lấy ý tưởng tưởng từ thuật toán tìm kiếm nhị phân đã được học trong học phần cấu trúc dữ liệu và giải thuật. Nhóm đã tạo một game trên máy tính và viết theo ngôn ngữ C++:•Game đoán số làm game rất phổ biến và áp dụng triệt để thuật toán tìm kiếm nhị phân trong một mảng số nguyên đã sắp xếp sẵn.•Dựa trên nguyên tắc có thứ tự của một mảng các số tự nhiên.•Game thể hiện sự nhanh trí, quá trình suy đoán, lập luận của người chơi.•Game đoán số dựa vào sự phân vùng dữ liệu để đoán giá trị (đoán số) nằm trong vùng nào để thu hẹp lại không gian tìm kiếm và xử lý dữ liệu.2.1.2.Luật chơiRất đơn giản người chơi chỉ cần nghĩ một số trong đầu nhưng bạn hãy trung thực, sau đó bạn hãy trả lời những câu hỏi mà máy tính đặt ra:•Nếu đúng từ bàn phím bạn gõ chữ “y”.•Nếu sai từ bàn phím bạn gõ chữ “n”.Trong khoảng 10 bước đoán của máy thì máy sẽ đoán đúng số bạn nghĩ trong đầu.
Trang 1CHƯƠNG 1: TỔNG QUAN LÝ THUYẾT 2
1.1 LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG (OBJECT ORIENTED PROGRAMMING 2
1.1.1 Sơ lược về lập trình hướng đối tượng 2
1.1.2 Cấu trúc của một chương trình C++ 2
1.2 NHỮNG THUẬT NGỮ CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 3
1.2.1 Lớp (class), đối tượng (object), phương thức (method) 3
1.2.2 Lớp cơ sở (base class), lớp dẫn xuất (derived class) 3
1.2.3 Tính kế thừa (Inheritance) 3
1.2.4 Tính đa hình (Polymorphism) 4
1.3 SƠ LƯỢC VỀ LỚP (CLASS) TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 4
1.3.1 Khái niệm về class 4
1.3.2 Định nghĩa lớp (class) 4
CHƯƠNG 2: GIỚI THIỆU 6
2.1 GIỚI THIỆU CHUNG 6
2.1.1 Giới thiệu về game 6
2.1.2 Luật chơi 6
2.2 MỤC TIÊU 6
CHƯƠNG 3: PHÂN TÍCH THIẾT KẾ CHƯƠNG TRÌNH 7
3.1 TÌM HIỂU BÀI TOÁN TÌM KIẾM NHỊ PHÂN 7
3.2 THUẬT TOÁN GIẢI QUYẾT BÀI TOÁN TÌM KIẾM NHỊ PHÂN 7
3.3 ÁP DỤNG THUẬT TOÁN TÌM KIẾM NHỊ PHÂN CHO GAME 8
3.4 THIẾT KẾ CLASS VÀ CÁC ĐOẠN CODE TRONG CHƯƠNG TRÌNH 8
CHƯƠNG 4: XÂY DỰNG CHƯƠNG TRÌNH 12
4.1 CHƯƠNG TRÌNH HOÀN CHỈNH “GAME ĐOÁN SỐ” 12
4.2 CHƠI THỬ NGHIỆM 14
CHƯƠNG 5: TỔNG KẾT 18
Trang 3LỜI NÓI ĐẦU
Game trên máy tính hay thiết bị trên di động là trò chơi giải trí đang được
ưa chuộng mạnh, nhất là những năm gần đây, khi mà thiết bị di động thôngminh phát triển mạnh Tổng giá trị thị trường game ở Hàn Quốc 9,16 tỷ USD(tương đương 180 ngàn tỷ đồng), và ở Nhật Bản ước tính giá trị đó gấp 7 lần VàViệt Nam là nước có thị trường game khá non trẻ, tuy nhiên Việt Nam cũng bắtđầu hội nhập với một số hãng game lớn đã xuất khẩu game ra thị trường thế giớinhư VinaGame là một ví dụ Ngoài ra, với sự tìm tòi, sáng tạo của các cá nhâncũng đã tự viết một số game từ cơ bản đến phức tạp để đáp ứng nhu cầu của bảnthân cũng như nhu cầu của xã hội
Hiện nay với cường độ làm việc và học tập ngày càng cao thì nhu cầugiảm stress, thư giản đầu óc cũng như nhu cầu giải trí của con người ngày càngđược chú tâm và nâng cao hơn Để đáp ứng yêu cầu, mong muốn của xã hộicũng như tạo ra công cụ giải trí cho con người Nhóm chúng tôi đã lập ra mộtgame nhỏ, đơn giản nhằm đáp ứng yêu cầu đó Game của nhóm chúng tôi thựchiện trên ngôn ngữ lập trình C++ (Ngôn ngữ lập trình hướng đối tượng) và có
tên là “Game đoán số”
Chúng tôi xin trân thành cảm ơn cô Trần Uyên Trang đã hướng dẫn giúp
đỡ chúng tôi trong quá trình học tập và hoàn thành tốt bài tập lớn này Đây là lầnlần đầu tiên nhóm chúng tôi thiết kế, lập trình một game và vì sự hiểu biết, kinhnghiệm còn hạn chế nên chắc chắn chương trình game của chúng tôi khôngtránh khỏi những thiếu sót nhất định Rất mong nhận được ý kiến đóng góp của
cô và các bạn để game của nhóm chúng tôi được hoàn thiện hơn
Chúng tôi xin chân thành cảm ơn!
Trang 4CHƯƠNG 1: TỔNG QUAN LÝ THUYẾT 1.1 Lập trình hướng đối tượng (Object Oriented Programming)
1.1.1 Sơ lược về lập trình hướng đối tượng
- Lập trình hướng đối tượng là ngôn ngữ được xây dựng trên nền tảngcủa lập trình có cấu trúc với sự trừu tượng hóa dữ liệu
- Sự trừu tượng dữ liệu tác động trên các dữ liệu cũng như sự trừu tượnghóa chức năng đã làm trên chức năng Khi sự trừu tượng hóa dữ liệuxảy ra, các cấu trúc dữ liệu và các phần tử có thể được sử dụng màkhông cần được chú ý đến các chi tiết cụ thể mà người ta xây dựng
- Sự thay đổi căn bản ở một chỗ: 1 chương trình hướng đối tượng đượcthiết kế xoay quanh dữ liệu mà ta làm việc trên nó hơn là bản thânchức năng chương trình
- Lập trình hướng đối tượng sẽ liên kết cấu trúc dữ liệu với thao tác theocách mà chúng ta thường nghĩ về thế giới xung quanh đó là: gắn mộthành động cụ thể với một loại đối tượng nào đó
- Lập trình hướng đối tượng cho phép sử dụng các quá trình suy nghĩ vềthế giới quan vào dữ liệu
1.1.2 Cấu trúc của một chương trình C++
(1): [Khai báo thư viện]
(2): [Khai báo các nguyên mẫu hàm của người dùng]
Trang 51.2 Những thuật ngữ của lập trình hướng đối tượng
1.2.1 Lớp (class), đối tượng (object), phương thức (method)
- Lập trình hướng đối tượng cho phép tổ chức dữ liệu theo một cáchtương tự như các nhà sinh học tổ chức các loại thực vật khác nhau.Theo cách nói của lập trình hướng đối tượng thì mỗi loài thực vật đó
sẽ được gọi là 1 lớp (class)
- Một lớp là một bảng mẫu mô tả các thông tin cấu trúc dữ liệu lẫn cáccông việc cụ thể của các phần tử dữ liệu
- Một phần tử mà được khai báo thuộc một 1 lớp gọi là phương thức(Method) và chúng là các hàm duy nhất có thể xử lý dữ liệu của cácđối tượng của lớp đó
- Các cấu trúc dữ liệu dùng để mô tả một lớp thì được gọi là các thuộctính (Properties)
- Mỗi một đối tượng thì có riêng một bản sao các phần tử dữ liệu củalớp
- Các phương thức định nghĩa trong một lớp thì có thể gởi bởi bất kỳmột đối tượng nào Điều này gọi là gởi thông điệp cho đối tượng Cácthông điệp thì chỉ phụ thuộc vào đối tượng nhận, nghĩa là đối tượngnào nhận thông điệp thì mới phải làm theo thông điệp đó
1.2.2 Lớp cơ sở (base class), lớp dẫn xuất (derived class)
- Không giống như các kiểu dữ liệu có sẵn, các lớp có thể sử dụng cáclớp khác làm các viên gạch cho mình
- Một lớp thì có thể dùng để xây dựng một lớp mới Lớp ban đầu thìđược gọi là lớp cơ sở (base class) Còn lớp mới gọi là lớp dẫn xuất(derived class)
1.2.3 Tính kế thừa (Inheritance)
- Đó là khả năng cho phép sử dụng lại lớp đã có sẵn để xây dựng lớpmới như trên đã đề cập
Trang 6- Lớp dẫn suất thì được kế thừa tất cả các thuộc tính (properties) vàphương thức (method) của lớp cơ sở, ngoài ra có thể có các thuộc tínhmới và phương thức mới của riêng nó.
1.2.4 Tính đa hình (Polymorphism)
- Tính đa hình thì dựa trên sự ràng buộc, đó là quá trình buộc, đó là quátrình của một phương thức với một hàm thực sự Khi các phương thứckiểu đa hình được sử dụng, trình biên dịch sẽ không xác định hàm nàotương ứng với phương thức sẽ được gọi Hàm cụ thể nào được gọi làtùy thuộc vào lúc chạy Điều này được gọi là sự ràng buộc muộn, vì nóxảy ra khi chương trình đang thực hiện
- Sự ràng buộc sớm cũng đươc sử dụng cho các phương thức không theokiểu đa hình (còn gọi là phương thức tĩnh) Lúc đó, khi biên dịch thìtrình biên dịch đã biết cụ thể hàm nào được gọi gắn với phương thứcnào
1.3 Sơ lược về lớp (class) trong lập trình hướng đối tượng
1.3.1 Khái niệm về class
- Lớp (class) là khái niệm trung tâm của lập trình hướng đối tượng
- Lớp là sự mở rộng khái niệm cấu trúc (struct) của C và bản ghi(record) của pascal
- Ngoài ra các thành phần dữ liệu như cấu trúc, lớp còn chứa các thànhphần hàm, còn gọi là phương thức (method) hay hàm thành viên(member function)
- Trong phần này sẽ xây dựng các định nghĩa về lớp, phương thức,phạm vi truy nhập, sử dụng các thành phần của lớp, lời gọi các phươngthức
1.3.2 Định nghĩa lớp (class)
- Lớp (class) là nhóm của những đối tượng (objects) có cùng chungthuộc tính (properties) và có những mối quan hệ chung
Trang 7- Thuật ngữ class là được viết tắc từ nhóm từ “class of object”.
- Lớp được định nghĩa như sau:
Class tenlop
{
Private:
//Khai báo các thuộc tính gồm các biến thành phần,
dữ //liệu các biến Và nó không truy xuất ra bên ngoàilớp
Public:
//khai báo các phương thức gồm các hàm//nó truy xuất trong và ngoài lớp
}
Trang 8CHƯƠNG 2: GIỚI THIỆU
2.1 Giới thiệu chung
2.1.1 Giới thiệu về game
- Game “Đoán Số” của nhóm chúng tôi lấy ý tưởng tưởng từ thuật toántìm kiếm nhị phân đã được học trong học phần cấu trúc dữ liệu và giảithuật Nhóm đã tạo một game trên máy tính và viết theo ngôn ngữ C++:
Game đoán số làm game rất phổ biến và áp dụng triệt để thuậttoán tìm kiếm nhị phân trong một mảng số nguyên đã sắp xếpsẵn
Dựa trên nguyên tắc có thứ tự của một mảng các số tự nhiên
Game thể hiện sự nhanh trí, quá trình suy đoán, lập luận củangười chơi
Game đoán số dựa vào sự phân vùng dữ liệu để đoán giá trị(đoán số) nằm trong vùng nào để thu hẹp lại không gian tìmkiếm và xử lý dữ liệu
Trang 9- Game “Đoán Số” dựa trên luật chơi đơn giản, dễ hiểu đáp ứng nhu cầu
về trình độ và phù hợp với lứa tuổi
CHƯƠNG 3: PHÂN TÍCH THIẾT KẾ CHƯƠNG TRÌNH 3.1 Tìm hiểu bài toán tìm kiếm nhị phân
Cho dãy A gồm N số nguyên khác nhau: a1, a2, ,aN và một số nguyên k(gọi tắt là khóa k) Cần biết có hay không chỉ số i (0 ≤ i ≤ N) mà ai = k Nếu
có hãy cho biết chỉ số đó
Xác định bài toán:
Input: Dãy A gồm N số nguyên khác nhau a1, a2, ,aN và số nguyên k; Output: Chỉ số i mà ai = k hoặc thông báo không có phần tử nào của dãy A có giá trị bằng k.
3.2 Thuật toán giải quyết bài toán tìm kiếm nhị phân
Xét bài toán ở một trường hợp đặc biệt của Input đó là dãy A đã được sắp
xếp tăng dần (a 1 < a2 <…< aN) Khi đó ý tưởng thuật toán như sau:
- Vì dãy A là dãy tăng dần, nên ta thu hẹp phạm vi tìm kiếm sau mỗilần so sánh khóa k với phần tử đã chọn
- Ở đây, ta chọn số hạng ở giữa dãy (gọi là aGiua ) để so sánh với khóa k.
Nếu bằng thì ta đưa ra kết quả là chỉ số tìm kiếm là “Giua”, còn
không thì tìm ở dãy các phần tử đứng sau a Giua nếu phần tử a Giua < k hoặc tìm kiếm ở dãy các phần tử đứng trước a Giua nếu phần tử a Giua > k
- Quá trình tiếp tục lặp đi lặp lại như trên với dãy các phần tử đứng
trước hoặc sau cho đến khi tìm thấy khóa k trong dãy A hoặc phạm vi
tìm kiếm (hay dãy phần tử) bằng rỗng (không còn phần tử nào) thì kếtthúc
Thuật toán tìm kiếm nhị phân viết bằng cách liệt kê:
a 1
Trang 10Bước 1: Nhập N, các số hạng a 1, a2, ,aN và khóa k;
Bước 2: Dau 1; Cuoi N;
Bước 3: Giua Dau2Cuoi;
Bước 4: Nếu a Giua = k thì thông báo chỉ số Giua, rồi kết thúc;
Bước 5: Nếu a Giua > k thì đặt Cuoi = Giua – 1 rồi chuyển đến bước 7;
Bước 6: Dau Giua + 1;
Bước 7: Nếu Dau > Cuoi thì thông báo dãy A không có số hạng nào có
giá trị bằng k, rồi kết thúc;
Bước 8: Quay lại bước 3;
3.3 Áp dụng thuật toán tìm kiếm nhị phân cho game
Bước 1: Khởi tạo đối tượng DoanSo gồm một số nguyên n (khoảng
{0,n}) và một phương thức để hiển thị dữ liệu trong quá trình đoán số
Bước 2: Thực thi các phương thức trong đối tượng DoanSo bằng cách áp
dụng đúng theo nguyên tắc của thuật toán tìm kiếm nhị phân
Bước 3: Sử dụng while(true), tức là cứ làm đi (lặp liên tục đi), khi nào
tìm thấy được đúng giá trị thì hãy dừng
Bước 4: Trong source code có sử dụng việc tương tác giữa người dùng và
máy Máy sẽ liên tục hỏi người dùng và người dùng trả lời bằng cáchnhập từ bàn phím y: đồng ý với câu hỏi, n: không đồng ý với câu hỏi Với
n nhập vào, thì số lần mà máy tính hỏi để đoán được số là log2n: Tức là rấtnhỏ
Bước 5: Giả sử n = 1000 thì số lần tối đa mà máy tính hỏi là log21000 gầnbằng 10 Bởi vì 210 > 1000, nên độ phức tạp của thuật toán này rất tốt Ngoài game đoán số này thì với thuật toán tìm kiếm nhị phân có thể dùngcho rất nhiều bài toán khác nữa
3.4 Thiết kế CLASS và các đoạn code trong chương trình
Chương trình được xây dựng với một lớp class DoanSo, trong lớp classDoanSo chứa :
Trang 11- Các thuộc tính của lớp nằm trong phần private chứa một biến n có kiểu int, biến này chỉ truy xuất được trong lớp “class DoanSo” không
truy xuất được bên ngoài lớp
- Các phương thức của lớp thì nằm trong phần public chứa hàm “void hienthi()” và constructor một đối “DoanSo(int n1)”
class DoanSo //Lớp có tên Doanso
{
private: //Là thuộc tính dùng để khai báo biến
int n;
public: //Là phương thức dùng để khai báo các hàm thành phần
void hienthi(); //Hàm thực thi chương trình
DoanSo(int n1); //Constructor 1 đối dùng để khởi tạo giá trị cho biến n (Với n là kích thước dữ liệu vùng tìm kiếm)
cout<<"\t\t\1 TRO CHOI DOAN SO \1"<<endl; // \t: dấu tab
cout<<"\tBan hay nghi mot so be hon "<< n <<endl;
Trang 12cout<<"\tToi se doan khong qua 10 lan de tim ra so ma ban nghi???
<<endl;
cout<<"\tCac ban co muon thu khong?"<<endl;
cout<<"\tHay bat dau di nao > Let's go"<<endl;
cout<<endl<<endl;
int l = 1, r = n; //Khởi tạo giá trị đầu (Dau) và cuối (Cuoi)
char c; //Khai báo biến c có kiểu char (ký tự)
int count = 1; //Khai báo và khởi tạo biến count
do
{
cout<<"Lan doan thu " << count<<endl;
cout<<"So ban dang nghi la " << (l+r)/2 << " phai khong?? {y: yes,n: no}: "; cin>>
if(c == 'y'){
cout<<"*******Minh da doan dung day!*********"<<endl; return;
r = (l+r)/2; //Giá trị cuối (Cuoi) bị thay đổi
}
else
{
Trang 13l = (l+r)/2; //Giá trị đầu (Dau) bị thay đổi
- Cấu tử DoanSo (int n1) có chức năng khởi tạo giá trị cho biến “n”,
trong đó n là kích thước dữ liệu của vùng tìm kiếm
DoanSo (int n1)
{
n = n1;
}
Trang 14CHƯƠNG 4: XÂY DỰNG CHƯƠNG TRÌNH 4.1 Chương trình hoàn chỉnh “Game Đoán Số”
cout<<"\t\t\1 TRO CHOI DOAN SO \1"<<endl;
cout<<"\tBan hay nghi mot so be hon "<< n <<endl;
Trang 15cout<<"\tToi se doan khong qua 10 lan de tim ra so ma ban nghi???
<<endl;
cout<<"\tCac ban co muon thu khong?"<<endl;
cout<<"\tHay bat dau di nao > Let's go"<<endl;
cout<<"Lan doan thu " << count<<endl;
cout<<"So ban dang nghi la " << (l+r)/2 << " phai khong?? {y: yes, n:no}: "; cin>>c;
Trang 16Ví dụ số mà bạn nghĩ cụ thể là số “999”, chúng ta bắt đầu “Game Đoán số”
Giao diện ban đầu của “Game Đoán số”
Trang 17Lần đoán thứ 1:
Số đang nghĩ không phải là 500 nên chúng ta gõ phím “n” và lớn hơn 500 nên khi máy hỏi “Số bạn nghĩ có nhỏ hơn 500 không?” chúng ta gõ phím “n”.
Lần đoán thứ 2:
Trang 18Số đang nghĩ không phải là 750 nên chúng ta gõ phím “n” và lớn hơn 750 nên khi máy hỏi “Số bạn nghĩ có nhỏ hơn 750 không?” chúng ta gõ phím “n”.
Lần đoán thứ 3:
Số đang nghĩ không phải là 875 nên chúng ta gõ phím “n” và lớn hơn 875 nên khi máy hỏi “Số bạn nghĩ có nhỏ hơn 875 không?” chúng ta gõ phím “n”.
Trang 20Lần đoán thứ 6, 7, 8, 9 tương tự cho đến lần đoán thứ 10
Với trình độ hiểu biết; khả năng tìm kiếm, đọc hiểu tài liệu; kỹ năng lậptrình còn hạn chế nên không tránh khỏi những sai sót rất mong nhận được sựthông cảm và đóng góp ý kiến của cô và các bạn để kỹ năng lập trình cũng nhưkinh nghiệm của chúng tôi ngày càng được mở rộng và nâng cao hơn
Nếu có cơ hội tiếp theo, hi vọng rằng phiên bản mới của game sẽ có thêmcác đặc tính mới hơn như:
Trang 21Sửa các lổi hiện có.
Tăng độ lớn của vùng tìm kiếm dữ liệu lên cao hơn
…
Một lần nữa nhóm chúng tôi xin chân thành cảm ơn sự giúp đỡ, hướngdẫn, chỉ bảo tận tình của cô và các bạn để chúng tôi hoàn thành được chươngtrình này
TÀI LIỆU THAM KHẢO
[1] đầu-từ-đâu/
vietnamedev.net/blog/81/game-c-c-cho-newbie-01-lập-trình-game-bắt-[2] moi-bat-dau.757/
http://coronaviet.com/forum/index.php?threads/lap-trinh-game-voi-nguoi-[3] dối-tượng-của-thầy-phạm-van-ất/
//luckypham.wordpress.com/2011/08/16/docgiao-trinh-c-lập-trinh-hướng-[4]
http://diendan.congdongcviet.com/threads/t263::c-cach-su-dung-constructor-va-destructor-trong-cpp.cpp