Уроки по созданию браузерной игры (ККИ)
| |
Assasin | Дата: Понедельник, 04 Февраля 2013, 00:08 | Сообщение # 1 |
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 | Дата: Понедельник, 04 Февраля 2013, 00:09 | Сообщение # 2 |
web-coder
Сейчас нет на сайте
| Слово автора
Вот и подошла серия уроков к концу, но это не значит что игра готова. Я рассказал только о каркасе для игры. Можно ввести много разнообразных фич. Если игру не улучшать, не обновлять, то она потеряет всякий интерес для тех кто в нее играет. Главное это фантазия.
Я надеюсь вам понравилось. С ув. Assasin
|
|
| |
harmoxyne | Дата: Понедельник, 04 Февраля 2013, 19:12 | Сообщение # 3 |
заслуженный участник
Сейчас нет на сайте
| Спасибо большое, отличные уроки. Но, проблему, писал о ней в ЛС, я так и не смог решить. Если есть такая возможность, напиши пожалуйста в скайп dark-nicolya. Заранее благодарен.
|
|
| |
dezant | Дата: Суббота, 07 Января 2017, 20:07 | Сообщение # 4 |
уже был
Сейчас нет на сайте
| Огромное спасибо за уроки и исчерпывающую и хорошо описанную информацию! Код прекрасно поддается модификациям, хороший потенциал для различных модулей! Мой результат за пару часов работы. Еще пару лет назад загорелся мечтой сделать ККИ, и даже брался за это, но не понимал всей системы правил боя и т.п., а тут такой подарок, которым грех не воспользоваться. Вопрос к автору, в коммерции код использовать можно? Разумеется, он подвергся множеству модификаций, но в базе все равно заложен он.
Сообщение отредактировал dezant - Суббота, 07 Января 2017, 20:16 |
|
| |
Assasin | Дата: Четверг, 12 Января 2017, 01:22 | Сообщение # 5 |
web-coder
Сейчас нет на сайте
| Рад что кому то помог
Цитата dezant ( ) в коммерции код использовать можно? Можно
|
|
| |
|