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ở

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.

Duane O'Brien, Phát triển PHP, Java, 自由职业者

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.


Cấp độ đóng góp cho developerWorks của
        tác giả

31 07 2009

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ỹ 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);   // roll a six-sided die
echo roll(10);  // roll a ten-sided die
echo roll(20);  // 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ọ.

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.

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.

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.

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

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.

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

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


Tải về

Mô tảTênKích thước
10 kịch bản PHPos-php-gamescripts1-php10games1.zip377KB

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ệ

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở
ArticleID=416854
ArticleTitle=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ở
publish-date=07312009