Chúng em xin gửi lời cảm ơn chân thành đến thầy Nguyễn Đình Thái giảng viên Bộ môn Đồ họa máy tính.- trường Đại học Điện Lực người đã tận tình hướng dẫn, chỉ bảo em trong suốt quá trình
Trang 1TRƯỜNG ĐẠI HỌC ĐIỆN LỰC
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO MÔN HỌC
ĐỒ HỌA MÁY TÍNH
Đ TI:
GAME HỨNG BÓNG ĐƠN GIẢN
Giảng viên hướng dẫn : TS.NGUYỄN ĐÌNH THÁI Sinh viên thực hiện : HONG BÍCH DIỆP
TRẦN QUANG ANH NGUYỄN XUÂN HIẾU Ngành : CÔNG NGHỆ THÔNG TIN Chuyên ngành : CÔNG NGHỆ PHẦN MM Lớp : D16CNPM1
Khóa học : 2023-2024
PHIẾU CHẤM ĐIỂM
Hà Nội, ngày 14 tháng 4 năm 2024
Trang 2STT Họ và tên sinh viên Điểm Chữ ký
Giảng viên chấm 1:
Giảng viên chấm 2:
Trang 3LỜI CẢM ƠN
Trong thời gian làm đồ án tốt nghiệp, em đã nhận được nhiều sự giúp
đỡ, đóng góp ý kiến và chỉ bảo nhiệt tình của thầy cô, gia đình và bạn bè Chúng em xin gửi lời cảm ơn chân thành đến thầy Nguyễn Đình Thái giảng viên Bộ môn Đồ họa máy tính.- trường Đại học Điện Lực người đã tận tình hướng dẫn, chỉ bảo em trong suốt quá trình làm báo cáo Em cũng xin chân thành cảm ơn các thầy cô giáo trong trường Đại học Điện Lực nói chung, các thầy cô trong bộ môn nói riêng đã dạy dỗ cho em kiến thức về các môn đại cương cũng như các môn chuyên ngành, giúp em có được cơ
sở lý thuyết vững vàng và tạo điều kiện giúp đỡ em trong suốt quá trình học tập Cuối cùng, chúng em xin chân thành cảm ơn gia đình và bạn bè,
đã luôn tạo điều kiện, quan tâm, giúp đỡ, động viên em trong suốt quá trình học tập và hoàn thành khoá luận tốt nghiệp Với điều kiện thời gian cũng như kinh nghiệm còn hạn chế của nhóm em, báo cáo này không thể tránh được những thiếu sót Chúng em rất mong nhận được sự chỉ bảo, đóng góp
ý kiến của các thầy cô để tôi có điều kiện bổ sung, nâng cao ý thức của mình, phục vụ tốt hơn công tác thực tế sau này
Trang 4MỤC LỤC
LỜI CẢM ƠN
DANH MỤC CÁC HÌNH VẼ, ĐỒ THỊ
MỞ ĐẦU
CHƯƠNG 1: GIỚI THIỆU V MÔ TẢ BI TOÁN THỰC TẾ ĐƯỢC GIẢI QUYẾT
1.1 Tên đề tài : Game đỡ bóng
1.2 Lý do chọn đề tài
1.3 Mô tả bài toán thực tế được giải quyết
1.4 Đặt vấn đề
CHƯƠNG 2: CHI TIẾT CÁC PHƯƠNG PHÁP DÙNG ĐỂ GIẢI QUYẾT BI TOÁN
2.1 Các thuật toán được áp dụng
2.1.1 Thuật toán Sutherland – Hodgman
2.1.2 Thuật toán Cohen – Sutherland
CHƯƠNG 3: CHƯƠNG TRÌNH V THỰC NGHIỆM
3.1 Code game:
3.2 Kết quả
3.2.1 Giao diện chính
3.2.2 Giao diện Game over
KẾT LUẬN
TÀI LIỆU THAM KHẢO
Trang 5DANH MỤC CÁC HÌNH VẼ, ĐỒ THỊ
Hình 2.1: Mô tả thuật toán Cohen-Sutherland………4 Hình 3.1: Giao diện chính………12
over……….13
Trang 6MỞ ĐẦU
Như chúng ta đã thấy trong những năm gần đây sự phát triển vượt bậc về công nghệ đồ họa đã mang lại cho con người chúng ta vô vàn sự tiện nghi, những trải nghiệm mới mẻ, chân thật Vậy đồ họa máy tính là gì: Đồ họa máy tính là phương pháp và công nghệ dùng trong việc chuyển đổi qua lại giữa dữ liệu và hình ảnh bằng máy tính Đồ họa máy tính là một lĩnh vực của khoa học máy tính nghiên cứu về ở toán học, các thuật toán cũng như các kĩ thuật để cho phép tạo, hiển thị và điều khiển hình ảnh trên màn hình máy tính Đồ họa máy tính có liên quan ít nhiều đến một số lĩnh vực khác như đại số, hình học giải tích, hình học họa hình, quang học, và kĩ thuật máy tính, đặc biệt là chế tạo phần cứng (các loại màn hình, các thiết bị xuất, nhập, các vỉ mạch đồ họa ) Là sinh viên khoa Công nghệ thông tin trường Đại học Điện lực,chúng em cũng được tiếp xúc với môn học đồ họa máy tính Với những kiến thức nhóm em đã được học và được sự hướng dẫn của thầy chúng em đã thực hiện dự án xây dựng game hứng bóng đơn giản ” Trong quá trình thực hiện nghiên cứu chúng em đã
sử dụng thư viện đồ họa openGL đang được sử dụng rộng rãi hiện nay Có lẽ rằng chương trình và báo cáo của chúng em chưa được chuyên nghiệp,hoàn chỉnh nhất, còn có những thiếu xót Vì thế em rất mong thầy cô và các bạn có thể góp ý để nhóm em xây dựng đề đạt kết quả tốt nhất có thể
Trang 7CHƯƠNG 1: GIỚI THIỆU V MÔ TẢ BI TOÁN THỰC TẾ ĐƯỢC
GIẢI QUYẾT 1.1 Tên đề tài : Game đỡ bóng
1.2 Lý do chọn đề tài
Mô tả và giải thích các thuật toán đã được áp dụng tạo nên game trên, qua
đó tìm hiểu sâu hơn về thuật toán và áp dụng cho các mục đích sau này
1.3 Mô tả bài toán thực tế được giải quyết
Trước khi xây dựng tác tử cho trò chơi, chúng ta hãy bắt đầu bằng cách xác định đâu là hướng có thể tiếp cận của thuật toán cho trò chơi này Trước hết ta cần quy khoảng sân trò chơi trong đường đỏ để dễ dàng tính toán chuyển động của quả bóng hợp lý nhất có thể và cũng như để xây dựng chức năng di chuyển của người chơi cũng như để tính điểm người chơi Ở đây, ta sẽ quy định không gian trong khung trò chơi như một độ thị tọa độ hàm số chèn vẽ 1 hình tròn nhỏ
và 1 hình chữ nhật vào với việc cài đặt chức năng mỗi khi thanh chữ nhật sẽ di chuyển trên trục hoành tính toán cũng như hình tròn di chuyển tương ứng của trong khoảng không trục tung tương ứng và di chuyển ngược lại ra sao trong từng thường hợp đụng cột trái hoặc phải và trường hợp đỡ trượt và khi người chơi đỡ trúng bóng
1.4 Đặt vấn đề
Đối tượng nghiên cứu : Nghiên cứu và sử dụng thuật toán xén đa giác trong trò chơi áp dụng các thư viện Glut và Opengl
7
Trang 8CHƯƠNG 2: CHI TIẾT CÁC PHƯƠNG PHÁP DÙNG ĐỂ GIẢI QUYẾT
BI TOÁN 2.1 Các thuật toán được áp dụng
2.1.1 Thuật toán Sutherland – Hodgman
Chúng ta có thể hiệu chỉnh các thuật toán xén đoạn thẳng để xén đa giác bằng cách xem đa giác như là một tập các đoạn thẳng liên tiếp nối với nhau Tuy nhiên, kết quả sau khi xén nhiều khi lại là tập các đoạn thẳng rời nhau Điều chúng ta mong muốn ở đây đó là kết quả sau khi xén phải là một các đa giác để sau này có thể chuyển thành các vùng tô Thuật toán này sẽ tiến hành xén đa giác lần lượt với các biên cửa sổ Đầu tiên, đa giác sẽ được xén dọc theo biên trái của cửa sổ, kết quả sau bước này sẽ được dùng để xén tiếp biên phải, rồi cứ tương tự như vậy cho các biên trên, dưới Sau khi xén hết với bốn biên của cửa sổ, ta được kết quả cuối cùng
2.1.2 Thuật toán Cohen – Sutherland
Đây là một trong những thuật toán ra đời sớm nhất và thông dụng nhất Bằng cách kéo dài các biên của cửa sổ, người ta chia mặt phẳng thành chín vùng gồm cửa sổ và tám vùng xung quanh nó.Một con số 4 bit nhị phân gọi là mã vùng sẽ được gán cho mỗi vùng để mô tả vị trí tương đối của vùng đó so với cửa sổ Bằng cách đánh số từ 1 đến 4 theo thứ tự từ phải qua trái, các bit của mã vùng được dùng theo quy ước sau để chỉ một trong bốn vị trí tương đối của vùng so với cửa sổ bao gồm : trái, phải, trên, dưới
Trang 9Bit 1 : trái (LEFT)
Bit 2 : phải (RIGHT)
Bit 3 : trên (TOP)
Bit 4 : dưới (BOTTOM)
Giá trị 1 tương ứng với vị trí bit nào trong mã vùng sẽ chỉ ra rằng điểm đó ở vị trí tương ứng, ngược lại bit đó sẽ được đặt bằng 0 Ví dụ một vùng có mã là
1001, thì nó sẽ nằm phía dưới (bit 4 bằng 1), bên trái (bit 1 bằng 1) so với cửa sổ, vùng có mã là 0000 chính là cửa sổ
Hình 2.1: Mô tả thuật toán Cohen-Sutherland
9
Trang 10CHƯƠNG 3: CHƯƠNG TRÌNH V THỰC NGHIỆM
3.1 Code game:
-Dưới đây là một số phần code chính của game:
#include<stdio.h>
#include<GL/glut.h>
#include<math.h>
#define pi 3.142857
//Vs c và d se theo dõi lần lượt số lần nút b và n được bấm
//Biến left và right lần lượt là biến di chuyển phía trái và bên phải của người chơi int c = 0, d = 0, left = 0, right = 0;
int m = 0, j = 1, flag1 = 0, l = 1, flag2 = 0, n = 0, score = 0, count = 1;
// hàm myInit tạo ra khung bao quanh trò choi
void myInit (void)
{
//Đầu tiên ta sẽ đổi màu nền sang màu trắng bằng hàm glclear color và đổi màu
vẽ các đối tượng của game thành màu đỏ sử dụng he màu rgb bằng hàm glColor3f
glClearColor(1.0, 1.0, 1.0, 0.0);
glColor3f(1.0f, 0.0f, 0.0f);
//Kéo dài độ dài khung trò chơi 1 khoảng sao cho cách khung màn hình 1 khoảng nhất định bằng các hàm sau
glPointSize(1.0);
Trang 11glLoadIdentity();
//áp dụng thuật toán southeland-hodgeman để xén khung trò chơi vào màn hình cửa sổ một kích thước toạ độ nhất định bằng hàm sau
gluOrtho2D(-620.0, 620.0, -340.0, 340.0);
}
//Hàm lập trình các nút điều khiển trò chơi
void keyboard(unsigned char key, int x, int y)
{
left = -200 + 200 * (d - c);
right = 200 + 200 * (d - c);
if (left == -600)
{
if (key == 110)
d++;
}
else if (right == 600)
{
if (key == 98)
c++;
}
11
Trang 12{
if (key == 98)
c++;
if (key == 110)
d++;
}
glutPostRedisplay();
}
//Hàm hiện trò chơi cũng như sử dụng thuật toán Cohen - Sutherland để chèn bóng vào khung trò chơi hiện màn hình trò chơi
void myDisplay(void)
{
int x, y, k;
for (k = 0; k <= 400; k += 5)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINE_STRIP);
float i = 0;
m = m + 6;
n = n + 4;
while (i <= 2 * pi)
Trang 13y = 12 + 20 * cos(i);
x = 20 * sin(i);
i = i + 0.1;
if (m == 288 && flag1 == 0)
{
j = -1;
m = -288;
flag1 = 1;
score++;
}
if (m == 288 && flag1 == 1)
{
j = 1;
m = -288;
flag1 = 0;
}
if (n == 580 && flag2 == 0)
{
l = -1;
n = -580;
flag2 = 1;
13
Trang 14if (n == 580 && flag2 == 1)
{
l = 1;
n = -580;
flag2 = 0;
}
//Hàm để tính toán đường di chuyển hợp lý nhất cho bóng
glVertex2i((x - l * n), (y - j * m));
}
glEnd();
///hàm tạo cửa sổ trò chơi
glBegin(GL_LINE_LOOP);
glVertex2i(-600, -320);
glVertex2i(-600, 320);
glVertex2i(600, 320);
glVertex2i(600, -320);
glEnd();
// hàm vẽ hình chữ nhật chèn vào cửa sổ trò chơi
glBegin(GL_LINE_LOOP);
left = -200 + 200 * (d - c);
right = 200 + 200 * (d - c);
Trang 15glVertex2i(left, -315);
glVertex2i(left, -295);
glVertex2i(right, -295);
glVertex2i(right, -315);
glEnd();
if ((j * m) == 276)
{
if ((left > ((-1 * l * n) + 20)) || (right < (-1 * l * n) - 20)) {
printf("Game Over !!!\nYour Score is :\t%d\n", score); exit(0);
}
}
glutSwapBuffers();
}
}
int main (int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
//Xác định kích thước cửa sổ cần chèn
glutInitWindowSize(1100, 600);
15
Trang 16// Hàm áp dụng thuật toán Cohen-Sutherland chèn cửa sổ ngay chính giữa màn hình máy tính
glutInitWindowPosition(0, 0);
//Cài tên cửa sổ game
glutCreateWindow("Game");
//goi hàm lập trình thanh điều khiển
glutKeyboardFunc(keyboard);
// goi hàm init và hàm display
myInit();
glutDisplayFunc(myDisplay);
glutMainLoop();
}
Trang 173.2 Kết quả
3.2.1 Giao diện chính
Hình 3.1: Giao diện chính
Trên giao diện chính có các chức năng bao gồm: Màn hình hiển thị của trò chơi Người chơi bắt đầu trò chơi bấm bất kì nút A trên bàn phím để sang trái hay D
để sang phải Với mỗi lần người chơi đỡ bóng thành công thì người chơi sẽ được
2 điểm
17
Trang 183.2.2 Giao diện Game over
Hình 3.2: Giao diện game over
Nếu người chơi thất bại trong việc đỡ bóng thì màn hình game over sẽ hiện ra cùng với số điểm của người chơi đã ghi được
Trang 19KẾT LUẬN
Trong thời gian nghiên cứu và vận dụng những kiến thức đã được trang bị ở nhà trường và các lĩnh vực khác Chúng em đã viết được game đỡ bóng nhằm mục đích giải trí lành mạnh Chúng em hy vọng rằng những khái niệm này là tiền đề giúp chúng em phát triển mạnh hơn về những thể loại game khác chất lượng hơn, hay hơn để phục vụ cho nhu cầu cuộc sống chúng ta.Trong quá trình thực hiện
đề tài, chúng em đã nhận được sự giúp đỡ tận tình của thầy Nguyễn Đình Thái giúp chúng em hoàn thành tốt báo cáo này Vì thời gian làm báo cáo hạn hẹp, kinh nghiệm thực tế chưa nhiều nên báo cáo không tránh khỏi những sai sót, rất mong sự đóng góp của thầy cô và các bạn để chúng em có thể hoàn thiện hơn đề tài của mình Trong quá trình thực hiện đề tài này có rất nhiều ý tưởng hay, độc đáo,…Nhưng do kiến thức của chúng em hạn hẹp và thời gian không cho phép nên chúng em chưa thể thực hiện những ý tưởng đó Tuy nhiên chúng em đã cố gắng xây dựng chương trình hoàn chỉnh nhất, đẹp nhất.Trong quá trình xây dựng chương trình,nhóm chúng em khó tránh khỏi những sai sót.Vì vậy chúng em rất mong rằng thầy và các bạn cùng đóng góp ý kiến giúp chúng em có thể hoàn thành sản phẩm một cách hoàn thiện nhất
19
Trang 20TI LIỆU THAM KHẢO
[1] Cao Ngọc Ánh, Giáo trình đồ họa máy tính, NXB Khoa học kỹ thuật 2012 [2] Trần Giang Sơn, Đồ họa máy tính trong không gian hai chiều : Lý thuyết và thực hành, NXB Khoa học kỹ thuật 2008
[3] Trần Giang Sơn, Đồ họa máy tính trong không gian ba chiều : Lý thuyết và thực hành, NXB Khoa học kỹ thuật 2008
[4] Trịnh Thị Vân Anh, Giáo trình kỹ thuật đồ họa, Nhà xuất bản thông tin và truyền thông 2010