Tải bản đầy đủ (.docx) (21 trang)

BTL DHMT

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 (844.98 KB, 21 trang )

TRƯỜNG ĐẠI HỌC HỒNG ĐỨC
KHOA: CNTT & TT

BÀI TIỂU LUẬN
HỌC PHẦN: ĐỒ HỌA MÁY TÍNH
ĐỀ TÀI: “LẬP TRÌNH GAME CONSOLE XE TRÁNH VẬT CẢN
BẰNG NGÔN NGỮ C++”

Họ và tên: Đỗ Viết Vũ
Mã sinh viên: 1561030049
Lớp: K18-ĐHCNTT
Giáo viên HD: Lê Thị Hồng

Thanh Hóa, tháng 11, năm 2017

1


MỤC LỤC

2


Lời nói đầu

Kĩ thuật đồ họa không thể thiếu trong các ngành khoa học kĩ thuật, giáo dục,
nghệ thuật, giải trí, quảng cáo (để diễn đạt máy móc thiết bị, kiến trúc, hình ảnh
minh họa…). Chính vì vậy, đồ họa là một vấn đề được quan tâm trong ngành công
nghệ thông tin.
Cùng với sự phát triển của tin học, kĩ thuật đồ họa trên máy vi tính càng trở
nên tinh xảo. Giao diện các phần mềm càng trở nên thân thiện, đẹp mắt nhờ các thể


hiện đồ họa. Sự hỗ trợ của tin học cho các ngành khác trở nên đắc lực hơn nhờ khả
năng đồ họa vi tính. Và thế giới thực được biểu hiện một cách sinh động, linh hoạt,
đầy màu sắc, bằng không gian ba chiều.
Trong thành công của kĩ thuật đồ họa ngày nay không thể không nói đến sự
phát triển vượt bậc của tốc độ phần cứng và hệ điều hành. Nhưng bản thân kĩ thuật
đồ họa thì các bước tiến nhảy vọt từ những phép tính toán học phức tạp đến những
thư viện đồ họa tạo sẳn. Các thư viện này được phép giảm nhẹ thời gian và công
sức của người lập trình.
Mục đích của bài tập lớn này là tìm hiểu về các hàm cơ bản trong lập trình
game console và đồng thời tạo một game console bằng ngôn ngữ C++.

3


I.
Cơ sở lí thuyết
1. Giới thiệu ngôn ngữ C++
- C++ là một ngôn ngữ lập trình bậc trung. Có thể sử dụng ngôn ngữ C++ để

2.
-

phát triển những ứng dụng bậc cao và những phương trình bậc thấp hoạt động
tốt trên phần cứng.
C++ là ngôn ngữ lập trình hướng đối tượng, hướng cấu trúc.
Chạy được trên nhiều nền tảng khác nhau: windows, Mac Os…
Các thể loại game chơi trên Playstation, Xbox,… được tạo ra từ C++. Có thể
thấy C++ là ngôn ngữ truyền thống trong ngành làm game.
Các sản phẩm phần mềm nổi tiếng được phát triển từ C++ như MS Office,
Photoshop, Auto CAD,…

Struct
Để định nghĩa cấu trúc cần phải sử dụng câu lệnh Struct.
Cú pháp:
Struct [tên_cấu_trúc]
{
Khai báo các thành phần của kiểu;
}[một hoặc nhiều biến cấu trúc];

3. Mảng hai chiều
- Cú pháp:

Typedef <kiểu cơ sở> <tên kiểu> [<N1>][<N2>];
N1, N2 là số phần tử mỗi chiều.
4. Đồ họa máy tính

Sự phát triển của khoa học, kĩ thuật, nghệ thuật, kinh doanh, và công nghệ
luôn luôn phụ thuộc vào khả năng truyền đạt thông tin của chúng ta, hoặc thông
qua các bit dữ liệu lưu trữ trong microchip hoặc thông qua giao tiếp bằng tiếng
nói. Câu châm ngôn từ xa xưa “một hình ảnh có giá trị hơn cả vạn lời” hay
“trăm nghe không bằng một thấy” cho thấy ý nghĩa rất lớn của hình ảnh trong
việc chuyển tải thông tin. Hình ảnh bao giờ cũng được cảm nhận nhanh và dễ
dàng hơn, đặc biệt là trong trường hợp bất đồng về ngôn ngữ. Do đó không có gì
ngạc nhiên khi mà ngay từ khi xuất hiện máy tính, các nhà nghiên cứu đã cố
gắng sử dụng nó để phát sinh các ảnh trên màn hình. Trong suốt gần 50 năm
phát triển của máy tính, khả năng phát sinh hình ảnh bằng máy tính của chúng ta
đã đạt tới mức mà bây giờ hầu như tất cả các máy tính đều có khả năng đồ họa.
Đồ họa máy tính là một trong những lĩnh vực lí thú nhất và phát triển nhanh nhất
của tin học. Ngay từ khi xuất hiện, đồ họa máy tính đã có sức lôi cuốn mãnh liệt,

4



cuốn hút rất nhiều người ở nhiều lĩnh vực khác nhau như khoa học, nghệ thuật,
kinh doanh, quản lí, ... Tính hấp dẫn và đa dạng của đồ họa máy tính có thể được
minh họa rất trực quan thông qua việc khảo sát các ứng dụng của nó.
4.1.
Các thuật toán vẽ đường
a. Thuật toán DDA (Digital Differential Analyzer)
• Tư tưởng thuật toán
Với thuật toán DDA, việc quyết định chọn yi+1 là yi hay yi+1, dựa vào phương
trình y = mx + b của đoạn thẳng . Nghĩa là, ta sẽ tính tọa độ của điểm (x i+1,y) thuộc
về đoạn thẳng thực. Tiếp đó, yi+1 sẽ là giá trị sau khi làm tròn giá trị tung độ y.
y = m (xi+1) + b

Như vậy: yi+1 = Round(y).
Nếu tính trực tiếp giá trị thực y ở mỗi bước từ phương trình y = mx + b thì phải cần
một phép toán nhân và một phép toán cộng số thực. Để cải thiện tốc độ, người ta
tính giá trị thực của y ở mỗi bước theo cách sau để khử phép tính nhân trên số thực.
Nhận xét rằng:
ysau = m (xi+1) + b = m (xi+1) + b
ytruoc = m xi + b
 ysau = ytruoc + m



Lưu đồ thuật toán

5





Cài đặt thuật toán DDA
#define Round(a) int(a+0.5)
int Color = WHITE;
void DDALine1(int x1, int y1, int x2, int y2) {
int x = x1;
float y = y1;
float m = float(y2-y1)/(x2-x1);
putpixel(x, Round(y), Color);
for(int i=x1; ix++;

6


y +=m;
putpixel(x,Round(y), Color);
}
}
b. Thuật toán Bresenham
• Lưu đồ thuật toán Bresenham

7




Cài đặt thuật toán


void LineBres (int x1, int y1, int x2, int y2)
{
int Dx, Dy, p, Const1, Const2;

8


int x, y;
Dx = x2 - x1;
Dy = y2 - y1;
p = 2*Dy - Dx;
Const1 = 2*Dy;
Const2 = 2*(Dy-Dx);
x = x1;
y = y1;
putpixel(x, y, Color);
for(i=x1; i{
if (p<0)
p += Const1;
else
{
p += Const2;
y++;
}
x++;
putpixel(x, y, Color);
}

9



}
4.2.
Thuật toán vẽ đường tròn
• Tư tưởng thuật toán

Do tính đối xứng của đường tròn (C) nên ta chỉ cần vẽ cung (C 1/8) là cung
1/8 đường tròn, sau đó lấy đối xứng. Cung (C 1/8) được mô tả như sau (cung của
phần tô xám trong hình vẽ) :

Như vậy nếu có (x, y) Î (C1/8) thì các điểm : (y, x), (y,-x), (x,-y), (-x,-y), (-y,-x),
(y,x), (-x,y) sẽ thuộc (C). Chọn điểm bắt đầu để vẽ là điểm (0,R). Dựa vào hình vẽ,
nếu (xi, yi) là điểm nguyên đã tìm được ở bước thứ i, thì điểm (xi+1, yi+1) ở bước thứ
(i+1) là sự lựa chọn giữa S và P.
Như vậy :
Tương tự như thuật toán MidPoint vẽ đoạn thẳng, việc quyết định chọn một trong
hai điểm S và P sẽ được thực hiện thông qua việc xét dấu của một hàm nào đó tại
điểm MidPoint là điểm nằm giữa chúng.

Đặt F (x, y) =

10


F(x, y) =
Xét:
-

Nếu , điểm MidPoint nằm trong đường tròn. Lúc này điểm thực Q gần S hơn

nên ta chọn S, tức là .
Ngược lại, nếu , điểm MidPoint nằm ngoài đường tròn. Lúc này điểm thực Q
gần P hơn nên ta chọn P, tức là .
Mặt khác:
Vậy:



Cài đặt thuật toán
void Put8Pixel(int x, int y)
{
putpixel(x, y, Color);
putpixel(y, x, Color);
putpixel(y, -x, Color);
putpixel(x, -y, Color);
putpixel(-x, -y, Color);
putpixel(-y, -x, Color);
putpixel(-y, x, Color);
putpixel(-x, y, Color);
}
void CircleMidPoint (int R)
{

11


int x, y;
x = 0;
y = R;
Put8Pixel(x, y);

p = 1 - R; // 5/4-R
while (x < y)
{
if (p < 0)
p += 2*x + 3;
else
{
p += 2*(x -y) + 5;
y--;
}
x++;
Put8Pixel(x, y);
}
}
II.
Khảo sát và phân tích
1. Khảo sát
1.1.
Mục đích nghiên cứu
- Áp dụng các hàm cơ bản trong lập trình game console như: hàm di chuyển, tô

màu, thay đổi kích thước khung nhìn, xóa màn hình.

12


1.2.

Áp dụng các thuật toán sử dụng mảng hai chiều để vẽ các đối tượng trong
game console.

Khảo sát

Đề tài: Xây dựng chương trình game xe tránh vật cản bằng ngôn ngữ C++ là
đề tài yêu cầu tìm hiểu và vận dụng các hàm cơ bản trong lập trình game console có
sử dụng mảng hai chiều.
Yêu cầu tư duy và vận dụng chắc chắn các kiến thức cơ bản trong các phép biến
hình, xây dựng đối tượng trong game.

-



1.3.


Khảo sát xe Player:
Có nhiều dạng xe Player, do dùng mảnh hai chiều để đơn giản lựa chọn các kí
tự để thể hiện xe.
Lựa chọn di chuyển xe bằng các phím:
VK_ DOWN: Di chyển lên trên.
VK_UP: di chuyển xuống dưới.
VK_LEFT: di chuyển sang trái.
VK_RIGHT: di chuyển sang phải.
Khảo sát xe Computer:
Thiết lập xe Computer cũng tương tự như xe Player. Thiết lập xe Computer
thành hai loại xe đó là xe Computer tĩnh và xe Computer động.
Xe tĩnh chạy ngẩu nhiên trên đường đua còn xe độg chạy cố định không bị
thay đổi trên đường đua.
Đường đua.
Vẽ đường đua bằng mảng và thể hiện bằng các kí tự. Sau đó dùng hàm

textcolor tô màu lên các kí tự và cuối cùng xóa các kí tự ẩn đó đi.
Đối tượng nghiên cứu
Nghiên cứu trên nền tảng ngôn ngữ C++ và xây dựng đối tượng trên mảng hai
chiều.

• Đối tượng chủ yếu nghiên cứu đó là game console xe tránh vật cản.
2. Phân tích
II.1.
Xây dựng trên không gian hai chiều

Để thể hiện được hình vẽ trên mặt phẳng tọa độ trước tiên ta xây dựng trên không
gian 2 chiều.
a.



b.

Xây dựng công cụ chuyển đổi hệ quan sát
Xây dựng của sổ.
Xây dựng khung nhìn.
Các công cụ: di chuyển, tô màu, xóa màn hình…
Mục đích

13



c.




II.2.

Mô phỏng kí tự, hình vẽ,… trong không gian hai chiều lên màn hình.
Xây dựng không gian hai chiều
Khai váo các biến như: x, y, k, diem, xu,…
Xây dựng các công cụ phụ trợ
void resizeConsole(int width, int height).
void textcolor(int x).
void gotoxy(int x,int y).
void XoaManHinh().
Xây dựng các hàm đồ họa
void VeDuongDua1().
void VeDuongDua2().
void InDuongDua().
void VeXePlayer(int x, int y).
void VeXeChuongNgaiVat(int x, int y).
void VeTien(int x, int y).
void DiChuyenXe(int &x, int &y).
Các bước làm game console xe tránh vật cản

Trong game console xe tránh vật cản xây dựng 4 đối tượng: đường đua, xe
Player, xe Computer và vật phẩm. Ta thấy xe Player, xe Computer và vật phẩm đều
nằm trong phạm vi đường đua. Vậy các bước xây dựng game console xe tránh vật
cản tuân thủ theo các bước sau:
III.
1.




Bước 1: Tạo đường đua (mảng 2 chiều chứa các ký tự).
Bước 2: Tạo hiệu ứng đường đua chạy.
Bước 3: Tạo xe Player.
Bước 4: Di chuyển xe Player.
Bước 5: Tạo xe chướng ngại vật ngẫu nhiên.
Bước 6: Kiểm tra sự đụng độ giữa 2 xe.
Chương trình game console xe tránh vật cản
Thiết kế xe Player
Vẽ xe Player bằng các kí tự, chữ cái.
Hình ảnh xe sau khi vẽ.

14


Code vẽ xe Player.
void VeXePlayer(int x, int y).
{
a[x-1][y] = '^';
a[x+1][y] = '-';
a[x][y] = 'X';
a[x][y - 1] = '|';
a[x][y + 1] = '|';
a[x - 1][y - 1] = 'o';
a[x + 1][y - 1] = 'o';
a[x - 1][y + 1] = 'o';
a[x + 1][y + 1] = 'o';
}
2. Thiết kế xe vật cản và đường đua
2.1 Thiết kế xe vật cản

• Vẽ xe Computer bằng các kí tự, chữ cái.
• Hình ảnh xe sau khi vẽ.


15


Code vẽ xe Computer.
void VeXeChuongNgaiVat(int x, int y)
{
a[x][y] = '!';
a[x][y - 1] = '!';
a[x][y + 1] = '!';
a[x - 1][y - 1] = '!';
a[x + 1][y - 1] = '!';
a[x - 1][y + 1] = '!';
a[x + 1][y + 1] = '!';
}
2.2.
Thiết kế đường đua
• Thiết kế hai đường đua riêng biệt để tạo hiệu ứng cho xe.
• Hình ảnh đường đua sau khi vẽ.


16




Code vẽ đường đua.

void VeDuongDua1()
{
// d0ng= 40, cot= 30
for(int i = 0; i < 40; i++)
{
// gan dong i cot 0
a[i][0] = '|';
// gán dong i, cot 29
a[i][29] = '|';
if(i % 2 == 0)
{
a[i][14] = '|';
}
for(int j = 1; j < 29 && j != 14; j++)
{
a[i][j] = ' ';
}
}
}
void VeDuongDua2()
{
// dong=40, cot= 30
for(int i = 0; i < 40; i++)
{
a[i][0] = '|';
a[i][30] = '|';

17



if(i % 2 != 0)
{
a[i][14] = '|';
}
for(int j = 1; j < 29 && j != 14; j++)
{
a[i][j] = ' ';
}
}
}
3. Demo
III.1.
Bắt đầu game
• Sử dụng menu và chọn phím chức năng.

Phím 2: chơi ngay.
Chọn phím bất kì rồi ENTER hoặc ấn phím ESE thoát ngay.



Demo khi ấn phím bất kì kết hợp với phím Enter hoặc ấn phím ESE.

18


III.2.

Kết thúc game

19



IV.

Kết luận

Sau một thời gian tìm hiểu, nghiên cứu và thực hiện đề tài các yêu cầu chính của
đề tài cơ bản được hoàn tất với các nội dung sau:
1. Ưu điểm
• Xây dựng được chương trình “game xe tránh vật cản” bằng ngôn ngữ C++.
• Chương trình xử lí tương đối nhanh và chính xác.
2. Nhược điểm
• Mặc dù rất cố gắng nhưng trong thời gian ngắn, kinh nghiệm còn hạn chế

nên kết quả còn thiếu sót cần tiếp tục được hoàn thiện để có thể làm thêm
được các yêu cầu phức tạp hơn.
• Chương trình còn nhiều hạn chế như: về vấn đề bắt chuột, menu chưa dẹp,
chưa có tiếng nhạc khi chơi game,…
3. Hướng phát triển
• Xây dựng hoàn thiện các chức năng giúp người sử dụng dễ dàng hơn.

20


• Có thể sử dụng cách làm game như trên để làm một số game tương tự.
Trên đây là kết quả đạt được cũng như còn một số tồn tại, hướng phát triển của đề
tài.

Sinh viên thực hiện.


Đỗ Viết Vũ

TÀI LIỆU THAM KHẢO
[1]. />[2]. />
21



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×