Среда, 04 Декабря 2024, 22:32

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Результаты поиска
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 - папка:

    • style.css - файл

  • .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 писал. У меня фреймворки что то медленно работают smile
5. Как тебе лучше будет
6. Вопрос не понял
AssasinДата: Суббота, 17 Ноября 2012, 19:01 | Сообщение # 90 | Тема: Бот для чата
web-coder
Сейчас нет на сайте
SUPERVADIM, учись искать ответы на свои вопросы сам. В крайнем случае обращайся к другим.
Тема закрыта.
AssasinДата: Пятница, 02 Ноября 2012, 13:59 | Сообщение # 91 | Тема: Бесплатный движок браузерной игры
web-coder
Сейчас нет на сайте
Quote (Teodoro)
cougraAcc, за халяву не какой красивый код никто не предоставит )))

Ложь и провокация smile Если знания есть, то почему бы ими не поделится. Если нет, и интереса нет, то как раз пишут код плохо.
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
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг