IBM®
Перейти к тексту
    в России и странах СНГ [изменить]    Условия использования
 
 
   
    Главная страница    Продукты    Услуги и решения    Поддержка и загрузка    Мой профиль    
Перейти к тексту

developerWorks Россия  >  Open source  >

30 игровых скриптов, которые можно написать на языке PHP: Часть 3. Создание 10 скриптов повышенной сложности

developerWorks
Опции документа

Опции документа, требующие включения JavaScript, не отображаются

Обсудить

Исходные тексты примера


Выскажите мнение об этой странице

Помогите нам улучшить содержание


Уровень сложности: простой

Дуэйн О'Брайен, разработчик PHP, внештатный писатель

12.08.2009

PHP – это общедоступный язык программирования, простой в изучении и применении. Он хорошо подходит для создания простых скриптов, которые вы сможете использовать для решения различных задач при программировании игр. Эта серия поможет вам вне зависимости от того, в какие игры вы играете – в простые одиночные игры на бумаге, в сложные ролевые игры в составе группы людей или в какую-либо разновидность онлайновых игр. Данная статья, основанная на 1-й и 2-й частях серии «30 игровых скриптов, которые можно написать на языке PHP», посвящена анализу 10 скриптов повышенной сложности, которые могут использоваться в играх различного типа. В частности, в статье рассмотрены скрипты для управления запасами и скрипты для ведения записей, скрипты для помощи в играх со словами и скрипты для работы с изображениями, а также скрипты для таких игр, как Кено.

В этой статье мы построим скрипты для системы управления запасами и для ведения заметок в ролевых играх, а также займемся повышением интерактивности наших PHP-скриптов. Мы также построим основанный на работе с изображениями генератор удостоверений личности и подробнее ознакомимся с тем, как манипулировать изображениями с помощью PHP. Мы создадим «оценщика рук» при игре в покер и генератор для слот-машины, что позволит вам попрактиковаться с несколько более сложной PHP-логикой. Мы увеличим сложность наших скриптов для игр со словами – мы будем работать с более сложной логикой, строить сложные генераторы анаграмм, дешифровщики и т.д.

Эти скрипты несколько сложнее, чем скрипты из первой части и второй части, поскольку они решают существенно более трудные задачи. Прилагаемый к данной статье архив программного кода (далее – Архив) содержит полный исходный текст для каждого описываемого в ней скрипта. Кроме того, вы сможете увидеть эти скрипты «в действии» на Web-сайте: http://chaoticneutral.net/3d10 (EN).

Как и в первой части и во второй части, мы «пробежимся» по этим скриптам достаточно быстро. Если вы до сих пор не прочитали 1-ю и 2-ю статьи этой серии, то вам следует это сделать до начала работы с данной статьей.

Базовая система управления запасами

В свое время мы создали скрипт для управления статистической информацией персонажей. Усовершенствуем этот скрипт и добавим к нему некоторые базовые функции для управления запасами. С помощью этого скрипта мы будем отслеживать потраченные боеприпасы, сожженные факелы и найденные объекты (листинг 1). Вместо того чтобы заранее предусмотреть размещение всех объектов, которые игрок потенциально способен найти, мы создаем два поля ввода – одно для названия объекта, второе – для числа экземпляров этого объекта: <input name='newitem' /> <input name='newcount' />. После того как этот скрипт будет готов, мы сможем добавлять новые объекты в инвентаризационный массив и сохранять этот массив вместе с характеристиками персонажа. Затем пройдем по инвентаризационному массиву и создадим новые поля ввода, в которых будут содержаться объекты.


Листинг 1. Добавление некоторых базовых функций для управления запасами

foreach ($character['inventory'] as $name => $count) {
    echo $name . " : <input name='inventory[" . $name . "]' value='" .
$count . "' /><br />";
}

Посредством подобной структуризации входных имен PHP автоматически создает массив «запасов», заполненный парами название–значение. С полным текстом этого скрипта можно ознакомиться в Архиве.



В начало


Простой скрипт для ведения игровых заметок

При участии в RPG-игре определенную пользу игроку может принести фиксация тех или иных заметок. Однако пользы от таких заметок будет немного, если игрок не сможет найти, где он записал важные моменты. Создадим скрипт, помогающий сохранять и находить игровые заметки.

Для создания заметки требуется всего два поля: <input name='title' /> <br /> <textarea name='body'> <br />.

Как и в случае со страницей персонажа, заметки добавляются к массиву, преобразуются в последовательную форму (сериализуются) и сохраняются в текстовом файле. В процессе сохранения заметки производится анализ слов. Полученное количество слов также сохраняется в том же текстовом файле. Для упрощения процесса заменим все символы, не являющиеся буквами или числами, а также переведем всю заметку в нижний регистр (исключительно с целью анализа): $analyze = preg_replace('/[^0-9a-z\s]/', strtolower($_POST['body']));. Затем разобьем заметку по пробелам и переместим идентификатор заметки в массив подсчета слов для каждого слова (листинг 2).


Листинг 2. Скрипт, упрощающий сохранение и нахождение игровых заметок

$noteid = count($masternotes);
$masternotes[] = array('title' => htmlentities($_POST['title']), 
        'body' => htmlentities($_POST['body']));
$words = preg_split('/\s/', $note['body'] . ' ' . $note['title']);
foreach ($words as $word) {
    $word = preg_replace('/[^0-9a-z]/', '', strtolower($word));
    if (!in_array($word, $ignore_these_words)) {
        if (isset($counts[$word])) {
                $counts[$word][$noteid] = $noteid;
        } else {
            $counts[$word] = array($noteid => $noteid);
        }
    }
}

Чтобы увидеть, как осуществляется извлечение отдельных заметок или поиск заметки по ключевым словам, воспользуйтесь тестовым скриптом или обратитесь к Архиву.



В начало


Генератор удостоверения личности

Если вы играете в современные игры, то с помощью физического удостоверения личности для вашего персонажа вы сможете произвести сильное впечатление на своих друзей и привнести в игру ощущение реализма. Мы собираемся скомпоновать PHP-код для манипулирования изображениями, который позволит нам создать изображение удостоверения личности, готовое к последующему ламинированию. Для начала нам нужно некое базовое изображение, которое мы смоли бы использовать в качестве бланка для создаваемого удостоверения личности. Мы будем использовать следующую заготовку для бланка удостоверения личности, которую я создал для нашего примера (рисунок 1).


Рисунок 1. Пример бланка удостоверения личности
Рисунок 1. Пример бланка удостоверения личности

Нам нужна базовая форма для группировки всех полей удостоверения личности (имя, допуск, место жительства, дата рождения, цвет волос, цвет глаз). Затем мы должны разместить эти значения как строки на изображении. Чтобы определить надлежащие места для начала и окончания текста для некоторых значений потребуется неоднократное применение метода проб и ошибок: imagettftext ( $img , 40 , 0 , 600 , 200 , 0 , "tarzeau_-_OCR-A", $_POST['name'] );. Если вы все сделали правильно, то после заполнения бланка у вас получилось примерно следующее (рисунок 2).


Рисунок 2. Пример заполненного бланка удостоверения личности
Рисунок 2. Пример заполненного бланка удостоверения личности

Соответствующий шрифт включен в Архив; исходное изображение имеет разрешение 300 точек на дюйм. На некоторых системах получение нужного шрифта и создание удостоверения личности может оказаться непростым делом, однако исходный код в Архиве скрипта позволяет успешно решить эти проблемы.



В начало


Генератор карт на базе тайлов

В ранних компьютерных играх для создания игровых карт использовались так называемые «тайлы» (tile). Этот же базовый подход на основе тайлов по-прежнему используется сегодня в некоторых случаях. Давайте создадим скрипт для генерации базовой карты. Эта карта будет не очень большой, однако мы сможем использовать те же самые принципы для создания карт гораздо большего размера, причем, с переменной детализацией. Для начала создадим несколько различных типов ландшафта и соответствующих им элементарных тайлов, каждый из которых будет представлять свой тип ландшафта (рисунок 3).


Рисунок 3. Базовые типы ландшафта
Basic terrain types

Теперь, когда у нас есть базовые типы ландшафта, несложно догадаться, что мы будем делать дальше: мы создадим массив тайлов для каждого ряда. Однако мы не получим хороших результатов, если будем выбирать (и заносить в массивы) типы ландшафта случайным образом.

Мы будем создавать карту из 20 тайлов. При принятии решения о выборе типа ландшафта для текущего тайла следует учитывать соседние тайлы. Посмотрите на четыре ближайших известных тайла: на последний тайл в текущем ряду и на три тайла непосредственно над текущим тайлом. Мы можем установить сложные правила для управления генерацией ландшафта, но для начала мы поступим проще. Прежде чем выбирать типы ландшафта по случайному закону, мы будем добавлять к массиву типы ландшафта четырех ближайших тайлов. Чем большее количество раз мы добавим предшествующие типы ландшафта, тем с большей вероятностью мы получим гомогенные области. Результат показан в листинге 3.


Листинг 3. Массив тайлов карты

$map = array();
$terrain = array ('plains', 'forest', 'swamp', 'hills', 'mountain', 'water');
for ($row = 0; $row < 20; $row++) {
    $map[] = array();
    for ($column = 0; $column < 20; $column++) {
        $pool = $terrain;
        if (isset($map[$row-1])) {
            if (isset($map[$row-1][$column-1])) {
                $pool[] = $map[$row-1][$column-1];
                $pool[] = $map[$row-1][$column-1];
            }
            $pool[] = $map[$row-1][$column];
            $pool[] = $map[$row-1][$column];
            if (isset($map[$row-1][$column+1])) {
                $pool[] = $map[$row-1][$column+1];
                  $pool[] = $map[$row-1][$column+1];
            }
        }
        if (isset($map[$row][$column-1])) {
                $pool[] = $map[$row][$column-1];
                $pool[] = $map[$row][$column-1];
        }
        shuffle($pool);
        $map[$row][$column] = $pool[0];
    }
}

Располагая массивом карты, мы будем совершать итерации по каждому ряду и каждому столбцу этого массива, заполняя его ландшафтом соответствующего типа. Опробуйте тестовый скрипт, чтобы увидеть, какие виды карт он способен генерировать. Его возможности буквально безграничны. Мы можем присваивать отдельным типам ландшафта различные веса для варьирования частоты их появления, создавать более сложные правила относительно допустимых соседей для различных типов ландшафта и т. д. Не бойтесь экспериментировать.



В начало


«Оценщик рук» в покере

Мы уже написали дилера для игры в покер и дилера для игры в Блэкджек. Сделаем очередной шаг вперед и напишем «оценщика рук» при игре в покер. Это более сложная задача, поскольку работа по ранжированию рук с аналогичными комбинациями может потребовать значительного времени. Однако ее можно существенно упростить, если поручить скрипту посмотреть на пять карт в руке и сообщить нам об имеющихся комбинациях («стрит», «флеш» и т.д.).

При рассмотрении карт на руке применяются следующие простые правила.

  1. Если масть текущей карты не совпадает с мастью предыдущей карты, то нет комбинации «флеш».
  2. Если картинка какой-либо карты совпадает с картинкой какой-либо предыдущей карты, то нет комбинации «стрит».
  3. Если никакие карты не совпадают и если $highcard минус $lowcard точно равно пяти, то имеет место комбинация «стрит»

После реализации этих простых правил примените следующую простую процедуру для выявления совпадений.

  1. Если все пять карт имеют разные номиналы, то какие-либо комбинации отсутствуют.
  2. Если на руке имеется только четыре различных номинала, то присутствует одна комбинация «пара».
  3. Если имеется только три различных номинала, то присутствуют две комбинации «пара» или одна комбинация «тройка».
  4. Если имеется только два различных номинала, то присутствует комбинация «фул-хаус» или «каре».
  5. Если все пять карт имеют один номинал, значит, вы шулер.

В Архив включен типовой скрипт, в котором реализованы все эти правила.



В начало


Слот-машина

Современные слот-машины – это сложные агрегаты с видеоэкранами, с несколькими линиями выигрыша (payline), с большим количеством кнопок и с меньшим количеством рычагов, за которые нужно тянуть. В этом примере мы моделируем простую слот-машину с тремя барабанами и с одной линией выигрыша. Для начала определите, какие картинки находятся на барабане (листинг 4).


Листинг 4. Задание картинок для барабана

$faces = array ('Cherry', 'Bar', 'Double Bar', 'Triple Bar', 'Diamond', 'Seven');

Затем задайте правила определения выигрышного результата. Эти правила могут быть самыми разными. В данном примере выигрышный результат – это три одинаковых картинки на линии выигрыша. Нам необходимо настроить определенное соответствие между выигрышным результатом и выплатой. Возможный вариант решения приведен в листинге 5.


Листинг 5. Выигрышные результаты и выплаты

$payouts = array (
    'Bar|Bar|Bar' => '5',
    'Double Bar|Double Bar|Double Bar' => '10',
    'Triple Bar|Triple Bar|Triple Bar' => '15',
    'Cherry|Cherry|Cherry' => '20',
    'Seven|Seven|Seven' => '70',
    'Diamond|Diamond|Diamond' => '100',
);

При повороте барабанов первый и третий барабаны вращаются в одном направлении, а второй барабан – в противоположном направлении. Настроим наши барабаны с учетом этого обстоятельства (листинг 6).


Листинг 6. Настройка барабанов

$wheel1 = array();
foreach ($faces as $face) {
    $wheel1[] = $face;
}
$wheel2 = array_reverse($wheel1);
$wheel3 = $wheel1;

Для настройки барабана 2 ($wheel2) мы изменили порядок массива на обратный. Мы хотим отслеживать положения барабанов от игры к игре. Остальная часть этого упражнения достаточно проста. Каждый барабан должен сделать не менее одного и не более 10 оборотов. Для моделирования вращения барабана воспользуемся операцией «взятия по модулю»: $result1 = $wheel1[rand(count($wheel1), 10*count($wheel1)) % count($wheel1)];. Результат будет находиться в переменной $payouts (листинг 7).


Листинг 7. Результаты в переменной $payouts

if (isset($payouts[$result1.'|'.$result2.'|'.$result3])) {
    // give the payout
}

Примечание. Мы сознательно рассмотрели максимально упрощенную ситуацию. Реальные слот-машины гораздо сложнее и используют весьма запутанные процедуры выплат. Данный скрипт – это всего лишь учебное упражнение. Поработайте с кодом скрипта из Архива и попробуйте несколько усложнить механизм выплаты.



В начало


Игра Кено

Игра Кено (Keno) представляет нечто среднее между лото и лотерей. Двадцать чисел в диапазоне от 1 до 80 выпадают по случайному закону, а игрок делает ставку на то, какие номера выпадут (он может выбрать до 15 чисел). Выплаты в Кено меняются в широких пределах, тем не менее, настройка скрипта для моделирования игры в Кено достаточно проста, тем более, что мы уже делали весьма похожие вещи. Для начала создадим массив чисел от 1 до 80 (листинг 8).


Листинг 8. Массив чисел от 1 до 80

$balls = array();
for ($i = 1; $i <= 80; $i++) {
    $balls[] = $i;
}

shuffle($balls);

Вводите в единственное текстовое поле свои предположения, разделенные запятыми. Затем просто извлеките 20 чисел из массива $balls и проверьте свои предположения на соответствие этим числам. Реализация не должна вызывать каких-либо затруднений. Соответствующий скрипт приведен в Архиве. Этот скрипт можно усовершенствовать посредством демонстрации выпавших номеров на доске в стиле Кено. Попробуйте сделать это сами, когда освоитесь с этим скриптом.



В начало


Помощник для разгадывания криптограмм

Crypto – игра, которая достаточно часто встречается в газетах. Ее цель состоит в том, чтобы расшифровать заданную фразу, которая была зашифрована с использованием подстановочного шифра (подобного тому, который мы расшифровывали в части 2). Давайте напишем скрипт, который будет использовать простейший частотный анализ для расшифровки зашифрованного сообщения. Мы могли бы использовать тот же самый подход и при игре в Crypto.

Частотный анализ – это не более чем наукообразное название для обычного подсчета букв. Возьмите образец незашифрованного текста, подсчитайте, сколько раз определенные буквы появляются в этом тексте, и отсортируйте эти буквы по порядку – от самых частых до самых редких. Затем проделайте эту же операцию для зашифрованного текста. После этого поместите два списка букв рядом друг с другом. Это позволит вам выдвигать разумные предположения о ключах расшифровки. Этот метод лучше всего работает с большими фрагментами текста, однако может оказаться полезен и в случае более коротких фрагментов. Начните с двух текстовых окон: одно для незашифрованного текста, второе – для зашифрованного текста игры Crypto. Подсчитайте буквы в незашифрованном тексте и отсортируйте результаты в массиве (листинг 9).


Листинг 9. Подсчет букв в незашифрованном тексте и сортировка результатов в массиве

$unencoded = str_split(preg_replace('/[^a-z]/', '', strtolower($_POST['unencoded'])));
foreach ($unencoded as $letter) {
    $lettercount[$letter]++;
}

arsort($lettercount);

Затем проделайте то же самое с зашифрованным текстом. После того как мы отсортировали массив по частоте букв, создадим карту букв и используем ее в своих попытках расшифровки текста. Если вы будете особенно удачливы, то расшифруете текст с первого раза, однако на это не следует рассчитывать. Наиболее вероятным результатом будет частично расшифрованный текст – это хорошая отправная точка для решения головоломки. Для получения дополнительных подробностей обратитесь к образцу этого скрипта. Для улучшения этого скрипта существует множество возможностей.



В начало


Игра Mastermind

Mastermind – это настольная игра (основанная на еще более старой игре), в которой игрок должен разгадать последовательность цветных штырьков, загаданную ведущим. В этой версии выполнять функции ведущего будет скрипт, а вам поручается делать догадки. Скрипт будет говорить вам, сколько раз вы угадали цвет, но не угадали положение, и сколько из ваших догадок оказались полностью правильными. В игре Mastermind используются колышки шести различных цветов; цвета могут повторяться. Начните с написания следующего кода (листинг 10).


Листинг 10. Массив из шести колышков разного цвета

$pegs = array ('R','O','Y','G','B','V');
$code = array();
for ($i = 0; $i < 4; $i++) {
    $code[] = $pegs[rand(0,5)];
}

Теперь нам необходим механизм для анализа догадок (листинг 11). Догадки вводятся в единственное текстовое поле, например, в таком виде OOGBVR.


Листинг 11. Анализ догадок

$guess = str_split($_POST['guess']);
if ($guess == $code) {
    // the code has been guessed.
} else {
    for ($i = 0;$i < 4;$i++) {
        if ($guess[$i] == $code[$i]) {
            // A correct guess
        } else {
            // Keep track of the guessed colors, for output later
        }
    }
}

Ознакомьтесь с полным текстом соответствующего типового скрипта. Это небольшая забавная игра, которую вы сможете модифицировать разными способами.



В начало


Цепочки слов

Вероятно, вы уже играли в игру, где нужно взять какое-либо слово и изменить всего одну букву для превращения его в другое слово. Обычно цель этой игры состоит в превращении одного слова в другое слово, например, превратить слово BIKE в слово FATE с использованием следующей цепочки слов: BIKE, LIKE, LAKE, LATE, FATE. Создадим скрипт, который будет генерировать цепочки слов из отдельного слова. Используем для этого фрагмент кода, который мы ранее создали для помощника в разгадывании кроссвордов (листинг 12). Взяв отдельное слово, например, BIKE, мы можем создать четыре слова с пропущенными буквами (.IKE, B.KE, BI.E и BIK.), которые затем можно передать помощнику по кроссвордам для нахождения возможных совпадений.


Листинг 12. Генерация цепочек слов из отдельного слова

$letters = str_split($link);
foreach ($letters as $key => $letter) {
    foreach ($words as $word) {
        if ($key == 0) {
            $guess =  '.' . substr($link, 1);
        } else if ($key+1 == count($letters)) {
            $guess =  substr($link, 0, $key) . '.';
        } else {
            $guess =  substr($link, 0, $key) . '.' . substr($link, $key+1);
        }
        if (preg_match("/^" . $guess . "$/",$word)) {
            $matches[] = $word;
        }
    }
}

Как только совпадение будет найдено, проделаем эту же операцию с совпавшим словом (удостоверившись в отсутствии дубликатов). Продолжайте применять эту логику до тех пор, пока сможете находить совпадения. Мы даже можем реализовать ветвление решений для каждого возможного совпадения. Это было бы весьма полезным упражнением по обращению с неконтролируемой рекурсией. Попробуйте сделать это, когда освоитесь с соответствующим типовым скриптом.



В начало


Заключение

Я надеюсь, что эта серия «30 игровых скриптов, которые можно написать на PHP» поможет вам в создании на языке PHP интересных скриптов для различных игр. Вне зависимости от того, насколько вы сами любите играть в игры, с помощью простых утилит, представленных в этой серии, вы сможете существенно обогатить свои игровые возможности. Язык PHP – это прекрасный выбор для решения таких задач. Если вы тщательно следовали всем рекомендациям этой серии, то, вне всякого сомнения, вы существенно улучшили свои навыки программирования на PHP и получили удовольствие.




В начало


Загрузка

ОписаниеИмяРазмерМетод загрузки
10 PHP-скриптов повышенной сложностиos-php-gamescripts3.zip844KBHTTP
Информация о методах загрузки


Ресурсы

Научиться
  • Оригинал статьи: 30 game scripts you can write in PHP, Part 3: Creating 10 advanced scripts (EN).

  • ™Прочитайте первую статью в серии на ресурсе developerWorks: "30 игровых скриптов, которые можно написать на языке PHP. Часть 1. Создание 10 скриптов базового уровня.

  • ™Переходите на следующий уровень сложности – это обеспечит дальнейшее развитие ваших навыков программирования на PHP и повысит ваш статус в качестве гейммастера. Вторая статья серии «30 игровых скриптов, которые можно написать на языке PHP. Часть 2. Разработка 10 скриптов средней сложности».

  • ™Опробуйте действующие примеры (EN) всех скриптов.

  • ™Библиотека Open Font Library (EN): источник шрифтов OCR-A, которые применяются в принтерах идентификационных карт (имеются и другие шрифты).

  • ™Базовые сведения об игровых автоматах (EN).

  • ™Дополнительная информация об игре Keno (EN).

  • ™Ресурс Cryptograms.org (EN) содержит великое множество криптограмм – гораздо большее, чем вам может понадобиться.

  • ™Прочитайте статью "Apache 2 and PHP 5 (mod_php) on Linux" (EN), в которой описывается, как получить дистрибутивы Apache V2 и PHP V4.x (поддерживается использование PHP V5.x), совместно работающие в среде Linux.

  • ™В статье «Подключение PHP-приложений к серверу Apache Derby» (EN) показано, как установить и сконфигурировать PHP в среде Windows (некоторые шаги применимы и к среде Linux).

  • ™Прочитайте статью "Learning PHP, Part 1 (Изучение PHP, часть 1), в которой излагаются базовые сведения по PHP. Затем прочитайте Часть 2 , чтобы узнать, как загрузить файлы на локальные хосты с помощью DOM и SAX. В завершающей эту серию Части 3 описывается потоковое приложение.

  • ™Обратитесь к документу Руководство по PHP (EN), чтобы узнать больше об объектах данных в PHP и об их возможностях.

  • PHP.net (EN): центральный ресурс для PHP-разработчиков.

  • ™Ознакомьтесь со "списком рекомендованной литературы по PHP" (EN).

  • ™Просмотрите все материалы по PHP (EN) на ресурсе developerWorks.

  • ™Для совершенствования навыков программирования на PHP рекомендуем посетить раздел ресурса IBM developerWorks под названием Ресурсы проекта PHP (EN).

  • ™Прослушайте интересные интервью и дискуссии для разработчиков ПО: подкасты ресурса developerWorks (EN).

  • ™Используете базу данных с PHP? Ознакомьтесь с продуктом Zend Core for IBM (EN) – это простая в установке и применении, готовая к использованию среда для разработки и эксплуатации приложений на языке PHP, поддерживающая IBM DB2 V9.

  • ™Следите за техническими событиями и Web-трансляциями на ресурсе developerWorks (EN).

  • ™Своевременно узнавайте о намечаемых конференциях, выставках, Web-трансляциях и других событиях (EN) во всем мире, представляющих интерес для разработчиков продуктов IBM с открытым кодом.

  • ™Посетите раздел Web-сайта developerWorks, посвященный продуктам с открытым кодом – к вашим услугам обширный ассортимент справочной информации, инструментов и обновлений, который поможет осуществлять разработки на основе технологий с открытым кодом и использовать их вместе с продуктами IBM.

  • ™Наблюдайте и изучайте технологии IBM и технологии с открытым кодом, а также функции новых продуктов бесплатно: демонстрации «по запросу» на ресурсе developerWorks (EN).


Получить продукты и технологии

Обсудить


Об авторе

Дуэйн О'Брайен (Duane O'Brien) был разносторонним специалистом еще в те времена, когда у игры Oregon Trail был только текстовый интерфейс. Его любимый цвет - sushi (суши). Он никогда не бывал на луне.




Выскажите мнение об этой странице


Пожалуйста, найдите минутку и заполните форму, чтобы повысить уровень сервиса.



 


 


 


Поделиться этой статьей:

забобрить забобрить memori сохранить в memori




В начало


IBM обладает всеми авторскими правами касательно информации, расположенной на developerWorks. Использование информации приведенной на этом ресурсе без явного письменного разрешения от IBM или первоначального автора запрещены. Если Вы желаете использовать информацию с developerWorks, пожалуйста воспользуйтесь регистрационной формой для того, чтобы связаться с нами запрос на использование материалов developerWorks Россия.
    IBM в России Конфиденциальность Контакты