You are on page 1of 21

Trò chơi Rượt đuổi 1.

Nội dung
A. Tổng quan............................................................................................................................ 1
B. Các yêu cầu.......................................................................................................................... 1
1. Phần mề
m........................................................................................................................1
2. Kiế
n thức......................................................................................................................... 3
C. Phần mề
m chơi...................................................................................................................3
1. Cấu trúc thư mục.............................................................................................................3
2. Phím tắt........................................................................................................................... 4
3. map.xml.......................................................................................................................... 4
4. Replay..............................................................................................................................5
D. Pacman đầu tiên.................................................................................................................5
1. Ngôn ngữ C#....................................................................................................................5
2. Ngôn ngữ VB.NET...........................................................................................................9
E. API tham khảo...................................................................................................................13
1. Kiểu dữ liệu....................................................................................................................13
2. Map................................................................................................................................ 14
3. Pacman.......................................................................................................................... 17
4. Ghost.............................................................................................................................18
5. Utils...............................................................................................................................18
F. Các qui định...................................................................................................................... 19
G. Hỏi đáp.............................................................................................................................. 19
Cúp Sáng Tạo Công Nghệ Thông Tin 201
0

A. Tổng quan
Rượt đuổi là một trò chơi dành cho các lập trình viên, mô phỏng game kinh đi ển Pacman 1. Ý
tưởng chính của trò chơi này là thay vì dùng bàn phím để di chuyển Pacman nh ư người dùng
bình thường, các lập trình viên có thể viế
t mã để tạo ra Pacman thông minh, có khả năng tiêu
diệt các Pacman khác, tìm đường ăn được nhiề u điểm và tránh gặp phải các Ghost trong mê
cung.

Tài liệu này mô tả các bước chi tiế t để tạo ra được một Pacman như trên, từ các công cụ và
kiến thức lập trình, cho đến các ví dụ mẫu, cách sử dụng phần mềm chơi cùng các API mà nó
cung cấp, kể cả giải đáp một sốthắc mắc thường gặp.

Đối tượng đọc tài liệu này là:

- Các lập trình viên chuyên và không chuyên, có kiế n thức căn bản vềlập trình, muốn
trải nghiệm một phần công việc lập trình robot.
- Các đội thi ITICup 2010 muốn biế t cách lập trình cho trò chơi Rượt đuổi để cạnh
tranh với Pacman của đội bạn và Ghost của BTC.

Trong quá trình xây dựng phần mề m chơi và viế


t tài liệu hướng dẫn, chắc chắn BTC không
thể quản lý hết toàn bộ các sai sót. Mọi ý kiế
n đóng góp, đềxuất vềAPI, hay các yêu cầu trợ
giúp vui lòng gửi vềđịa chỉ email iticup2010@iticlub.org. BTC rất mong nhận được phản hồi
mang tính chất xây dựng cho trò chơi.

B. Các yêu cầu


1. Phần mềm
Để bắt đầu lập trình Pacman, lập trình viên cần 3 phần mề
m sau:

1. Microsoft .NET Framework 4: Đây là gói thư viện nề n tảng dùng để chạy các
chương trình .NET và cung cấp các hàm tiện ích để làm việc với các kiểu dữ liệu, cấu
trúc căn bản.
http://www.microsoft.com/downloads/details.aspx?
displaylang=en&FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7

1
http://www.freepacman.org/pacman.swf

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 1


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0

2. Visual Studio 2010 Express: Đây là chương trình soạn thảo mã nguồn cho các
ngôn ngữ C# hoặc VB.NET. Phần mề m IDE này hoàn toàn miễn phí, và đã bao gồm cả
Microsoft .NET Framework 4.
http://www.microsoft.com/express/downloads/#2010-All

3. Phần mềm Pacman: Đây là phần mề m chơi, kiểm thử các Pacman được lập trình,
đồng thời làm thư viện cung cấp các API để lấy thông tin vềbản đồ, các Pacman khác
và các Ghost.
http://iticlub.org

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 2


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0

2. Kiến thức
Để chơi Rượt đuổi, lập trình viên cần có một sốkiế
n thức căn bản về1 trong 2 ngôn ngữ C#
hoặc VB.NET. Dưới đây là một sốmục quan trọng cần phải nắm:

- .NET Framework
- C# & VB.NET Language Fundamentals
- Classes & Objects
- Inheritance & Polymorphism
- Operator Overloading
- Structs
- Interfaces
- Arrays, Indexers, Collections
- Strings & Regular Expressions
- Handling Exceptions
- Delegates & Events

Tài liệu tham khảo:

- Ngôn ngữ Lập trình C#


http://www.ebook.edu.vn/?page=1.4&view=183
- A Programmer’s Introduction to Visual Basic.NET
http://www.ebook.edu.vn/?page=1.39&view=5917

C. Phần mềm chơi


1. Cấu trúc thư mục
- Tập tin Pacman.exe: chương trình chơi, đồng thời là thư viện cung cấp API để lập
trình Pacman.
- Tập tin background: nhạc nề
n của trò chơi, được cắt bỏ phần mở rộng.
- map.xml: Dữ liệu vềbản đồvà vị trí khởi động của các Pacman.

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 3


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0
- Thư mục Pacmans: chứa các thư viện dll là các Pacman đã được lập trình.

2. Phím tắt
- Enter: khởi động trò chơi.
- Spacebar: tạm dừng hoặc tiếp tục trò chơi.
- Esc: kế t thúc trò chơi.
- F7: tắt âm thanh
- F8: bật âm thanh

3. map.xml
Đây là tập tin cấu hình bản đồ,có định dạng XML như sau:

<?xml version="1.0" encoding="utf-8" ?>
<map>
  <width>Chiều rộng X của bản đồ</width>
  <height>Chiều cao Y của bản đồ</height>
  <ghost-duration>Số lượt di chuyển để xuất hiện thêm 1 Ghost</ghost-duration>
  <content>
    <![CDATA[X*Y ký tự biểu diễn từng ô của bản đồ]]>
  </content>
</map>

Nội dung của X*Y ký tự có thể là các giá trị sau:

- W: tương ứng với ô có chứa vật cản.


- P: tương ứng với ô có chứa điểm.
- E: tương ứng với ô trống.
- M: Tương ứng với ô có chứa vật Magic.
- *: vị trí Pacman xuất hiện.

4. Replay
Để lưu giữ lại diễn biế
n của những trận thi đấu hay, đồng thời hỗ trợ lập trình viên bẫy lỗi,
phần mề m cung cấp chức năng replay, dùng để xuất và nạp dữ liệu vềbản đồ, đường đi của
các Pacman và Ghost.

Bước 1: sau khi trận đấu kế


t thúc, lập trình viên dùng tổ hợp phím Ctrl+S để tạo ra tập tin
replay dưới dạng XML.

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 4


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0
Bước 2: mở tập tin replay (Open With) bằng chương trình chơi hoặc kéo thả tập tin này vào
icon của chương trình chơi để xem lại diễn biế
n của trận thi đấu.

D. Pacman đầu tiên


1. Ngôn ngữ C#
Bước 1: Mở Visual C# 2010 Express. File  New Project. Chọn Class Library. Đặt tên cho
project là MyPacman. Click OK.

Bước 2: Thêm tham chiế u đến chương trình chơi bằng cách click phải vào project MyPacman
 Add Reference. Sau đó tìm đến thư mục phần mề m chơi và chọn Pacman.exe. Click OK.

Tiế
p tục tham chiế
u đế
n thư viện PresentationCore và click OK.

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 5


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0

Bước 3: Khai báo sử dụng thư viện của chương trình chơi và thư viện PresentationCore bằng
cách thêm vào 2 dòng sau ở phần đầu của Class1.cs.

using VCProjects.PacmanGame.Models;
using System.Windows.Media;

Bước 4: Thêm chuỗi “: Pacman” phía sau “public class Class1” để kếthừa từ lớp Pacman
do chương trình chơi cung cấp. Sau đó trỏ chuột vào chữ Pacman và chọn Implement abstract
class ‘Pacman’.

Bước 5: Chỉ định thuộc tính màu sắc cho Pacman, ví dụ chọn màu hồng.

public override Color Color


{
get { return Colors.Pink; }
}

Bước 6: Chỉ định thuộc tính tên cho Pacman, ví dụ chọn “My Pacman”.

public override string Name


{
get { return "My Pacman"; }
}

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 6


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0
Bước 7: Lập trình cho Pacman di chuyển.

public override void Start()


{
// Xây dựng một vòng lặp vô hạn,
// liên tục tiếp nhận thông tin từ bản đồ, các Pacman và Ghost khác
// để quyết định hướng đi tiếp theo.
// Vòng lặp này hoạt động trong suốt thời gian trò chơi diễn ra.
do
{
// Nếu trước đó Pacman đứng yên
// hoặc không thể di chuyển theo hướng đã đi trước đó nữa (gặp vật cản)
// thì sẽ tính toán để tìm ra hướng đi mới.
if (this.Direction == DirectionType.None ||
!this.CanGo(this.Direction))
{
// Lấy tập hợp tất cả các hướng đi có thể đi được
// từ vị trí hiện tại và chuyển thành cấu trúc danh sách
var dirs = Map.GetMovableDirections(this.Location).ToList();

// Nếu có nhiều hướng đi thì ưu tiên không đi theo đường ngược lại
// bằng cách xóa bỏ hướng đi ngược lại ra khỏi danh sách.
if (dirs.Count > 1)
dirs.Remove(Utils.GetOppositeDirection(this.Direction));

// Nếu có ít nhất một hướng đi thì chọn hướng đi ngẫu nhiên.


if (dirs.Count > 0)
this.Direction = dirs[Utils.GetRandom(dirs.Count)];
// Nếu không có hướng đi nào khác thì quyết định đứng yên.
else
this.Direction = DirectionType.None;
}
}
while (true);
}

Bước 8: Sao lưu lại project bằng File  Save All. Biên dịch project thành thư viện dll bằng
cách click phải vào project MyPacman  Build. Copy MyPacman.dll trong thư mục bin (nơi
sao lưu project) vào thư mục Pacmans của phần mề m chơi.

Bước 9: Chạy chương trình chơi và mọi chuyện nên diễn ra suôn sẻ.

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 7


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0

2. Ngôn ngữ VB.NET


Bước 1: Mở Visual Basic 2010 Express. File  New Project. Chọn Class Library. Đặt tên cho
project là MyPacman. Click OK.

Bước 2: Thêm tham chiế u đến chương trình chơi bằng cách click phải vào project MyPacman
 Add Reference. Sau đó tìm đến thư mục phần mề m chơi và chọn Pacman.exe. Click OK.

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 8


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0

Tiế
p tục tham chiế
u đế
n thư viện PresentationCore và click OK.

Bước 3: Khai báo sử dụng thư viện của chương trình chơi và thư viện PresentationCore bằng
cách thêm vào 2 dòng sau ở phần đầu của Class1.vb.

Imports VCProjects.PacmanGame.Models
Imports System.Windows.Media

Bước 4: Thêm chuỗi Inherits Pacman” bên dưới dòng “Public Class Class1” để kếthừa từ
lớp Pacman do chương trình chơi cung cấp. Sau đó nhấn Enter để tự động phát sinh các hàm
cần thiế
t.

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 9


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0

Bước 5: Chỉ định thuộc tính màu sắc cho Pacman, ví dụ chọn màu hồng.

Public Overrides ReadOnly Property Color As System.Windows.Media.Color


Get
Return Colors.Pink
End Get
End Property

Bước 6: Chỉ định thuộc tính tên cho Pacman, ví dụ chọn “My Pacman”.

Public Overrides ReadOnly Property Name As String


Get
Return "My Pacman"
End Get
End Property

Bước 7: Lập trình cho Pacman di chuyển.

Public Overrides Sub Start()


' Xây dựng một vòng lặp vô hạn,
' liên tục tiếp nhận thông tin từ bản đồ, các Pacman và Ghost khác
' để quyết định hướng đi tiếp theo.
' Vòng lặp này hoạt động trong suốt thời gian trò chơi diễn ra.
Do
' Nếu trước đó Pacman đứng yên
' hoặc không thể di chuyển theo hướng đã đi trước đó nữa (gặp vật cản)
' thì sẽ tính toán để tìm ra hướng đi mới.
If Me.Direction = DirectionType.None OrElse _
Not Me.CanGo(Me.Direction) Then
' Lấy tập hợp tất cả các hướng đi có thể đi được
' từ vị trí hiện tại và chuyển thành cấu trúc danh sách
Dim dirs = Map.GetMovableDirections(Me.Location).ToList()

' Nếu có nhiều hướng đi thì ưu tiên không đi theo đường ngược lại
' bằng cách xóa bỏ hướng đi ngược lại ra khỏi danh sách.
If dirs.Count > 1 Then
dirs.Remove(Utils.GetOppositeDirection(Me.Direction))
End If

' Nếu có ít nhất một hướng đi thì chọn hướng đi ngẫu nhiên.
If dirs.Count > 0 Then
Me.Direction = dirs(Utils.GetRandom(dirs.Count))
Else

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 10


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0
' Nếu không có hướng đi nào khác thì quyết định đứng yên.
Me.Direction = DirectionType.None
End If
End If
Loop
End Sub

Bước 8: Sao lưu lại project bằng File  Save All. Biên dịch project thành thư viện dll bằng
cách click phải vào project MyPacman  Build. Copy MyPacman.dll trong thư mục bin (nơi
sao lưu project) vào thư mục Pacmans của phần mề m chơi.

Bước 9: Chạy chương trình chơi và mọi chuyện nên diễn ra suôn sẻ.

E. API tham khảo


Các API dưới đây đề
u được cung cấp dưới namespace VCProjects.PacmanGame.Models.

1. Kiểu dữ liệu
Bản đồcủa mê cung được mô hình hóa thành một ma trận kích thước Map.Height x
Map.Width. Các ô trong ma trận có tọa độ dòng và c ột được đánh sốbắt đầu từ 0, do đó dòng
cuối cùng có sốthứ tự là Map.Height – 1, và cột cuối cùng có sốthứ tự là Map.Width – 1.

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 11


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0
Mỗi ô của ma trận có giá trị thuộc kiểu CellType, mô tả ô này đang chứa vật gì:

- CellType.Empty: ô này đang trống.


- CellType.Point: ô đang có chứa điểm. Khi di chuyển đế n ô này, Pacman được cộng
thêm điểm và ô chuyển sang giá trị CellType.Empty.
- CellType.Magic: ô đang có chứa vật Magic. Khi di chuyển đế n ô này, Pacman biế n tất
các các Pacman và Ghost khác sang trạng thái yế u, gây ra hiệu ứng dễ bị tổn thương và
giảm ½ tốc độ. Khi này ô chuyển sang giá trị CellType.Empty.
- CellType.Wall: ô có chứa vật cản, Pacman và Ghost không thể di chuyển đế n đây.

Tại ô (i, j), Pacman và Ghost có thể di chuyển theo 4 hướng kếcận hoặc đứng yên. Hướng đi
được mô tả bằng một giá trị thuộc kiểu DirectionType như sau:

- DirectionType.North: di chuyển theo hướng Bắc, đế n ô có tọa độ (i – 1, j) nếu i > 0,


ngược lại đế
n ô có tọa độ (Map.Height – 1, j).
- DirectionType.East: di chuyển theo hướng Đông, đế n ô có tọa độ (i, j + 1) nế
uj+1<
Map.Width, ngược lại đế n ô có tọa độ (i, 0).
- DirectionType.South: di chuyển theo hướng Nam, đế n ô có tọa độ (i + 1, j) nếui+1<
Map.Height, ngược lại đế n ô có tọa độ (0, j).
- DirectionType.West: di chuyển theo hướng Tây, đế n ô có tọa độ (i, j – 1) nế u j > 0,
ngược lại đế
n ô có tọa độ (i, Map.Width - 1).
- DirectionType.None: không di chuyển, giữ nguyên tọa độ (i, j).

Thay vì mô tả tọa độ bằng một cặp giá trị sốnguyên (dòng, cột) như trên, lập trình viên có thể
sử dụng kiểu dữ liệu Coordinate được xây dựng sẵn như sau:

- Coordinate.X: hoành độ của tọa độ, tương đương với sốthứ tự cột, có giá trị thuộc kiểu
Int32.
- Coordinate.Y: tung độ của tọa độ, tương đương với sốthứ tự dòng, có giá trị thuộc kiểu
Int32.
- Coordinate.MaxValue: giá trị lớn nhất được cho phép của một tọa độ, thuộc kiểu
Coordinate.
- Coordinate.MinValue: giá trị nhỏ nhất được cho phép của một tọa độ, thuộc kiểu
Coordinate, tất nhiên trong trò chơi này đó là (0, 0).
- Các phép so sánh bằng (=) và so sánh khác (≠) giữa 2 giá trị thuộc kiểu Coordinate.
- Coordinate.ToString(): tạo một chuỗi mô tả tọa độ theo dạng “x,y”.
- Coordinate.Parse(string s): tạo một đối tượng tọa độ từ một chuỗi mô tả s có dạng
“x,y”.

2. Map
Cung cấp các hàm tiện ích để làm việc với bản đồ.Đây là những hàm static có thể gọi trực tiế
p
từ lớp Map.

Prototype Mô tả
Map.CommandKey Nhận các mệnh lệnh của người dùng từ bàn
phím. Giá trị trả về thuộc kiểu
System.Windows.Input.Key. Lưu ý: thuộc
tính này chỉ được dùng để hỗ trợ kiểm thử
trong giai đoạn lập trình, để sử dụng cần tham

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 12


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0
chiế u đế n thư viện Windows Base.
Map.GetCell(Coordinate coor) Lấy mô tả của ô trong mê cung có tọa độ coor.
Giá trị trả vềthuộc kiểu CellType.
Map.GetCell(Coordinate coor, Lấy mô tả của ô trong mê cung nằm theo
DirectionType dir) hướng dir cạnh bên ô có tọa độ coor. Giá trị trả
vềthuộc kiểu CellType.
Map.GetCell(Int32 i, Int32 j) Lấy mô tả của ô trong mê cung tại dòng i, cột j.
Giá trị trả vềthuộc kiểu CellType.
Map.GetCell(Int32 i, Int32 j, Lấy mô tả của ô trong mê cung nằm theo
DirectionType dir) hướng dir cạnh bên ô tại dòng i, cột j. Giá trị
trả vềthuộc kiểu CellType.
Map.GetGhost(Int32 index) Lấy đối tượng Ghost theo số thứ tự index
(được đánh sốbắt đầu từ 0). Giá trị trả về
thuộc kiểu Ghost, hoặc trả vềnull nế u Ghost
này không còn tồn tại.
Map.GetGhostMoves() Lấy toàn bộ dữ liệu lịch sử vềhướng đi của tất
cả các Ghost đã và đang xuất hiện trong mê
cung. Giá trị trả về thuộc kiểu
Dictionary<Ghost, DirectionType[]>.
Map.GetGhosts() Lấy mảng toàn bộ các Ghost có trong mê cung.
Giá trị trả vềthuộc kiểu Ghost[].
Map.GetGhosts(Coordinate coor) Lấy mảng các Ghost hiện đang nằm tại tọa độ
coor trên mê cung. Giá trị trả vềthuộc kiểu
Ghost[].
Map.GetGhosts(Int32 i, Int32 j) Lấy mảng các Ghost hiện đang nằm tại dòng i,
cột j trên mê cung. Giá trị trả vềthuộc kiểu
Ghost[].
Map.GetInitCell(Int32 i, Int32 j) Lấy mô tả của ô trong mê cung khởi đầu tại
dòng i, cột j. Giá trị trả vềthuộc kiểu CellType.
Map.GetInitCell(Coordinate coor) Lấy mô tả của ô trong mê cung khởi đầu có tọa
độ coor. Giá trị trả vềthuộc kiểu CellType.
Map.GetInitMatrix() Lấy mô tả tình trạng khởi đầu của mê cung.
Giá trị trả vềthuộc kiểu CellType[,].
Map.GetLocation(Coordinate coor, Lấy tọa độ ô trên mê cung nằm theo hướng dir
DirectionType dir) cạnh bên ô có tọa độ coor. Giá trị trả vềthuộc
kiểu Coordinate.
Map.GetLocation(Int32 i, Int32 j, Lấy tọa độ ô trên mê cung nằm theo hướng dir
DirectionType dir) cạnh bên ô tại dòng i, cột j. Giá trị trả vềthuộc
kiểu Coordinate.
Map.GetMatrix() Lấy mô tả tình trạng hiện thời của mê cung.
Giá trị trả vềthuộc kiểu CellType[,].
Map.GetMovableDirections( Lấy tập hợp các hướng đi có thể di chuyển
Coordinate coor) được xung quanh ô có tọa độ coor. Giá trị trả
vềthuộc kiểu IEnumerable<DirectionType>.
Map.GetMovableDirections(Int32 i, Lấy tập hợp các hướng đi có thể di chuyển
Int32 j) được xung quanh ô tại dòng i, cột j. Giá trị trả
vềthuộc kiểu IEnumerable<DirectionType>.
Map.GetMovableLocations( Lấy tập hợp các tọa độ có thể di chuyển được
Coordinate coor) xung quanh ô có tọa độ coor. Giá trị trả về
thuộc kiểu IEnumerable<Coordinate>.
Map.GetMovableLocations(Int32 i, Lấy tập hợp các tọa độ có thể di chuyển được
Int32 j) xung quanh ô tại dòng i, cột j. Giá trị trả về
thuộc kiểu IEnumerable<Coordinate>.

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 13


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0
Map.GetMove(Ghost gho, Int32 turn) Lấy dữ liệu lịch sử vềhướng đi của Ghost gho
tại lượt có chỉ sốlà turn. Giá trị trả vềthuộc
kiểu DirectionType. Lưu ý: nế u tại lượt này
gho chưa xuất hiện thì trả về
DirectionType.None.
Map.GetMove(Pacman man, Int32 turn) Lấy dữ liệu lịch sử vềhướng đi của Pacman
man tại lượt có chỉ sốlà turn. Giá trị trả về
thuộc kiểu DirectionType.
Map.GetMoves(Ghost gho, Int32 start, Lấy dữ liệu lịch sử vềcount hướng đi của Ghost
Int32 count) gho bắt đầu từ lượt có chỉ sốlà start. Giá trị trả
vềthuộc kiểu DirectionType[].
Map.GetMoves(Pacman man, Int32 start, Lấy dữ liệu lịch sử về count hướng đi của
Int32 count) Pacman man bắt đầu từ lượt có chỉ sốlà start.
Giá trị trả vềthuộc kiểu DirectionType[].
Map.GetPacman(Int32 index) Lấy đối tượng Pacman theo sốthứ tự index
(được đánh sốbắt đầu từ 0). Giá trị trả về
thuộc kiểu Pacman, hoặc trả về null nế u
Pacman này không còn tồn tại.
Map.GetPacmanMoves() Lấy toàn bộ dữ liệu lịch sử vềhướng đi của tất
cả các Pacman đã và đang xuất hiện trong mê
cung. Giá trị trả về thuộc kiểu
Dictionary<Pacman, DirectionType[]>.
Map.GetPacmans() Lấy mảng toàn bộ các Pacman có trong mê
cung. Giá trị trả vềthuộc kiểu Pacman[].
Map.GetPacman(Coordinate coor) Lấy Pacman hiện đang nằm tại tọa độ coor
trên mê cung. Giá trị trả về thuộc kiểu
Pacman. Nế u không có Pacman nào thì trả về
null.
Map.GetPacman(Int32 i, Int32 j) Lấy Pacman hiện đang nằm tại dòng i, cột j
trên mê cung. Giá trị trả về thuộc kiểu
Pacman. Nế u không có Pacman nào thì trả về
null.
Map.GhostDuration Lấy sốlượt di chuyển mà cứ sau sốlượt này,
một Ghost mới sẽ được sinh ra. Giá trị trả về
thuộc kiểu Int32. Lưu ý: do mỗi lượt di chuyển
cách nhau 0.2 giây nên Map.GhostDuration ÷
5 chính là khoảng thời gian tính theo giây giữa
các lần xuất hiện của Ghost.
Map.Height Lấy chiề u cao của mê cung. Giá trị trả vềthuộc
kiểu Int32.
Map.IsPaused Kiểm tra trò chơi có đang bị tạm dừng hay
không. Thuộc tính này ít khi được sử dụng.
Map.IsPlaying Kiểm tra trò chơi có đang diễn ra hay không.
Thuộc tính này ít khi được sử dụng.
Map.IsStarted Kiểm tra trò chơi đã được bắt đầu hay chưa.
Thuộc tính này ít khi được sử dụng.
Map.IsStopped Kiểm tra trò chơi đã được kế t thúc hay chưa.
Thuộc tính này ít khi được sử dụng.
Map.NextGhostDuration Lấy sốlượt di chuyển tiế p theo mà một Ghost
mới sẽ xuất hiện. Giá trị trả vềthuộc kiểu
Int32.
Map.NextGhostLocation Lấy tọa độ tiế p theo mà một Ghost mới sẽ xuất
hiện. Giá trị trả vềthuộc kiểu Coordinate.

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 14


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0
Map.NoGhosts Lấy sốlượng Ghost hiện tại có trong mê cung.
Giá trị trả vềthuộc kiểu Int32. Lưu ý: sốthứ tự
của các Ghost được đánh số từ 0 đế n
NoGhosts - 1.
Map.NoMagics Lấy sốlượng ô chứa vật Magic còn trong mê
cung. Giá trị trả vềthuộc kiểu Int32.
Map.NoPacmans Lấy sốlượng Pacman hiện tại có trong mê
cung. Giá trị trả vềthuộc kiểu Int32. Lưu ý: số
thứ tự của các Pacman được đánh sốtừ 0 đế n
NoPacmans - 1.
Map.NoPoints Lấy sốlượng ô chứa điểm còn trong mê cung.
Giá trị trả vềthuộc kiểu Int32.
Map.Turns Lấy sốlượt di chuyển đã trải qua kể từ khi trò
chơi bắt đầu. Giá trị trả vềthuộc kiểu Int32.
Map.WeakDuration Lấy sốlượt di chuyển mà Pacman hay Ghost
phải trải qua để trở lại trạng thái bình thường
kể từ khi rơi vào trạng thái yếu do tác dụng của
vật Magic. Giá trị trả vềthuộc kiểu Int32. Mặc
định, giá trị này là một nửa chu vi của mê
cung.
Map.Width Lấy chiề u rộng của mê cung. Giá trị trả về
thuộc kiểu Int32.

3. Pacman
Cung cấp các hàm tiện ích để làm việc với Pacman. Đây là những hàm gắn với một đối tượng
Pacman P cụ thể.

Prototype Mô tả
Pacman.CanEat(Pacman man) Kiểm tra Pacman P có khả năng ăn được
Pacman man hay không.
Pacman.CanEat(Ghost gho) Kiểm tra Pacman P có khả năng ăn được Ghost
gho hay không.
Pacman.CanGo(DirectionType dir) Kiểm tra Pacman P có thể đi tiế p theo hướng
dir hay không.
Pacman.Color Lấy màu sắc của Pacman P, trả vềgiá trị màu
thuộc kiểu System.Windows.Media.Color.
Pacman.Direction Gán hoặc lấy hướng đi hiện tại của Pacman P,
trả về giá trị hướng đi thuộc kiểu
DirectionType. Lưu ý: Pacman P không thể
gán hướng đi cho Pacman khác hoặc ngược lại.
Pacman.EatenGhosts Lấy sốlượng Ghost mà Pacman P đã ăn được
kể từ lúc bắt đầu trò chơi. Giá trị trả vềthuộc
kiểu Int32.
Pacman.Index Lấy sốthứ tự chỉ mục của Pacman P trong
danh sách các Pacman có mặt ở mê cung. Giá
trị trả vềthuộc kiểu Int32. Lưu ý: nế u Pacman
đã bị tiêu diệt thì trả về-1.
Pacman.IsDead Kiểm tra Pacman P đã bị tiêu diệt hay chưa.
Pacman.Location Lấy tọa độ hiện thời của Pacman P trên mê
cung, trả về giá trị tọa độ thuộc kiểu
Coordinate.
Pacman.Name Trả vềtên của Pacman P dưới dạng chuỗi.

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 15


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0
Pacman.NextGhostPoints Trả vềsốđiểm sẽ được cộng thêm nế u Pacman
P tiếp tục ăn được một Ghost nữa.
Pacman.Points Lấy sốđiểm mà Pacman P đã ghi được từ khi
bắt đầu trò chơi. Sốđiểm này là sốnguyên
dương kiểu Int32.
Pacman.Start() Hàm khởi động của Pacman P được gọi bởi
chương trình chơi khi trò chơi bắt đầu.
Pacman.Weak Lấy trạng thái hiện tại của Pacman P. Nế u P
đang bình thường, trả vềgiá trị 0. Nế u P đang
ở trạng thái yế u, trả vềsốnguyên dương kiểu
Int32 biểu diễn sốlượt di chuyển mà P cần
phải trải qua để trở lại trạng thái bình thường.

4. Ghost
Cung cấp các hàm tiện ích để làm việc với Ghost. Đây là những hàm gắn với một đối tượng
Ghost G cụ thể.

Prototype Mô tả
Ghost.CanEat(Pacman man) Kiểm tra Ghost G có khả năng ăn được
Pacman man hay không.
Ghost.CanGo(DirectionType dir) Kiểm tra Ghost G có thể đi tiế p theo hướng dir
hay không.
Ghost.Direction Lấy hướng đi hiện tại của Ghost G, trả vềgiá trị
hướng đi thuộc kiểu DirectionType.
Ghost.Index Lấy sốthứ tự chỉ mục của Ghost G trong danh
sách các Ghost có mặt ở mê cung. Giá trị trả về
thuộc kiểu Int32. Lưu ý: nế u Ghost đã bị tiêu
diệt thì trả về-1.
Ghost.IsDead Kiểm tra Ghost G đã bị tiêu diệt hay chưa.
Ghost.Location Lấy tọa độ hiện thời của Ghost G trên mê cung,
trả vềgiá trị tọa độ thuộc kiểu Coordinate.
Ghost.Weak Lấy trạng thái hiện tại của Ghost G. Nế u G
đang bình thường, trả vềgiá trị 0. Nế u G đang
ở trạng thái yế u, trả vềsốnguyên dương kiểu
Int32 biểu diễn sốlượt di chuyển mà G cần
phải trải qua để trở lại trạng thái bình thường.

5. Utils
Cung cấp một sốhàm tiện ích hỗ trợ cho công việc lập trình. Đây là những hàm static có thể
gọi trực tiế
p từ lớp Utils.

Prototype Mô tả
Utils.FillArray(T[] array, T value) Gán value làm giá trị của tất cả các phần tử
thuộc mảng một chiề u array.
Utils.FillArray(T[,] array, T value) Gán value làm giá trị của tất cả các phần tử
thuộc mảng 2 chiề u array.
Utils.GetColor(String color) Lấy giá trị màu từ một chuỗi mô tả. Giá trị trả
vềthuộc kiểu System.Windows.Media.Color.
Utils.GetOppositeDirection( Trả vềhướng đi ngược lại với hướng đi dir
DirectionType dir) được cung cấp. Ví dụ, nế u dir là

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 16


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0
DirectionType.North thì hàm trả về
DirectionType.South.
Utils.GetRandom() Trả vềmột sốnguyên dương kiểu Int32 có giá
trị ngẫu nhiên.
Utils.GetRandom(Int32 maxValue) Trả vềmột sốnguyên dương kiểu Int32 có giá
trị ngẫu nhiên nhỏ hơn maxValue.
Utils.GetRandom(Int32 minValue, Trả vềmột sốnguyên kiểu Int32 có giá trị
Int32 maxValue) ngẫu nhiên trong khoảng minValue và
maxValue.
Utils.GetRandomDouble() Trả vềmột sốthực có giá trị ngẫu nhiên trong
khoảng từ 0 đế n 1.
Utils.SetRandomBytes(Byte[] buffer) Gán các giá trị sốnguyên kiểu Byte ngẫu nhiên
vào từng vị trí của mảng buffer.
Utils.Shuffle(IEnumerable<T> list) Trả vềmột hợp gồm các phần tử đã được xáo
trộn ngẫu nhiên từ tập hợp list.

F. Các qui định


1. Không được sử dụng Thread hoặc Parallel Task Library. Mỗi Pacman chỉ được chạy
trên thread do chương trình chơi cung cấp nhằm bảo đảm công bằng vềviệc tiêu thụ
CPU.
2. Không được gọi hàm Pacman.Start(). Đây là hàm khởi động Pacman và chỉ chương
trình chơi mới được phép gọi khi trò chơi bắt đầu.
3. Không được sử dụng con trỏ để bảo đảm an toàn vềmặt tài nguyên vùng nhớ.
4. Không được chọn màu của Pacman là Black, Blue hay White vì sẽ làm rối mắt khán giả
do bản đồcủa chương trình chơi cũng được xây dựng từ 3 màu này.
5. Không được thực hiện bất kỳ xử lý nào trong thuộc tính Color và Name của Pacman để
bảo đảm độ phức tạp của 2 thuộc tính này luôn là O(1).
6. Không được viế t thêm hàm khởi tạo cho Pacman.
7. Không được sử dụng các hàm input/output gây gián đoạn trò chơi, ví dụ như
InputBox, MessageBox, v.v…
8. Không được gọi các chương trình, các thư viện khác ngoài việc sử dụng API do chương
trình chơi và .NET Framework cung cấp, điển hình là dùng thư viện của Windows như
user32.dll, hay command line cmd.exe.
9. Không được sử dụng những kỹ thuật gây ảnh hưởng xấu đế n hệ thống máy tính và
thuật toán của các Pacman khác, điển hình là lập trình đệ qui, chiế m dụng bộ nhớ,
hoặc khóa các tài nguyên sử dụng chung.
10. Ở mỗi lượt di chuyển, chương trình chơi thực hiện những công việc sau đây:
a. Giảm trạng thái Weak của Pacman và Ghost 1 đơn vị.
b. Trao quyề n di chuyển luân phiên từ Pacman đầu tiên đế n Pacman cuối cùng,
sau đó đế n lượt các Ghost. Nế u Pacman hay Ghost ở vào trạng thái yế
u thì sẽ
mất lượt di chuyển tại các thời điểm Pacman.Weak hay Ghost.Weak là sốlẻ.
c. Sinh thêm Ghost mới nế u đúng thời điểm qui định.

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 17


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0
G. Hỏi đáp
1. Trong thi đấu thì tôi có cần phải thực hiện cả 7 bước như ví dụ mẫu hay
không?

Không. BTC sẽ thực hiện các bước từ 1 đế n 4 và chuẩn bị sẵn máy tính cho việc lập trình.
Trong thời gian thi đấu, lập trình viên thực hiện tiếp tục từ bước 5 đế
n 7. Sau khi hoàn thành
xong phần chơi, BTC tiế p tục thực hiện bước 8 và 9.

2. Điều gì sẽ xảy ra nếu tôi cài đặt hàm Start() không phải là một vòng lặp vô
hạn?

Lập trình viên được phép thực hiện điều này. Tuy nhiên, do đặc tính của chương trình chơi,
khi hàm Start() kết thúc đồng nghĩa với việc báo hiệu Pacman sẽ không còn có khả năng cập
nhật hướng đi nữa. Kể từ lúc này cho đế n khi trò chơi chấm dứt, Pacman sẽ chỉ đi theo một
hướng – đó chính là hướng đi cuối cùng mà nó cập nhật vào thuộc tính Direction.

3. Tôi có thể mang theo bàn phím và chuột riêng để thuận ti ện trong thao tác
hay không?

Hoàn toàn có thể. Lưu ý rằng BTC chỉ chấp nhận chuột và bàn phím có cổng USB.

4. Tôi có quyền mang theo tài liệu trong lúc lập trình không?

Không. Kể cả ở ví trí lập trình và vị trí chờ đề


u không được phép sử dụng tài liệu dưới bất kỳ
hình thức nào. BTC sẽ cung cấp sẵn giấy thi và viế t cho việc thảo luận, ghi chú. Giấy thi tại vị
trí chờ không được mang lên vị trí lập trình và ngược lại.

5. Bản đồthi đấu sẽ thay đổi như thếnào qua từng trận đấu?

Cuộc thi sẽ có 4 bản đồdành cho sơ loại, vòng loại, bán kết và chung kế t. Lập trình viên được
quyền biế t trước bản đồđể chuẩn bị trong vòng một tuần trước ngày thi.

6. Thuật toán điều khiển Ghost của BTC thay đổi thếnào qua từng trận đấu?

Mỗi trận đấu BTC có quyề n thay đổi một thuật toán khác nhau, không nhất thiế
t phải giống
với chương trình chơi được cung cấp với mục đích làm quen. BTC cũng không thông báo gì
trước vềmức độ thông minh của các Ghost.

7. Trong trường hợp tên và màu của các Pacman trùng nhau thì xử lý nh ư thế
nào?

BTC sẽ ưu tiên đội thi có điểm sốthấ


p hơn. Các đội còn lại buộc phải thay đổi tên hoặc chọn
một màu khác cho Pacman của mình.

8. Làm thếnào tôi có thể debug thư viện Pacman?

Để chạy Pacman, nế u lập trình viên phải copy thư viện dll và chạy chương trình chơi m ột cách
thủ công thì khá bất tiện trong lúc lập trình. Hướng dẫn sau đây mô tả cách thức thiế t lập chế
độ debug để thuận tiện cho việc dò lỗi. Trước khi thi đấu, tất cả máy tính cũng sẽ được BTC
cấu hình sẵn như bên dưới.

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 18


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0
Bước 1: Do phiên bản Visual Studio 2010 Express không hỗ trợ nhiề u thiết đặt Start Options
nên lập trình viên cần làm thủ công như sau. Mở tập tin project *.csproj (C#) ho ặc *.vbproj
(VB.NET) bằng notepad, thêm nội dung StartAction và StartProgram vào bên dưới thẻ
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">:

<StartAction>Program</StartAction>
<StartProgram>Đường dẫn đến chương trình chơi Pacman.exe</StartProgram>

Ngôn ngữ C#

Bước 2: Trong Visual C# 2010 Express, click phải vào project và ch ọn Properties.

Bước 3: Trong tab Build, mục Output, chọn Output Path là thư mục Pacmans c ủa phần mề
m
chơi.

Ngôn ngữ VB.NET

Bước 2: Trong Visual Basic 2010 Express, click phải vào project và ch ọn Properties.

Bước 3: Trong tab Compile, chọn Build output path là thư mục Pacmans c ủa phần mề
m chơi.

Cả 2 ngôn ngữ

Bước 4: Trong tab Debug, mục Start Options, chọn Working directory là thư m ục gốc của
phần mề m chơi.

Bước 5: Sao lưu lại project, đặt breakpoint tại các vị trí cần thiế
t và nhấn F5 để bắt đầu debug.

9. Tại sao trong thư mục Output của project tôi l ại thấy có cả tập tin
Pacman.exe?

Chương trình chơi Pacman.exe được project tham chiế u đế n trong lúc lập trình, do đó mặc
định nó sẽ được copy vào thư mục Output. Sự xuất hiện của nó, có hay không có, cũng không
gây ảnh hưởng gì đế n hoạt động của thư viện dll trong lúc thi đấu. Tuy nhiên, nế u cảm thấy
bất tiện, lập trình viên có thể tùy chỉnh như sau để ngăn việc tự động copy này: click vào
References\Pacman ở Solution Explorer, gán thuộc tính Copy Local ở Properties Window là
False.

10. Làm thếnào để ngăn chặn các Pacman khác gọi hàm Pacman.Start() của
tôi?

BTC đã có luật cấm gọi hàm Pacman.Start(). Pacman vi phạm luật này bị loại khỏi cuộc chơi.
Nếu lập trình viên vẫn chưa an tâm, có thể sử dụng cách thức sau để ngăn cản:

- Định nghĩa một biế n isStart kiểu Boolean và gán giá trị khởi tạo là False.
- Trong hàm Start(), nế u isStart là False thì gán isStart bằng True và chạy thuật toán,
ngược lại thoát khỏi hàm.

Phương cách trên không hoàn toàn giải quyế


t được vấn đề
, tuy nhiên nó góp phần hạn chế
một sốrủi ro có thể xảy ra.

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 19


Cúp Sáng Tạo Công Nghệ Thông Tin 201
0
11. Pacman của tôi gây ra lỗi trong lúc thực thi, làm sao để tôi xem chi tiết nội
dung của lỗi?

Khi Pacman bị hủy vì gây ra lỗi, nội dung lỗi sẽ nằm ẩn bên dưới khu vực điểm sốcủa Pacman.
Để thấy được nội dung này, lập trình viên trỏ chuột vào gần điểm số, chú thích (tooltip) vềlỗi
sẽ hiện ra.

12. Chương trình chơi bị crash trong lúc chạy vì thư viện WINMM.dll?

Thông thường, lỗi này không xuất hiện trên hầu hế


t các nề
n tảng Windows ngoại trừ Vista. Để
khắc phục lỗi này, có 2 phương án:

- Downgrade vềWindows XP hoặc upgrade lên Windows 7.


- Vô hiệu hóa âm thanh trong trò chơi bằng phím F7 trước khi nhấn Enter để bắt đầu.

BTC ITICup 2010

Năng động – Sáng tạo – Thân thiện – Phát triểnTrang 20

You might also like