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

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

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

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ông-phả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.

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
Tên vũ khí Thiệt hại
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.

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 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áu-gore- 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";
}

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


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.

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; $i++) {
    $numbers['B'][] = $i;
    $numbers['I'][] = $i+15;
    $numbers['N'][] = $i+30;
    $numbers['G'][] = $i+45;
    $numbers['O'][] = $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.

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.

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


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.


Tải về

Mô tảTênKích thước
10 intermediate PHP scriptsos-php-gamescripts2-php10games2.zip385KB

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

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=416855
ArticleTitle=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
publish-date=07312009