KOTOFF.NET
  • Главная
  • Пользователи
  • Контакты
  • Статистика
  • Правила
  • О нас
  • Вход / Регистрация

Простой игровой бот для ВК, создаем игру для Вконтакте + исходники! | Часть 1

Статьи / PHP


Данная статья, начало создания игровых механик для своего бота Вконтакте. Многие из вас завадались вопросом: А как создать игрового бота для ВК, давайте начнем создавать классного бота для совместных игр.

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

Создаем новое сообщество, указываем название, тематику и по желанию свой сайт (если есть).


Переходим в настройки и включаем сообщения сообщества, а так же создаем новое приветствие для новичков :), тут же в подразделе Настройки для бота не забываем включить их, и разрешить  добавлять его в беседу!

Теперь переходим к настройке скрипта, назовем это основной файл отвечающий за прием событий от вк и их дальнейшей обработки 
Если нет сервера, нужно приобрести, рекомендуем хостинг FirstVDS нам подойдет и обычный хостинг VDS-OVZ-Разминка, цена на время написания статьи всего 90 рублей в месяц. После заказа Вам придет на почту данные для авторизации на сервере. Использовать можете любой хостинг, на ваш вкус и цвет. Главное условие поддержка PHP 5.6+ (желательно 7.0+) и MySQL. Далее переходим на сервер, создаем любое доменное имя куда будем заливать скрипты. Мы будем использовать IP адрес. Если с с настройкой сервера не понятно, то почитайте эту статью на нашем сайте, где мы наглядно показываем как загрузить файлы на сервер.

После того как разобрались с сервером, нужно загрузить как раз необходимые библиотеки и основной файл, скачать ниже:

panamera.rar

Для работы с PHP я использую PHPStorm, это платный продукт, но как получить его бесплатно, Вам, наверно, объяснять не нужно :)

Распаковываем архив на сервер и открываем наш файл bot.php и пишем код который останется неизменным и может использоваться при создании новых ботов.

<?php

require_once('simplevk-master/autoload.php'); // БЛИБЛИОТЕКИ
require './vendor/autoload.php';// БЛИБЛИОТЕКИ

use Krugozor\Database\Mysql\Mysql as Mysql; // КЛАССЫ ДЛЯ РАБОТЫ С БД
use DigitalStar\vk_api\vk_api; // Основной класс
use DigitalStar\vk_api\Message; // Конструктор сообщений
use DigitalStar\vk_api\VkApiException; // Обработка ошибок

$host = 'localhost'; // По умолчанию localhost или ваш IP адрес сервера
$name = ''; // логин для авторизации к БД
$pass = ''; // Пароль для авторизации к БД
$bdname = ''; // ИМЯ базы данных
$vk_key = ''; // Длинный ключ сообщества, который мы получим чуть позже
$confirm = ''; // СТРОКА которую должен вернуть сервер
$v = '5.103'; // Версия API, последняя на сегодняшнее число, оставлять таким если на новых работать в будущем не будет

$db = Mysql::create($host, $name, $pass)->setDatabaseName($bdname)->setCharset('utf8mb4');
$vk = vk_api::create($vk_key, $v)->setConfirm($confirm);
$my_msg = new Message($vk);
$data = json_decode(file_get_contents('php://input')); //Получает и декодирует JSON пришедший из ВК

$vk->sendOK();



// ТУТ УЖЕ БУДЕМ ПИСАТЬ КОД //


Здесь нам нужно заполнить следующие поля:

$host = 'localhost'; // По умолчанию localhost или ваш IP адрес сервера
$name = ''; // логин для авторизации к БД
$pass = ''; // Пароль для авторизации к БД
$bdname = ''; // ИМЯ базы данных
$vk_key = ''; // Длинный ключ сообщества, который мы получим чуть позже
$confirm = ''; // СТРОКА которую должен вернуть сервер
$v = '5.103'; // Версия API, последняя на сегодняшнее число, оставлять таким если на новых работать в будущем не будет

Получение ключа сообщества:
А так же в разделе Тип событий обязательно включите Входящие сообщения


Так как данные я буду вносить своего сервера, соответственно показывать их я не буду. После настройки возвращаемся снова в сообщество.

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

2. Регистрация новых пользователей в боте.
Для создания игрового бота понадобится регистрация используя базу данных. Мы будем Использовать для этого обертку на родным MySQLi. Для начала создаем через PhpMyAdmin новую таблицу users с полями:



Или используем запрос ниже:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

CREATE TABLE `users` (
  `id` int(11) NOT NULL,
  `vk_id` int(11) NOT NULL,
  `nick` varchar(20) NOT NULL,
  `status` int(11) NOT NULL,
  `time` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `users`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `users`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

Переходим к самому интересному, написанию кода. 

Для начала как всегда, создание переменных которые чаще всего будут использоваться в боте:
// ТУТ УЖЕ БУДЕМ ПИСАТЬ КОД //

// Переменные для удобной работы в будущем
$id = $data->object->message->from_id; // ИД того кто написал
$peer_id = $data->object->message->peer_id; // Только для бесед (ид беседы)

$time = time();
$cmd = explode(" ", mb_strtolower($data->object->message->text)); // Команды
$message = $data->object->message->text; // Сообщение полученное ботом
$new_ids = current($data->object->message->fwd_messages)->from_id ?? $data->object->message->reply_message->from_id; // ИД того чье сообщение переслали 
$userinfo = $vk->userInfo($id);
// Закончили с переменными 

Пишем первую проверку, на входящее сообщение, именно туда мы будем вносить весь код
if ($data->type == 'message_new') {
    
    // ТУТ все что будем делать дальше
    
}
Это нужно что бы исключить все другие события, ведь у нас игровой бот который использует только текст.
Обращаемся к базе данных, что бы проверить есть ли такой пользователь в ней:

if ($id < 0){exit();} // ПРОВЕРЯЕМ что сообщение прислал юзер а не сообщество

if ($data->type == 'message_new') {

    $id_reg_check = $db->query('SELECT vk_id FROM users WHERE ids = ?i', $id)->fetch_assoc()['vk_id']; // Пытаемся получить пользователя который написал сообщение боту
    if (!$id_reg_check and $id > 0) { // Если вдруг запрос вернул NULL (0) это FALSE, то используя знак ! перед переменной, все начинаем работать наоборот, FALSE становится TRUE
        // Так же мы проверяем что $id больше нуля, что бы не отвечать другим ботам, но лучше в самом верху добавить такую проверку что бы не делать лишних обращений к БД!
        $db->query("INSERT INTO users (vk_id, nick, status, time) VALUES (?i, '?s', ?i, ?i)", $id, "$userinfo[first_name] $userinfo[last_name]", 0, $time);
        $vk->sendMessage ($peer_id, "Приветствую  тебя, @id$id ($userinfo[first_name] $userinfo[last_name]), ты теперь один из нас, вступай в ряды мощных панамеровцев!");
    }

}





Давайте сразу добавим кнопки, ведь это удобно, так как у нас бот называется PANAMERA, давайте сделаем какую-нибудь автомобильную игру, где ваша задача получить Porshe PANAMERA, но не будем ограничиваться этим, а начнем развивать механику в разные направления.


После регистрации у вас ничего нет, нужны деньги, что бы их получить, можно использовать кнопку бонус, давайте ее и добавим в бот.
Пишем следующий код:
К переменным
$bonus = $vk->buttonText('⏰ Бонус!', 'green', ['command' => 'bonus']);
Далее:
if ($data->type == 'message_new') {
    if (isset($data->object->message->payload)) {  //получаем payload
        $payload = json_decode($data->object->message->payload, True); // Декодируем кнопки в массив
    } else {
        $payload = null; // Если пришел пустой массив кнопок, то присваиваем кнопке NULL
    }
    $payload = $payload['command'];

    $id_reg_check = $db->query('SELECT vk_id FROM users WHERE vk_id = ?i', $id)->fetch_assoc()['vk_id']; // Пытаемся получить пользователя который написал сообщение боту
    if (!$id_reg_check and $id > 0) { // Если вдруг запрос вернул NULL (0) это FALSE, то используя знак ! перед переменной, все начинаем работать наоборот, FALSE становится TRUE
        // Так же мы проверяем что $id больше нуля, что бы не отвечать другим ботам, но лучше в самом верху добавить такую проверку что бы не делать лашних обращений к БД!
        $db->query("INSERT INTO users (vk_id, nick, status, time) VALUES (?i, '?s', ?i, ?i)", $id, "$userinfo[first_name] $userinfo[last_name]", 0, $time);


        $vk->sendButton($peer_id, "Приветствую  тебя, @id$id ($userinfo[first_name] $userinfo[last_name]), ты теперь один из нас, вступай в ряды мощных панамеровцев!", [[$bonus]]);
    }

    
    // Давайте для обработки кнопки воспльзуемся SWITCH - CASE
    switch ($payload) // Проще говоря мы загрузили кнопки кнопки в свич, теперь проверяем что за кнопка была нажата и обрабатываем ее
    {
        case 'bonus';
            $vk->sendMessage($peer_id, "Вы взяли бонус, Вам выпало N монет");
        break;
        
    }
    
    
}


Давайте протестируем регистрацию и ответ на нажатие кнопки:

Ответил не сразу, в коде были допущены следующие ошибки:
ids заменить на vk_id и добавить переменную $userinfo = $vk->userInfo ($id);
Так как статья пишется параллельно созданию  бота, могут быть допущены ошибки, выше в исходных файлах они будут исправлены.



Давайте сделаем что бы бонус начислялся на баланс. Добавляем 2 поля к таблице USERS:

ALTER TABLE `users` ADD `balance` INT NOT NULL AFTER `time`, ADD `time_bonus` INT NOT NULL AFTER `balance`;

переходим к коду и пишем следующую проверку и рандом:

 case 'bonus';
        $time_bonus = $id_reg_check = $db->query('SELECT time_bonus FROM users WHERE vk_id = ?i', $id)->fetch_assoc()['time_bonus'];
        if ($time_bonus < $time){
            //  + 21600 минут = 6 часов
            $next_bonus = $time + 21600; // Прибавляем 6 часов для следующего бонуса!
            $rand_money = mt_rand(100, 5000); // Рандомно выбираем число от 100 до 5000, используя встроенную функцию PHP mt_rand
            $db->query('UPDATE users SET time_bonus = ?i, balance = balance + ?i WHERE vk_id = ?i',$next_bonus, $rand_money, $id); // Обновляем данные
            $vk->sendMessage($peer_id, "Вы взяли бонус, Вам выпало $rand_money монет");
        } else { // Иначе сообщим о том что бонус уже взят!

            $next_bonus = date("d.m в H:i:s",$time_bonus);
            $vk->sendMessage($peer_id,"Вы уже брали бонус ранее, следующий будет доступен \"$next_bonus\"");
        }

        break;


Проверяем:

Так это выглядит в базе данных:

Отлично у нас есть деньги, пора бы начать их и тратить :) самое распространенное в играх конечно же казино, давайте сделаем что-то подобное, самое простейшее казино. Пока мы еще не придумали игровые механики для нашего игрового бота, сделаем фарм денег.

Как будет работать наше казино:
Казино все, казино 100, казино 1кк и прочие, означающие ставки. Погнали делать команду:

    if ($cmd[0] == 'казино'){ // Первая команда

        if (!$cmd[1]){ // если вторая команда пустая она вернет FALSE
            $vk->sendMessage($peer_id, 'Вы не указали ставку!');
        }elseif ($cmd[1] == 'все' or $cmd[1] == 'всё'){ // Если указано все

            $balance = $db->query('SELECT balance FROM users WHERE vk_id = ?i', $id)->fetch_assoc()['balance']; // вытягиваем весь баланс

            if($balance == 0) {
                $vk->sendMessage($peer_id, 'У Вас нет денег :(');
            } else {
                $result = mt_rand(1, 4); // 1 - проиграл половину, 2 - победа x1.5, 3 - победа x2, 4 - проиграл все
                $win_money = ($result == 1 ? $balance / 2 : ($result == 2 ? $balance * 1.5 : ($result == 3 ? $balance * 2 : 0)));
                $win_nowin = ($result == 1 ? 'проиграли половину' : ($result == 2 ? 'выиграли x1.5' : ($result == 3 ? 'выиграли x2' : 'проиграли все')));
                $vk->sendMessage($peer_id, "Вы $win_nowin, ваш баланс теперь составляет $win_money монет.");
                $db->query('UPDATE users SET balance = ?i WHERE vk_id = ?i', $win_money, $id); // Обновляем данные
            }
        } else {

         $sum =  str_replace(['к','k'], '000', $cmd[1]); // наши Кk превращаем в человеческий вид, заменяя их на нули :)
         $sum =  ltrim(mb_eregi_replace('[^0-9]', '', $sum),'0'); // удаляем лишние символы, лишние нули спереди и все что может поломать систему :), подробнее о функциях можно почитать в интернете
         $balance = $db->query('SELECT balance FROM users WHERE vk_id = ?i', $id)->fetch_assoc()['balance']; // вытягиваем весь баланс

            if($balance < $sum) {
                $vk->sendMessage($peer_id, 'У вас не достаточно денег');
            } else {
            $result = mt_rand(1, 4); // 1 - проиграл половину, 2 - победа x1.5, 3 - победа x2, 4 - проиграл все

            $win_money = ($result == 1 ?  $balance - ($sum / 2)  : ($result == 2 ? $balance + ($sum * 1.5) : ($result == 3 ? $balance + ($sum * 2) : $balance - $sum)));
            $win_nowin = ($result == 1 ? 'проиграли половину' : ($result == 2 ? 'выиграли x1.5' : ($result == 3 ? 'выиграли x2' : 'проиграли все')));

            $vk->sendMessage($peer_id, "Вы $win_nowin, ваш баланс теперь составляет $win_money монет.");
            $db->query('UPDATE users SET balance =  ?i WHERE vk_id = ?i',  $win_money, $id); // Обновляем данные
            }
        }


    }


Получилось довольно много кода, в будущем возможно мы еще вернемся для доработок, все зависит только от Вас, давайте попробуем это в действии:

Получилось не плохо, теперь в нашем игровом боте есть казино!

На этом наша первая часть по созданию игрового бота вконтакте подходит к концу, теперь ваши идеи и предложения будут появляться в новой статье, во второй части мы уже начнем реализацию ваших идей и предложений! 

Если статья понравилась, оцените ее лайком.

Исходники готового проекта:
panamera.rar

Ссылка на группу для теста
  • Сергей Котов
  • 19.04.2020
  • 51 020
  • 12
Создаем собственного бота VK, подробная инструкция как создать бота VK за 5 минут!
Создаем собственного бота VK, подробная инструкция как создать бота VK за 5 минут!
16-01-2019, 06:02, Статьи / PHP
Python и LongPoll VK, или как запустить скрипт ВК и настроить Python, для новичков
Python и LongPoll VK, или как запустить скрипт ВК и настроить Python, для новичков
29-06-2019, 08:34, Статьи / Python
Загружаем скрипты на бесплатный хостинг с PHP и MySQL. Подойдет для скриптов бота ВК
Загружаем скрипты на бесплатный хостинг с PHP и MySQL. Подойдет для скриптов бота ВК
24-01-2019, 04:11, Статьи
Услуги по разработке ботов и сайтов - Стоимость и возможности
Услуги по разработке ботов и сайтов - Стоимость и возможности
30-01-2020, 13:37, Обновления
  1. Eldakim

    Eldakim@Ельдар 20 апреля 2020 17:22

    Добавьте кейсы CS:GO или скины. Пример пришлю Сергею 

  2. Артем Фриз

    Артем Фриз@Артем Фриз 22 апреля 2020 15:52

    Го личный кабинетик

  3. アレクセイ サモシュキン

    アレクセイ サモシュキン@アレクセイ 25 апреля 2020 16:45

    👍
  4. Данил Кочергин

    Данил Кочергин@Данил Кочергин 28 апреля 2020 14:41

    Как сделать бонус за подписку?
    1. feedmyant2005

      feedmyant2005@Вадим Шкабнев 13 мая 2020 21:56

      Получаешь событие на подписку, потом начисляешь бонус и записываешь в бд то, что ты уже начислил ему бонус (чтобы не багали бонус (отписка-подписка))
  5. Пётр

    Пётр Гость 14 мая 2020 17:42

    Я не могу разархировать пишет архив поврежён
  6. Коля Давыдов

    Коля Давыдов@Коля Давыдов 23 мая 2020 15:10

    не работает, вообще, 0 реакций
    1. Артем Фриз

      Артем Фриз@Артем Фриз 25 мая 2020 15:47

      понимаю

    2. Павел

      Павел Гость 10 июля 2020 15:15

       Ты не правильно сделал, могу помочь https://vk.com/batkalal 
  7. Гость Андрей

    Гость Андрей Гость 17 июля 2020 11:45

    Сделал парочку команд в боте, ну и из этой статьи тоже взял) Всё работает, только спасибо постоянно, к примеру напишешь: "Помощь", бот ответит без задержки, но через пару секунд опять будет отвечать, и так бывает по часу спамит, получается 50 сообщений, как можно это исправить?
  8. Сергей Котов

    Сергей Котов@Сергей Котов 21 марта 2021 13:52

    Вторая часть уже доступна на сайте
  9. Николай Клочков

    Николай Клочков@Николай Клочков 21 августа 2023 16:59

    Ставлю бота а он не реагирует

{login}

Твой комментарий..

Заказывай!
Разработка ботов на заказ, любой сложности, обращаться:
 VK KOTOFF.net - Сообщество, в личные сообщения или по контактам указанным там 
 mail: [email protected]

Рекламный блок
  • Новости
  • Платная категория
  • Блог
  • Игры
  • Обновления
  • Программы
  • Статьи
    • PHP
    • Python
    • JS
  • Дизайн
    • PSD исходники
  • DLE
    • Шаблоны
    • Модули
    • Хаки
  • Магазин
    • Скрипты
Комментарии
Система комментариев на PHP
<Script>Alert("hello");</Script>
Генерация всевозможных комбинаций из набора символов — комбинаторика в Python (itertools)
Qwertyuiopasdfghjklzxcvbnm 1234567890
Система комментариев на PHP
Полезная статья
Создание простого Telegram-бота с клавиатурой и inline-кнопками [Часть 2]
Класс, хорошая тема
Динамическая обложка для группы ВК, последний подписчик, топ комментатор и прочее
Как отключить вывод результата cron в папку modules/cron в Open Server? Крон запускает несколько
Все комментарии..
Полный список последних комментариев
Лучшие новости
Всего публикаций: 115
Добавлено за сутки: +0
Записей в блоге: 1
Добавлено за сутки: +0
Комментариев: 938
Добавлено за сутки: +0
Пользователей: 4124
Добавлено за сутки: +0
Полная статистика..
Подробная статистика сайта
Loading...

Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите CTRL+Enter

Полезные ссылки
  • О проекте
  • Наши контакты
  • Администрация
  • Рекламные материалы
  • Идеи и предложения
  • Ответы на вопросы
Информация
  • Условия сделки
  • Способы оплаты
  • Поддержка / F.A.Q
  • Онлайн документация
  • Статистика сайта
  • Список пользователей
Услуги/Работа
  • Разработка ботов ВК
  • Обновление проекта
  • Консультация/поддержка
KOTOFF.net

Copyright © Footer 2019-2023. All right reserved.
KOTOFF.net - Уроки по PHP, SQL, IT новости
Быстрый вход

Используйте социальные сети для быстрой регистрации и авторизации.

Google
ВКонтакте
Яндекс
Mail.ru
Создать аккаунт / Регистрация
Авторизация

Я забыл свой пароль