PDF:

30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần
1: Tạo 10 kịch bản lệnh cơ sở
Duane O'Brien
Phát triển PHP, Java
自由职业者
31 07 2009
PHP là một ngôn ngữ lập trình dễ sử dụng, dễ học, có mặt rộng rãi mọi nơi. Nó cũng rất thích
hợp để phát triển các kịch bản lệnh đơn giản mà bạn có thể sử dụng để giúp bạn trong tất cả các
loại trò chơi. Cho dù bạn chưa hay đã từng chơi các trò chơi một mình đơn giản chỉ dùng bút
và giấy, các trò chơi phức tạp, có phân vai, bên bàn với một nhóm người, hay các trò chơi trực
tuyến bất kỳ loại nào, thì loạt bài viết này này vẫn sẽ có một ý nghĩa gì đó đối với bạn. Mỗi bài
trong loạt bài "30 kịch bản lệnh trò chơi bạn có thể viết trong PHP" sẽ trình bày 10 kịch bản lệnh
trong khoảng 300 từ hoặc ít hơn (3d10 là viết tắt từ “roll three 10-sided dice” – lăn súc sắc 10
mặt ) đủ đơn giản đối với ngay cả một nhà phát triển mới vào nghề, nhưng cũng đủ ích lợi đối
với một tay chơi dày dạn. Mục đích là cung cấp cho bạn một thứ gì đó mà bạn có thể sửa đổi
cho phù hợp với nhu cầu của bạn, sao cho bạn có thể gây ấn tượng cho bạn bè và người chơi
bằng cách làm nổ tung máy tính xách tay của bạn trong ván tiếp theo.
Xem thêm bài trong loạt bài này
Bắt đầu
Với tư cách là người thạo trò chơi/người kể chuyện và cũng là người phát triển, tôi thường tự mình
viết vài tiện ích nhỏ và kịch bản lệnh để giúp cho chạy, lập kế hoạch, và chơi các trò chơi. Đôi khi
tôi cần một ý tưởng nhanh. Vào lúc khác, tôi lại cần một đống tên cho các Nhân vật Không-phải-làNgười-chơi (NPCs - Non-Player Characters). Thỉnh thoảng, tôi cần phải vùi đầu vào các con số, tính
toán tỷ lệ cược, hoặc tích hợp một số trò đố chữ vào một trò chơi. Nhiều việc trong số đó trở nên dễ
quản lý hơn với một ít công sức làm kịch bản lệnh sẵn từ trước.
Bài này sẽ khám phá 10 kịch bản lệnh cơ bản, có thể được sử dụng trong các loại trò chơi. Kho lưu
trữ mã chứa toàn bộ nguồn cho từng kịch bản lệnh chúng ta sẽ thảo luận, và bạn có thể thấy các
kịch bản lệnh này hoạt động như thế nào tại trang web chaoticneutral.
Chúng ta sẽ điểm qua các kịch bản lệnh này khá nhanh. Các chủ đề về tìm kiếm một máy chủ chứa
hoặc thiết đặt một máy chủ sẽ không được trình bày. Có nhiều công ty chủ chứa các trang web
cung cấp PHP, và bộ cài đặt XAMPP rất dễ sử dụng nếu bạn muốn thiết lập máy chủ cho riêng bạn.
Chúng ta sẽ không dành nhiều thời gian nói về các thói quen thực hành PHP tốt nhất hoặc các kỹ
© Copyright IBM Corporation 2009
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 1: Tạo
10 kịch bản lệnh cơ sở
Nhẫn hiệu đăng ký
Trang 1 của 15
developerWorks®
ibm.com/developerWorks/vn/
thuật thiết kế trò chơi hay nhất. Các kịch bản lệnh này được thiết kế đơn giản để dễ hiểu, sử dụng
đơn giản, và nhanh chóng nắm bắt được.
Trò gieo súc sắc cơ sở
Nhiều trò chơi và các hệ thống trò chơi cần đến súc sắc. Hãy bắt đầu với một cái gì đó đơn giản:
gieo một quân súc sắc sáu mặt. Về bản chất, không có khác biệt giữa việc gieo một con súc sắc sáu
mặt và việc nhặt ngẫu nhiên một số từ 1 đến 6. Trong PHP, đây là điều đơn giản: echo rand(1,6);.
Trong nhiều trường hợp, như thế cũng đã là ổn. Nhưng khi chúng ta làm việc với các trò chơi may
rủi (games of chance), chúng ta cần cái gì đó tốt hơn một chút. PHP cung cấp một máy sinh số
ngẫu nhiên tốt hơn, đó là: mt_rand(). Không cần đi sâu vào chi tiết về sự khác biệt giữa hai cái đó,
cứ an tâm khi giả thiết rằng mt_rand là một máy sinh số ngẫu nhiên tốt hơn và nhanh hơn: echo
mt_rand(1,6);. Chúng ta về tổng thể sẽ hài lòng hơn nếu đặt những cái này vào trong một hàm.
Liệt kê 1. Sử dụng hàm sinh số ngẫu nhiên mt_rand()
function roll () {
return mt_rand(1,6);
}
echo roll();
Sau đó chúng ta có thể chuyển kiểu súc sắc chúng ta muốn dùng tới hàm này dưới dạng một tham
số.
Liệt kê 2. Chuyển kiểu súc sắc thành một tham số
function roll ($sides) {
return mt_rand(1,$sides);
}
echo roll(6);
echo roll(10);
echo roll(20);
// roll a six-sided die
// roll a ten-sided die
// roll a twenty-sided die
Từ đây, chúng ta có thể tiếp tục gieo nhiều súc sắc một lần, trả về một mảng kết quả, hoặc gieo
nhiều con súc sắc các loại khác nhau cùng một lúc, tùy vào nhu cầu của chúng ta. Nhưng kịch bản
lệnh đơn giản này có thể được sử dụng cho hầu hết các nhiệm vụ.
Máy sinh tên ngẫu nhiên
Nếu bạn đang chạy các trò chơi, viết các truyện, hoặc tạo ra một nhóm các nhân vật cùng một lúc,
đôi khi khó tìm thấy các tên mới. Chúng ta hãy xem xét một máy sinh tên ngẫu nhiên mà bạn có
thể sử dụng để giải quyết vấn đề này. Để khởi động, chúng ta hãy tạo hai mảng đơn giản — một
mảng các tên riêng, một mảng các tên họ.
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 1: Tạo
10 kịch bản lệnh cơ sở
Trang 2 của 15
ibm.com/developerWorks/vn/
developerWorks®
Liệt kê 3. Hai mảng đơn giản các tên riêng và tên họ
$male = array(
"William",
"Henry",
"Filbert",
"John",
"Pat",
);
$last = array(
"Smith",
"Jones",
"Winkler",
"Cooper",
"Cline",
);
Sau đó chúng ta có thể chỉ cần chọn ra một phần tử ngẫu nhiên từ mỗi mảng: echo
$male[array_rand($male)] . ' ' . $last[array_rand($last)];. Để rút ra một nhóm tên mỗi lần,
chúng ta có thể chỉ cần xáo trộn các mảng và rút ra nhiều hay ít tuỳ thích.
Liệt kê 4. Xáo trộn các mảng tên
shuffle($male);
shuffle($last);
for ($i = 0; $i <= 3; $i++) {
echo $male[$i] . ' ' . $last[$i];
}
Khi nắm được khái niệm cơ bản này, chúng ta có thể tạo ra các tệp tin văn bản để lưu giữ các tên
riêng và tên họ. Nếu chúng ta đặt một tên trên mỗi dòng trong tệp tin văn bản của chúng ta, chúng
ta có thể dễ dàng chia tách nội dung các tệp tin theo ký tự xuống dòng để xây dựng các mảng
nguồn của chúng ta.
Liệt kê 5. Tạo các tệp tin văn bản cho các tên của chúng ta
$male = explode('\n', file_get_contents('names.female.txt'));
$last = explode('\n', file_get_contents('names.last.txt'));
Hãy xây dựng hoặc tìm ra một số tệp tin tốt chứa các tên (một vài tệp có trong kho lưu trữ mã) và
chúng ta sẽ không bao giờ muốn tìm thêm các tên nữa.
Máy sinh kịch bản
Theo cùng một nguyên tắc cơ bản mà chúng ta đã sử dụng để làm máy sinh tên, chúng ta có thể
làm ra cái gọi là máy sinh kịch bản Điều này là hữu ích trong các trò chơi nhập vai hay các tình
huống khác mà chúng ta cần có một tập hợp giả ngẫu nhiên các tình huống, có thể được sử dụng
để đóng vai diễn, ứng tác, viết, v.v... Một trong những trò chơi yêu thích của tôi là Paranoia, có một
thứ tên là “mission blender” (N.D: máy trộn ngẫu nhiên, sinh ra các sứ mệnh (nhiệm vụ) khác nhau
để luyện trí óc) trong GM Pack của nó. Mission blender có thể được sử dụng để lắp ghép thành một
sứ mệnh đầy đủ dựa trên kết quả gieo súc sắc. Chúng ta hãy lắp ghép máy sinh kịch bản của chính
chúng ta.
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 1: Tạo
10 kịch bản lệnh cơ sở
Trang 3 của 15
developerWorks®
ibm.com/developerWorks/vn/
Lấy kịch bản sau đây: Bạn thức dậy thấy bị lạc trong rừng. Bạn biết bạn phải đến New York, nhưng
bạn không biết lý do. Bạn nghe thấy tiếng chó sủa và âm thanh không thể nhầm lẫn của những kẻ
săn tìm thù địch ngay gần đó. Bạn bị lạnh, run, và không có vũ khí. Mỗi câu trong kịch bản đó đưa
ra một khía cạnh cụ thể của kịch bản:
•
•
•
•
"Bạn thức dậy thấy bị lạc trong rừng" — Việc này tạo ra một khung cảnh (setting).
"Bạn biết bạn phải đến New York" — Điều này mô tả một mục tiêu.
"Bạn nghe thấy tiếng chó sủa" — Việc này đưa ra một bên đối kháng.
"Bạn bị lạnh, run, và không có vũ khí" — Điều này làm gia tăng sự phức tạp.
Đúng như chúng ta đã tạo ra các tệp tin văn bản cho tên riêng và tên họ của chúng ta, bắt đầu
bằng việc tạo các tệp tin văn bản tương ứng cho các khung cảnh, các mục tiêu, các bên đối kháng,
và sự phức tạp. Các tệp tin mẫu được gộp trong kho lưu trữ mã. Một khi chúng ta có các tệp tin
này, mã để sinh ra một kịch bản trông rất giống với mã để sinh ra các tên.
Liệt kê 6. Sinh ra một kịch bản
$settings = explode("\n", file_get_contents('scenario.settings.txt'));
$objectives = explode("\n", file_get_contents('scenario.objectives.txt'));
$antagonists = explode("\n", file_get_contents('scenario.antagonists.txt'));
$complications = explode("\n", file_get_contents('scenario.complications.txt'));
shuffle($settings);
shuffle($objectives);
shuffle($antagonists);
shuffle($complications);
echo $settings[0] . ' ' . $objectives[0] . ' ' . $antagonists[0] . ' '
. $complications[0] . "<br />\n";
Chúng ta có thể thêm các yếu tố vào kịch bản của chúng ta bằng cách bổ sung các tệp tin văn bản
mới, hoặc chúng ta có thể muốn gia tăng thêm nhiều sự phức tạp. Chúng ta càng thêm vào các tệp
tin văn bản cơ bản, thì sau này các kịch bản của chúng ta càng thêm đa dạng.
Trình lập cỗ bài và trình xáo trộn bài
Nếu bạn chơi bài và quan tâm đến việc viết bất kỳ kịch bản lệnh nào liên quan đến lá bài, chúng ta
muốn ghép cùng nhau một trình lập cỗ bài với trình trộn bài lập sẵn. Để bắt đầu, chúng ta hãy lập
ra một cỗ bài cơ sở gồm các lá bài tiêu chuẩn. Chúng ta cần phải lập hai mảng — một mảng để giữ
các lá bài hoa (suits) và một mảng để giữ các lá bài mặt người (quân J, Q, K). Việc này sẽ cho phép
có sự linh hoạt sau này nếu chúng ta muốn thêm vào các hoa hoặc kiểu lá bài mới.
Liệt kê 7. Lập một cỗ bài cơ sở
$suits = array (
"Spades", "Hearts", "Clubs", "Diamonds"
);
$faces = array (
"Two", "Three", "Four", "Five", "Six", "Seven", "Eight",
"Nine", "Ten", "Jack", "Queen", "King", "Ace"
);
Sau đó lập ra một mảng cỗ bài để giữ tất cả các trị số của lá bài (card values). Chúng ta có thể làm
việc này một cách đơn giản bằng cách sử dụng một cặp vòng lặp foreach.
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 1: Tạo
10 kịch bản lệnh cơ sở
Trang 4 của 15
ibm.com/developerWorks/vn/
developerWorks®
Liệt kê 8. Lập một mảng cỗ bài
$deck = array();
foreach ($suits as $suit) {
foreach ($faces as $face) {
$deck[] = array ("face"=>$face, "suit"=>$suit);
}
}
Một khi chúng ta đã có một mảng cỗ bài được lập, chúng ta có thể trộn bài dễ dàng và rút ngẫu
nhiên một lá bài.
Liệt kê 9. Trộn cỗ bài và rút ngẫu nhiên một lá bài
shuffle($deck);
$card = array_shift($deck);
echo $card['face'] . ' of ' . $card['suit'];
Từ đây, chỉ còn một quãng đường ngắn để rút ra một tay bài gồm một bộ các lá bài hoặc lập ra một
multideck shoe (N.D – tên một lối chơi bài).
Trình tính toán khả năng: Rút lá bài
Do chúng ta đã lập ra cỗ bài theo cách đã làm ở trên, theo vết lá bài mặt người (face) và lá bài hoa
(suit) riêng rẽ, chúng ta có thể sử dụng cỗ bài theo cách lập chương trình để làm một điều gì đó
chẳng hạn như tính toán khả năng nhận được một lá bài cụ thể. Bắt đầu bằng cách rút ra hai tay bài
mỗi tay năm lá bài.
Liệt kê 10. Rút hai tay bài mỗi tay năm lá bài
$hands = array(1 => array(), 2=>array());
for ($i = 0; $i < 5; $i++) {
$hands[1][] = implode(" of ", array_shift($deck));
$hands[2][] = implode(" of ", array_shift($deck));
}
Sau đó chúng ta có thể tìm trong cỗ bài để xem có bao nhiêu lá bài còn lại và khả năng để rút được
một lá bài cụ thể là bao nhiêu. Còn lại bao nhiêu lá bài là một việc dễ dàng. Đó chỉ là việc đếm có
bao nhiêu phần tử trong mảng $deck. Để tính được khả năng rút được một lá bài cụ thể, chúng ta
cần một hàm duyệt qua toàn bộ cỗ bài và đánh giá các lá bài còn lại để xem chúng có khớp với
yêu cầu không.
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 1: Tạo
10 kịch bản lệnh cơ sở
Trang 5 của 15
developerWorks®
ibm.com/developerWorks/vn/
Liệt kê 11. Tính toán khả năng rút được một lá bài cụ thể
function calculate_odds($draw, $deck) {
$remaining = count($deck);
$odds = 0;
foreach ($deck as $card) {
if ( ($draw['face'] == $card['face'] && $draw['suit'] ==
$card['suit'] ) ||
($draw['face'] == '' && $draw['suit'] == $card['suit'] ) ||
($draw['face'] == $card['face'] && $draw['suit'] == '' ) ) {
$odds++;
}
}
return $odds . ' in ' $remaining;
}
Bây giờ chúng ta có thể chọn lá bài mà chúng ta đang thử rút. Để làm việc này dễ dàng hơn,
chuyển vào một mảng trông hệt như một lá bài. Chúng ta có thể tìm kiếm một lá bài cụ thể.
Liệt kê 12. Tìm kiếm một lá bài cụ thể
$draw = array('face' => 'Ace', 'suit' => 'Spades');
echo implode(" of ", $draw) . ' : ' . calculate_odds($draw, $deck);
Hoặc chúng ta có thể tìm một lá bài có một mặt người hoặc có hoa đã cho.
Liệt kê 13. Tìm kiếm một lá bài có một mặt người hoặc có hoa cho trước
$draw = array('face' => '', 'suit' => 'Spades');
$draw = array('face' => 'Ace', 'suit' => '');
Trình chia bài poker đơn giản
Bây giờ chúng ta đã có một trình lập cỗ bài và một thứ để tính ra khả năng rút được các lá bài cụ
thể, chúng ta có thể ghép thành một trình chia bài thực sự đơn giản để thực hành tay bài poker
(poker hands). Để phục vụ cho thí dụ này, chúng ta lập ra một trình chia bài để rút năm lá bài.
Trình chia bài sẽ cung cấp năm lá bài từ cỗ bài. Bạn chỉ rõ các lá bài nào mà bạn muốn chui thông
qua số hiệu lá bài, và trình chia bài sẽ thay các lá bài này bằng các lá bài mới từ cỗ bài. Chúng ta
sẽ không phải bận lòng với việc đặt ra các giới hạn rút bài hay các luật chơi riêng, mặc dù bạn có
thể thấy đó là một bài luyện tập cá nhân đáng làm.
Như đã trình bày trong phần trước, tạo ra và trộn một cỗ bài, sau đó tạo ra một tay bài gồm năm lá
bài. Hiển thị các lá bài bằng chỉ số mảng của chúng để bạn có thể xác định được những lá bài nào
trả về. Bạn phải làm điều đó bằng cách sử dụng các hộp kiểm để để chỉ các lá bài nào bạn muốn
thay thế.
Liệt kê 14. Sử dụng hộp kiểm để chỉ ra các lá bài bạn đang thay thế
foreach ($hand as $index =>$card) {
echo "<input type='checkbox' name='card[" . $index . "]'>
" . $card['face'] . ' of ' . $card['suit'] . "<br />";
}
Sau đó, đánh giá mảng đầu vào array $_POST['card'] để xem các lá bài đã được đánh dấu kiểm
để thay thế.
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 1: Tạo
10 kịch bản lệnh cơ sở
Trang 6 của 15
ibm.com/developerWorks/vn/
developerWorks®
Liệt kê 15. Đánh giá đầu vào
$i = 0;
while ($i < 5) {
if (isset($_POST['card'][$i])) {
$hand[$i] = array_shift($deck);
}
}
Sử dụng kịch bản lệnh này, bạn có thể thử luyện tay — chơi chữ có chủ ý — qua việc nêu rõ các
cách tốt nhất để xử lý một bộ các lá bài cụ thể.
Người chơi trò Hangman
Hangman về bản chất là một trò chơi đoán từ. Cho trước một từ có độ dài nhất định, chúng ta có
một số lần hạn chế để đoán các chữ cái. Nếu bạn đoán đúng một chữ cái có xuất hiện trong từ, tất
cả các vị trí xuất hiện của chữ đó được điền vào. Sau một số lần đoán sai định từ trước (thường là
sáu), bạn sẽ bị thua. Để lắp ghép thành một trò chơi hangman thô sơ, chúng ta cần bắt đầu với một
danh sách các từ. Bây giờ, chúng ta hãy tạo cho nó một mảng đơn giản.
Liệt kê 16. Tạo một danh sách các từ
$words = array (
"giants",
"triangle",
"particle",
"birdhouse",
"minimum",
"flood"
);
Sử dụng các kỹ thuật đã trình bày trước đây, chúng ta có thể di chuyển những từ này tới một tệp tin
văn bản danh sách các từ ở bên ngoài và nhập khẩu chúng vào theo ý muốn.
Khi chúng ta đã có một danh sách các từ, chúng ta cần chọn ngẫu nhiên một từ, hiển thị khoảng
trống thay cho mỗi chữ, và bắt đầu đoán. Chúng ta cần theo vết các lần đoán đúng và sai từ lần
đoán này đến lần khác. Chúng ta sẽ làm điều này với chi phí rẻ bằng cách chỉ cần sắp tuần tự mảng
các lần đoán và truyền qua mỗi lần đoán. Nếu ta muốn giữ không cho người chơi gian lận bằng
cách xem thẳng trang mã nguồn, thì phải làm một cái gì đó đảm bảo an ninh hơn một chút.
Lập ra các mảng để giữ các chữ cái và các lần đoán đúng/sai của chúng ta. Với lần đoán đúng,
chúng ta sẽ điền vào một mảng các chữ như các khóa và dấu chấm câu như là các giá trị.
Liệt kê 17. Lập các mảng để lưu giữ các chữ cái và các lần đoán
$letters = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
'p','q','r','s','t','u','v','w','x','y','z');
$right = array_fill_keys($letters, '.');
$wrong = array();
Bây giờ chúng ta cần một ít mã để đánh giá các lần đoán và hiển thị từ theo tiến triển của trò chơi
đoán chữ này.
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 1: Tạo
10 kịch bản lệnh cơ sở
Trang 7 của 15
developerWorks®
ibm.com/developerWorks/vn/
Liệt kê 18. Đánh giá các lần đoán và hiển thị sự tiến triển
if (stristr($word, $guess)) {
$show = '';
$right[$guess] = $guess;
$wordletters = str_split($word);
foreach ($wordletters as $letter) {
$show .= $right[$letter];
}
} else {
$show = '';
$wrong[$guess] = $guess;
if (count($wrong) == 6) {
$show = $word;
} else {
foreach ($wordletters as $letter) {
$show .= $right[$letter];
}
}
}
Trong kho lưu trữ mã nguồn, chúng ta có thể thấy cách thức xếp tuần tự các mảng của mỗi lần
đoán và chuyển chúng từ lần đoán này đến lần khác.
Trình trợ giúp trò chơi ô chữ
Tôi biết nó là xấu, nhưng đôi lúc khi bạn đang chơi trò đoán ô chữ, bạn bỗng vướng mắc khi cố gắng
tìm một từ có năm chữ cái mà bắt đầu bằng chữ C và kết thúc bằng chữ T. Bằng cách sử dụng cùng
một danh sách các từ chúng ta đã lập cho Hangman, có thể dễ dàng tìm kiếm những từ khóa vừa
khớp với một mẫu nhất định. Trước tiên, hãy thiết lập một cách để chuyển tải các từ. Để làm cho
việc này dễ dàng, hãy thay các chữ thiếu bằng các dấu chấm: $guess = "c...t";. Vì các biểu thức
chính quy coi một dấu chấm câu như là một ký tự duy nhất, chúng ta có thể dễ dàng duyệt qua hết
danh sách các từ, tìm kiếm từ vừa khớp.
Liệt kê 19. Duyệt qua danh sách các từ
foreach ($words as $word) {
if (preg_match("/^" . $_POST['guess'] . "$/",$word)) {
echo $word . "<br />\n";
}
}
Tùy vào chất lượng danh sách các từ của chúng ta và độ chính xác của mỗi phán đoán của chúng
ta, ta sẽ có thể nhận được một danh sách từ hợp lý để sử dụng tìm các so khớp khả dĩ. Bạn sẽ phải
tự quyết định liệu “chest” (rương, hòm; ngực) hay “cheat” (gian lận) là khớp hơn với “một từ gồm 5
chữ cái, có nghĩa là 'không chơi đúng luật.'"
Mad Libber
Mad Libs là một trò chơi với các từ mà người chơi lấy một câu chuyện ngắn và thay thế các từ khoá
biểu thị từ loại bằng một từ thuộc từ loại đó để tạo ra một phiên bản mới, ngớ ngẩn của câu chuyện
đã cho. Lấy văn bản sau: “Tôi đang dạo chơi trong công viên thì nhìn thấy một hồ nước. Tôi nhảy
xuống và uống phải quá nhiều nước. Tôi phải đi viện.” Bắt đầu bằng việc thay thế các từ loại bằng
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 1: Tạo
10 kịch bản lệnh cơ sở
Trang 8 của 15
ibm.com/developerWorks/vn/
developerWorks®
các thẻ từ thế chỗ. Bắt đầu và kết thúc mỗi thẻ từ thế chỗ bằng một dấu gạch dưới để tránh các
trùng khớp ngẫu nhiên.
Liệt kê 20. Thay thế các từ loại bằng các thẻ từ thế chỗ
$text = "I was _VERB_ing in the _PLACE_ when I found a _NOUN_.
I _VERB_ed in, and _VERB_ed too much _NOUN_. I had to go to the _PLACE_.";
Tiếp theo, hãy tạo ra vài danh sách từ cơ sở. Đối với ví dụ này, chúng ta sẽ không đi quá xa.
Liệt kê 20. Tạo vài danh sách từ cơ sở
$verbs = array('pump', 'jump', 'walk', 'swallow', 'crawl', 'wail', 'roll');
$places = array('park', 'hospital', 'arctic', 'ocean', 'grocery', 'basement',
'attic', 'sewer');
$nouns = array('water', 'lake', 'spit', 'foot', 'worm',
'dirt', 'river', 'wankel rotary engine');
Bây giờ chúng ta có thể lặp lại nhiều lần duyệt qua văn bản để thay thế các từ thế chỗ như yêu cầu.
Liệt kê 22. Đánh giá văn bản
while (preg_match("/(_VERB_)|(_PLACE_)|(_NOUN_)/", $text, $matches)) {
switch ($matches[0]) {
case '_VERB_' :
shuffle($verbs);
$text = preg_replace($matches[0], current($verbs), $text, 1);
break;
case '_PLACE_' :
shuffle($places);
$text = preg_replace($matches[0], current($places), $text, 1);
break;
case '_NOUN_' :
shuffle($nouns);
$text = preg_replace($matches[0], current($nouns), $text, 1);
break;
}
}
echo $text;
Rõ ràng, đây là một ví dụ đơn giản và thô thiển. Các danh sách từ của chúng ta càng chính xác
bao nhiêu, và chúng ta đầu tư càng nhiều thời gian vào văn bản cơ sở của chúng ta bao nhiêu, thì
kết quả mà ta nhận được càng tốt hơn bấy nhiêu. Chúng ta đã sử dụng các tệp tin văn bản để tạo
ra các danh sách tên và danh sách từ cơ sở. Sử dụng cùng một nguyên tắc này, chúng ta có thể
tạo ra các danh sách từ, phân chia theo từ loại và sử dụng chúng để tạo thêm các Mad Libs khác
nhau.
Trình chơi xổ số
Việc chọn đúng sáu số trong một trò xổ số, chẳng phải nói nhiều, là bất khả thi theo lý thuyết xác
suất thống kê. Tuy nhiên, nhiều người vẫn trả tiền để chơi, và nếu bạn ưa thích các con số, nó có
thể là thú tiêu khiển khi quan sát các xu hướng. Chúng ta hãy cùng tung ra một kịch bản lệnh cho
phép ta theo dõi các số trúng thưởng và cung cấp sáu số được chọn ít nhất trong danh sách của
chúng ta.
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 1: Tạo
10 kịch bản lệnh cơ sở
Trang 9 của 15
developerWorks®
ibm.com/developerWorks/vn/
(Từ chối trách nhiệm: Việc này sẽ không giúp bạn trúng xổ số, vì vậy xin đừng chi tiền của bạn vào
vé số. Đây chỉ là trò vui đùa).
Chúng ta ghi lưu các số vé trúng thưởng trong một tệp tin văn bản. Chúng ta phân tách từng số
một bằng dấu phẩy và đặt mỗi bộ số trên một dòng riêng của nó. Khi chúng ta nhận được nội dung
tệp tin, tách ra theo từng dòng, và tách mỗi dòng theo các dấu phẩy, chúng ta nhận được một thứ
trông giống như Liệt kê 23.
Liệt kê 23. Lưu các số vé trúng thưởng trong một tệp tin văn bản
$picks = array(
array('6', '10', '18', '21', '34', '40'),
array('2', '8', '13', '22', '30', '39'),
array('3', '9', '14', '25', '31', '35'),
array('11', '12', '16', '24', '36', '37'),
array('4', '7', '17', '26', '32', '33')
);
Rõ ràng, đó không hẳn là một tệp tin cơ sở để rút ra các số liệu thống kê. Nhưng đó là một sự khởi
đầu, và đủ để minh họa các nguyên lý.
Thiết lập một mảng cơ sở để lưu giữ phạm vi được chọn. Chẳng hạn, nếu chúng ta chọn các số từ 1
đến 40 (ví dụ, $numbers = array_fill(1,40,0);, sau đó duyệt qua từng lựa chọn, tăng tương ứng
các giá trị ăn khớp nhau.
Liệt kê 24. Duyệt qua từng lựa chọn của chúng ta
foreach ($picks as $pick) {
foreach ($pick as $number) {
$numbers[$number]++;
}
}
Cuối cùng, sắp xếp các số này theo giá trị. Thao tác này sẽ xếp các số được chọn ít nhất lên đầu
mảng.
Liệt kê 25. Sắp xếp các số theo giá trị
asort($numbers);
$pick = array_slice($numbers,0,6,true);
echo implode(',', array_keys($pick));
Bằng cách bổ sung thêm đều đặn các số trúng thưởng thực tế vào tệp tin văn bản chứa danh sách
các số được chọn của chúng ta, chúng ta có thể phát hiện xu thế chọn số trong một thời gian dài.
Thật là thú vị khi thấy được một số chữ số thường xuất hiện ra sao.
Tóm tắt
Bài viết này là một nguồn tài nguyên giúp bạn bước vào sử dụng PHP để giúp làm giàu thêm các
trải nghiệm trò chơi của bạn. Trong Phần 2 của loạt bài “30 kịch bản lệnh trò chơi bạn có thể viết
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 1: Tạo
10 kịch bản lệnh cơ sở
Trang 10 của 15
ibm.com/developerWorks/vn/
developerWorks®
trong PHP”, chúng ta xây dựng tiếp dựa trên các mã đã có ở đây và đi vào các kịch bản lệnh liên
quan sâu hơn, có thể mang lại cho bạn thậm chí nhiều ích lợi hơn nữa.
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 1: Tạo
10 kịch bản lệnh cơ sở
Trang 11 của 15
developerWorks®
ibm.com/developerWorks/vn/
Các tải về
Mô tả
10 kịch bản PHP
Tên
Kích thước
os-php-gamescripts1-php10games1.zip
377KB
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 1: Tạo
10 kịch bản lệnh cơ sở
Trang 12 của 15
ibm.com/developerWorks/vn/
developerWorks®
Tài nguyên
Học tập
• Bắt đầu với XAMPP: XAMPP là một bản phân phối Apache dễ cài đặt, có chứa MySQL, PHP
và Perl.
• Xem qua các ví dụ làm việc của tất cả các kịch bản lệnh.
• U.S. Census Bureau là một nguồn lớn các danh sách tên.
• Nhận một số thông tin về Paranoia.
• Tìm hiểu các quy tắc cơ bản về trò Rút năm lá bài.
• Đây là một số danh sách từ tiện dụng. Và trên ManyThings.org thậm chí còn nhiều hơn.
• Hãy truy cập trang web chính thức của Mad Libs site.
• Apache V2 and PHP Installation: Đọc một bài viết mô tả cách làm thế nào để Apache V2 và
PHP V4.x (cũng có thể sử dụng PHP V5.x) làm việc cùng nhau trên Linux.
• "Connecting PHP applications to Apache Derby" cho biết cách cài đặt và lập cấu hình PHP
trên Windows (một số bước có thể áp dụng với Linux).
• Đọc "Learning PHP, Part 1" để tìm hiểu về cơ sở PHP. Sau đó đọc Phần 2 để tìm hiểu cách tải
các tệp tin lên các địa chỉ truy cập được không phải là trang web, bằng cách sử dụng DOM và
SAX. Và Phần 3 hoàn tất ứng dụng dòng công việc (workflow application).
• Xem PHP Manual để tìm hiểu thêm về các đối tượng dữ liệu PHP và các khả năng của chúng.
• PHP.net là nguồn tài nguyên trung tâm cho các nhà phát triển PHP.
• Xem "Recommended PHP reading list."
• Duyệt qua toàn bộ nội dung PHP trên developerWorks.
• Mở rộng các kỹ năng của bạn bằng cách kiểm tra PHP project resources của IBM
developerWorks.
• Để nghe phỏng vấn và các cuộc thảo luận thú vị đối với các nhà phát triển phần mềm, kiểm tra
developerWorks podcasts.
• Bạn sử dụng cơ sở dữ liệu với PHP? Hãy thử Zend Core for IBM, đó là một môi trường phát
triển và chạy sản xuất PHP liền khối, sẵn để dùng ngay, dễ dàng cài đặt và có hỗ trợ DB2 V9
của IBM..
• Theo sát Các buổi phát tin trên mạng và sự kiện kỹ thuật của developerWorks.
• Xem qua các hội nghị, trưng bày thương mại, các buổi phát tin trên mạng và các Sự kiện khác
trên khắp thế giới sắp diễn ra mà các nhà phát triển mã nguồn mở của IBM quan tâm đến.
• Hãy truy cập vào Open source zone của developerWorks để có các thông tin hướng dẫn cách
làm, các công cụ, và các dự án cập nhật, giúp bạn phát triển với các công nghệ mã nguồn mở
và sử dụng chúng với các sản phẩm của IBM.
• Theo dõi và tìm hiểu về IBM và các công nghệ mã nguồn mở và các chức năng của sản phẩm
qua các trình diễn miến phí theo yêu cầu trên developerWorks (developerWorks On demand
demos).
Lấy sản phẩm và công nghệ
• Đổi mới dự án phát triển mã nguồn mở tiếp theo của bạn với phần mềm dùng thử của IBM
(IBM trial software), sẵn có để tải về hoặc trên đĩa DVD.
• Tải về Các phiên bản đánh giá sản phẩm của IBM (IBM product evaluation versions), và hãy
bắt tay vào các công cụ phát triển ứng dụng và các sản phẩm phần mềm tầng giữa từ DB2®,
Lotus®, Rational®, Tivoli® và WebSphere®.
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 1: Tạo
10 kịch bản lệnh cơ sở
Trang 13 của 15
developerWorks®
ibm.com/developerWorks/vn/
Thảo luận
• Tham gia vào các developerWorks blogs và gia nhập cộng đồng developerWorks.
• Tham gia vào Diễn đàn PHP trên developerWorks: Phát triển các ứng dụng PHP với các sản
phẩm quản lý thông tin của IBM (DB2, IDS).
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 1: Tạo
10 kịch bản lệnh cơ sở
Trang 14 của 15
ibm.com/developerWorks/vn/
developerWorks®
Đôi nét về tác giả
Duane O'Brien
Duane O'Brien là một nhà khoa học máy tính. Ông đã có nhiều bài viết về phát triển
ứng dụng web và về các framework PHP khác nhau. Để tìm hiểu thêm về Duane, bạn
xem trang blogtwitter của ông.
© Copyright IBM Corporation 2009
(www.ibm.com/legal/copytrade.shtml)
Nhẫn hiệu đăng ký
(www.ibm.com/developerworks/vn/ibm/trademarks/)
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 1: Tạo
10 kịch bản lệnh cơ sở
Trang 15 của 15