PDF:

30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần
2: Phát triển 10 kịch bản lệnh mức trung bình
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 với một nhóm người quanh bàn, 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 vẫn sẽ có một ý nghĩa gì đó đối với bạn. Bài viết này
sẽ xây dựng trên Phần 1 của loạt bài "30 kịch bản lệnh trò chơi bạn có thể viết trong PHP", khám
phá 10 kịch bản lệnh mức trung bình có thể được sử dụng trong các loại trò chơi khác nhau. Các
kịch bản lệnh này dự định dành cho ba loại trò chơi: các trò chơi phân vai, các trò chơi may rủi,
và các trò chơi từ ngữ.
Xem thêm bài trong loạt bài này
Trong Phần 1 của loạt bài này, bạn đã tạo ra một số kịch bản lệnh PHP ở mức cho người mới bắt
đầu. Bây giờ là lúc để gia tăng đóng góp, thêm độ phức tạp nhiều hơn để phát triển hơn nữa các kỹ
năng lập trình PHP của bạn và tăng cường vị thế của bạn như là một bậc thầy về trò chơi.
Với các kịch bản lệnh trò chơi nhập vai, bạn sẽ tìm hiểu làm thế nào để lắp ghép một trình tính
toán thiệt hại vũ khí, một trình theo dõi tờ thống kê nhân vật, và một trình tạo Nhân vật khôngphải-là-Người-chơi (NPC), đồng thời dạy cho bạn cách lưu thông tin vào một tệp tin và làm việc với
các mảng trong PHP. Các kịch bản lệnh liên quan đến các trò chơi may rủi sẽ giúp bạn thực hành
Blackjack, học cách đếm lá bài, và có được một sự hiểu biết nhanh chóng về các nguyên tắc cơ
bản của Bingo đồng thời dạy cho bạn cách thực hiện các yếu tố may rủi trong kịch bản lệnh PHP.
Cuối cùng, các kịch bản lệnh trò chơi từ ngữ sẽ giúp bạn giải quyết trò Jumble, tạo ra các trình mật
mã bằng thay thế đơn giản, và tạo ra các sơ đồ tìm kiếm từ, đồng thời đưa bạn tiến thêm một bước
với các kỹ năng xử lý mảng trong PHP.
Chúng ta sẽ điểm qua ngay các kịch bản lệnh này mà không bàn về việc tìm một máy chủ chứa
hoặc thiết lập một máy chủ. Có nhiều máy chủ 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 cách làm thực tế PHP hay nhất cũng như về các kỹ thuật thiết kế trò chơi. Các kịch bản lệnh
trình bày ở đây được thiết kế đơn giản để dễ hiểu, dễ sử dụng, và học được nhanh chóng.
© Copyright IBM Corporation 2009
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 2: Phát
triển 10 kịch bản lệnh mức trung bình
Nhẫn hiệu đăng ký
Trang 1 của 14
developerWorks®
ibm.com/developerWorks/vn/
Kho lưu trữ mã cho bài viết này chứa toàn bộ mã nguồn cho từng kịch bản lệnh mà chúng
ta sẽ thảo luận, và bạn có thể xem các kịch bản lệnh đang hoạt động bằng cách truy cập vào
Chaoticneutral.net.
Trình tính toán thiệt hại
Trang Phần 1, chúng ta đã xây dựng nên một trình gieo súc sắc cơ sở. Chúng ta hãy xem xét cách
sử dụng trình gieo súc sắc đó để giúp cho việc lắp ghép một trình tính toán thiệt hại cơ sở.
Nếu bạn từng chạy hoặc chơi một trò chơi nhập vai, bạn hẳn đã nhìn thấy các biểu đồ vũ khí lớn có
kèm trong sổ kế toán. Thường thường, các biểu đồ này gồm tên của vũ khí và mức độ thiệt hại mà
nó gây ra. Nó trông giống như được hiển thị trong Bảng 1.
Bảng 1. Tính toán thiệt hại
Thiệt hại
Tên vũ khí
Gậy Nhỏ
1d6
Gậy Lớn
1d6+4
Cưa xích
2d8
Bạn sẽ có thể dùng hàm roll đơn giản được tạo ra trong Phần 1 của loạt bài "30 kịch bản lệnh trò
chơi bạn có thể viết trong PHP" và sử dụng nó để tính toán thiệt hại cho một tập hợp cơ sở các vũ
khí. Để làm điều này, bạn sẽ tạo một mảng để chứa thông tin về các vũ khí.
Đối với thí dụ này, một vũ khí cá nhân có ba đặc trưng cơ sở: Tên, gieo súc sắc, và thiệt hại gây ra.
Bằng cách sử dụng những đặc trưng này, bạn hẳn sẽ xây dựng được mảng vũ khí của bạn, như chỉ ra
sau đây.
Liệt kê 1. Mảng vũ khí
$weapons = array (
'littlestick' => array (
'name' => 'Little Stick',
'roll' => '1d6',
'bonus' => '0',
),
'bigstick' => array (
'name' => 'Little Stick',
'roll' => '1d6',
'bonus' => '4',
),
'chainsaw' => array (
'name' => 'Little Stick',
'roll' => '2d8',
'bonus' => '0',
),
);
Sử dụng mảng này, bạn có thể xây dựng nên một bảng hiển thị vũ khí, thiệt hại mà vũ khí này có
thể gây ra, và kết quả gieo súc sắc ứng với thiệt hại.
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 2: Phát
triển 10 kịch bản lệnh mức trung bình
Trang 2 của 14
ibm.com/developerWorks/vn/
developerWorks®
Liệt kê 2. Xây dựng bảng vũ khí
foreach ($weapons as $weapon) {
list($count, $sides) = explode('d', $weapon['roll']);
$result = 0;
for ($i = 0; $i < $count;$i++) {
$result = $result + roll($sides);
}
echo "<tr><td>" . $weapon['name'] . "</td><td>"
. $weapon['roll'];
if ($weapon['bonus'] > 0) {
echo "+" . $weapon['bonus'];
$result = $result + $weapon['bonus'];
}
echo "</td><td>" . $result . "</td></tr>";
}
Sử dụng kịch bản lệnh này, bạn có thể tạo ra một biểu đồ vũ khí cơ sở với một máy tính ,thiệt hại
mà vũ khí này có thể gây ra đã tích hợp.
Theo dõi thống kê
Bây giờ bạn có thể tính toán thiệt hại, chúng ta hãy xem xét việc theo dõi một số số liệu thống kê cơ
bản, giống như bạn có thể phải sử dụng nếu bạn đang chạy một trò chơi với một vài NPC. Chúng ta
tạo ra một mảng đơn giản để giữ thông tin nhân vật và ghi lưu nó (sau khi tuần tự hóa) vào một tệp
tin văn bản. (Có nhiều cách để lưu thông tin này vào một cơ sở dữ liệu, và bạn nên đi theo hướng
này sau khi bạn đã thấy thoải mái làm việc với PHP.) Đối với thí dụ này, bạn sẽ tạo thủ công một
nhân vật con ma cơ sở từ một trò chơi tôi đã viết có tên Shambles. Bắt đầu với một mảng để chứa
thông tin nhân vật.
Liệt kê 3. Mảng dành cho thông tin nhân vật
$character = array(
'name' => 'Fred The Zombie',
'health' => '36',
'gore' => '1',
'clutch' => '5',
'brawn' => '6',
'sense' => '4',
'flail' => '2',
'chuck' => '3',
'lurch' => '4',
);
Bạn cần trích rút ra một tên tệp tin để lưu trữ các thông tin này. Bạn thực sự không muốn chỉ sử
dụng input khi nó được gửi vào, nhưng bạn chỉ có thể sử dụng các chữ cái rút từ tên nhân vật để tạo
một tệp tin.
Liệt kê 4. Tạo một tệp tin để lưu thông tin
$filename = substr(preg_replace("/[^a-z0-9]/", "",
strtolower($character['name'])), 0, 20);
file_put_contents($filename, serialize($character));
Ghi chú: Khi đưa kịch bản lệnh này vào sử dụng công cộng, bạn sẽ muốn lọc dữ liệu đầu vào từ
người sử dụng để ngăn giữ những kẻ ác tâm, không chèn thêm JavaScript mục đích xấu hoặc rác
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 2: Phát
triển 10 kịch bản lệnh mức trung bình
Trang 3 của 14
developerWorks®
ibm.com/developerWorks/vn/
rưởi vào các tệp tin. Đây chỉ là một ví dụ để bạn sử dụng cá nhân. Cuối cùng, bạn cần phải trình
bày thông tin ở một dạng để cho phép dễ dàng cập nhật. Đó chỉ là vấn đề tạo ra một biểu mẫu với
các giá trị mặc định trong các trường nhập liệu.
Liệt kê 5. Trình bày thông tin trong một biểu mẫu
<input name='health' value='<?php echo $character['health'] ?>' />
Sử dụng kịch bản lệnh cơ bản này (xem Kho lưu trữ mã) để theo dõi một số nhân vật và các NPC.
Máy sinh NPC
Khi bạn đang lắp ráp một trò chơi lớn, sẽ rất có ích khi có một quỹ các NPC sẵn có. Điều này đặc
biệt có ích nếu bạn cần một số lớn kẻ côn đồ hoặc bia đỡ đạn. Để lắp ráp máy sinh NPC, chúng ta
hãy xây dựng một mảng chứa các quy tắc để xây dựng một nhân vật, sau đó sử dụng máy sinh tên
ngẫu nhiên và trình gieo súc sắc (Die Roller) để rút ra một nhóm nhân vật cùng một lúc.
Lấy Fred the Zombie làm ví dụ, bạn có thể định nghĩa các quy tắc để tạo ra một nhân vật. Một số
số liệu thống kê là tĩnh (sức khoẻ-health- luôn luôn bắt đầu từ 36), một số số liệu được tính ra (máugore- là bằng health/6) và một số thống kê là kết quả gieo súc sắc (khớp-clutch- là 1d6 — một súc
sắc sáu mặt). Các quy tắc sẽ giống như trình bày trong Liệt kê 6.
Liệt kê 6. Định nghĩa các quy tắc để tạo ra một nhân vật
$rules = array(
'health' => '36',
'gore' => 'health/6',
'clutch' => '1d6',
'brawn' => '1d6',
'sense' => '1d6',
'flail' => '1d6',
'chuck' => '1d6',
'lurch' => '1d6',
);
Bây giờ bạn có thể viết ra một ít mã để đánh giá các quy tắc.
Liệt kê 7. Mã để đánh giá các quy tắc
foreach ($rules as $stat=>$rule) {
if (preg_match("/^[0-9]+$/", $rule)) {
// This is only a number, and is therefore a static value
$character[$stat] = $rule;
} else if (preg_match("/^([0-9]+)d([0-9]+)/", $rule, $matches)) {
// This is a die roll
$val = 0;
for ($n = 0;$n<$matches[1];$n++) {
$val = $val + roll($matches[2]);
}
$character[$stat] = $val;
} else if (preg_match("/^([a-z]+)\/([0-9]+)$/", $rule, $matches)) {
// This is a derived value of some kind.
$character[$stat] = $character[$matches[1]] / $matches[2];
}
echo $stat . ' : ' . $character[$stat] . "<br />\n";
}
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 2: Phát
triển 10 kịch bản lệnh mức trung bình
Trang 4 của 14
ibm.com/developerWorks/vn/
developerWorks®
Một khi bạn đánh giá chính xác các quy tắc, bạn có thể rút một tên ngẫu nhiên bằng cách sử dụng
máy sinh tên ngẫu nhiên và tạo ra các NPC hàng ngày. Xin xem lại kịch bản lệnh trong kho trữ mã
để biết nhiệm vụ này ăn ý với nhau như thế nào.
Trình tính toán khả năng: gieo súc sắc
Trong Phần 1, bạn đã viết một trình tính toán khả năng đơn giản để xác định cơ hội rút được một
lá bài hoa hoặc lá bài mặt (face) cụ thể từ một tập hợp các lá bài cho trước. Bây giờ hãy xây dựng
một trình tính toán khả năng gieo nhiều súc sắc. Với thí dụ này, bạn sẽ xây dựng một trình tính toán
xác định các kết quả khả dĩ khi gieo 2 con súc sắc 6 mặt (2d6). Việc này sẽ có ích nếu bạn sử dụng
bất kỳ một hệ thống RPG nào dựa trên súc sắc 6 mặt (d6), hoặc chơi những trò chơi chẳng hạn như
Monopoly hay Backgammon, hoặc nếu bạn đang cố gắng tính ra các tỷ lệ cược trong một trò chơi
súc sắc như Craps.
Trước hết, thiết lập cách xác định các kết quả khả dĩ như thế nào khi gieo hai súc sắc. Sẽ dễ hơn
nếu coi hai súc sắc có màu khác nhau, chẳng hạn như một con súc sắc đỏ và một con súc sắc
xanh. Nếu con súc sắc màu đỏ đậu ở số 1, sẽ có sáu khả năng kết quả ứng với 6 mặt của con súc
sắc xanh. Điều này có nghĩa là tổng số kết quả súc sắc khả dĩ là 62 hay 36 kết quả. Có vẻ hơi lạ vì
giá trị cao nhất bạn có thể nhận được chỉ là 12 (số 6 đỏ và số 6 xanh), nhưng bạn sẽ thấy là hợp lý
nếu nhận ra rằng có thể nhận được tổng số 11 với hai kết cục khác nhau (một số 6 đỏ và một số 5
xanh hoặc một số 5 đỏ và một số 6 xanh).
Giả thiết rằng với ví dụ này bạn muốn nhận được cả hai loại kết quả, cả tổng số (gieo được 10 điểm)
lẫn từng mặt (gieo được một mặt 6 và một mặt 4) và không phân biệt 6 đỏ hay 6 xanh. Các con số
quan trọng là S (con súc sắc có mấy mặt) và N (gieo bao nhiêu con súc sắc) — Vì có N mặt y hệt
nhau nên tổng số khả năng là S^N — cho dù một số kết cục là trùng nhau (số 6 và số 4, so với số 4
và số 6).
Liệt kê 8. Xây dựng trình tính toán khả năng gieo súc sắc
$s = 6;
$n = 2;
$results = array(array());
for ($i = 0; $i < $n; $i ++) {
$newresults = array();
foreach ($results as $result) {
for ($x = 0; $x < $s; $x++) {
$newresults[] = array_merge($result, array($x+1));
}
}
$results = $newresults;
}
Đoạn mã này xem ra hơi lủng củng. Bạn có thể chỉnh lại tốt hơn đáng kể, nhưng ở đây tôi đã làm
mọi việc hiển hiện rõ hơn để bạn có thể hiểu được cách xử lý các mảng như thế nào. Một khi bạn
đã lập ra được mảng cuối cùng, bạn có thể lặp qua mảng này và tạo ra một danh sách các tổng và
các khả năng tương ứng của các tổng đó. Mã này có trong kho lưu trữ mã.
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 2: Phát
triển 10 kịch bản lệnh mức trung bình
Trang 5 của 14
developerWorks®
ibm.com/developerWorks/vn/
Trình chia bài Blackjack đơn giản
Trong Phần 1, bạn đã xây dựng nên một trình chia bài poker đơn giản. Trình chia bài này trên thực
tế không chơi chống lại bạn; nó chỉ chia bài từ hộp chia bài (shoe), để bạn thực hành nhiều tay bài
khác nhau. Bây giờ chúng ta hãy xây dựng một trình chia bài Blackjack mà thực sự chơi chống lại
bạn. Bạn sẽ xây dựng trình chia bài này bằng cách sử dụng luật chơi riêng đơn giản là trình chia bài
này phải rút đến ít nhất là 17.
Các phần của mã này sẽ giống như trình chia bài Poker đơn giản lập ra trước đó. Đối với Blackjack,
bạn cần xây dựng vòng lặp rút lá bài và đánh giá tay bài. Bạn sẽ cần một mảng để gán các giá trị
mặt lá bài với các mô tả bằng số. Bạn có thể làm việc này trong mảng $faces ban đầu nếu bạn thay
đổi cách lập ra cỗ bài.
Liệt kê 9. Sửa đổi mảng $faces cho Blackjack
$faces = array('Two' => 2, ... ... ... 'King' => 10, 'Ace' => 11);
Sau đó bạn cần có một hàm cơ bản để đánh giá một tay bài cho trước. Hàm này sẽ xem xét các lá
bài trong tay và trả lại tổng giá trị của tay bài.
Liệt kê 10. Hàm đánh giá một tay bài cho trước
function evaluateHand($hand) {
global $faces;
$value = 0;
foreach ($hand as $card) {
if ($value > 11 && $card['face'] == 'Ace') {
$value = $value + 1; // An ace can be 11 or 1
} else {
$value = intval($value) + intval($faces[$card['face']]);
}
}
return $value;
}
Một khi bạn đã có sẵn một hàm để đánh giá một tay bài đơn lẻ, sẽ là vấn đề đơn giản để xác định
xem tay bài của bạn đã vượt quá 21 chưa, hay trình chia bài này sẽ đánh hay để lại (hit or stay).
Xem kho trữ mã để biết thêm chi tiết về cách xây dựng.
Trình đếm lá bài
Khi bạn chơi Blackjack, hoặc các trò chơi dựa trên lá bài chủ như Hearts, việc biết cách đếm các
lá bài sẽ là có ích. Với trường hợp Blackjack, ít nhất bạn muốn biết là có bao nhiêu lá bài át, lá bài
mặt (face). Với Hearts, bạn có thể cần biết có bao nhiêu lá bài chủ vẫn còn trong cuộc. Bạn sẽ xây
dựng nên một trình đếm thô sơ dành cho Blackjack. Bạn có thể theo cùng các nguyên lý đó để xây
dựng một trình đếm lá bài cho một trò chơi có lá bài chủ.
Bạn sẽ lập cỗ bài để đếm hơi khác một chút. Bạn không cần phải biết tất cả các lá bài — chỉ cần có
đúng các lá bài mà bạn quan tâm. Đối với hộp chia bài (shoe) một cỗ, nó sẽ giống như dưới đây.
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 2: Phát
triển 10 kịch bản lệnh mức trung bình
Trang 6 của 14
ibm.com/developerWorks/vn/
developerWorks®
Liệt kê 11. Xây dựng trình đếm lá bài cho hộp chia bài một cỗ
$deck = array (
'faces' => 16, // 10,J,Q,K * 4 suits
'aces' => 4, // One per suit
'other' => 32, // 52 - (16 + 4)
);
Tiếp theo, xây dựng một biểu mẫu đơn giản có ba nút — một dành cho các lá bài mặt, một dành
cho các lá bài át, và một dành cho các lá bài khác còn lại. Bằng cách nhấn vào nút thích hợp mỗi
khi bạn trông thấy một lá bài thuộc kiểu cụ thể, bạn có thể điều chỉnh những gì còn lại trong cỗ bài.
Liệt kê 12. Một biểu mẫu đơn giản với ba nút
if ($_POST['submit'] == 'faces') {
$deck['faces']--;
}
Sau đó, bạn có thể tính toán khả năng để rút được một lá bài mặt, một lá bài át, hoặc một lá bài
khác bằng cách tìm kiếm trong cỗ bài sau khi nó được sửa đổi.
Liệt kê 13. Tính toán khả năng rút được một lá bài mặt, một lá bài át hoặc lá bài
khác
echo "Odds of pulling a face: " . $deck['faces'] . " out of "
. $deck['faces'] + $deck['aces'] + $deck['other'];
Sử dụng trình đếm lá bài thô sơ này làm điểm xuất phát, bạn có thể xây dựng một cái gì đó mạnh
hơn.
Máy Bingo
Từ những cái mà chúng ta đã thực hiện trong bài viết này, bạn có thể dễ dàng lắp ráp một máy
Bingo để tạo ra các tấm vé và rút các số từ một quỹ.
Các số Bingo chạy từ 1 đến 75, chia thành các nhóm 15 số (1-15 gán cho B, 16-30 gán cho I,
v.v...). Bạn có thể xây dựng và trộn một bộ bóng Bingo ảo rất giống với cách bạn xây dựng và trộn
một cỗ bài ảo. Nhưng bạn không cần phải theo dõi các lá bài mặt và lá bài hoa giống như trước.
Trước hết, xây dựng bộ số cơ bản.
Liệt kê 14. Xây dựng bộ số cơ bản cho Bingo
for ($i = 1; $i < 16;
$numbers['B'][] =
$numbers['I'][] =
$numbers['N'][] =
$numbers['G'][] =
$numbers['O'][] =
}
$i++) {
$i;
$i+15;
$i+30;
$i+45;
$i+60;
Tiếp theo, bạn có thể trộn từng mảng con và tạo ra những tấm vé đồng thời. (Đừng quên: Khoảng
không chính giữa thường là một điểm tự do.) Khi đã xong, hãy tạo ra một mảng chủ mà bạn có thể
sử dụng giống như một cỗ bài.
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 2: Phát
triển 10 kịch bản lệnh mức trung bình
Trang 7 của 14
developerWorks®
ibm.com/developerWorks/vn/
Liệt kê 15. Tạo một mảng chủ
$letters = array ('B','I','N','G','O');
foreach ($letters as $letter) {
shuffle($numbers[$letter]);
$chunks = array_chunk($numbers[$letter], 5);
$cards[$i][$letter] = $chunks[0];
if ($letter == 'N') {
$cards[$i][$letter][2] = ' '; // Free Space
}
shuffle($balls);
}
Giờ thì bạn đã sẵn sàng! Giơ các lá bài của bạn ra, và bắt đầu rút các trái bóng Bingo ảo từ bộ chủ,
giống như bạn đã làm khi rút các lá bài trước đây. Một phiên bản đã hoạt động tốt của kịch bản
lệnh này có trong kho lưu trữ mã.
Trình trợ giúp Jumble
Jumble là trò chơi đố chữ xuất hiện ở hầu hết các tờ báo, ở đây bạn có một số từ đã trộn lẫn vào
nhau. Bạn phải tạo ra các từ có thật từ những xâu ký tự vô nghĩa, sau đó sử dụng một số chữ cái để
tạo ra một cụm từ mới. Bắt đầu với các trình trợ giúp trò chơi ô chữ đã tạo ra trong Phần 1, hãy lắp
ghép một kịch bản lệnh nhanh để trợ giúp bạn trong trò Jumble.
Để bắt đầu, hãy mở danh sách từ của bạn. Bạn muốn lặp lần lượt qua danh sách, tách từng từ
thành một mảng chữ cái có sắp xếp, sau đó chắp nối lại mảng này. Thí dụ, việc này sẽ đổi từ
“COLOR” thành xâu ký tự “CLOOR”; xâu ký tự này biểu diễn tất cả các chữ cái có trong “COLOR,”
nhưng theo một trật tự có thể đoán trước được (và quan trọng hơn nữa, là có thể so khớp). Xâu
ký tự này sau đó được sử dụng như là một khóa của một mảng các từ ăn khớp. Nó cần phải là một
mảng vì “sword” và “words” có chính xác cùng các chữ cái như nhau, chỉ có thứ tự là khác nhau.
Cuối cùng, nó trông giống như dưới đây.
Liệt kê 16. Kịch bản lệnh cho một Jumble
foreach ($words as $word) {
$arr = str_split($word);
sort($arr);
$key = implode('', $arr);
if (isset($lookup[$key])) {
array_push($lookup[$key], $word);
} else {
$lookup[$key] = array($word);
}
}
Một khi bạn đã tới đây, tất cả những việc bạn cần làm là xử lý Jumble của bạn đúng như với bất kỳ
từ nào khác, tìm kiếm giá trị của khóa tương ứng và in ra bất kỳ kết quả nào.
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 2: Phát
triển 10 kịch bản lệnh mức trung bình
Trang 8 của 14
ibm.com/developerWorks/vn/
developerWorks®
Liệt kê 17. Hoàn tất kịch bản lệnh Jumble
$arr = str_split($_POST['jumble']);
sort($arr);
$search = implode('', $arr);
if (isset($lookup[$search])) {
foreach ($lookup[$search] as $word) {
echo $word;
}
}
Bạn có thể thấy tất cả được phối hợp với nhau như thế nào trong kho lưu trữ mã.
Mật mã bằng thay thế
Mật mã bằng thay thế (substitution cypher) là một kỹ thuật mã hoá đơn giản, ở đây mỗi chữ của
bảng chữ cái được thay thế bằng một chữ khác từ bảng chữ cái. Theo các tiêu chuẩn của kỹ thuật
mật mã hoá hiện đại, mật mã bằng thay thế là trò trẻ con. Nhưng mật mã bằng thay thế đơn giản có
thể là trò chơi cho vui, nhất là trong bối cảnh RPG, bằng cách trao cho ai đó một thông điệp đã mã
hoá để họ giải trong cuộc chơi.
Bắt đầu bằng cách “lấy trộm” một số mã lệnh trong trò chơi hangman từ Phần 1— cụ thể là mảng
chữ cái. Hãy thực hiện một bản sao của mảng, trộn bản sao này, và xây dựng một mảng kết hợp, ở
đây các chữ cái ban đầu nhận giá trị đã xáo trộn.
Liệt kê 18. Sửa đổi mảng chữ cái
$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');
$code = $letters;
shuffle($code);
$key = array_combine($letters, $code);
Tiếp theo, lấy dữ liệu vào từ $_POST, tách thông điệp rời thành các chữ cái, và xuất ra giá trị của
từng chữ cái trong khoá.
Liệt kê 19. Tách và xuất ra các chữ cái
if (!empty($_POST)) {
$messageletters = str_split(strtolower($_POST['message']));
$show = '';
foreach ($messageletters as $letter) {
$show .= @$key[$letter];
}
}
Bằng cách sử dụng ký hiệu @ trước $key[$letter] sẽ báo cho PHP bỏ qua bất kỳ lỗi nào xảy ra
trong khi mã hóa. Nếu thông điệp đó có dấu chính tả, con số hoặc dấu cách, PHP sẽ phàn nàn là
không có giá trị tương ứng trong mảng $key. Thế là ổn. Văn bản mã hóa được tạo ra sẽ được loại bỏ
các dấu cách, các số và dấu chính tả, làm cho nó khó (một tí) giải mã.
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 2: Phát
triển 10 kịch bản lệnh mức trung bình
Trang 9 của 14
developerWorks®
ibm.com/developerWorks/vn/
Máy sinh trò tìm từ
Trò chơi tìm từ có lẽ là trò đố chữ dựa trên các chữ cái đầu tiên mà chúng ta biết. Bằng các kỹ thuật
đã đưa vào sử dụng, và gồm thêm một số lô gic từ trình trợ giúp trò chơi ô chữ, bạn có thể làm ra
một máy sinh trò tìm từ khá cơ bản. Để công việc đơn giản, bạn sẽ làm một trò tìm từ có kích thước
10x10 chữ cái, với 10 từ ẩn bên trong (năm theo chiều dọc và năm theo chiều ngang).
Phần đầu tiên, đưa vào các từ nằm ngang, là khá dễ — lập một mảng các mảng, mỗi mảng 10 phần
tử, chứa các dấu chấm. Sau đó trong mỗi mảng, đẩy vào các chữ cái của mỗi từ riêng lẻ. Để điền
vào các từ theo chiều dọc, bạn cần phải duyệt qua đồng thời tất cả các mảng, bằng cách sử dụng
mã lệnh của trình trợ giúp trò chơi ô chữ để tìm các từ khớp có thể có. Có lẽ phần khó nhất là đoạn
mã trong Liệt kê 20, điền vào các từ hoặc chữ cái ngẫu nhiên theo chiều dọc mà từ đó ngắn hơn
toàn bộ cột dọc.
Liệt kê 20. Điền vào các từ hoặc các chữ cái ngẫu nhiên theo chiều dọc
$wordletters = str_split($word);
for ($c = 0; $c < $height; $c++) {
if ( $grid[$c][$i] == '.' && ($c < $x || empty($wordletters))) {
$grid[$c][$i] = $letters[rand(0,25)];
} else {
if ($grid[$c][$i] == '.') {
$grid[$c][$i] = array_shift($wordletters);
} else if ($c >= $x) {
array_shift($wordletters);
}
}
}
Kho lưu trữ mã chứa một số chú thích giúp làm sáng tỏ toàn bộ quá trình này. Còn nhiều chỗ để cải
tiến trong các mã đó, nhưng chúng sẽ mang lại cho bạn một ý tưởng chung về cách tiếp cận vấn đề.
Hãy thử kịch bản lệnh đầy đủ trong kho lưu trữ mã để xem các kết quả.
Tóm tắt
Bài viết này trình bày cách làm thế nào để lấy một số kịch bản lệnh cơ bản viết trong Phần 1 của
loạt bài "30 kịch bản lệnh trò chơi bạn có thể viết trong PHP" và dựa trên đó xây dựng các kịch bản
lệnh mạnh hơn. Trong Phần 3, thậm chí bạn còn đi xa hơn nữa bằng cách xây dựng tiếp trên những
cái đã thực hiện ở đây để cung cấp thêm các công cụ có ích và mạnh mẽ hơn nữa.
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 2: Phát
triển 10 kịch bản lệnh mức trung bình
Trang 10 của 14
ibm.com/developerWorks/vn/
developerWorks®
Các tải về
Mô tả
Tên
Kích thước
10 intermediate PHP scripts
os-php-gamescripts2-php10games2.zip
385KB
30 kịch bản lệnh trò chơi bạn có thể viết trong PHP, Phần 2: Phát
triển 10 kịch bản lệnh mức trung bình
Trang 11 của 14
developerWorks®
ibm.com/developerWorks/vn/
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 các ví dụ làm việc đối với tất cả các kịch bản lệnh.
• Trò chơi Shambles game sử dụng với mục đích giới thiệu.
• Tìm hiểu thêm về các tổ hợp gieo súc sắc.
• Lấy thông tin về Blackjack.
• Tìm hiểu về đếm lá bài.
• Lấy một số thông tin cơ bản về Bingo.
• Để có mọi thứ về Jumble, hãy truy cập Jumble.com.
• Lấy một mật mã Caesar đơn giản.
• Đọc "Apache 2 and PHP 5 (mod_php) on Linux" để tìm ra cách làm thế nào để cho 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 áp dụng vào 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).
• PHP.net là nguồn trung tâm cho các nhà phát triển PHP.
• Xem "Danh mục bài đọc PHP nên đọc" (Recommended PHP reading list).
• Duyệt 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 xem các tài nguyên dự án PHP trên developerWorks
IBM.
• Để nghe các bài phỏng vấn và thảo luận thú vị đối với các nhà phát triển phần mềm, hãy xem
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 Technical events and webcasts 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
thức, các công cụ, và các dự án cập nhật sâu hơn để 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.
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,
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 bạn vào các công cụ phát triển ứng dụng và các phần mềm trung gian 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 2: Phát
triển 10 kịch bản lệnh mức trung bình
Trang 12 của 14
ibm.com/developerWorks/vn/
developerWorks®
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 2: Phát
triển 10 kịch bản lệnh mức trung bình
Trang 13 của 14
developerWorks®
ibm.com/developerWorks/vn/
Đô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 2: Phát
triển 10 kịch bản lệnh mức trung bình
Trang 14 của 14