TRƯỜNG
ĐẠI
HỌC
KHOA
HỌC
TỰ
NHIÊN
KHOA
CÔNG
NGHỆ
THÔNG
TIN
BỘ
MÔN
CÔNG
NGHỆ
TRI
THỨC
NGUYỄN
THANH
PHONG
ỨNG
DỤNG
TRÍ
TUỆ
NHÂN
TẠO
TRONG
XÂY
DỰNG
GAME
KHÓA
LUẬN
CỬ
NHÂN
TIN
HỌC
TP.
HCM,
2005
TRƯỜNG
ĐẠI
HỌC
KHOA
HỌC
TỰ
NHIÊN
KHOA
CÔNG
NGHỆ
THÔNG
TIN
BỘ
MÔN
CÔNG
NGHỆ
TRI
THỨC
NGUYỄN
THANH
PHONG
-
0112191
ỨNG
DỤNG
TRÍ
TUỆ
NHÂN
TẠO
TRONG
XÂY
DỰNG
GAME
KHÓA
LUẬN
CỬ
NHÂN
TIN
HỌC
GIÁO
VIÊN
HƯỚNG
DẪN
TH.S
BÙI
TIẾN
LÊN
NIÊN
KHÓA
2001-2005
NHẬN
XÉT
CỦA
GIÁO
VIÊN
HƯỚNG
DẪN
NHẬN
XÉT
CỦA
GIÁO
VIÊN
PHẢN
BIỆN
LỜI
CẢM
ƠN
Em sẽ không thể hoàn thành luận văn nếu không có sự hướng dẫn và chỉ
bảo tận tình của thầy Bùi Tiến Lên. Em xin chân thành cảm ơn sự chỉ bảo của
thầy.
Em cũng rất cảm ơn các thầy cô trong khoa Công nghệ Thông tin trường
Đại học Khoa học Tự nhiên Tp.Hồ Chí Minh đã tận tình giảng dạy, truyền đạt
những kiến thức quý báu và tạo điều kiện cho em hoàn thành luận văn này.
Xin chân thành cảm ơn sự giúp đỡ, động viên của của tất cả các bạn trong
quá trình thực hiện luận văn.
Em cũng muốn cảm ơn những người thân trong gia đình đã động viên, giúp
đỡ và tạo điều kiện để hoàn thành luận văn.
Mặc dù đã cố gắng hoàn thành luận văn với tất cả sự nổ lực của bản thân,
nhưng
luận
văn
chắc
chắn
không
tránh
khỏi
những
thiếu
xót.
Em
rất
mong
nhận được sự thông cảm và chỉ bảo tận tình của các thầy cô và các bạn.
Tp.HCM 7/2005
Sinh viên thực hiện
Nguyễn Thanh Phong
Mục lục
MỤC
LỤC
Chương
1
GIỚI
THIỆU
1
1. Lý do chọn đề tài
1
1.1. Các ngôn ngữ lập trình game
1
1.2. Phân loại game
2
1.2.1. Game hành động
2
1.2.2. Game nhập vai
3
1.2.3. Game đua xe
3
2. Mục đích của đề tài
3
Chương
2
CÁC
THUẬT
TOÁN
TÌM
ĐƯỜNG
ĐI
4
1. Mô tả các thủ tục tìm kiếm rộng, sâu và sâu dần
6
2. Thuật giải tìm đường đi có giá thành nhỏ nhất A
T
7
3.Tìm kiếm với tri thức bổ sung
8
4.Tìm đường đi trên đồ thị tổng quát
9
Chương
3
GAME
ENGINE
12
I. WED editor:
13
1. Những khái niệm cơ bản
13
a. Giao diện người dùng
13
b. Thanh Icon
15
c. Mode
15
d. Thiết kế một khung cảnh
14
e. Hướng đối tượng
16
f. Cửa sổ dự án
18
2. Các lệnh trong WED
19
2.1.Các lệnh trong các thực đơn
19
2.1.1. Thực đơn file
20
2.1.2. Thực đơn edit:
24
i
Mục lục
2.1.3. Thực đơn mode
25
2.1.4. Thực đơn Object
29
2.1.5. Thực đơn Texture
32
2.1.5. Thực đơn View
33
2.1.6. Thực đơn help
34
2.2 Giao diện sử dụng
35
2.3. Cửa sổ dự án
36
2.3.1. Tab đối tượng
36
2.3.2. Tab Views
38
2.3.3. Tab Texture
38
2.3.4. Tab Resource
41
2.4. Cửa sổ Bookmark
41
2.5. Thuộc tính của khối
41
2.6. Thuộc tính của thực thể
43
3. Thiết kế một map
45
4. Thực thể
46
4.1. Thực thể mô hình
46
4.2. Thực thể Sprite
47
4.3. Thực thể Map
47
4.4. Thực thể Địa hình (terrain)
48
4.5. Bóng
48
4.5. Thuộc tính trong suốt
49
II. CÁCH SỬ DỤNG MED
50
1. Trình thiết kế
50
1.1. Các thực đơn
50
1.1.1. Thực đơn File
50
1.1.2. Thực đơn Edit
53
1.1.3. Thực đơn View
55
ii
Mục lục
1.1.4. Thực đơn Options
56
1.1.5. Thực đơn Help
57
1.2. Toolbars
58
1.2.1. Toolbar File
58
1.2.2. Toolbar Edit
58
1.2.3. Toolbar Select
60
1.2.4. Toolbar Mesh
60
1.2.5. Toolbar các đối tượng cơ sở
61
1.2.6. Toolbar view
62
1.2.7. Toolbar Frame
63
1.2.8. Thanh trạng thái
64
2.Trình thiết kế Skin
64
2.1. Các thực đơn
65
2.1.1. Thực đơn File
65
2.1.2. Thực đơn Edit
66
2.1.3. Thực đơn View
67
2.2. Các Toolbar
68
2.2.1. Toolbar Skin
68
2.2.2. Toolbar Edit
68
2.2.3. Toolbar Paint
69
III. SED, C-Script editor
70
1. Giao diện sử dụng
71
2. Soạn thảo
72
2.1. Lệnh Insert
72
2.2. Dòng chú thích
72
2.3. Nhảy đến một đoạn mã
72
2.4. Sử dụng danh sách các thành phần
73
2.5. Kiểm tra cú pháp
73
iii
Mục lục
2.6. Soạn thảo thông minh
73
3. Cấu hình
74
4. Thực đơn
75
4.1. Thực đơn File
75
4.2. Thực đơn Edit
76
4.3. Thực đơn Options
76
4.4. Thực đơn Tools
77
4.5. Thực đơn Debug
77
IV. Giao tiếp với các DLL
79
1. Bắt đầu với SDK
79
2. Sử dụng đối tượng C-Script trong một DLL
82
3. Sử dụng các hàm API
83
4. Lập trình một game trong C++
87
Chương
4
CÀI
ĐẶT
89
I. Người chơi
89
1. Chuyển động vật lý
89
a. Gia tốc, quán tính và lực ma sát
89
b. Rơi từ trên xuống
93
2. Cách di chuyển camera theo người chơi
97
2.1. Tầm nhìn của người thứ nhất
97
2.2. Quay tự do tầm nhìn của người thứ 3
101
2.3. Cách để cho camera tránh chạm vào tường
106
II. Xe tự động
108
Tránh chướng ngại vật trên đường đi
108
iv
Chương 1: Giới thiệu
Chương
1
GIỚI
THIỆU
1.
Lý
do
chọn
đề
tài
Ngày
nay,
do
nhu
cầu
đời
sống
của
con
người
ngày
càng
được
nâng
cao,
trong đó nhu cầu giải trí của con người được quan tâm đến rất nhiều. Trong đó
việc giải trí bằng Game máy tính ngày càng phát triển nhanh và lan rộng ra do
sự lôi cuốn rất mạnh mẽ của nó. Hầu như ai đã sử dụng máy tính đều đã giải trí
bằng một số game nào đó trên máy tính. Có thể nói Game là một thể loại phóng
phú nhất trong tất cả các loại chương trình trên máy tính.
Mặc dù các chương trình Game rất nhiều, nhưng để có thể viết ra được một
game hay, có thể chơi được quả là một điều không dễ. Tuy vậy, với niềm đam
mê về game máy tính, em cũng muốn tiếp cận với lĩnh vực này.
1.1.
Các
ngôn
ngữ
lập
trình
game
Có rất nhiều chương trình hỗ trợ cho việc viết game: các ngôn ngữ lập trình
như C++, Visual C++, Delphi, Dark Basic Pro, 3D Game Studio.
Nhưng
với
các
ngôn
ngữ
lập
trình
C++,
Visual
C++,
DelPhi…
có
thể
là
những ngôn ngữ rất mạnh, có thể viết ra được những game có quy mô lớn. Đây
là những ngôn ngữ lập trình có thể hoạt động trong nhiều lĩnh vực: với cơ sở dữ
liệu, lập trình hệ thống, hoặc viết game…Do đó sự hỗ trợ của nó trong việc viết
game là rất ít. Để có thể viết được một game bằng những ngôn ngữ lập trình
này mà không sử dụng một thư viện nào, đòi hỏi phải bỏ ra rất nhiều công sức.
Với engine Dark Basic Pro, đây là loại engine rất đơn giản và dễ sử dụng, là
một ngôn ngữ Script theo họ Basic. Nó chỉ thích hợp với các game nhỏ.
Tại
sao
lại
sử
dụng
ngôn
ngữ
3D
Game
Studio
để
viết
game?
3D Game Studio là chương trình chuyên dụng dùng để tạo ra game 3D.
1
Chương 1: Giới thiệu
Với hàng trăm game đã được phát hành, 3D Game Studio xứng đáng là một
ngôn ngữ lập trình game lớn. Với 3D Game Studio, chúng ta có thể:
- Tạo ra một game đơn giản từ những script mẫu có sẵn.
- Tạo ra các game thương mại viết bằng ngôn ngữ script.
- Có thể sử dụng VisualC++ hoặc Delphi để kết hợp với 3D Game Studio
để viết game.
Có rất nhiều tài liệu hướng dẫn lập trình game bằng 3D Game Studio. Ngay
cả với những người chưa có kiến thức về lập trình, nhưng nếu theo từng bước
hướng
dẫn
tạo
một
game
hành
động
đơn
giản
thì
cũng
có
thể
hoàn
thành
nó
trong một thời gian ngắn.
Theo Dr.Dobb's Journal: “Đây là bộ công cụ tuyệt vời để nhanh chóng tạo
ra mẫu ban đầu và phát triển ứng dụng 3D”. Chúng ta có thể sử dụng ngôn ngữ
script trong 3D Game Studio để viết và phân phối một game thương mại. Dưới
đây là những game thương mại được làm bằng 3D Game Studio:
1.2.
Phân
loại
game
Thể loại của game thì rất phong phú và đa dạng, ở đây chúng ta chỉ xét các
thể loại game thường thấy nhất là:
1.2.1.
Game
hành
động
Game hành động xuất hiện rất nhiều trong cả game 3D và game 2D. Game
loại
này
có
đặc
điểm
chúng
là
tính
co
giật
trong
game,
như
trong
game
bắn
2
Chương 1: Giới thiệu
súng. Game hành động thường đơn giản hơn tất cả các loại game khác bởi vì
những người bình thường dễ dàng biết cách chơi và chơi hay game này .
1.2.2.
Game
nhập
vai
Game nhập vai thường có hai đặc trưng là: sự thay đổi, phát triển nhân vật
và một câu chuyện mà trong đó nhân vật sẽ trải qua.
1.2.3.
Game
thể
thao
Game thể thao là sự thách thức cho các nhà thiết kế game. Không giống như
hầu hết các thể loại game khác, người chơi biết rất ít về nó, trong game thể thao
người chơi biết rất rõ vì nó mô phỏng một môn thể thao có sẵn trong thực tế.
1.2.3.
Game
đua
xe
Game đua xe tạo ra cảm giác giống như người chơi đang lái xe bên ngoài
thế giới thực.
Tuy trong đề tài của em không thể nói là viết ra được một game chơi được
như
một
game
đua
xe,
mà
đây
chỉ
là
một
chương
trình
ở
mức
độ
mô
phỏng
giao thông trên đường phố.
2.
Mục
đích
của
đề
tài
Tìm hiểu ngôn ngữ lập trình game trong 3D GameStudio:
- Tìm hiểu về WED, một chương trình thiết kế khung cảnh trong game.
- Tìm hiểu về MED, một chương trình thiết kế các mô hình trong game.
- Tìm hiểu về SED, trình soạn thảo dùng để viết các câu lệnh script để kết
nối
các
mô
hình
được
tạo
ra
trong
MED,
các
khung
cảnh
được
tạo
ra
trong
WED và sử dụng những hàm có sẵn trong SED hoặc trong các DLL khác để
tạo ra một game.
Sử dụng thuật toán cổ điển A* tìm kiếm đường đi để một đối tượng có thể
chuyển động theo một hướng mong muốn nào đó.
3
Chương 2: Các thuật toán tìm đường đi
Chương
2
CÁC
THUẬT
TOÁN
TÌM
ĐƯỜNG
ĐI
Hầu hết các bài toán hoặc vấn đề đều có thể phát biểu dưới dạng “từ một
trạng
thái
xuất
phát
hãy
tìm
đường
dẫn
đến
một
trạng
thái
kết
thúc
mong
muốn”
Việc
tìm
“đường
dẫn”
từ
trạng
thái
xuất
phát
(S
0
)
đến
trạng
thái
kết
th
úc
(S
n
)
gồm
có
một
số
bước
sau
đây:
−
Chọn không gian tìm kiếm thích hợp.
−
Tiến hành tìm kiếm có hệ thống và hiệu quả trong không gian tìm kiếm.
−
Sử dụng triệt để các nguồn tri thức liên quan trong quá trình tìm kiếm
tương ứng với miền đối tượng cụ thể.
Không gian tìm kiếm của một vấn đề cần giải trên máy tính thường được
biểu diễn bằng đồ thị hay một dạng đặt biệt của đồ thị là cây. Đồ thị là một tập
hợp giữa các đỉnh và các cung nối giữa các đỉnh. Các cung có thể được định
hướng hoặc không định hướng, gán giá trị hoặc không gán giá trị.
Cây là đồ thị định hướng đặt biệt có duy nhất một đỉnh mà không có cung
nào hướng đến (gốc của cây), và mỗi đỉnh khác của cây chỉ có duy nhất một
cung hướng đến.
Sau khi bài toán hoặc vấn đề được biểu diễn lại dưới dạng đồ thị hoặc cây:
−
Mỗi đỉnh là một trạng thái của quá trình giải bài toán.
−
Mỗi cung là tác động biến đổi quá trình từ giai đoạn này sang giai đoạn
khác.
Như vậy, việc giải quyết một bài toán cũng chỉ là tìm đường đi từ trạng thái
ban đầu đến trạng thái mong muốn được biểu diễn qua hai đỉnh nào đó của đồ
4
Chương 2: Các thuật toán tìm đường đi
thị
hoặc
cây
tìm
kiếm.
Nhiều
bài
toán
phức
tạp
nếu
giải
quyết
bằng
phương
pháp tìm kiếm ngẫu nhiên thì hầu như vô vọng vì số đường đi có thể sẽ tăng lên
theo hàm mũ của số đỉnh. Chính ở đây biểu lộ toàn bộ bản chất của trí tuệ nhân
tạo khi giải quyết các vấn đề: Đó là nghệ thuật xử trí với các vấn đề lớn bằng
cách giảm số lượng tìm kiếm.
Các thủ tục tìm kiếm điển hình bao gồm:
−
Tìm kiếm rộng: đường đi được tìm theo mọi hướng có thể ở mỗi bước.
−
Tìm kiếm sâu: đường đi sâu mãi theo một hướng đến khi nào không tiếp
tục được nữa mới chuyển sang hướng khác.
−
Tìm kiếm sâu dần: kết hợp tìm kiếm rộng và tìm kiếm sâu trên cơ sở cho
trước mức sâu n rồi tìm kiếm rộng ứng với mức sâu đó.
−
Tìm kiếm cực tiểu hóa giá thành: mỗi cung của cây (đồ thị) được gán giá
thành
và
hướng
tìm
kiếm
được
xác
định
bởi
việc
cực
tiểu
hóa
giá
thành
đường đi.
−
Tìm
kiếm
với
tri
thức
bổ
sung:
hướng
tìm
kiếm
được
xác
định
với
tri
thức bổ sung ở mỗi bước.
Trước hết các thủ tục tìm kiếm rộng, sâu và sâu dần sẽ được mô tả qua một
ví dụ. Sau đó một số thuật giải tìm kiếm cực tiểu hóa giá thành và bổ sung tri
thức sẽ được trình bày chi tiết.
5
Chương 2: Các thuật toán tìm đường đi
1.
Mô
tả
các
thủ
tục
tìm
kiếm
rộng,
sâu
và
sâu
dần
A
100
1
17
B
1
C
D
1 1
10
12
1
E F G H I J
1 1
1
1
K L M
N
1
1
O P
1 1
Q R
1 1
S
T
1
U
1
Trạng thái mong m
uốn
V
Tìm kiếm rộng: quá trình tìm kiếm sẽ lần lượt là
A, B, C, D, E, F, G, H, I,
J, K, L, M, N, O, P, Q, R, S, T, U, V…
Tìm kiếm sâu: quá trình tìm kiếm sẽ lần lượt là A, E, K, O, Q, S, T, U, V,
…B, F,… C, G, L, H, M, … D, I, J, N, P, R.
Chú ý: nếu nhánh dưới v dài vô hạn thì quá trình tìm kiếm sẽ không bao giờ
đến được mục tiêu.
Tìm
kiếm
sâu
dần:
ứng
với
mức
sâu
2:
(A,E),
(B,F),
(C,G),
(C,H),
(D,I),
(D,J).
10
6
Chương 2: Các thuật toán tìm đường đi
ứng với mức sâu 3: (A,E,K), (B,F), (C,G,L), (C,H,M), (D,I), (D,J,N).
2.
Thuật
giải
tìm
đường
đi
có
giá
thành
nhỏ
nhất
A
T
(Algorithm
for
Trees)
với
mỗi
đỉnh
n
tương
ưng
số
g(n)
là
giá
thàn
h
đường đi từ đỉnh đầu tới n. (g(n) có thể chưa xác định đối với các đỉnh thuộc
phần cây chưa hướng đến). Mỗi đỉnh n có thể là:
−
Đỉnh đóng: nghĩa là đỉnh đã được xem xét;
−
Đỉnh mở: là đỉnh giả định sẽ được xem ở bước sau;
−
Đỉnh
ẩn:
là
đỉnh
mà
hàm
g(n)
tương
ứng
chưa
được
tính
đến
và
chưa
được xem xét đến.
Thuật giải A
T
gồm các bước sau:
Bước 1: Đầu tiên, mọi đỉnh n và mọi giá trị g(n) đều là ẩn. Mở đỉnh đầu tiên
(coi đỉnh đầu tiên là đỉnh mở và đặt giá trị g tương ứng bằng 0).
Bước 2: Chọn đỉnh mở với giá thành g tương ứng nhỏ nhất. Gọi đỉnh này là
N, nếu N là đỉnh mục tiêu thì đường dẫn tới N là đường đi có giá thành nhỏ
nhất g(n) và vấn đề đã được giải. Nếu không còn đỉnh mở nào thì cây biểu
diễn vấn đề không có đường đi tới mục tiêu. Nếu có từ 2 đỉnh trở lên cùng
giá trị g nhỏ nhất thì kiểm tra trong số đó có đỉnh mục tiêu không? Nếu có
thì chọn đỉnh mục tiêu đó và quá trình giải kết thúc. Nếu không thì chọn tùy
ý một đỉnh trong số đó và gọi là N.
Bước 3: Đóng đỉnh N và mở các đỉnh sau N (có cùng hướng đến N), với
mỗi đỉnh sau N gọi là s, ta tính:
g(s)=g(N)+(giá thành cung từ N tới s)
Bước 4: Quay trở lại bước 2.
Thuật giải A
T
đã được chứng minh là luôn luôn tìm được đường đi với giá
thành nhỏ nhất nếu như tồn tại đường đó trên đồ thị và là thuật giải tối ưu theo
nghĩa số đỉnh đóng trong quá trình tìm kiếm là ít nhất.
7
Chương 2: Các thuật toán tìm đường đi
3.
Tìm
kiếm
với
tri
thức
bổ
sung
Thuật giải A
T
là thuật giải tìm kiếm đường đi tốt nhất đối với các cây chỉ có
thông tin về đỉnh, cung và giá thành cung. Nhưng trong nhiều trường hợp việc
tìm kiếm đường đi sẽ được định hướng rõ thêm nếu
sử
dụng các tri thức thu
được dựa trên những hiểu biết về tình huống vấn đề ở mỗi bước. Các thủ tục
tìm kiểm dựa trên 3 cách tiếp cận:
−
Không tính đến các tri thức bổ sung ngoài thông tin về đỉnh, cung, giá
thành.
−
Sử dụng tri thức bổ sung để tìm cách giải riêng biệt cho vấn đề mà bỏ
qua việc xây dựng cây biểu diễn cho vấn đề.
−
Xây dựng biểu diễn vấn đề dưới dạng cây có tính đến tri thức bổ sung
trong cấu trúc cây hoặc giá thành các cung.
Ngoài
ra
có
có
cách
tiếp
cạn
theo
hướng
xây
dựng
các
thuật
giải
“vạn
năng”, tìm kiếm đường đi với tri thức bổ sung. Họ thuật giải này mang tên là
A
KT
(Algorithm
for
knowledgeable
Tree
search).
Tri
thức
bổ
sung
ở
mỗi
đỉnh
∧
được tương ứng một giá trị
h(n) . Chẳng hạn đó là ước lượng giá thành đường
∧
đi từ n đến mục tiêu (như vậy
h
là ước lượng giá thành đường đi con chương
biết đến).
Thuật giải A
KT
gồm các bước sau:
∧ ∧
a)
Đầu
tiên,
mọi
đỉnh
cũng
như
giá trị
g,
h , f
là
chưa
biết.
Mở
đỉnh
đầu
tiên
(o)
và
gán
g(0),
sử
dụng
tri
thức
bổ
sung
để
ước
tính
h(0)
và
tính
∧ ∧
f (0) = g(0) + h(0) .
∧ ∧
b) Chọn đỉnh mở có giá trị
f
= g(n) + h(n) nhỏ nhất. Gọi đỉnh này là N. Nếu
N
là
mục
tiêu
thì
đường
tới
N
là
đường
đi
có
giá
thành
nhỏ
nhất
g(N).
Nếu
không tồn tại đỉnh mở nào thì cây không tồn tại đường đi tới mục tiêu. Nếu có
8
Chương 2: Các thuật toán tìm đường đi
∧
từ 2 đỉnh mở trở lên cùng giá trị
f
nhỏ nhất, hãy kiểm tra trong các đỉnh này
có chứa mục tiêu không? Nếu một trong các đỉnh này là mục tiêu thì vấn đề đã
được giải quyết, còn không thì chọn tùy ý một trong các đỉnh này là N.
c)
Đóng
đỉnh
N,
mở
đỉnh
sau
N.
Với
mỗi
đỉnh
S
sau
N
ta
tính
g(s)=g(N)+(giá thành cung từ N đến S). Sử dụng tri thức bổ sung ở bước này,
∧ ∧ ∧
ước lượng
h(s)
và gán cho f(s) giá trị
f (s) = g(s) + h(s) .
d) Quay về bước 2.
Giải thích ý nghĩa
A
KT
:
giả
sử
h(n)
là
giá
thành
nhỏ
nhất
được biết
chính
xác từ n đến mục tiêu. Như vậy h(n) chỉ là ước lượng gần đúng về h(n). nếu
∧
đỉnh nằm trên đường đi ngắn nhất đến mục tiêu). Trong trường hợp không có
∧
∧ ∧
h = 0
và
h = h
sẽ
tồn
tại
các
thuật
giải
với
mức
độ
hiệu
quả
rất
thú
vị.
Nếu
∧
tối ưu theo nghĩa sử dụng số đỉnh đóng ít nhất so với mọi thuật giải cũng chỉ
làm việc với các tri thức như vậy.
∧
đường
đi
giá
thành
nhỏ
nhất
nhưng
đường
đi
mà
A
KT
tìm
ra
vẫn
dùng
được
h(n) ≡ h(n) thì
A
KT
là
thủ
tục
hoàn
toàn
tuyệt
đối
(các
đỉnh
đóng
đúng
là
các
tri thức bổ sung,
h(n) = 0
và A
KT
suy biến thành A
T
. Ta thấy rõ ràng rằng giữa
h ≤ h (với mọi n), A
KT
sẽ bảo đảm tìm ra được đường đi giá thành nhỏ nhất và
Nếu
h > h
(với mọi n, hoặc với một số đỉnh). A
KT
không bảo đảm tìm được