Результаты поиска
| |
Assasin | Дата: Понедельник, 31 Декабря 2012, 19:05 | Сообщение # 81 | Тема: Уроки по созданию браузерной игры (ККИ) |
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.
Но этого мало, карт все равно нет у игрока. Где же они тогда? Они оказывается в магазине. Поэтому приступаем к написанию магазина.
При копировании материала ссылка на источник обязательна!
|
|
| |
Assasin | Дата: Понедельник, 31 Декабря 2012, 18:33 | Сообщение # 82 | Тема: Уроки по созданию браузерной игры (ККИ) |
web-coder
Сейчас нет на сайте
| Предисловие В данных уроках не рассказывается о том как создать мега игру. В них описывается процесс создания игры. Как начать и что делать дальше. Что бы начинающие игроделы поняли что создание игры это не набор заготовок, которые можно сложить как конструктор и получить результат. Игра это то что ты сам придумал и написал. Только Ваша фантазия.
Описание игры Игра представляет собой коллекционирование карт, их улучшение и сражения с их помощью. К слову давно хотелось попробовать создать карточную игру, вдохновила меня на это, возможно знакомая вам, игра klanz.ru. В распоряжении игрока есть карты, которые имеют различные характеристики. Карты можно купить либо в магазине, либо на аукционе от других игроков. Карты игроков могут сражаться друг против друга за что получают опыт и возможность улучшить свои характеристики, а игрок получает игровую валюту для покупки карт, либо для улучшения самого себя. Более подробная информация будет описываться в последующих главах.
Список программ Denwer – локальный web-сервер Navicat MySQL – управление БД Notepad++ - написание скриптов Chrome, Opera, Firefox etc. – просмотр результата
Содержание Глава 1. Первые шаги. Знакомство с Navicat Глава 2. Основа игры – карты Глава 3. Магазин. Карты и бонусы для игрока Глава 4. «Доказать кто тут лучший» - сражения Глава 5. Уведомления и переписка Глава 6. Возможность заработать – аукцион Слово автора
Глава 1. Первые шаги. Знакомство с Navicat Приступим. Вы уже установили Denwer. Теперь нужно создать папку в которой будут храниться скрипты игры. У меня Denwer использует Локальный диск Z. Папку с игрой я назвал tgame и создал её в папке localhost. Перед началом создания файлов ознакомьтесь с программой Navicat - программа для работы с разными базами данных (далее БД). В качестве СУБД я использую MySQL. Найти программу можно на просторах интернета, так как на официальном сайте она не бесплатная. Видео продемонстрирует подключение к MySQL и создание БД. Напомню что Denwer должен быть включен иначе невозможно будет подключится к MySQL.
В видео показано создание БД – map_db, создание таблицы – user и структура остальных таблиц – Design Table. Как видно у меня уже была создана БД с нужными таблицами, я просто скопировал их и показал структуру. Во всех таблицах поле id должно быть Auto Increment и Unsigned Краткое описание таблиц battle – сражения battle_log – фразы используемые во время боя картами map – список всех карт post – почта shop – список вещей для магазина trade – список лотов для аукциона user – список всех игроков user_map – список карт у игроков word – список фраз, который можно использовать в бою Структура папок: - adm - папка:
- map.php - файл
- shop.php - файл
- inc - папка:
- battle.php - файл
- db.php - файл
- module - папка:
- .htaccess - файл
- battle.php - файл
- footer.php - файл
- header.php - файл
- main.php - файл
- maps.php - файл
- post.php - файл
- shop.php - файл
- trade.php - файл
- style - папка:
- .htaccess - файл
- index.php - файл
- reg.php - файл
- game.php - файл
Перед тем как приступить к авторизации и регистрации пользователей я подробно опишу таблицу user. Таблица user id – уникальный идентификатор, с помощью которого можно определить игрока. login – игровой логин игрока password – пароль зашифрованный md5 хешем email – почтовый ящик life – текущее здоровье игрока mlife – максимальное значение здоровья money – количество игровой валюты position – позиция карт для боя
Здоровье игрока важный показатель для боя. Чем больше здоровья, тем больше шанс продержать в бою и выиграть его. При регистрации игроку дается 25 здоровья. Забегая на перед сообщу что здоровье возможно повысить покупая специальные «таблетки» в магазине. Позиция карт для боя будет описана в Главе 2.
Регистрация Регистрация нужна для создания игрового аккаунта. Логика регистрации довольна проста, скрипт принимает данные (логин, пароль и пр.), проверяет есть ли такие данные в БД, если есть, то уведомляет пользователя о том что аккаунт с введенными данными уже существует. Если же в БД подобной записи не будет, то она создается и позволяет пользователю в дальнейшем заходить в игру. Приступим к написанию кода. Вход в игру При входе, скрипт проверяет наличие записи в БД с принятыми данными, если запись есть, то предоставляется доступ в игру, если записи нет, то уведомляется пользователь о том что аккаунта с введенными данными не существует.
Все создаваемые файлы должны быть в формате UNIX и в кодировке UTF-8 без BOM.
После создания всех нужных папок и файлов откройте файл .htaccess на редактирование. В этом файле будут храниться настройки для сайта, кодировка сайта и к какому файлу подключится если в адресной строке указан только url сайта. Код # Файл который будет подключен при указании названия # сайта с его доменом без лигних параметров. # Пример: tgame.localhost DirectoryIndex index.php
# Кодировка страниц AddDefaultCharset UTF-8
Теперь откройте index.php на редактирование. В нем будет авторизация пользователя. Это просто форма с двумя текстовыми полями и собственно кнопкой. При нажатии на которую скрипт производит проверки и решает впускать пользователя в игру или нет. Код <?php session_start(); # Подключается сессия if (!empty($_POST['auth'])) { include('inc/db.php'); # Подключается класс БД $db = new db; # Создается переменная для работы с классом БД # Фильтруются входящие данные $login = str_replace("'","\'",$_POST['login']); $password = str_replace("'","\'",$_POST['password']); # Проверяется существует ли запись в БД с получеными данными $sql = $db->q("SELECT * FROM `user` WHERE `login`='".$login."' AND `password`=MD5('".$password."')"); if (mysql_num_rows($sql) == 1) { # Если существует, то сохраняется сессия и переадресовывает в игру $row = mysql_fetch_array($sql); $_SESSION['user_id'] = $row['id']; header("Location: game.php"); } else { # Если нет, то выводится ошибка $err = '<div style="text-align: center;color: red;">Игрок не найден</div>'; } } ?> <!DOCTYPE html> <html> <head> <title>Браузерная игра "Картишки"</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <?php echo $err; # Вывод ошибки ?> <div style="text-align:center;"> <form method="post"> Логин: <input type="text" name="login" /> Пароль: <input type="password" name="password" /> <input type="submit" value="Войти" name="auth" /> </form> <br> <a href="reg.php">Регистрация</a> </div> </body> </html>
Сохраните файл и откройте reg.php. В этом файле прописана логика создания нового игрока. Также форма, только с тремя текстовыми полями и кнопкой. Код <?php session_start(); # Подключается сессия if (!empty($_POST['reg'])) { include('inc/db.php'); # Подключается класс БД $db = new db; # Создается переменная для работы с классом БД # Фильтруются входящие данные $login = htmlspecialchars(str_replace("'","\'",$_POST['login'])); $email = htmlspecialchars(str_replace("'","\'",$_POST['email'])); $password = htmlspecialchars(str_replace("'","\'",$_POST['password'])); # Проверяется существует ли запись в БД с получеными данными $sql = $db->q("SELECT * FROM `user` WHERE `login`='".$login."' OR `email`='".$email."'"); if (mysql_num_rows($sql) > 0) { # Если существует, то выводится ошибка $err = '<div style="text-align: center;color: red;">Такой логин/email уже существует </div>'; } else { # Если нет, то создается запись в БД, сохраняется сессия и переадресовывает в игру $db->q("INSERT INTO `user` (`login`,`password`,`email`,`position`) VALUES ('".$login."',MD5('".$password."'),'".$email."','0|0|0|0|0')"); $_SESSION['user_id'] = mysql_insert_id(); header("Location: game.php"); } } ?> <!DOCTYPE html> <html> <head> <title>Браузерная игра "Картишки"</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <?php echo $err; # Вывод ошибки ?> <div id="main" style="text-align:center;"> <form method="post"> <table align="center"> <tr><td>Логин:</td><td><input type="text" name="login" value="<?php echo $_POST['login']; ?>" /></td></tr> <tr><td>Пароль:</td><td><input type="password" name="password" /></td></tr> <tr><td>email:</td><td><input type="text" name="email" value="<?php echo $_POST['email']; ?>" /></td></tr> <tr><td colspan="2"><input type="submit" value="Зарегистрироваться" name="reg" /></td></tr> </table> </form>
<a href="index.php">Главная</a> </div> </body> </html>
Сохраните файл. Осталось добавить код в файл inc/db.php. Это класс для работы с БД, в нем также выводится отладочная информация для отслеживания скриптов и запросов которые грузят систему. Код файла. Код <?php /* * Класс базы данных * */
class db { public $time_load_page; # Время выполнения скрипта public $mem_start; # Потребление памяти при выполнении скрипта public $mem_pek_start; # Пиковое потребление памяти при выполнении скрипта const DB_HOST = "localhost"; # mysql хост const DB_USER = "root"; # mysql пользователь const DB_PASS = ""; # mysql пароль const DB_NAME = "tgame"; # БД mysql private $counter_mysql = 0; # Количество запросов private $timer_mysql = 0; # Общее время запросов private $mysql_query_desc; # Список запросов # Соединение с БД и запуск класса public function __construct() { $connect = mysql_connect(self::DB_HOST, self::DB_USER, self::DB_PASS) or die("База данных ушла в себя"); mysql_select_db(self::DB_NAME,$connect) or die("Невозможно найти БД"); # Установка языка записи в БД mysql_query("SET NAMES utf8"); } # Считаются запросы # @query:String - mysql запрос public function q($query) { $this->mysql_query_desc[] = $query; # Добавляется запрос в список запросов $this->counter_mysql++; # Увеличивается количество запросов # Считается время выполнения запроса $start = microtime(true); $result = mysql_query($query); $this->timer_mysql += microtime(true)-$start; # Возвращается выполненый mysql запрос return $result; } # Выводится отладочная инфа public function debug() { $txt = ""; $txt .= "Скрипт выполнен за ".$this->time_load_page." сек.<br>\n"; $txt .= "Количество запросов к БД: ".$this->counter_mysql."<br>\n"; $txt .= "Время запросов к БД: ".round($this->timer_mysql,4)."<br>\n"; $txt .= "Список запросов<br>\n<div>"; $len = sizeof($this->mysql_query_desc); for ($i=0;$i<$len;$i++) { $txt .= "[".($i+1)."] ".$this->mysql_query_desc[$i]."<br>\n"; } $txt .= "</div>"; if ( function_exists('memory_get_usage') ) { $type = "Kb"; $num = round($this->mem_start/1024, 2); if ($num > 1024) { $type = "Mb"; $num = round($this->mem_start/1024/1024, 2); } $txt .= "Потребление памяти: ".$num.$type." <br>\n"; } return $txt; } }
?>
Просмотреть результат можно тут http://tgame.localhost/index.php
При копировании материала ссылка на источник обязательна!
|
|
| |
Assasin | Дата: Суббота, 08 Декабря 2012, 12:37 | Сообщение # 83 | Тема: Урок по созданию браузерной игры в стиле покемонов. Part 4 |
web-coder
Сейчас нет на сайте
| putdanil, Создай файл .htaccess в нем сохрани этот код Code # Кодировка страниц AddDefaultCharset UTF-8 Вместо UTF-8 указываешь ту кодировку, которая тебе нужна.
|
|
| |
Assasin | Дата: Понедельник, 03 Декабря 2012, 23:28 | Сообщение # 84 | Тема: Урок по созданию браузерной игры в стиле покемонов. Part 4 |
web-coder
Сейчас нет на сайте
| Step Следим за выражениями.
|
|
| |
Assasin | Дата: Среда, 28 Ноября 2012, 01:55 | Сообщение # 85 | Тема: Урок по созданию браузерной игры в стиле покемонов. Bonus! |
web-coder
Сейчас нет на сайте
| Quote (PROstak) Теперь просто каждый раз выкидывает назад на авторизацию... $Myrow = mysql_fetch_array(mysql_query("SELECT * FROM users WHERE login='".$login."' AND password='".$password."'"));
|
|
| |
Assasin | Дата: Пятница, 23 Ноября 2012, 00:12 | Сообщение # 86 | Тема: PHP |
web-coder
Сейчас нет на сайте
| Название темы не информативно. Ввиду того что пользователь "доконал" многих и отправился отдыхать, тему закрываю.
|
|
| |
Assasin | Дата: Пятница, 23 Ноября 2012, 00:10 | Сообщение # 87 | Тема: Бан лог |
web-coder
Сейчас нет на сайте
| SUPERVADIM - бан 30 дней, флуд
|
|
| |
Assasin | Дата: Суббота, 17 Ноября 2012, 19:36 | Сообщение # 88 | Тема: Разработка игры, вопросы |
web-coder
Сейчас нет на сайте
| 1. На твое усмотрение, знаешь хорошо ООП, тогда дерзай. 6. Даже не знаю. Думаю лучше подключить.
|
|
| |
Assasin | Дата: Суббота, 17 Ноября 2012, 19:05 | Сообщение # 89 | Тема: Разработка игры, вопросы |
web-coder
Сейчас нет на сайте
| 1. Что за зверь такой ОПП? 3. Разбросать в отдельный, в одном заблудишься. 4. Я бы с 0 писал. У меня фреймворки что то медленно работают 5. Как тебе лучше будет 6. Вопрос не понял
|
|
| |
Assasin | Дата: Суббота, 17 Ноября 2012, 19:01 | Сообщение # 90 | Тема: Бот для чата |
web-coder
Сейчас нет на сайте
| SUPERVADIM, учись искать ответы на свои вопросы сам. В крайнем случае обращайся к другим. Тема закрыта.
|
|
| |
Assasin | Дата: Пятница, 02 Ноября 2012, 13:59 | Сообщение # 91 | Тема: Бесплатный движок браузерной игры |
web-coder
Сейчас нет на сайте
| Quote (Teodoro) cougraAcc, за халяву не какой красивый код никто не предоставит ))) Ложь и провокация Если знания есть, то почему бы ими не поделится. Если нет, и интереса нет, то как раз пишут код плохо.
|
|
| |
Assasin | Дата: Понедельник, 15 Октября 2012, 19:32 | Сообщение # 92 | Тема: Браузерная игра: действие в процессе |
web-coder
Сейчас нет на сайте
| 1. cron 2. Пост №2
|
|
| |
Assasin | Дата: Пятница, 05 Октября 2012, 20:08 | Сообщение # 93 | Тема: Правый нижний угол. Как определить? |
web-coder
Сейчас нет на сайте
| position:fixed - было бы лучше, при прокрутке страницы картинка все равно оставалась бы в правом углу.
|
|
| |
Assasin | Дата: Четверг, 04 Октября 2012, 22:14 | Сообщение # 94 | Тема: Бан лог |
web-coder
Сейчас нет на сайте
| jeki Оскорбления, бан 7 дней
|
|
| |
Assasin | Дата: Воскресенье, 02 Сентября 2012, 15:05 | Сообщение # 95 | Тема: Не заливается база |
web-coder
Сейчас нет на сайте
| Через mysql консоль, либо другим полноценным приложением для работы с mysql (Navicat etc.)
|
|
| |
Assasin | Дата: Воскресенье, 02 Сентября 2012, 13:15 | Сообщение # 96 | Тема: BBMMO от Mozilla |
web-coder
Сейчас нет на сайте
| Это такой баг, уже не помню как его делать. Вроде когда босса убиваешь и становишься на его место, когда он реснится, то ты как бы в нем сидишь.
|
|
| |
Assasin | Дата: Воскресенье, 02 Сентября 2012, 00:12 | Сообщение # 97 | Тема: BBMMO от Mozilla |
web-coder
Сейчас нет на сайте
| Quote (Ku-Klux) в юникс системах мало кто работает. Интересно на чем тогда большинство хостингов стоит...
|
|
| |
Assasin | Дата: Четверг, 16 Августа 2012, 21:12 | Сообщение # 98 | Тема: Бан лог |
web-coder
Сейчас нет на сайте
| SUPERVADIM - 14 дней бан
|
|
| |
Assasin | Дата: Вторник, 12 Июня 2012, 14:06 | Сообщение # 99 | Тема: Таймер в pvp бою |
web-coder
Сейчас нет на сайте
| js - setInterval(), setTimeout()
|
|
| |
Assasin | Дата: Воскресенье, 27 Мая 2012, 00:56 | Сообщение # 100 | Тема: Помогите сделать функцию Восстановление пароля |
web-coder
Сейчас нет на сайте
| Либо проверь тут sendmail
|
|
| |
|