Пособие по написанию WAP сайтов


         

Пособие по написанию WAP сайтов



ГЛАВА 23

Рассмотрение приложения SlotMachine
Рассмотрение сценария SlotMachine.wmls

В предыдущих главах рассматривались приложения, решающие задачи, близкие креальным. В данной главе WMLScript будет использоваться для написания программы интерактивного игорного автомата. При запуске приложения сотовыйтелефон пользователя отображает пустой автомат и кнопку Start (Пуск). При выборе кнопки Start приложение предоставляет пользователю 100 долларов виртуальных игровых денег и обновляет изображение автомата, как показано на Рис.23.1. Если пользователь выбирает кнопку Spin (Вращение), игорный автомат перемещает появляющиеся на экране символы фишек и отображает полученныйрезультат, как показано на Рис. 23.2. Приложение позволяет пользователю игратьдо тех пор, пока сумма имеющихся игровых денег не будет меньше 10 долларов.


В настоящее время приложения, написанные на языке сценариев WMLScript, можно только просматривать, причем для этого необходимо использовать самые последние версии некоторых пакетов инструментального программного обеспечения (SDK) дляразработки WAP-приложений, аналогичных SDK, который выможете загрузить с Web-cauma www.openwave.com. Пока вСША не существует сотовых телефонов с поддержкойWMLScript. Если вы скачаете и установите SDK, поддерживающий WMLScript, то, чтобы проверить работу приложенияSlotMachine, необходимо будет набрать в качестве URLwaplib.com/SlotMachine/SlotMachine.wml.







Рассмотрение приложения blotMachme





Рассмотрение приложения blotMachme


При запуске приложения SlotMachine WML-страница SlotMachine.wml выводит наэкран приглашение пользователю начать игру. Чтобы реализовать игорный автомат, приложение задействует переменные, которые соответствуют трем рядампо три колонки. Для ссылки на переменные в программном коде используютсяимена rlcl, rlc2, rlc3 и так далее. Вывод на экран значений переменных выполняется в виде таблицы размером три на три. WML-страница SlotMachine.wml реализуется с помощью следующего программного кода:
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>


<head>
<meta http-equiv="Cache-Control" content="max-age=0" forua="true"/>
</head>
<card id="SlotMachine">
<onevent type="ontimer">
<go href="#Init" />
</onevent>
<timer name="InitTime" value="600" />
<p align="center" mode="nowrap">
Slot Machine<br/>
<table align="center" columns="5">
<tr>
<td></td> <td><img alt="" src="" localsrc= "minus" /></td> <td><img alt="" src="" localsrc= "minus" /></td> <td><img alt="" src="" localsrc= "minus" /></td> <td> </td>
</tr>
<tr>
<td>=</td> <td><img alt="" src="" localsrc= "minus" /></td> <td><img alt="" src="" localsrc= "minus" /></td> <td><img alt="" src="" localsrc= "minus" /></td> <td>=</td>
</tr>
<tr>
<td> </td> <td><img alt="" src="" localsrc= "minus" /></td> <td><img alt="" src="" localsrc= "minus" /></td> <td><img alt="" src="" localsrc= "minus" /></td> <td> </td>
</tr>
</table>
<do type="accept" label="Start">
<go href="#Init" />
</do>
</p>
</card>
<card id="Init">
<onevent type="onenterforward">
<refresh>
<setvar name="r1c1" value="minus" /> <setvar name="r1c2" value="minus" /> <setvar name="r1c3" value="minus" />
<setvar name="r2c1" value="dollarsign" /> <setvar name="r2c2" value="dollarsign" /> <setvar name="r2c3" value="dollarsign" />
<setvar name="r3c1" value="minus" /> <setvar name="r3c2" value="minus" /> <setvar name="r3c3" value="minus" />
<setvar name="cash" value="100" />
<setvar name="LoopCounter" value="0" />
<setvar name="SpinTime" value="1" />
</refresh>
</onevent>
<p align="center" mode="nowrap">
Slot Machine<br/>
<table align="center" columns="5">
<tr>
<td> </td> <td><img alt="" src="" localsrc= "$(r1c1)" /></td> <td><img alt="" src="" localsrc= "$(r1c2)" /></td> <td><img alt="" src="" localsrc= "$(r1c3)" /></td> <td> </td>
</tr>
<tr>
<td>=</td> <td><img alt="" src="" localsrc= "$(r2c1)" /></td> <td><img alt="" src="" localsrc= "$(r2c2)" /></td> <td><img alt="" src="" localsrc= "$(r2c3)" /></td> <td>=</td>
</tr>
<tr>
<td> </td> <td><img alt="" src="" localsrc= "$(r3c1)" /></td> <td><img alt="" src="" localsrc= "$(r3c2)" /></td> <td><img alt="" src="" localsrc= "$(r3c3)" /></td> <td> </td>
</tr>
</table>
$$$(cash)
<do type="accept" label="Spin">
<go href="SlotMachineSpin.wml" />
</do>
</p>
</card>
</wml>


Первые два элемента WML-страницы сообщают WAP-браузерам версию WAP-спецификации, которую поддерживает приложение. В данном случае WML-страница совместима с XML 1.0 и описанием типа документа (DTD) версии 1.1,разработанным ассоциацией WAP Forum. Любая WML-страница, размещаемаяпосле информации о версии, начинается с тега <WML>. В конце каждой WML-страницы должен находиться соответствующий тег </WML>, который завершаетэлементы WML-страницы. Теги <HEAD> и </HEAD>, располагающиеся после тега<WML>, позволяют указывать данные о WML-странице, включая метаданные и информацию управляющую доступом


Элемент <meta> позволяет определять для WML-страницы метаинформацию. Внашем случае параметр http~equiv=Cache-Control сообщает WAP-браузеру, чтоданная часть метаинформации относится к системе кэширования памяти. Аналогично, параметр content=max-age=o сообщает браузеру, что максимальное время, в течение которого должно выполняться кэширование WML-страницы, равнонулю секунд; то есть, браузер должен не запоминать, а повторно загружать данные с сервера каждый раз, когда поступает запрос. Для данной книги нулевоезначение было выбрано, чтобы помочь читателю в разработке программы. Привыборе нулевого значения каждый раз, когда происходит изменение, это изменение передается на телефон. В реально эксплуатируемом приложении статическое меню, подобное рассматриваемому здесь, по-видимому, должно использовать интервал хранения, установленный по умолчанию, равным 30 дням. Наконец, параметр forua="true" определяет, что данное значение Cache-Controlпредназначено для телефона и не должно удаляться каким-либо промежуточнымагентом.


При запуске приложения выполняется ветвление программного кода и переходна локальную карту Init, которая присваивает символам верхнего и нижнего ряда знаки минуса, а символам среднего ряда - знаки доллара. Кроме того, для отображения в таблице пиктограмм, таких как бубны и черви, карта Init используетв элементе <img> опцию localsrc. С помощью опции localsrc приложение получает пиктограммы из ПЗУ телефона.


Когда пользователь выбирает кнопку Spin (Вращение), приложение вызываетWML-страницу SlotMachineSpin.wml, со следующим программным кодом:
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta http-equiv="Cache-Control" content="max-age=0" forua="true"/>
</head>
<card id="Spin">
<onevent type="ontimer">
<go href="SlotMachine.wmls#Spin()" />
</onevent>
<timer name="SpinTime" value="1" />
<p align="center" mode="nowrap">
Slot Machine<br/>
<table align="center" columns="5">
<tr>
<td> </td> <td><img alt="" src="" localsrc= "$(r1c1)" /></td> <td><img alt="" src="" localsrc= "$(r1c2)" /></td> <td><img alt="" src="" localsrc= "$(r1c3)" /></td> <td> </td>
</tr>
<tr>
<td>=</td> <td><img alt="" src="" localsrc= "$(r2c1)" /></td> <td><img alt="" src="" localsrc= "$(r2c2)" /></td> <td><img alt="" src="" localsrc= "$(r2c3)" /></td> <td>=</td>
</tr>
<tr>
<td> </td> <td><img alt="" src="" localsrc= "$(r3c1)" /></td> <td><img alt="" src="" localsrc= "$(r3c2)" /></td> <td><img alt="" src="" localsrc= "$(r3c3)" /></td> <td> </td>
</tr>
</table>
$$$(cash)
</p>
</card>
</wml>


Чтобы выполнить операцию «вращения барабанов» игорного автомата, WML-страница использует таймер, который заставляет приложение делать паузу в долю секунды между вызовами функции Spin. Каждый раз, когда срабатывает таймер, WML-страница вызывает функцию Spin, находящуюся в файлеSlotMachine.wmls в виде программного кода WMLScript. Для определения значенийпеременных rlcl, rlc2 и так далее, функция Spin использует случайные числа.После завершения функцией обработки, для которой она предназначена, WML-страница выводит на экран новые установки.





Рассмотрение сценария SlotMachine.wmls >





Рассмотрение сценария SlotMachine.wmls >


Когда пользователь выбирает кнопку Spin (Вращение), приложение SlotMachineвызывает функцию Spin, находящуюся в файле сценария SlotMachine.wmls. Функция Spin, в свою очередь, выполняет обработку, обеспечивающую перемещениеэлементов во время «вращения барабанов». Для моделирования вращающихсябарабанов игорного автомата, приложение использует цикл, в котором текущеесодержимое экрана вращается без отображения, а вращение девяти новых случайных символов выводится на экран. После завершения «вращения барабанов»игорного автомата, WML-страница вызывает функцию WinCash, находящуюся вовтором WMLScript-файле, имя которого SlotMachine2.wmls. СценарийSlotMachine.wmls реализуется с помощью следующего программного кода:
use url SlotMachine2 "SlotMachine2.wmls";
extern function Spin()
{
var Loop = WMLBrowser.getVar("LoopCounter");
if (Loop == 0)
{ Loop = 1;
var cash = WMLBrowser.getVar("cash"); cash = Lang.parseInt(cash); cash -= 10; cash = String.format("%1.1d", cash); WMLBrowser.setVar("cash", cash);
var Dummy = Lang.seed("InitTime");
WMLBrowser.setVar("r1c1", "blankhalf"); WMLBrowser.setVar("r1c2", "blankhalf"); WMLBrowser.setVar("r1c3", "blankhalf");
WMLBrowser.setVar("r2c1", "blankhalf"); WMLBrowser.setVar("r2c2", "blankhalf"); WMLBrowser.setVar("r2c3", "blankhalf");
WMLBrowser.setVar("r3c1", "blankhalf"); WMLBrowser.setVar("r3c2", "blankhalf"); WMLBrowser.setVar("r3c3", "blankhalf");
WMLBrowser.setVar("SpinTime", 3);
}
else if (Loop == 1)
{ Loop = 2;
WMLBrowser.setVar("r1c1", SlotMachine2#GetSymbol()); WMLBrowser.setVar("r1c2", SlotMachine2#GetSymbol()); WMLBrowser.setVar("r1c3", SlotMachine2#GetSymbol());
WMLBrowser.setVar("SpinTime", 3); }
else if (Loop == 2)
{ Loop = 3;
WMLBrowser.setVar("r2c1", WMLBrowser.getVar("r1c1")); WMLBrowser.setVar("r2c2", WMLBrowser.getVar("r1c2")); WMLBrowser.setVar("r2c3", WMLBrowser.getVar("r1c3"));
WMLBrowser.setVar("r1c1", SlotMachine2#GetSymbol()); WMLBrowser.setVar("r1c2", SlotMachine2#GetSymbol()); WMLBrowser.setVar("r1c3", SlotMachine2#GetSymbol());
WMLBrowser.setVar("SpinTime", 3);
}
else if (Loop == 3)
{ Loop = 4;
WMLBrowser.setVar("r3c1", WMLBrowser.getVar("r2c1")); WMLBrowser.setVar("r3c2", WMLBrowser.getVar("r2c2")); WMLBrowser.setVar("r3c3", WMLBrowser.getVar("r2c3"));
WMLBrowser.setVar("r2c1", WMLBrowser.getVar("r1c1")); WMLBrowser.setVar("r2c2", WMLBrowser.getVar("r1c2")); WMLBrowser.setVar("r2c3", WMLBrowser.getVar("r1c3"));
WMLBrowser.setVar("r1c1", SlotMachine2#GetSymbol()); WMLBrowser.setVar("r1c2", SlotMachine2#GetSymbol()); WMLBrowser.setVar("r1c3", SlotMachine2#GetSymbol());
WMLBrowser.setVar("SpinTime", 3);
}
else if (Loop == 4)
{ Loop = 5;
WMLBrowser.setVar("r3c1", WMLBrowser.getVar("r2c1")); WMLBrowser.setVar("r3c2", WMLBrowser.getVar("r2c2")); WMLBrowser.setVar("r3c3", WMLBrowser.getVar("r2c3"));
WMLBrowser.setVar("r2c1", WMLBrowser.getVar("r1c1")); WMLBrowser.setVar("r2c2", WMLBrowser.getVar("r1c2")); WMLBrowser.setVar("r2c3", WMLBrowser.getVar("r1c3"));
WMLBrowser.setVar("r1c1", SlotMachine2#GetSymbol()); WMLBrowser.setVar("r1c2", SlotMachine2#GetSymbol()); WMLBrowser.setVar("r1c3", SlotMachine2#GetSymbol());
WMLBrowser.setVar("SpinTime", 3);
}
else if (Loop == 5)
{ Loop = 6;
WMLBrowser.setVar("r3c1", WMLBrowser.getVar("r2c1")); WMLBrowser.setVar("r3c2", WMLBrowser.getVar("r2c2")); WMLBrowser.setVar("r3c3", WMLBrowser.getVar("r2c3"));
WMLBrowser.setVar("r2c1", WMLBrowser.getVar("r1c1")); WMLBrowser.setVar("r2c2", WMLBrowser.getVar("r1c2")); WMLBrowser.setVar("r2c3", WMLBrowser.getVar("r1c3"));
WMLBrowser.setVar("r1c1", SlotMachine2#GetSymbol()); WMLBrowser.setVar("r1c2", SlotMachine2#GetSymbol()); WMLBrowser.setVar("r1c3", SlotMachine2#GetSymbol());
WMLBrowser.setVar("SpinTime", 1);
}
else if (Loop == 6)
{
SlotMachine2#WinCash();
}
WMLBrowser.setVar("LoopCounter", Loop);
WMLBrowser.refresh(); }


Как вы уже знаете, в настоящее время WMLScript-код необходимо размещать вотдельном файле, отличном от файла страницы WML-карт и предварять имякаждой функции ключевым словом extern. Первая строка сценария сообщаетбраузеру о том, что сценарий использует функции, находящиеся в WMLScript-файле SlotMachine2.wmls. Затем программа вызывает функцию WMLBrowsr. getVarдля выборки значения глобальной переменной LoopCounter, используемойсценарием для подсчета количества «вращений барабанов» игорного автомата.Далее программный код содержит серию ветвлений if-else, которыевыполняют обработку, характерную для текущего цикла. Например, в первомцикле должно выполняться вращение только одного набора символов, тогда какво втором цикле должно выполняться вращение двух наборов и так далее.


Для выборки и присвоения переменным символов приложение активизируетфункции WMLBrowser. getVar и WMLBrowser. setVar. Чтобы извлечь новые символы, сценарий вызывает функцию GetSymbol, находящуюся в файлеSlotMachine2.wmls. Для получения символа функция GetSymbol использует генератор случайных чисел.


В начале каждого цикла таймеру присваивается значение SpinTime. Это значениезаменяет используемую по умолчанию величину, которая определяется в элементе <timer> из файла SlotMachineSpin.wml. В данном случае с помощью переменной SpinTime устанавливается задержка в 0.3 секунды.
extern function GetSymbol()
{
var temp = Lang.random(10);
if (temp < 4) return "blankhalf"; else if (temp < 7) return "heart"; else if (temp < 9) return "gem"; else return "dollarsign";
}
extern function WinCash()
{
var cash = WMLBrowser.getVar("cash"); cash = Lang.parseInt(cash);
var r2c1 = WMLBrowser.getVar("r2c1"); var r2c2 = WMLBrowser.getVar("r2c2"); var r2c3 = WMLBrowser.getVar("r2c3");
if ((r2c1 == "heart") && (r2c2 == "heart") && (r2c3 == "heart")) cash += 50; else if ((r2c1 == "heart") && (r2c3 == "heart")) cash += 25; else if ((r2c1 == "heart") || (r2c3 == "heart")) cash += 10;
else if ((r2c1 == "gem") && (r2c2 == "gem") && (r2c3 == "gem")) cash += 250;
else if ((r2c1 == "dollarsign") && (r2c2 == "dollarsign") && (r2c3 == "dollarsign")) cash += 1000;
if (cash < 10) { Dialogs.alert("Game Over!"); WMLBrowser.go("SlotMachine.wml"); } else { cash = String.format("%1.1d", cash); WMLBrowser.setVar("cash", cash);
WMLBrowser.go("SlotMachineSpinAgain.wml"); }
}


После завершения «вращения барабанов» игорного автомата сценарий вызываетфункцию winCash, находящуюся в файле SlotMachine2.wmls. Функция winCash устанавливает факт выигрыша, и если таковой имеется, обновляет сумму выигрыша пользователя. Наконец, приложение вызывает функцию WMLBrowser. refreshдля обновления информации, отображаемой на экране. Файл SlotMachine2,wmlsсодержит следующий программный код:
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta http-equiv="Cache-Control" content="max-age=0" forua="true"/>
</head>
<card id="SpinAgain">
<onevent type="onenterforward">
<refresh>
<setvar name="LoopCounter" value="0" />
<setvar name="SpinTime" value="1" />
</refresh>
</onevent>
<p align="center" mode="nowrap">
Slot Machine<br/>
<table align="center" columns="5">
<tr>
<td> </td> <td><img alt="" src="" localsrc= "$(r1c1)" /></td> <td><img alt="" src="" localsrc= "$(r1c2)" /></td> <td><img alt="" src="" localsrc= "$(r1c3)" /></td> <td> </td>
</tr>
<tr>
<td>=</td> <td><img alt="" src="" localsrc= "$(r2c1)" /></td> <td><img alt="" src="" localsrc= "$(r2c2)" /></td> <td><img alt="" src="" localsrc= "$(r2c3)" /></td> <td>=</td>
</tr>
<tr>
<td> </td> <td><img alt="" src="" localsrc= "$(r3c1)" /></td> <td><img alt="" src="" localsrc= "$(r3c2)" /></td> <td><img alt="" src="" localsrc= "$(r3c3)" /></td> <td> </td>
</tr>
</table>
$$$(cash)
<do type="accept" label="Spin">
<go href="SlotMachineSpin.wml" />
</do>
</p>
</card>
</wml>
Как вы можете видеть, WML-страница сбрасывает счетчик циклов и таймер в исходное состояние, затем отображает текущие установки игорного автомата и остаток игровых денег. При выборе пользователем опции Spin (Вращение), программа загружает ранее рассмотренную WML-страницу SlotMachineSpin.wml.



Приглашение пользователю на «вращение барабанов» игорного автомата



Рис.. 23.1. Приглашение пользователю на «вращение барабанов» игорного автомата





Отображение результата «вращения барабанов» игорного автомата



Рис.. 23.2. Отображение результата «вращения барабанов» игорного автомата