Assasin | Дата: Понедельник, 31 Декабря 2012, 19:05 | Сообщение # 1 |
web-coder
Сейчас нет на сайте
| Глава 2. Основа игры – карты После успешного создания регистрации и входа в игру приступим к самой игре. Ядро игры будет файл game.php который в зависимости от полученных данных в url будет подключать игровые модули и выводить отладочную информацию. Код <?php session_start(); # Подключается сессия # Если сессии user_id нет, то переадресовывается пользователь на главную # Нужно что бы пользователи, которые не авторизировались, не могли просматривать страницы игры if (empty($_SESSION['user_id'])) { header("Location: index.php"); exit; }
$a = $_GET['a'];
if (empty($a)) $a = 'main';
if ($a == 'exit') { session_destroy(); # Уничтожается сессия и переадресовывается пользователь на главную header("Location: index.php"); exit; } # Читается url и происходит сравнение со словами в массиве # Если сравнение не найдено, автоматически подключается главная игровая страница # В другом случае подключается найденый модуль $modules = array('main','maps','shop','battle','post','trade');
$module_find = false; foreach($modules as $val) { if ($a == $val) { $module_find = true; break; } }
if ($module_find == false) $a = 'main'; # Функция переадресации function go2page($uri) { die("<script>location.href='".$uri."';</script>"); }
include('inc/db.php'); # Подключается класс БД $db = new db; # Создается переменная для работы с классом БД $start_time = microtime(true); # Запоминается время до начала выполнения скрипта. Узнаем сколько времени будет исполняться скрипт. Нужно для отслеживания долговыполняемых скриптов $mem_start = memory_get_usage(); # Запоминается потребление памяти до начала выполнения скрипта
include('module/header.php'); # Подключается шапка игры include('module/'.$a.'.php'); # Подключается игровой модуль include('module/footer.php'); # Подключается подвал игры
$db->time_load_page = microtime(true) - $start_time; # Запоминается время после выполнения скрипта и отнимает время начала скрипта. Получается полное время выполнения скрипта $db->mem_start = memory_get_usage() - $mem_start; # Запоминается потребление памяти после выполнения скрипта echo "<br><br><hr><br>".$db->debug(); # Выводится отладочная информация ?>
game.php всегда подключает три файла: шапка, модуль и подвал. В шапке отображается та часть кода, которая должна присутствовать в начале кода во всех модулях. Что бы каждый раз не прописывать этот код во всех модулях проще написать его один раз и забыть о нем. В подвале та часть кода которая находится в конце кода во всех модулях. Её тоже лучше вынести в отдельный файл. В шапке подключается файл стилей, отображается меню и происходит проверка на новые сообщения для отображения их количества (Глава 5). Код для module/header.php. Код <?php $read_post = $db->q("SELECT `id` FROM `post` WHERE `p1`='".$_SESSION['user_id']."' AND `read`='1'"); $num_messages = mysql_num_rows($read_post); # Список полученых и непрочтенных сообщений # Если найдены непрочтенные сообщения, то выводится их количество if ($num_messages == 0) $num_messages = ''; else $num_messages = '(<b>'.$num_messages.'</b>)'; # Если есть непрочтенные сообщения и игрок перешел в модуль почты, то отмечаем сообщения прочтенными if ($num_messages != '' && $a == 'post') { $db->q("UPDATE `post` SET `read`='2' WHERE `p1`='".$_SESSION['user_id']."'"); $num_messages = ''; } ?> <!DOCTYPE html> <html> <head> <title>Браузерная игра "Картишки"</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" type="text/css" href="style/style.css" /> </head> <body> <table> <tr> <td valign="top" style="width:120px;display:block;"> <table> <tr><td><a href="?a=main">Персонаж</a></td></tr> <tr><td><a href="?a=post">Почта <?php echo $num_messages; ?></a></td></tr> <tr><td><a href="?a=maps">Список карт</a></td></tr> <tr><td><a href="?a=trade">Аукцион</a></td></tr> <tr><td><a href="?a=shop">Магазин</a></td></tr> <tr><td><a href="?a=battle">Арена</a></td></tr> <tr><td><a href="?a=exit">Выход</a></td></tr> </table> </td> <td valign="top">
Подвал содержит закрывающие теги. Код для module/footer.php. Код </tr> </table> </body> </html>
Для того что бы никто не мог подключить модули напрямую, откройте файл module/.htaccess и запишите в него: Код Order Deny,Allow Deny from all
Код в этом файле запрещает просматривать файлы в папке module. Приступим к первому модулю, он отображает характеристики игрока, а именно: имя, количество жизней, и количество монет. Откройте файл module/main.php и запишите следующий код. Код <?php $User = mysql_fetch_array($db->q("SELECT * FROM `user` WHERE `id`='".$_SESSION['user_id']."'")); ?> <table> <tr> <td>Игрок: </td><td><b><?php echo $User['login']; ?></b></td> </tr> <tr> <td>Жизни: </td><td><?php echo $User['life']; ?>/<?php echo $User['mlife']; ?></td> </tr> <tr> <td>Деньги: </td><td><?php echo $User['money']; ?></td> </tr> </table>
Изменим немного стиль ссылок и разместим игровой экран по центру браузера. Для этого добавьте в файл style/style.css код. Код body { margin: 0 auto; width: 1000px; } a { color: grey; text-decoration: none; border-bottom: 1px dotted grey; } a:hover { text-decoration: underline; border-bottom: 0px; }
Важную информацию игрок видит. Можно еще добавить туда и аватар, и смену аватара и еще много разных «вкусностей», это уже на ваше усмотрение.
Немного о структурах таблиц user_map, map. Таблица user_map - id - уникальный идентификатор - user_id - id игрока - map_id - id карты - exp - количество опыта карты - lvl – уровень карты - att - количество параметра атаки - abi – количество параметра ловкости - skill - количество параметра мастерства - type – тип карты: 1 – находится у игрока в списке карт, 2 – находится у игрока в списке карт для боя Таблица map - id - уникальный идентификатор - name – имя карты - desc - описание карты - att - количество параметра атаки - skill - количество параметра мастерства - abi – количество параметра ловкости - lvl_exp - количество опыта для повышения уровня карты. Каждый уровень разделят символ | - char – % повышения любого параметра карты (разделяет символ : ) для каждого уровня (разделяет символ | ) - cost – стоимость карты
Следующим шагом будет создание списка карт у игрока и возможность их выставить для боя. Визуально это будет выглядеть так. Вверху 5 слотов в которые можно поместить карты, имеющиеся у игрока. Ниже этих слотов список всех карт, которые есть у игрока. Карты в верхних слотах выставляются слева на право для боя. Т.е. во время боя первой будет бить самая левая карта, следующей - вторая слева и т.д. Откройте файл module/maps.php и запишите в него. Код <?php # Характеристики игрока $User = mysql_fetch_array($db->q("SELECT * FROM `user` WHERE `id`='".$_SESSION['user_id']."'"));
if (!empty($_POST['add'])) { # Добавление карты в список карт для боя # Фильтрация данных $id = preg_replace("/[^0-9]/","",$_POST['map_id']); if ($id == '') go2page("game.php"); # Проверка на существование карты, которую игрок хочет добавить в слот для боя $umap = $db->q("SELECT * FROM `user_map` WHERE `user_id`='".$_SESSION['user_id']."' AND `id`='".$id."'"); if (mysql_num_rows($umap) == 1) { # Проверка на существование свободного слота $_ids = explode("|",$User['position']); $_cell = array(); $_free_cell = false; foreach($_ids as $ind => $val) { if ($val == 0) { # Если слот свообден, то указываем что он занят новой картой $_ids[$ind] = $id; $_free_cell = true; break; } else { $_cell[$val] = 1; } } # Если слот с id новой карты не существует и есть свободный слот, то добавляем новую карту в список карт для боя if ($_cell[$id] != 1 && $_free_cell == true) { $pos = implode("|",$_ids); $User['position'] = $pos; $db->q("UPDATE `user` SET `position`='".$pos."' WHERE `id`='".$_SESSION['user_id']."'"); $db->q("UPDATE `user_map` SET `type`='2' WHERE `id`='".$id."'"); # Указывает что карта добавлена в список карт для боя (нужно для аукциона: что бы невозможно было выставить такую карту на аукцион) } } } else if (!empty($_POST['del'])) { # Удаление карты из списка карт для боя # Фильтрация данных $cell_id = preg_replace("/[^0-9]/","",$_POST['cell_id']); if ($cell_id == '') go2page("game.php"); if ($cell_id < 0) $cell_id = 0; else if ($cell_id > 4) $cell_id = 4; $_ids = explode("|",$User['position']); # Список слотов $id = $_ids[$cell_id]; # Позиция удаляемой карты $_ids[$cell_id] = 0; # Указываем что слот свободен # После удаления карты, остальные карты должны сместиться влево, что бы не болы разрывов между ними. Иначе в бою это приведет к пропуску хода игрока. if ($cell_id < 4) { if ($_ids[$cell_id+1] != 0) { for ($i=$cell_id;$i<5;$i++) { $_ids[$i] = $_ids[$i+1]; $_ids[$i+1] = 0; } } } # Сохранение позиций и указывает что карта удалена из списка карт для боя (нужно для аукциона: что бы МОЖНО было выставить такую карту на аукцион) $pos = implode("|",$_ids); $User['position'] = $pos; $db->q("UPDATE `user` SET `position`='".$pos."' WHERE `id`='".$_SESSION['user_id']."'"); $db->q("UPDATE `user_map` SET `type`='1' WHERE `id`='".$id."'"); }
$ids = explode("|",$User['position']); $ids2 = array(); $cell = array(); $map_num=0; # Чтение количества карт в списке карт для боя foreach($ids as $ind => $val) { if ($val != 0) { $ids2[] = $val; # Запоминает какие карты есть в верхних слотах $map_num++; $cell[$val] = 1; } } ?> <div style='text-align: center;'><b>Последовательность карт для боя <?php echo $map_num; ?>/5</b></div> <table><tr> <?php $free_cell = false; # Указывает что свободных слотов нет # Отображает список карт для боя if (sizeof($ids2) > 0) { # Если есть карты в списке карт для боя for ($i=0;$i<5;$i++) { if ($ids[$i] == 0) { # Указывает что есть свободный слот echo "<td style='padding:4px;'> <table style='width:180px;height:300px;display:block;border:1px solid black;'> <tr> <td style='text-align:center;width:180px;'>Пусто</td> </tr> </table> </td>"; $free_cell = true; } else { # Получает характеристики карты и отображает их $sql = $db->q("SELECT *,`user_map`.`att` as `uatt`,`user_map`.`abi` as `uabi`,`user_map`.`skill` as `uskill` FROM `user_map`,`map` WHERE `user_map`.`user_id`='".$_SESSION['user_id']."' AND `map`.`id`=`user_map`.`map_id` AND `user_map`.`id`='".$ids[$i]."'"); $row = mysql_fetch_array($sql); $exp = explode("|",$row['lvl_exp']); echo "<td style='padding:4px;'> <table style='width:180px;display:block;border:1px solid black;'> <tr> <td style='text-align:center;width:180px;' colspan='2'><b>".$row['name']."</b></td> </tr> <tr> <td colspan='2'><div style='width:170px;height:120px;overflow:auto;display:block;border-bottom:1px solid black;'>".$row['desc']."</div></td> </tr> <tr> <td>Уровень</td> <td>".$row['lvl']."</td> </tr> <tr> <td>Опыт</td> <td>".$row['exp']."/".$exp[$row['lvl']-1]."</td> </tr> <tr> <td>Атака</td> <td>".$row['uatt']."</td> </tr> <tr> <td>Ловкость</td> <td>".$row['uabi']."</td> </tr> <tr> <td>Мастерство</td> <td>".$row['uskill']."</td> </tr> <tr> <td colspan='2' style='text-align:center;width:180px;'> <form method='post'> <input type='hidden' value='".$i."' name='cell_id'> <input type='submit' value='Убрать' name='del'> </form> </td> </tr> </table> </td>"; } } ?> </tr></table> <?php } else { # Если их нет $free_cell = true; echo "Выберите карты из списка ниже"; } ?>
<div style='text-align: center;'><b>Список всех карт</b></div> <table><tr> <?php # Отображает список всех карт игрока, кроме тех что выставлены на бой $sql = $db->q("SELECT *,`user_map`.`id` as `uid`,`user_map`.`att` as `uatt`,`user_map`.`abi` as `uabi`,`user_map`.`skill` as `uskill` FROM `user_map`,`map` WHERE `user_map`.`user_id`='".$_SESSION['user_id']."' AND `map`.`id`=`user_map`.`map_id` AND `user_map`.`type`='1'"); $i=1; while($row = mysql_fetch_array($sql)) { $exp = explode("|",$row['lvl_exp']); echo "<td style='padding:4px;'> <table style='width:180px;display:block;border:1px solid black;'> <tr> <td style='text-align:center;width:180px;' colspan='2'><b>".$row['name']."</b></td> </tr> <tr> <td colspan='2'><div style='width:170px;height:120px;overflow:auto;display:block;border-bottom:1px solid black;'>".$row['desc']."</div></td> </tr> <tr> <td>Уровень</td> <td>".$row['lvl']."</td> </tr> <tr> <td>Опыт</td> <td>".$row['exp']."/".$exp[$row['lvl']-1]."</td> </tr> <tr> <td>Атака</td> <td>".$row['uatt']."</td> </tr> <tr> <td>Ловкость</td> <td>".$row['uabi']."</td> </tr> <tr> <td>Мастерство</td> <td>".$row['uskill']."</td> </tr>"; # Если есть свободный слот и карта не находится в списке карт для боя [1], то отображается кнопка добавления в список карт для боя # [1] - Продвинутый пользователь может указать id карты, которая уже есть в списке карт для боя что приведен к неправильной работе скрипта, поэтому введена такая проверка if ($free_cell == true && $cell[$row['uid']] != 1) { echo "<tr> <td colspan='2' style='text-align:center;width:180px;'> <form method='post'> <input type='hidden' value='".$row['uid']."' name='map_id'> <input type='submit' value='Добавить' name='add'> </form> </td> </tr>"; } echo " </table> </td>"; if (($i%5)==0) echo "</tr><tr>"; # Вывод карт по 5 штук в строку $i++; } ?> </tr></table>
Скрипт написан, но как проверить его? Ведь в БД нет ни одной карты. Для этого нужно создать файлик, с помощью которого можно создавать карты. Откройте файл adm/map.php и вставьте код: Код <?php include('../inc/db.php'); # Подключается класс БД if (!empty($_POST['create'])) { # Создание карты $db = new db; if (!empty($_GET['id'])) { # Если существует id карты, то карта редактируется $sql = $db->q("SELECT * FROM `map` WHERE `id`='".$_GET['id']."'"); if (mysql_num_rows($sql) == 1) { $_POST['desc'] = str_replace("\n","<br>",$_POST['desc']); $exp = $_POST['exp0']."|".$_POST['exp1']."|".$_POST['exp2']."|".$_POST['exp3']; $char = $_POST['att2'].":".$_POST['abi2'].":".$_POST['skill2']."|"; $char .= $_POST['att3'].":".$_POST['abi3'].":".$_POST['skill3']."|"; $char .= $_POST['att4'].":".$_POST['abi4'].":".$_POST['skill4']."|"; $char .= $_POST['att5'].":".$_POST['abi5'].":".$_POST['skill5']; $sql = $db->q("UPDATE `map` SET `name`='".$_POST['name']."',`desc`='".$_POST['desc']."',`att`='".$_POST['att']."',`abi`='".$_POST['abi']."',`skill`='".$_POST['skill']."',`lvl_exp`='".$exp."',`char`='".$char."',`cost`='".$_POST['cost']."' WHERE `id`='".$_GET['id']."'"); if ($sql) echo '<div style="color:green;">Карта изменена</div>'; else echo "<div style='color:red;'>Ошибка<br>".mysql_error()."</div>"; } } else { # Если не существует, то создается новая карта $_POST['desc'] = str_replace("\n","<br>",$_POST['desc']); $exp = $_POST['exp0']."|".$_POST['exp1']."|".$_POST['exp2']."|".$_POST['exp3']; $char = $_POST['att2'].":".$_POST['abi2'].":".$_POST['skill2']."|"; $char .= $_POST['att3'].":".$_POST['abi3'].":".$_POST['skill3']."|"; $char .= $_POST['att4'].":".$_POST['abi4'].":".$_POST['skill4']."|"; $char .= $_POST['att5'].":".$_POST['abi5'].":".$_POST['skill5']; $sql = $db->q("INSERT INTO `map` (`name`,`desc`,`att`,`abi`,`skill`,`lvl_exp`,`char`,`cost`) VALUES ('".$_POST['name']."','".$_POST['desc']."','".$_POST['att']."','".$_POST['abi']."','".$_POST['skill']."','".$exp."','".$char."','".$_POST['cost']."')"); if ($sql) echo '<div style="color:green;">Карта добавлена <a href="?id='.mysql_insert_id().'">Просмотреть</a></div>'; else echo "<div style='color:red;'>Ошибка<br>".mysql_error()."</div>"; } }
if (!empty($_GET['id'])) { # Просмотр карты $db = new db; $sql = $db->q("SELECT * FROM `map` WHERE `id`='".$_GET['id']."'"); if (mysql_num_rows($sql) == 1) { $row = mysql_fetch_array($sql); $row['desc'] = str_replace("<br>","\n",$row['desc']); $name = $row['name']; $desc = $row['desc']; $att = $row['att']; $abi = $row['abi']; $skill = $row['skill']; $exp = explode("|",$row['lvl_exp']); $char = explode("|",$row['char']); foreach($char as $ind => $val) { $char[$ind] = explode(":",$val); } $cost = $row['cost']; } else { echo "<div style='color:red;'>Карта не найдена</div>"; } } ?> <form method="post"> <table style="width:400px;"> <tr><td style="width:110px;">Наименование</td><td><input style="width:100%;" type="text" name="name" value="<?php echo $name; ?>" /></td></tr> <tr><td colspan="2"><textarea name="desc" style="width:400px;height:150px;"><?php echo $desc; ?></textarea></td></tr> <tr><td style="width:110px;">Цена</td><td><input style="width:100%;" type="text" name="cost" value="<?php echo $cost; ?>" /></td></tr> <tr><td style="width:110px;">Атака</td><td><input style="width:100%;" type="text" name="att" value="<?php echo $att; ?>" /></td></tr> <tr><td style="width:110px;">Ловкость</td><td><input style="width:100%;" type="text" name="abi" value="<?php echo $abi; ?>" /></td></tr> <tr><td style="width:110px;">Мастерство</td><td><input style="width:100%;" type="text" name="skill" value="<?php echo $skill; ?>" /></td></tr> <tr><td style="width:110px;">Опыт 2 ур.</td><td><input style="width:100%;" type="text" name="exp0" value="<?php echo $exp[0]; ?>" /></td></tr> <tr><td style="width:110px;">Опыт 3 ур.</td><td><input style="width:100%;" type="text" name="exp1" value="<?php echo $exp[1]; ?>" /></td></tr> <tr><td style="width:110px;">Опыт 4 ур.</td><td><input style="width:100%;" type="text" name="exp2" value="<?php echo $exp[2]; ?>" /></td></tr> <tr><td style="width:110px;">Опыт 5 ур.</td><td><input style="width:100%;" type="text" name="exp3" value="<?php echo $exp[3]; ?>" /></td></tr> <tr><td colspan="2"><b>Повышение хар-к для 2 ур.</b></td></tr> <tr><td style="width:110px;">Атака</td><td><input style="width:100%;" type="text" name="att2" value="<?php echo $char[0][0]; ?>" /></td></tr> <tr><td style="width:110px;">Ловкость</td><td><input style="width:100%;" type="text" name="abi2" value="<?php echo $char[0][1]; ?>" /></td></tr> <tr><td style="width:110px;">Мастерство</td><td><input style="width:100%;" type="text" name="skill2" value="<?php echo $char[0][2]; ?>" /></td></tr> <tr><td colspan="2"><b>Повышение хар-к для 3 ур.</b></td></tr> <tr><td style="width:110px;">Атака</td><td><input style="width:100%;" type="text" name="att3" value="<?php echo $char[1][0]; ?>" /></td></tr> <tr><td style="width:110px;">Ловкость</td><td><input style="width:100%;" type="text" name="abi3" value="<?php echo $char[1][1]; ?>" /></td></tr> <tr><td style="width:110px;">Мастерство</td><td><input style="width:100%;" type="text" name="skill3" value="<?php echo $char[1][2]; ?>" /></td></tr> <tr><td colspan="2"><b>Повышение хар-к для 4 ур.</b></td></tr> <tr><td style="width:110px;">Атака</td><td><input style="width:100%;" type="text" name="att4" value="<?php echo $char[2][0]; ?>" /></td></tr> <tr><td style="width:110px;">Ловкость</td><td><input style="width:100%;" type="text" name="abi4" value="<?php echo $char[2][1]; ?>" /></td></tr> <tr><td style="width:110px;">Мастерство</td><td><input style="width:100%;" type="text" name="skill4" value="<?php echo $char[2][2]; ?>" /></td></tr> <tr><td colspan="2"><b>Повышение хар-к для 5 ур.</b></td></tr> <tr><td style="width:110px;">Атака</td><td><input style="width:100%;" type="text" name="att5" value="<?php echo $char[3][0]; ?>" /></td></tr> <tr><td style="width:110px;">Ловкость</td><td><input style="width:100%;" type="text" name="abi5" value="<?php echo $char[3][1]; ?>" /></td></tr> <tr><td style="width:110px;">Мастерство</td><td><input style="width:100%;" type="text" name="skill5" value="<?php echo $char[3][2]; ?>" /></td></tr> <tr><td colspan="2"><input type="submit" value="<?php if (empty($name)) { echo 'Создать'; } else { echo 'Изменить'; } ?>" name="create" /></td></tr> </table> </form>
В этом файле указываются характеристики карты, её описание, стоимость и % увеличения характеристик при повышении уровня карты (Глава 4). Важно то что данный файл будет доступен всем, каждый может зайти в него и создать или отредактировать карту. Как этого избежать? Вариантов много, некоторые из них: создать вход в админку и проверять админ зашел или кто то посторонний, либо повесить пароль на папку adm.
Но этого мало, карт все равно нет у игрока. Где же они тогда? Они оказывается в магазине. Поэтому приступаем к написанию магазина.
При копировании материала ссылка на источник обязательна!
|
|
| |