Суббота, 20 Апреля 2024, 13:42

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
Форум игроделов » Записи участника » Assasin [1155]
Результаты поиска
AssasinДата: Четверг, 15 Августа 2013, 20:39 | Сообщение # 61 | Тема: Урок по созданию браузерной игры № 3
web-coder
Сейчас нет на сайте
Цитата (last2424)
но гайд корявый

Согласен, гайд писался нубом, который не знал много чего smile

SalMan, как вариант, удаляй сессию ip после регистрации. И при входе, не создавай её.
AssasinДата: Четверг, 15 Августа 2013, 20:33 | Сообщение # 62 | Тема: Уроки по созданию браузерной игры
web-coder
Сейчас нет на сайте
Вместо TYPE написать ENGINE
AssasinДата: Пятница, 12 Июля 2013, 01:02 | Сообщение # 63 | Тема: Реализация изометрической карты
web-coder
Сейчас нет на сайте
Не часто тут бываю, отвечать быстро не могу. Твой вариант норм, только не оптимизирован. К примеру 100 игроков и карта 80х80 ячеек. Это получится 80*80*100 = 640000 запросов к базе. Я думаю сервер тебе скажет "привет". Малость изменил код:
JS
Код
window.onload = function()   
{   
   var element = document.getElementById('map_view');   
   element.width = 640;   
   element.height = 640;   

   var ctx = element.getContext('2d');   

   var map = {   
    id_map: 0,   
    tile_width: 80,   
    tile_height: 80,   
    w_cell: 8,   
    h_cell: 8   
   }

   var image = new Image();   

   var width = map.tile_width;   
   var height = map.tile_height;   

   function draw(x, y, image) {   
    ctx.drawImage(image, x - width / 2, y - height / 2, width, height);   
   }

   $.ajax({   
    url: "load.php",   
    data: "loc="+loc,   
    dataType: 'json',
    success: function(data) {
     renderMap(data);
    }
   })

   function renderMap(mapCord) {   
    var Xo = 0;   
    var Yo = 0;   

    var C = Math.floor(element.width / 2);   

    var Xc = 0;   

    for(var y = 0; y < map.h_cell; y++) {   

    Yo = (height / 4) * y;   
    Xc = C - (width / 2 * y);   

     for(var x = 0; x < map.w_cell; x++) { //Отрисовка ячеек   

      Xo = Xc + (x * (width / 2));   
      Yo += height / 4;   
      image.src = mapCord[x][y];   
      draw(Xo, Yo, image);   
     }   
    }
   }
}

PHP
Код
<?php   
//Connection to database   
$connect = mysql_connect('localhost','root','');   
$db = mysql_select_db('namedb');   
$loc = $_GET['loc'];   
$sql = mysql_query("SELECT * FROM `map` WHERE `id` = '{$loc}'");   
$arr = array();
while($r = mysql_fetch_array($sql)) {
   $arr[$r['x']][$r['y']] = $r['img_id'];
}
echo json_encode($arr);   
?>
AssasinДата: Понедельник, 08 Июля 2013, 23:05 | Сообщение # 64 | Тема: Реализация изометрической карты
web-coder
Сейчас нет на сайте
Создаешь объект, в котором прописаны все ячейки и их типы
Код
var mapTile = {"0,0":"0","0,1":"1","0,2":"2"};

где "0,0" - "x,y",
а "0", "1", "2" - тип ячейки. К примеру 0 - вода, 1 - земля, 2 - скалы.
Затем в своем цикле создаешь Image и в зависимости от типа указываешь url к картинкам.

Это пример в лоб, т.к. при каждой итерации будет создаваться новая картинка. Но главное что бы ты понял суть. Если поймешь, то подключишь потом кеширование и будешь тянуть картинки с кеша, а не подгружать каждый раз. Либо картинку можно сделать одной и вырезать определенные её области и отрисовывать на карте.
AssasinДата: Воскресенье, 07 Июля 2013, 17:27 | Сообщение # 65 | Тема: Вопрос о локациях
web-coder
Сейчас нет на сайте
таблица локаций:
id | name | other_loc
1 | loc1 | 2,3,4,5 # Это id локация на которые может перейти игрок

К примеру игрок на локации 1, берутся данные с таблицы у которых id = 1 и формируются ссылки. В них подставляются id локация с поля other_loc

Код
$loc = mysql_fetch_array(mysql_query("SELECT * FROM `table` WHERE `id`='{$_GET['loc_id']}'"));
$other_loc = explode(",",$loc['other_loc']);

echo "<a href='game.php?loc_id={$other_loc[0]}'>Go to up</a><br>";
echo "<a href='game.php?loc_id={$other_loc[1]}'>Go to right</a><br>";
echo "<a href='game.php?loc_id={$other_loc[2]}'>Go to down</a><br>";
echo "<a href='game.php?loc_id={$other_loc[3]}'>Go to left</a><br>";
AssasinДата: Пятница, 05 Июля 2013, 23:10 | Сообщение # 66 | Тема: Вопрос о локациях
web-coder
Сейчас нет на сайте
Добавь поля в таблицу, в которых укажешь на какие локации с данной игрок может перейти. Затем когда читаешь на какой локации игрок, подставляешь в ссылки id вытянутых локаций с базы.
AssasinДата: Вторник, 28 Мая 2013, 23:13 | Сообщение # 67 | Тема: Создание боя между персонажами?
web-coder
Сейчас нет на сайте
Бои бывают разными. Самые популярные: как в Карнаже (куда бить, что защищать), как в Ботве (бой происходит автоматически, игрок только результат видит). О каком ты говоришь?
AssasinДата: Суббота, 27 Апреля 2013, 12:54 | Сообщение # 68 | Тема: 3d "modeller" and Artist 2d
web-coder
Сейчас нет на сайте
Думаю в теме ясно написано чего хочет автор топика. И ваши указания "что ему делать", я думаю, не нужны.
AssasinДата: Суббота, 27 Апреля 2013, 12:52 | Сообщение # 69 | Тема: Бан лог
web-coder
Сейчас нет на сайте
GrontagWarrior - 14 дней бан, оскорбления пользователей
AssasinДата: Вторник, 16 Апреля 2013, 22:25 | Сообщение # 70 | Тема: Бан лог
web-coder
Сейчас нет на сайте
Romik - бан 60 дней. Игнор предупреждений
AssasinДата: Понедельник, 04 Февраля 2013, 21:13 | Сообщение # 71 | Тема: TigaEngine - ядро для браузерных игр
web-coder
Сейчас нет на сайте
Изобретая велосипед можно изобрести что то нестандартно-новое. Так же это опыт для себя.
AssasinДата: Понедельник, 04 Февраля 2013, 00:58 | Сообщение # 72 | Тема: Регистрация
web-coder
Сейчас нет на сайте
Бой подушками.
Если нужно сразу указать есть ли такой логин или нет, то ясное дело блур нужен. Если после нажатия на кнопку, то уже напротив всех полей логично указывать. А тут речь идет, как я понял, что бы сразу выдавался ответ.
AssasinДата: Понедельник, 04 Февраля 2013, 00:09 | Сообщение # 73 | Тема: Уроки по созданию браузерной игры (ККИ)
web-coder
Сейчас нет на сайте
Слово автора


Вот и подошла серия уроков к концу, но это не значит что игра готова. Я рассказал только о каркасе для игры. Можно ввести много разнообразных фич. Если игру не улучшать, не обновлять, то она потеряет всякий интерес для тех кто в нее играет. Главное это фантазия.

Я надеюсь вам понравилось.
С ув. Assasin
AssasinДата: Понедельник, 04 Февраля 2013, 00:08 | Сообщение # 74 | Тема: Уроки по созданию браузерной игры (ККИ)
web-coder
Сейчас нет на сайте
Глава 6. Возможность заработать – аукцион

Сражения хорошо, но что делать если есть лишние карты, но срочно нужны деньги? Конечно же избавиться от них, да еще и так что бы получить какую то монету в карман. Для этого и нужен аукцион. Игроки могут выставлять свои карты двумя способами. Первый – аукцион, игрок ставит минимальную цену, а те кто хочет купить ставят свою, другие перебивают своей и до тех пор, пока не истечет время аукциона. Тот кто последний поставил свою цену, тот и получит карту. Второй способ – просто продажа, игрок выставляет цену и первый кто захочет купить, может сразу же получить карту. Так же можно совмещать эти два способа.

Как только игрок переходит в аукцион, он видит список всех продаваемых карт и если у него хватает монет, то так же видит кнопки покупки. Так же он может выставить свои карты указав стоимость, время аукциона и тип (аукцион, продажа или совмещение).

Таблица trade

- id - уникальный идентификатор
- p1 – id игрока, который выставил карту
- p2 - id игрока, который купил карту или который «перебил» последнюю ставку
- map_id - id карты, которую выставили на аукцион
- cost - цена лота
- bet – ставка лота
- time – время лота
- type – тип лота (1 – продажа, 2 – аукцион, 3 – совмещение, 4 – лот выкуплен или его вернули владельцу по истечению времени)

Код для аукциона прописывается в файле module/trade.php
Код
<?php
$User = mysql_fetch_array($db->q("SELECT * FROM `user` WHERE `id`='".$_SESSION['user_id']."'"));

?>
<div style='text-align: center;'>
  <a href="?a=trade">Купить</a> | <a href="?a=trade&type=1">Продать</a>
</div>
<?php
if (empty($_GET['type'])) { # Просмотр аукциона
  if (!empty($_POST['buy'])) { # Покупка карты
   # Фильтрация
   $id = preg_replace("/[^0-9]/","",$_POST['id']);
   if ($id == '') go2page("game.php");
   # Проверка аукциона, покупка это или нет
   $sql = $db->q("SELECT * FROM `trade` WHERE `id`='".$id."' AND (`type`='1' OR `type`='3') AND `p1`<>'".$_SESSION['user_id']."'");
   if (mysql_num_rows($sql) == 1) { # Проверка прошла успешно
    $trade = mysql_fetch_array($sql);
    if ($trade['cost'] <= $User['money']) { # Если хватает денег, то отнимаются деньги у покупателя и прибавляются продавцу. Создается уведомление и завершается аукцион
     $item = mysql_fetch_array($db->q("SELECT `map`.`name`,`user_map`.`id` FROM `map`,`user_map` WHERE `user_map`.`id`='".$trade['map_id']."' AND `map`.`id`=`user_map`.`map_id`"));
     $db->q("UPDATE `user` SET `money`=CASE `id` WHEN '".$trade['p2']."' THEN `money`-'".$trade['cost']."' WHEN '".$trade['p1']."' THEN `money`+'".$trade['cost']."' ELSE `money` END");
     $db->q("UPDATE `user_map` SET `user_id`='".$trade['p2']."' WHERE `id`='".$trade['map_id']."'");
     $db->q("INSERT INTO `post` (`p1`,`p2`,`read`,`theme`,`text`,`time`) VALUES  
                              ('".$trade['p1']."','0','1','Аукцион','Ваш лот <b>".$item['name']."</b> выкуплен за ".$trade['cost']." монет','".date('Y-m-d H:i:s')."'),
                              ('".$trade['p2']."','0','1','Аукцион','Вы выкупили лот <b>".$item['name']."</b> за ".$trade['cost']." монет','".date('Y-m-d H:i:s')."')");
     $db->q("UPDATE `trade` SET `type`='4' WHERE `id`='".$id."'");
     $User['money'] -= $trade['cost'];
    }
   }
  }
  if (!empty($_POST['bet'])) { # Повышение ставки для лота
   # Фильтрация
   $id = preg_replace("/[^0-9]/","",$_POST['id']);
   $num = preg_replace("/[^0-9]/","",$_POST['num']);
   if ($id == '') go2page("game.php");
   if ($num == '') go2page("game.php");
   # Проверка аукциона, аукцион это или нет
   $sql = $db->q("SELECT * FROM `trade` WHERE `id`='".$id."' AND (`type`='2' OR `type`='3') AND `p1`<>'".$_SESSION['user_id']."'");
   if (mysql_num_rows($sql) == 1) { # Проверка прошла успешно
    $trade = mysql_fetch_array($sql);
    if ($num >= ($trade['bet']+10) && $num <= $User['money']) { # Если хватает денег, то отнимаются деньги у покупателя. Если уже кто то поставил ставку, то ему возвращаются его деньги.
     if ($trade['p2'] != 0) $db->q("UPDATE `user` SET `money`=CASE `id` WHEN '".$trade['p2']."' THEN `money`+'".$trade['bet']."' WHEN '".$_SESSION['user_id']."' THEN `money`-'".$num."' ELSE `money` END");
     else $db->q("UPDATE `user` SET `money`=`money`-'".$num."' WHERE `id`='".$_SESSION['user_id']."'");
     $db->q("UPDATE `trade` SET `bet`='".$num."', `p2`='".$_SESSION['user_id']."' WHERE `id`='".$id."'");
     $User['money'] -= $trade['bet'];
    }
   }
  }
  # Проверка на окончание аукционов
  $end_trade = $db->q("SELECT * FROM `trade` WHERE `type`<'4' AND `time`<='".date("Y-m-d H:i:s")."'");
  $end_map_id = '';
  $end_trade_id = '';
  while($ret = mysql_fetch_array($end_trade)) {
   if ($ret['p2'] == 0) { # Если уже кто то делал ставку, то ему дается эта карта
    $end_map_id .= "`id`='".$ret['map_id']."' OR";
    $end_trade_id .= "`id`='".$ret['id']."' OR";
   } else { # Иначе возвращается продавцу
    $db->q("UPDATE `user_map` SET `type`='1', `user_id`='".$ret['p2']."' WHERE `id`='".$ret['map_id']."'");
    $db->q("UPDATE `user` SET `money`=`money`+'".$ret['bet']."' WHERE `id`='".$ret['p1']."'");
    $end_trade_id .= "`id`='".$ret['id']."' OR";
   }
  }
  if ($end_map_id != '') {
   $end_map_id = substr($end_map_id,0,-3);
   $db->q("UPDATE `user_map` SET `type`='1' WHERE ".$end_map_id);
  }
  if ($end_trade_id != '') {
   $end_trade_id = substr($end_trade_id,0,-3);
   $db->q("UPDATE `trade` SET `type`='4' WHERE ".$end_trade_id);
  }
   
  echo '<table style="width:600px;" border="0"><tr><td style="width:120px;" align="center">Карта</td><td style="width:120px;" align="center">Продавец</td><td style="width:90px;" align="center">Цена</td><td style="width:90px;" align="center">Ставка</td><td style="width:180px;" align="center"></td></tr>';
  # Листалка
  $perpage = 10;
  if (empty($_GET['start'])) {
   $start = 0;
   $gstart = 1;
  } else {
   $gstart = preg_replace("/[^0-9]/","",$_GET['start']);
   $start = (int)($gstart - 1) * $perpage;
  }
  $pages = ceil(mysql_num_rows($db->q("SELECT * FROM `trade` WHERE `time`>='".date('Y-m-d H:i:s')."' AND `type`<'4'")) / $perpage);
   
  if ($start > $pages) $start = (int)($pages - 1) * $perpage;
  # Собственно вывод лотов
  $names = array();
  $sql = $db->q("SELECT `trade`.*,`user_map`.*,`map`.`name`,`trade`.`id` as `tid`,`trade`.`type` as `ttype` FROM `trade`,`user_map`,`map` WHERE `trade`.`map_id`=`user_map`.`id` AND `user_map`.`map_id`=`map`.`id` AND `trade`.`time`>='".date('Y-m-d H:i:s')."' AND `trade`.`type`<'4' ORDER BY `trade`.`time` DESC LIMIT ".$start.",".$perpage);
  while($row = mysql_fetch_array($sql)) {
   $name['login'] = '';
   $name2['login'] = '';
   if ($names[$row['p1']]) {
    $name['login'] = $names[$row['p1']];
   } else {
    $name = mysql_fetch_array($db->q("SELECT `login` FROM `user` WHERE `id`='".$row['p1']."'"));
    $names[$row['p1']] = $name['login'];
   }
   if ($names[$row['p2']]) {
    $name2['login'] = $names[$row['p2']];
   } else {
    if ($row['p2'] > 0) {
     $name2 = mysql_fetch_array($db->q("SELECT `login` FROM `user` WHERE `id`='".$row['p2']."'"));
     $names[$row['p2']] = $name2['login'];
    }
   }
   echo "<tr><td>
     <table style='width:110px;display:block;border:1px solid black;'>
     <tr>
      <td style='text-align:center;width:140px;' colspan='2'><b>".$row['name']."</b></td>
     </tr>
     <tr>
      <td>Уровень</td>
      <td>".$row['lvl']."</td>
     </tr>
     <tr>
      <td>Атака</td>
      <td>".$row['att']."</td>
     </tr>
     <tr>
      <td>Ловкость</td>
      <td>".$row['abi']."</td>
     </tr>
     <tr>
      <td>Мастерство</td>
      <td>".$row['skill']."</td>
     </tr>";
   # Сколько времени осталось до окончания лота
   $time = explode(' ',$row['time']);
   $time[0] = explode('-',$time[0]);
   $time[1] = explode(':',$time[1]);
    
   $time2 = explode(' ',date('Y-m-d H:i:s'));
   $time2[0] = explode('-',$time2[0]);
   $time2[1] = explode(':',$time2[1]);
   $time3 = array();
    
   $time3[1][2] = $time[1][2] - $time2[1][2];
   if ($time3[1][2] < 0) {
    $time3[1][2] = 60 + $time3[1][2];
    $time[1][1]--;
   }
   $time3[1][1] = $time[1][1] - $time2[1][1];
   if ($time3[1][1] < 0) {
    $time3[1][1] = 60 + $time3[1][1];
    $time[1][0]--;
   }
   $time3[1][0] = $time[1][0] - $time2[1][0];
   if ($time3[1][0] < 0) {
    $time3[1][0] = 24 + $time3[1][0];
    $time[0][2]--;
   }
   $time3[0][2] = $time[0][2] - $time2[0][2];
   if ($time3[0][2] < 0) {
    $time3[0][2] = date('t') + $time3[0][2];
   }
    
   $end_time = $time3[0][2].'д '.$time3[1][0].'ч '.$time3[1][1].'м '.$time3[1][2].'с';
   echo "</table>
    </td><td align='center'>".$name['login']."<br>".$end_time."</td>";
   if ($row['ttype'] == 1 || $row['ttype'] == 3) echo "<td align='center'>".$row['cost']."</td>";
   else echo "<td align='center'>---</td>";
   if ($row['ttype'] == 2 || $row['ttype'] == 3) {
    echo "<td align='center'>".$name2['login']."<br>".$row['bet']."</td>";
   }
   else echo "<td align='center'>---</td>";
    
   echo "<td align='center'>";
   # Отображать кнопки только для чужих лотов
   if ($row['p1'] != $_SESSION['user_id']) {
    if ($row['ttype'] == 2 || $row['ttype'] == 3) {
     if ($User['money'] >= ($row['bet']+10)) {
      echo "<form method='post'>
       <input type='hidden' value='".$row['tid']."' name='id' style='width:50px;'>
       <input type='text' value='".($row['bet'] + 10)."' name='num' style='width:50px;'><br>
       <input type='submit' value='Сделать ставку' name='bet'>
      </form>";
     }
    }
    if ($row['ttype'] == 1 || $row['ttype'] == 3) {
     if ($User['money'] >= $row['cost']) {
      echo "<form method='post'>
       <input type='hidden' value='".$row['tid']."' name='id' style='width:50px;'>
       <input type='submit' value='Выкупить' name='buy'>
      </form>";
     }
    }
   }
    
   echo "</td></tr>";
  }
  if ($pages > 1) {
   $show_page = '';
   $separate = ' ';
   $style = 'style="color: #000000; text-decoration: none;"';
   for ($i=1;$i<=$pages;$i++) {
    $show_page .= '<a href="?a=trade&start='.$i.'" '.$style.'>'.($i==$gstart ? '<b>[' : '').$i.($i==$gstart ? ']</b>' : '').'</a>'.$separate;
   }
   echo "<tr><td colspan='4' align='center'>".$show_page."</td></tr>";
  }
  echo "</table>";
} elseif ($_GET['type'] == 1) { # Просмотр карт, которые можно выставить на аукцион
  if (!empty($_POST['go'])) { # Выставить лот на ауцион
   # Фильтрация
   $id = preg_replace("/[^0-9]/","",$_POST['map_id']);
   $cost = preg_replace("/[^0-9]/","",$_POST['cost']);
   $bet = preg_replace("/[^0-9]/","",$_POST['bet']);
   $d = preg_replace("/[^0-9]/","",$_POST['day']);
   $h = preg_replace("/[^0-9]/","",$_POST['hour']);
   $m = preg_replace("/[^0-9]/","",$_POST['min']);
    
   if ($id == '') go2page("game.php");
   # Вывод всех карт, которые не выставлены на аукцион и не принимают участие в бое
   $sql = $db->q("SELECT * FROM `user_map` WHERE `id`='".$id."' AND `type`='1' AND `user_id`='".$_SESSION['user_id']."'");
   if (mysql_num_rows($sql) == 1) {
    $extra_sql = '';
    if ($d == '') $d = 1; if ($h == '') $h = 1; if ($m == '') $m = 1;
    if ($d > 10) $d = 10; if ($h > 24) $h = 24; if ($m > 60) $m = 60;
    if ($d == 10 && ($h > 0 || $m > 0)) {
     $h = 0;
     $m = 0;
    }
    if ($cost > 0 && $bet > 0) $type = 3;
    elseif ($bet > 0) $type = 2;
    elseif ($cost > 0) $type = 1;
    $t = ($m+($h*60)+($d*24*60))*60;
    $time = date("Y-m-d H:i:s",($t+time()));
    $db->q("INSERT INTO `trade` (`p1`,`p2`,`map_id`,`cost`,`bet`,`type`,`time`) VALUES ('".$_SESSION['user_id']."','0','".$id."','".$cost."','".$bet."','".$type."','".$time."')");
    $db->q("UPDATE `user_map` SET `type`='2' WHERE `id`='".$id."'");
    echo "<div style='text-align: center;color: green;'>Лот выставлен</div>";
   }
  }
  # Информация о картах
  $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'");
  echo '<table style="width:600px;" border="0"><tr><td style="width:120px;" align="center">Карта</td><td style="width:60px;" align="center">Цена</td><td style="width:60px;" align="center">Ставка</td><td style="width:230px;" align="center">Время</td><td style="width:120px;" align="center"></td></tr>';
  while($row = mysql_fetch_array($sql)) {
   $exp = explode("|",$row['lvl_exp']);
   echo "<tr><td>
     <table style='width:140px;display:block;border:1px solid black;'>
     <tr>
      <td style='text-align:center;width:140px;' colspan='2'><b>".$row['name']."</b></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>
     </table>
    </td>";
   echo "<form method='post'><td align='center'><input type='text' name='cost' value='".$row['cost']."' style='width:50px;'></td><td align='center'><input type='text' name='bet' value='0' style='width:50px;'></td><td align='center'><input type='text' name='day' value='1' style='width:50px;'>д <input type='text' name='hour' value='0' style='width:50px;'>ч <input type='text' name='min' value='0' style='width:50px;'>м</td><td align='center'><input type='hidden' value='".$row['uid']."' name='map_id'><input type='submit' value='Выставить' name='go'></td></form>";
   echo "</tr>";
  }
  echo '</table>';
}
?>
AssasinДата: Среда, 30 Января 2013, 00:11 | Сообщение # 75 | Тема: Бан лог
web-coder
Сейчас нет на сайте
Romik - 7 дней бан.
Игнорирование предупреждения.
AssasinДата: Воскресенье, 27 Января 2013, 15:20 | Сообщение # 76 | Тема: проблема з движком Pokelegenda
web-coder
Сейчас нет на сайте
Romik, учи русский язык, либо используй переводчик. Увижу русско-украинские предложения будет бан.
AssasinДата: Воскресенье, 27 Января 2013, 15:18 | Сообщение # 77 | Тема: Потребляемые ресурсы на PHP
web-coder
Сейчас нет на сайте
В начале скрипта пишешь:
Код
$start_time = microtime();
$mem_start = memory_get_usage();

Затем в конце:
Код
echo '<br>Время выполнения: '.microtime() - $start_time.' сек.';
echo '<br>Потребление памяти: '.round(((memory_get_usage() - $mem_start)/1024/1024), 2).' MB';
AssasinДата: Понедельник, 31 Декабря 2012, 23:31 | Сообщение # 78 | Тема: Уроки по созданию браузерной игры (ККИ)
web-coder
Сейчас нет на сайте
Глава 5. Уведомления и переписка

К примеру игрок выставил лот на аукцион и его выкупили, но для того что бы игрок об этом узнал ему нужно зайти на аукцион, пролистать кучу страниц для того что бы понять что его лот выкуплен. Что бы облегчить данные действия игрока нужно уведомить о том что его лот выкуплен. Либо другой пример, на игрока напали, но как он об этом узнает? Ведь другой игрок ссылку на лог боя может ему передать только через icq, skype и пр.
Для избежания данных ситуаций нужно создать модуль, в котором будут хранится уведомления и сообщения от других игроков, а также возможность написать сообщение и отправить любому игроку.
Таблица post

- id – уникальный идентификатор
- p1 – id отправителя
- p2 – id получателя
- read – прочитано письмо или нет (1 – не прочитано, 2 – прочитано)
- theme – тема письма
- text – сообщение
- time – время отправки сообщения

Приступим, откройте файл module/post.php и добавьте следующий код.
Код
<?php
$User = mysql_fetch_array($db->q("SELECT * FROM `user` WHERE `id`='".$_SESSION['user_id']."'"));
?>
<div style='text-align: center;'>
  <a href="?a=post">Сообщения</a> | <a href="?a=post&type=new">Написать</a>
</div>
<?php
if (empty($_GET['type'])) { # Просмотр сообщений
  if (!empty($_POST['del']) && $_POST['msg_id'] != '') { # Удаление выбранных сообщений
   $ids = $_POST['msg_id']; # Список id сообщений, которые нужно удалить
   $_ids = array();
   # Фильтрация
   foreach($ids as $val) {
    $val = preg_replace("/[^0-9]/","",$val);
    if ($val != '') $_ids[] = $val;
   }
   if (sizeof($_ids) > 0) {
    # Удаление сообщений и улаоений с БД
    $ids = implode(' OR `id`=',$_ids);
    $db->q("DELETE FROM `post` WHERE `p1`='".$_SESSION['user_id']."' AND (`id`=".$ids.")");
   }
  }
   
  $perpage = 10; # Количество сообщений на страницу
  if (empty($_GET['start'])) { # Стандартно происходит выборка сообщений с первой страницы
   $start = 0;
   $gstart = 1;
  } else { # Если указана страница, то выбираем сообщения начиная с неё
   $gstart = preg_replace("/[^0-9]/","",$_GET['start']);
   $start = (int)($gstart - 1) * $perpage;
  }
  $pages = ceil(mysql_num_rows($db->q("SELECT * FROM `post` WHERE `p1`='".$_SESSION['user_id']."'")) / $perpage); # Количество страниц
  # Фильтрация страниц, если указана страница бОльшая чем их всего существует, то указывает последнюю страницу
  if ($start > $pages) $start = (int)($pages - 1) * $perpage;
   
  echo "<form method='post'><table style='width:600px;'><tr><td style='width:20px'></td><td style='width:130px'></td><td style='width:450px'></td></tr>";
  # Выборка сообщений в зависимости от страницы
  $sql = $db->q("SELECT * FROM `post` WHERE `p1`='".$_SESSION['user_id']."' ORDER BY `time` DESC LIMIT ".$start.",".$perpage);
  $isset = false; # Сообщений нет
  $names = array(); # Список логинов игроков. Если есть несколько писем от одного игрока, что бы каждый раз не получать его логин с БД, заносится в переменную
  while($post = mysql_fetch_array($sql)) {
   $isset = true; # Сообщения есть
   $pre = '';
   if ($post['p2'] > 0) { # Если есть отправитель, то указывается его логин
    if ($names[$post['p2']]) { # Если логин сохранен в переменной, то выводит его
     $name['login'] = $names[$post['p2']];
    } else { # Если нет, то получает логин с БД
     $name = mysql_fetch_array($db->q("SELECT `login` FROM `user` WHERE `id`='".$post['p2']."'"));
     $names[$post['p2']] = $name['login'];
    }
    $pre = "Сообщение от <b>".$name['login']."</b>:<br>";
   }
   # Время отправки сообщения
   $time = explode(" ",$post['time']);
   $time[1] = substr($time[1],0,-3);
   $time[0] = explode("-",$time[0]);
   $time[0] = $time[0][2].'.'.$time[0][1].'.'.$time[0][0];
   $time = implode(" ",$time);
   echo "<tr><td><input type='checkbox' value='".$post['id']."' name='msg_id[]'></td><td>".$time."</td><td>".$pre."<b>".$post['theme']."</b><br>".$post['text']."</td></tr>";
  }
  # Если есть сообщения, то выводится кнопка "Удалить"
  if ($isset)    echo "<tr><td colspan='2'><input type='submit' value='Удалить' name='del'></td></tr>";
  else echo "<tr><td colspan='4' align='center'>Писем нет</td></tr>";
  # Если страниц больше одной, то выводится листалка
  if ($pages > 1) {
   $show_page = '';
   $separate = ' ';
   $style = 'style="color: #000000; text-decoration: none;"';
   for ($i=1;$i<=$pages;$i++) {
    $show_page .= '<a href="?a=post&start='.$i.'" '.$style.'>'.($i==$gstart ? '<b>[' : '').$i.($i==$gstart ? ']</b>' : '').'</a>'.$separate;
   }
   echo "<tr><td colspan='4' align='center'>".$show_page."</td></tr>";
  }
  echo "</table></form>";
} else if ($_GET['type'] == 'new') { # Создание сообщения
  if (!empty($_POST['send'])) { # Отправка сообщения
   # Фильтрация данных
   $name = preg_replace("/'/","\\'",$_POST['name']);
   $name = htmlspecialchars($name);
   $theme = preg_replace("/'/","\\'",$_POST['theme']);
   $theme = htmlspecialchars($theme);
   $msg = preg_replace("/'/","\\'",$_POST['desc']);
   $msg = htmlspecialchars($msg);
   $msg = str_replace("\n","<br>",$msg);
   # Нельзя отправить самому себе
   if ($name != $User['login']) {
    # Проверка на существование игрока, которому отправляется письмо
    $sql = $db->q("SELECT `id` FROM `user` WHERE `login`='".$name."'");
    if (mysql_num_rows($sql) == 1) {
     $row = mysql_fetch_array($sql);
     # Отправка письма, либо вывод ошибки
     $sql2 = $db->q("INSERT INTO `post` (`p1`,`p2`,`read`,`theme`,`text`,`time`) VALUES ('".$row['id']."','".$_SESSION['user_id']."','1','".$theme."','".$msg."','".date("Y-m-d H:i:s")."')");
     $err = false;
     if ($sql2) echo "<div style='text-align: center;color: green;'>Письмо отправлено</div>";
     else {
      echo "<div style='text-align: center;color: red;'>Ошибка при отправке письма. Попробуйте снова. Если ошибка повторится, обратитесь к администрации</div>";
      $err = true;
     }
    }
   }
  }
?>
<form method="post">
  <table style="width:400px;">
   <tr><td style="width:110px;">Кому</td><td><input style="width:99%;" type="text" name="name" value="<?php if ($err) { echo $_POST['name']; } ?>"></td></tr>
   <tr><td style="width:110px;">Тема</td><td><input style="width:99%;" type="text" name="theme" value="<?php if ($err) { echo $_POST['theme']; } ?>"></td></tr>
   <tr><td colspan="2"><textarea name="desc" style="width:400px;height:150px;"><?php if ($err) { echo $_POST['desc']; } ?></textarea></td></tr>
    
   <tr><td colspan="2" align="right"><input type="submit" value="Отправить" name="send" ></td></tr>
  </table>
</form>
<?php
}
?>


Для проверки можете провести бой и увидите что в меню, возле раздела Почта появилась цифра, эта цифра указывает сколько непрочитанных сообщений есть у Вас. В следующей главе будет описан процесс продажи и покупки карт у других игроков, ведь в магазине продаются карты только начальных уровней, а у игроков могут быть карты высших уровней.

При копировании материала ссылка на источник обязательна!
AssasinДата: Понедельник, 31 Декабря 2012, 22:53 | Сообщение # 79 | Тема: Уроки по созданию браузерной игры (ККИ)
web-coder
Сейчас нет на сайте
Глава 4. «Доказать кто тут лучший» - сражения

Итак, сражения. Самое интересное в играх. В нашем случае сражения будут смотреться так. Игрок нажимает кнопку «Напасть». Скрипт ищет соперника и происходит бой по алгоритму:
- Удар напавшего первой картой по первой карте защитника
- Удар защитника первой картой по первой карте напавшего
И т.д. пока все 5 карт не ударят, либо если карт меньше, то алгоритм пойдет по новой, пока не будет сделано 5 ударов с каждой стороны игроков.
После расчета кто кого и как отпинал, записывается лог, на который тут же переадресовывает игрока что бы он мог насладится победой, либо унывать от поражения.
Весь процесс от нажатия на кнопку «Напасть» и до переадресации в лог занимает доли секунды. Так что игроку долго ждать не придется.
Бой будет состоять с двух файлов. Модуль боя, в котором отображается либо кнопка «Напасть», либо лог боя, если такой существует. И класс боя, в котором непосредственно будет происходить вся механика боя. Приступим к модулю, откройте файл module/battle.php и запишите следующее.
Код
<?php
$User = mysql_fetch_array($db->q("SELECT * FROM `user` WHERE `id`='".$_SESSION['user_id']."'"));

if (!empty($_POST['rush'])) { # Нападение
    if ($User['life'] == 0) { # Если мало жизней, нельзя нападать
     echo "<div style='text-align: center;color: red;'>У вас мало жизней</div>";
    } elseif ($User['position'] == '0|0|0|0|0') { # Если не выставлены карты для боя, нельзя нападать
     echo "<div style='text-align: center;color: red;'>Выставьте карты для сражения</div>";
    } else {
     # Поиск игроков у которых выставлены карты для боя
     $user = array();
     $find = $db->q("SELECT `id` FROM `user` WHERE `position`<>'0|0|0|0|0' AND `id`<>'".$_SESSION['user_id']."'");
     while($r = mysql_fetch_array($find)) {
      $user[] = $r['id'];
     }
     $rnd = mt_rand(1,sizeof($user));
     $id = $user[$rnd-1]; # Игрок найден, запоминается его id
        
     $player = mysql_fetch_array($db->q("SELECT * FROM `user` WHERE `id`='".$id."'"));
     include("inc/battle.php"); # Подключениет класс боя
     $battle = new battle;
     $battle->rush($User,$player,$db); # Инициализируется функция боя
    }
}

$log = false; # Указывает что лог не найден
if (!empty($_GET['id'])) { # Просматривает лог боя
    # Фильтрация данных
    $id = preg_replace("/[^0-9]/","",$_GET['id']);
    if ($id == '') go2page("game.php");
    # Получение характеристик игроков на основе выбранного боя
    $sql = $db->q("SELECT `battle`.*,`user`.`login`,`user`.`id` FROM `battle`,`user` WHERE `battle`.`id`='".$id."' AND (`battle`.`p1`=`user`.`id` OR `battle`.`p2`=`user`.`id`)");
    if (mysql_num_rows($sql) >= 1) {
     $i=0;
     while($row = mysql_fetch_array($sql)) {
      $p[$i] = $row;
      $i++;
     }
     $log = true;
    }
}
if (!$log) { # Если не просматривается лог, выводится кнопка "Напасть"
?>
<form method="post">
<input type="submit" value="Напасть" name="rush">
</form>
<?php
} else { # Просмотр лога боя
    echo "<div style='text-align:center;'><b>".$p[0]['login']."</b> VS <b>".$p[1]['login']."</b> (".$p[0]['time'].")</div>";
    echo "<table><tr>";
    $p1 = json_decode($p[0]['p1_map']); # Список карт первого игрока
    $p2 = json_decode($p[0]['p2_map']); # Список карт второго игрока
    $_p = $p1; # Выводится список карт первого игрока
    for ($i=0;$i<5;$i++) {
     echo "<td style='padding:4px;'>
       <table style='width:140px;display:block;border:1px solid black;'>
       <tr>
        <td style='text-align:center;width:140px;' colspan='2'><b>".$_p[$i]->name."</b></td>
       </tr>
       <tr>
        <td>Уровень</td>
        <td>".$_p[$i]->lvl."</td>
       </tr>
       <tr>
        <td>Атака</td>
        <td>".$_p[$i]->att."</td>
       </tr>
       <tr>
        <td>Ловкость</td>
        <td>".$_p[$i]->abi."</td>
       </tr>
       <tr>
        <td>Мастерство</td>
        <td>".$_p[$i]->skill."</td>
       </tr>
       </table>
      </td>";
     if ($i == 4 && $_p == $p1) { # Если список карт первого игрока выведены и просматриваются карты первого игрока, то переключает на вывод списка карт второго игрока
      $i = -1;
      $_p = $p2;
      echo "</tr><tr><td colspan='5' align='center'><h2>VS</h2></td></tr><tr>";
     }
    }
    echo "</tr>";
    # Вывод лога боя
    $sql = $db->q("SELECT * FROM `battle_log` WHERE `battle_id`='".$id."'");
    while($log = mysql_fetch_array($sql)) {
     echo "<tr><td colspan='5' align='center'>".$log['desc']."</td></tr>";
    }
    # Проверка на победителя
    if ($p[0]['win'] == 0) {
     echo "<tr><td colspan='5' align='center'>Ничья</td></tr>";
    } else {
     echo "<tr><td colspan='5' align='center'>Победитель <b>".($p[0]['id'] == $p[0]['win'] ? $p[0]['login'] : $p[1]['login'])."</b></td></tr>";
     $loot = json_decode($p[0]['desc']);
     # Если выиграны монеты, отображает их количество и слово "монеты" с правильным окончанием в зависимости от количества монет. Пример: 1 монетУ, 2 монетЫ, 5 монет
     if ($loot->money > 0) {
      if (substr($loot->money,-1) == 1) $m = 'у';
      if (substr($loot->money,-1) > 1 && substr($loot->money,-1) < 5) $m = 'ы';
      if ($loot->money > 9 && $loot->money < 20) $m = '';
      echo "<tr><td colspan='5' align='center'>Выиграл <b>".$loot->money."</b> монет".$m."</td></tr>";
     }
    }
    echo "</table>";
}
?>


Таблица battle

- id – уникальный идентификатор
- p1 – id нападающего
- p2 – id защищающегося
- win – кто выиграл (0 – ничья, любая цифра – id выигравшего)
- desc – приз победителя
- time – время начала сражения
- p1_map – список карт нападавшего
- p2_map – список карт защищающегося
Таблица battle_log

- id – уникальный идентификатор
- battle_id – id боя
- desc – предложение лога
Таблица word

- id – уникальный идентификатор
- type – тип фразы (1 – простой удар, 2 – промах, 3 – критический удар)
- desc – фраза для лога, пример:

  • {name1} зарядил в лоб {name2} ({damage})
  • {name2} уклонился от атаки
  • {name1} удачно использовал прием ({damage})

Слова {name1} заменится на имя атакующего, {name2} на имя защищающегося, {damage} на количество урона

Модуль боя есть. Осталось логику боя прописать. Для этого откройте файл inc/battle.php и запишите:
Код
<?php
/*
    * Класс боя
    *
    */

class battle {

    private $W_krit = array(); # Список слов для критического удара
    private $W_att = array(); # Список слов для простого удара
    private $W_miss = array(); # Список слов для промаха
       
    # Инициализируется бой
    # $p1:Array - характеристики нападающего (Н)
    # $p2:Array - характеристики защищающегося (З)
    # $db:Class - класс БД
    public function rush($p1,$p2,$db) {
     $db->q("INSERT INTO `battle` (`p1`,`p2`,`time`) VALUES ('".$p1['id']."','".$p2['id']."','".date('Y-m-d H:i:s')."')"); # Созадется запись боя
     $battle_id = mysql_insert_id(); # Запоминается id боя
     $map1 = explode("|",$p1['position']); # Список карт Н
     $map2 = explode("|",$p2['position']); #  Список карт З
     # Создание списка слов для лога
     $sql_word = $db->q("SELECT * FROM `word`");
     while($word = mysql_fetch_array($sql_word)) {
      if ($word['type'] == 1) {
       $this->W_att[] = $word['desc'];
      } elseif ($word['type'] == 2) {
       $this->W_miss[] = $word['desc'];
      } elseif ($word['type'] == 3) {
       $this->W_krit[] = $word['desc'];
      }
     }
        
     $j=0; # Текущая карта Н
     $k=0; # Текущая карта З
     $_map1 = array(); # Характеристики карт Н
     $_map2 = array(); # Характеристики карт З
     $ids1 = array(); # Список карт Н
     $ids2 = array(); # Список карт З
     $log1 = array(); # Список характеристик карт Н для вывода в лог
     $log2 = array(); # Список характеристик карт З для вывода в лог
     # Запоминается расположение карт игроков
     for ($i=0;$i<5;$i++) {
      $n_map1 = $map1[$j];
      if ($n_map1 == 0) { # Если в текцщем слоте Н нет карты, то записывается первая карта
       $n_map1 = $map1[0];
       $j=0;
      }
      $n_map2 = $map2[$k];
      if ($n_map2 == 0) { # Если в текцщем слоте З нет карты, то записывается первая карта
       $n_map2 = $map2[0];
       $k=0;
      }
      # Получение характеристик карты. Если характеристики карты были уже получены, то считывается с переменной
      if (!isset($ids1[$n_map1])) {
       $sql = $db->q("SELECT `user_map`.`att`,`user_map`.`abi`,`user_map`.`skill`,`user_map`.`lvl`,`user_map`.`exp`,`user_map`.`id`,`map`.`name`,`map`.`lvl_exp`,`map`.`c har` FROM `user_map`,`map` WHERE `user_map`.`map_id`=`map`.`id` AND `user_map`.`id`='".$n_map1."'");
       $_map1[] = mysql_fetch_array($sql);
      } else {
       $_map1[] = $_map1[$j];
      }
      # Получение характеристик карты. Если характеристики карты были уже получены, то считывается с переменной
      if (!isset($ids2[$n_map2])) {
       $sql = $db->q("SELECT `user_map`.`att`,`user_map`.`abi`,`user_map`.`skill`,`user_map`.`lvl`,`user_map`.`exp`,`user_map`.`id`,`map`.`name`,`map`.`lvl_exp`,`map`.`c har` FROM `user_map`,`map` WHERE `user_map`.`map_id`=`map`.`id` AND `user_map`.`id`='".$n_map2."'");
       $_map2[] = mysql_fetch_array($sql);
      } else {
       $_map2[] = $_map2[$k];
      }
      # Запись характеристик карт для лога
      $log1[] = array(
       'name'=>$_map1[$j]['name'],
       'att'=>$_map1[$j]['att'],
       'abi'=>$_map1[$j]['abi'],
       'skill'=>$_map1[$j]['skill'],
       'lvl'=>$_map1[$j]['lvl']
      );
      $log2[] = array(
       'name'=>$_map2[$k]['name'],
       'att'=>$_map2[$k]['att'],
       'abi'=>$_map2[$k]['abi'],
       'skill'=>$_map2[$k]['skill'],
       'lvl'=>$_map2[$k]['lvl']
      );
      # Записывает характеристики карты, что бы не проверять каждый раз одну и ту же карту в БД, будут браться характеристики с этой переменной
      $ids1[$n_map1] = $_map1[$j];
      $ids2[$n_map2] = $_map2[$k];
         
      $j++;
      $k++;
     }
        
     $life1 = $p1['life']; # Жизненная энергия Н
     $life2 = $p2['life']; # Жизненная энергия З
     $data = array(); # Выигрышь победителя
     $all_damage1 = 0; # Всего урона Н
     $all_damage2 = 0; # Всего урона З
     $win = -1; # Определяет кто победитель
     # Запускается бой на 5 ходов
     for ($i=0;$i<5;$i++) {
      if (!isset($ids1[$_map1[$i]['id']]['k'])) $ids1[$_map1[$i]['id']]['k'] = 0; # Количество урона, который нанесла карта Н за все ходы
      if (!isset($ids2[$_map2[$i]['id']]['k'])) $ids2[$_map2[$i]['id']]['k'] = 0; # Количество урона, который нанесла карта З за все ходы
         
      $damage1 = $this->damage($_map1[$i],$_map2[$i]); # Урон в текущем ходе Н
      $damage2 = $this->damage($_map2[$i],$_map1[$i]); # Урон в текущем ходе З
      # Создается запись в лог
      $db->q("INSERT INTO `battle_log` (`battle_id`,`desc`) VALUES ('".$battle_id."','".$damage1['txt']." - ".$damage2['txt']."')");
         
      $life1 -= $damage2['damage']; # Уменьшается жизненная энергия Н
      $life2 -= $damage1['damage']; # Уменьшается жизненная энергия З
         
      $ids1[$_map1[$i]['id']]['k'] += $damage1['damage']; # Увеличивается количество урона, нанесенного картой Н
      $ids2[$_map2[$i]['id']]['k'] += $damage2['damage']; # Увеличивается количество урона, нанесенного картой З
         
      $all_damage1 += $damage1['damage']; # Увеличивается количество общего урона Н
      $all_damage2 += $damage2['damage']; # Увеличивается количество общего урона З
      # Если жизненная энергия обои игроков закончилась или какого то одного из них, а ходы еще остались, то записывается победитель и его приз
      if ($life1 <= 0 && $life2 <= 0) {
       $win = 0;
       $desc = '';
       break;
      } elseif ($life1 <= 0) {
       $win = $p2['id'];
       $data['money'] = mt_rand(0,$all_damage2);
       $desc = json_encode($data);
       break;
      } elseif ($life2 <= 0) {
       $win = $p1['id'];
       $data['money'] = mt_rand(0,$all_damage1);
       $desc = json_encode($data);
       break;
      }
     }
     # Если прошло 5 ходов, а жизненная энергия игроков еще не закончилась, то в зависимости от нанесенного урона выбирается победитель и получает свой приз
     if ($win == -1) {
      if ($all_damage1 == $all_damage2) {
       $win = 0;
       $desc = '';
      } elseif ($all_damage1 < $all_damage2) {
       $win = $p2['id'];
       $data['money'] = mt_rand(0,$all_damage2);
       $desc = json_encode($data);
      } elseif ($all_damage2 < $all_damage1) {
       $win = $p1['id'];
       $data['money'] = mt_rand(0,$all_damage1);
       $desc = json_encode($data);
      }
     }
     # Запись карт игроков в лог, так же их фильтрация
     $_p1_map = json_encode($log1);
     $_p2_map = json_encode($log2);
     $_p1_map = str_replace("\\","\\\\",$_p1_map);
     $_p1_map = str_replace("'","\\'",$_p1_map);
     $_p2_map = str_replace("\\","\\\\",$_p2_map);
     $_p2_map = str_replace("'","\\'",$_p2_map);
     $db->q("UPDATE `battle` SET `win`='".$win."', `desc`='".$desc."',`p1_map`='".$_p1_map."',`p2_map`='".$_p2_map."' WHERE `id`='".$battle_id."'");
     if ($win != 0) $db->q("UPDATE `user` SET `money`=`money`+'".$data['money']."' WHERE `id`='".$win."'"); # Если есть победитель, увеличивается его количество монет
        
     $char_list = array('att','abi','skill'); # Список характеристик для карт
     # Список карт Н
     foreach($ids1 as $id => $val) {
      $exp = $val['exp']+$val['k']; # Расчитывается количество опыта для карты
      $lvl = $val['lvl']; # Уровень карты
      $char = array($val['att'],$val['abi'],$val['skill']); # Характеристики карты
      $plvl = $val['lvl']-1; # Позиция уровня
      $extra_sql = '';
         
      if ($lvl == 5) continue; # Если уровень карты 5 (максимальный), то переходим к следующей
         
      $_exp = explode("|",$val['lvl_exp']); # Количество опыта для поднятия уровня
      $_char = explode("|",$val['char']); # Процент увеличения для каждой характеристики отдельно для всех уровней
      if ($_exp[$plvl] <= $exp) { # Если текущий опыт больше опыта для текущего уровня, то увеличивается уровень
       $lvl++;
       $exp -= $_exp[$plvl]; # Указывается реальный опыт на текущем уровне
          
       $__char = explode(":",$_char[$plvl]); # Процент увеличения для каждой характеристики отдельно для текущего уровня карты
       # Случайным образом увеличивается характеристика, либо не увеличивается, как повезет <img src="http://s12.ucoz.net/sm/1/smile.gif" border="0" align="absmiddle" alt="smile" />
       for ($i=0;$i<3;$i++) {
        $rnd = mt_rand(1,100);
        if ($rnd >= $__char[$i]) {
         $extra_sql = ",`".$char_list[$i]."`=`".$char_list[$i]."`+'".mt_rand(1,5)."'";
         break;
        }
       }
      }
      $db->q("UPDATE `user_map` SET `exp`='".$exp."', `lvl`='".$lvl."' ".$extra_sql." WHERE `id`='".$id."'"); # Обновление информации о карте
     }
     # Отправляется уведомление о бое
     $db->q("INSERT INTO `post` (`p1`,`p2`,`read`,`theme`,`text`,`time`) VALUES    
                     ('".$p1['id']."','0','1','Вы участвовали в сражении','<a href=\'?a=battle&id=".$battle_id."\'>Просмотреть лог боя</a>','".date('Y-m-d H:i:s')."'),
                     ('".$p2['id']."','0','1','Вы участвовали в сражении','<a href=\'?a=battle&id=".$battle_id."\'>Просмотреть лог боя</a>','".date('Y-m-d H:i:s')."')");
     # Список карт З
     foreach($ids2 as $id => $val) {
      $exp = $val['exp']+$val['k']; # Расчитывается количество опыта для карты
      $lvl = $val['lvl']; # Уровень карты
      $char = array($val['att'],$val['abi'],$val['skill']); # Характеристики карты
      $plvl = $val['lvl']-1; # Позиция уровня
      $extra_sql = '';
         
      if ($lvl == 5) continue; # Если уровень карты 5 (максимальный), то переходим к следующей
         
      $_exp = explode("|",$val['lvl_exp']); # Количество опыта для поднятия уровня
      $_char = explode("|",$val['char']); # Процент увеличения для каждой характеристики отдельно для всех уровней
      if ($_exp[$plvl] <= $exp) { # Если текущий опыт больше опыта для текущего уровня, то увеличивается уровень
       $lvl++;
       $exp -= $_exp[$plvl]; # Указывается реальный опыт на текущем уровне
          
       $__char = explode(":",$_char[$plvl]); # Процент увеличения для каждой характеристики отдельно для текущего уровня карты
       # Случайным образом увеличивается характеристика, либо не увеличивается, как повезет <img src="http://s12.ucoz.net/sm/1/smile.gif" border="0" align="absmiddle" alt="smile" />
       for ($i=0;$i<3;$i++) {
        $rnd = mt_rand(1,100);
        if ($rnd >= $__char[$i]) {
         $extra_sql = ",`".$char_list[$i]."`=`".$char_list[$i]."`+'".mt_rand(1,5)."'";
         break;
        }
       }
      }
      $db->q("UPDATE `user_map` SET `exp`='".$exp."', `lvl`='".$lvl."' ".$extra_sql." WHERE `id`='".$id."'"); # Обновление информации о карте
     }
     # Переадресация на лог боя
     go2page("game.php?a=battle&id=".$battle_id);
    }
    # Расчет урона
    # $m1:Array - характеристики атакующей карты
    # $m2:Array - характеристики защищающейся карты
    private function damage($m1,$m2) {
     $ret = array('damage'=>0,'txt'=>''); # Данные, которые будут возвращаться текущей функцией
        
     $is_miss = round($m1['att']/(mt_rand($m1['att'],($m1['att']+($m2['abi']*2))))); # Расчитывает возможность промаха
     if ($is_miss == 1) { # Если промаха нет, то расчитывает урон
      $is_krit = round(round(mt_rand(0,10)/10)*$m1['skill']/($m1['skill']+$m2['abi'])); # Расчитывает критический удар
      if ($is_krit == 1) { # Если удар критический, то увеличивается урон
       $m1['att'] = round(($m1['att']*150)/100);
      }
      $_damage = round($m1['att']*(mt_rand(75,150)/100)); # Общий урон
       
      $_block = round($m2['abi']*(mt_rand(5,10)/10)); # Защита защищающегося
         
      $ret['damage'] = $_damage-$_block; # Окончательный урон
     }
        
     if ($ret['damage']<0) $ret['damage'] = 0; # Что бы не было минусового урона
     # Указывает какие слова для лога использовать
     if ($is_krit == 0) {
      $word = $this->W_att;
     } elseif ($is_krit == 1) {
      $word = $this->W_krit;
     }
     if ($ret['damage'] == 0) {
      $word = $this->W_miss;
     }
     # Получает случайную фразу из списка фраз
     $sizeof = sizeof($word)-1;
     $arr_word_rand = mt_rand(0,$sizeof);
     $ret['txt'] = $word[$arr_word_rand];
     if ($ret['txt'] == "") {
      $ret['txt'] = $word[0];
     }
     # Преобразовывает зарезервированые слова в нужные
     $ret['txt'] = str_replace('{name1}','<b>'.$m1['name'].'</b>',$ret['txt']);
     $ret['txt'] = str_replace('{name2}','<b>'.$m2['name'].'</b>',$ret['txt']);
     $ret['txt'] = str_replace('{damage}','<b>'.$ret['damage'].'</b>',$ret['txt']);
     # Возвращает данные
     return $ret;
    }
}

?>

В этом файле прописана логика боя. Он прокомментирован, но если что то не ясно, пишите в теме. Логика довольно проста. По очереди карты нападающего атакуют карты защищающегося, те в ответ отбиваются. Если у одного игрока 1 карта, а у другого несколько, то эта 1 карта отбивается от всех. Но бывает что одна карта раскачана так, что может нескольких побить спокойно.
Всего есть 5 ходов. Т.е. с каждой стороны игроков должно быть по 5 ударов. После окончания этих ходов, либо у игрока(игроков) закончилась жизненная энергия происходит подсчет урона. По наибольшему урону, либо тот кто выжил тот и выигрывает. Каждой карте дается опыт равный урону, который нанесла эта карта. При повышении уровня, у карты случайным образом увеличивается определенная характеристика, либо не увеличивается, как повезет.
После всех этих манипуляций игрок сможет увидеть лог боя. В следующей главе я расскажу как уведомить игрока, о том что на него напали, либо о покупке лота с аукциона, либо просто пообщаться с другими игроками.

При копировании материала ссылка на источник обязательна!
AssasinДата: Понедельник, 31 Декабря 2012, 19:08 | Сообщение # 80 | Тема: Уроки по созданию браузерной игры (ККИ)
web-coder
Сейчас нет на сайте
Глава 3. Магазин. Карты и бонусы для игрока

В магазине продаются карты и свитки. С картами ясно, они нужны для боя. А вот свитки нужны для увеличения жизненной энергии игрока. Чем она выше, тем больший шанс продержаться в бою как можно дольше и возможно выиграть.
Код магазина module/shop.php.
Код
<?php
$User = mysql_fetch_array($db->q("SELECT * FROM `user` WHERE `id`='".$_SESSION['user_id']."'"));

if (!empty($_POST['buy'])) { # Покупка
        if (!empty($_POST['map_id'])) { # Покупка карты
         # Фильтрация данных
         $id = preg_replace("/[^0-9]/","",$_POST['map_id']);
         if ($id == '') go2page("game.php");
         # Проверка на существование карты
         $map = $db->q("SELECT * FROM `map` WHERE `id`='".$id."'");
         if (mysql_num_rows($map) == 1) {
          $row_map = mysql_fetch_array($map);
          if ($row_map['cost'] <= $User['money']) { # Если хватает денег, то добавляем игроку карту, отнимаем деньги
           $db->q("INSERT INTO `user_map` (`user_id`,`map_id`,`att`,`abi`,`skill`,`type`) VALUES ('".$_SESSION['user_id']."','".$row_map['id']."','".$row_map['att']."','".$row_map['abi']."','".$row_map['skill']."','1')");
           $db->q("UPDATE `user` SET `money`=`money`-'".$row_map['cost']."' WHERE `id`='".$_SESSION['user_id']."'");
           $User['money'] -= $row_map['cost']; # Изменяем количество монет у игрока, т.к. количество монет мы получили раньше (строка 2), затем изменили их (строка 15), но данные полученные раньше не изменились, поэтому изменяются в данной строке
           echo "<div style='text-align: center;color: green;'>Спасибо за покупку</div>";
          } else {
           echo "<div style='text-align: center;color: red;'>Не хватает денег</div>";
          }
         }
        } elseif (!empty($_POST['item_id'])) { # Покупка "таблетки"
         # Фильтрация данных
         $id = preg_replace("/[^0-9]/","",$_POST['item_id']);
         if ($id == '') go2page("game.php");
         # Проверка на существование "таблетки"
         $map = $db->q("SELECT * FROM `shop` WHERE `id`='".$id."'");
         if (mysql_num_rows($map) == 1) {
          $row_item = mysql_fetch_array($map);
          if ($row_item['cost'] <= $User['money']) { # Если хватает денег, то увеличиваем количество жизненной энергии и отнимаем деньги
                  
           if ($row_item['type'] == 1) {
            $action = json_decode($row_item['action']);
            $extra_sql = '';
            if (!empty($action->life)) {
             $extra_sql = ", `life`=`life`+'".$action->life."', `mlife`=`mlife`+'".$action->life."'";
            }
                   
            $db->q("UPDATE `user` SET `money`=`money`-'".$row_item['cost']."' ".$extra_sql." WHERE `id`='".$_SESSION['user_id']."'");
           }
           $User['money'] -= $row_item['cost'];
           echo "<div style='text-align: center;color: green;'>Спасибо за покупку</div>";
          } else {
           echo "<div style='text-align: center;color: red;'>Не хватает денег</div>";
          }
         }
        }
}
?>
<div style='text-align: center;'>
        <a href="?a=shop">Карты</a> | <a href="?a=shop&type=1">Свитки</a>
</div>
<table><tr>
<?php
if (empty($_GET['type'])) { # Список карт
        $sql = $db->q("SELECT * FROM `map` ORDER BY `id` ASC");
        $i=1;
        while($row = mysql_fetch_array($sql)) {
         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['att']."</td>
           </tr>
           <tr>
            <td>Ловкость</td>
            <td>".$row['abi']."</td>
           </tr>
           <tr>
            <td>Мастерство</td>
            <td>".$row['skill']."</td>
           </tr>
           <tr>
            <td>Цена</td>
            <td>".$row['cost']."</td>
           </tr>";
         if ($User['money'] >= $row['cost']) { # Хватает денег?
          echo "<tr>
            <td style='text-align:center;width:180px;' colspan='2'>
             <form method='post'>
             <input type='hidden' value='".$row['id']."' name='map_id'>
             <input type='submit' value='Купить' name='buy'>
             </form>
            </td>
           </tr>";
         }
         echo "    </table>
          </td>";
         if (($i%5)==0) echo "</tr><tr>"; # По 5 штук в строку
         $i++;
        }
} else { # Список "таблеток"
        $type = preg_replace("/[^0-9]/","",$_GET['type']);
        if ($type == '') go2page("game.php");
        $sql = $db->q("SELECT * FROM `shop` WHERE `ptype`='".$type."' ORDER BY `id` ASC");
        $i=1;
        while($row = mysql_fetch_array($sql)) {
         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['type'] == 1 ? 'Игрока' : 'Карту')."</td>
           </tr>
           <tr>
            <td>Цена</td>
            <td>".$row['cost']."</td>
           </tr>";
         if ($User['money'] >= $row['cost']) { # Хватает денег?
          echo "<tr>
            <td style='text-align:center;width:180px;' colspan='2'>
             <form method='post'>
             <input type='hidden' value='".$row['id']."' name='item_id'>
             <input type='submit' value='Использовать' name='buy'>
             </form>
            </td>
           </tr>";
         }
         echo "    </table>
          </td>";
         if (($i%5)==0) echo "</tr><tr>"; # По 5 штук в строку
         $i++;
        }
}
?>
</tr></table>


Как добавлять карты в магазин, Вы уже знаете. А вот как добавить свитки? Для этого откройте файл adm/shop.php.
Код
<?php
include('../inc/db.php'); # Подключается класс БД
if (!empty($_POST['create'])) { # Создание "таблетки"
        $db = new db;
               
        if (!empty($_GET['id'])) { # Если существует id "таблетки", то "таблетка" редактируется
         $sql = $db->q("SELECT * FROM `shop` WHERE `id`='".$_GET['id']."'");
         if (mysql_num_rows($sql) == 1) {
          $_POST['desc'] = str_replace("\n","<br>",$_POST['desc']);
          $hp = array(
           'life'=>'+'.$_POST['life']
          );
          $hp = json_encode($hp);
                 
          $sql = $db->q("UPDATE `shop` SET `name`='".$_POST['name']."',`desc`='".$_POST['desc']."',`action`='".$hp."',`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']);
         $hp = array(
          'life'=>'+'.$_POST['life']
         );
         $hp = json_encode($hp);
                 
         $sql = $db->q("INSERT INTO `shop` (`name`,`desc`,`type`,`ptype`,`action`,`cost`) VALUES ('".$_POST['name']."','".$_POST['desc']."','1','1','".$hp."','".$_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'];
         $hp = json_decode($row['action']);
         $life = $hp->life;
         $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="life" value="<?php echo $life; ?>" /></td></tr>
                
         <tr><td colspan="2"><input type="submit" value="<?php if (empty($name)) { echo 'Создать'; } else { echo 'Изменить'; } ?>" name="create" /></td></tr>
        </table>
</form>


В этом файле можно указать описание, стоимость и сколько жизненной энергии повысится.

Таблица shop

- id - уникальный идентификатор
- name – имя свитка
- desc – описание свитка
- ptype – на какой «полке» находятся свитки (1 – «полка» Свитки, зависит от параметра $_GET[‘type’])
- type – на кого применить: 1 – игрок (дальше полет вашей фантазии)
- action действие свитка (в нашем случаем повышение жизненной энергии)
- cost – стоимость свитка

Создайте карты по адрессу http://tgame.lovalhost/adm/map.php. Теперь можно перейти в магазин и купить созданные карты, затем добавить их в список карт для боя, т.к. в следующей главе будет сам бой!

При копировании материала ссылка на источник обязательна!
Форум игроделов » Записи участника » Assasin [1155]
Поиск:

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