Среда, 18 Декабря 2024, 22:13

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Уроки по созданию браузерной игры (ККИ)
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.

Но этого мало, карт все равно нет у игрока. Где же они тогда? Они оказывается в магазине. Поэтому приступаем к написанию магазина.

При копировании материала ссылка на источник обязательна!
  • Страница 1 из 1
  • 1
Поиск:

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