You are on page 1of 22

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 ......................................................................................................................................... 4
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 2010

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 Pacman1. Ý 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ển Trang 1


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

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ển Trang 2


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

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.

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


Cúp Sáng Tạo Công Nghệ Thông Tin 2010
- map.xml: Dữ liệu về bản đồ và vị trí khởi động của các Pacman.
- 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.

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.

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


Cúp Sáng Tạo Công Nghệ Thông Tin 2010
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.

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.

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


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

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ển Trang 6


Cúp Sáng Tạo Công Nghệ Thông Tin 2010
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"; }
}

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))

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


Cúp Sáng Tạo Công Nghệ Thông Tin 2010
{
// 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ển Trang 8


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

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ển Trang 9


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

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ển Trang 10


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

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.

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”.

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


Cúp Sáng Tạo Công Nghệ Thông Tin 2010
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ế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.

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


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

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.

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.

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


Cúp Sáng Tạo Công Nghệ Thông Tin 2010
- 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ếu j + 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ếu i + 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 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 hướng
DirectionType dir) 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 hướng
DirectionType dir) dir cạnh bên ô tại dòng i, cột j. Giá trị trả về thuộc

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


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

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 được
Coordinate coor) 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 được
Int32 j) 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 xung
Coordinate coor) 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 xung
Int32 j) quanh ô tại dòng i, cột j. Giá trị trả về thuộc kiểu
IEnumerable<Coordinate>.
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 Pacman

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


Cúp Sáng Tạo Công Nghệ Thông Tin 2010
Int32 count) 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.
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

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


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

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.
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.

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


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

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 được
DirectionType dir) cung cấp. Ví dụ, nếu dir là 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ị ngẫu
Int32 maxValue) 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.

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


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

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.

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?

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


Cúp Sáng Tạo Công Nghệ Thông Tin 2010
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.

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.

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


Cúp Sáng Tạo Công Nghệ Thông Tin 2010
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.

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.

BTC ITICup 2010

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

You might also like