Написание простой онлайн игры. Советы в организации
Смысл: против пользователя выбирается случайный враг (монстр какой-нибудь), и они начинают сражаться. У пользователя как и у врага есть жизни(HP), очки магии(MP), в течении битвы они тратятся. У кого первее закончатся HP тот и проиграл.
Теперь вот и весь в опрос в организации. Раньше подобным никогда не занимался, а потому я сейчас накидаю свои идеи по поводу организации такого проекта (для начала это будет просто одна битва и не более), а просьба вас высказать свое согласие, советы и т.д.
Клиент, сервер: самый лучший клиент на мой взгляд, написанный на Flash, но я во флэше вообще не умею, так что я думаю можно для начала обойтись AJAX, и с его помощью с серваком обмениваться. Потом полученные данные уже парсить и раскидывать по странице где надо.
Сервер писать буду на PHP ибо только его норм.знаю, но если писать большой проект, то тогда конечно надо на С++ писать. БД тоже думаю возьму стандартный MySQL. Для моих целей его хватит.
Хранение данных: здесь вроде тоже ничего сложного. Данные врага будут хранится в какой-то папке enemy с именем имя_врага.xml Т.е. все данные будут хранится в xml файле. Которые при загрузке матча будут парситься.
Данные пользователя. Тут посложнее... Юзер регится на сайте, выбирает кем будет играть. Все данные я думаю тоже будут хранится в xml, потом пользователь подерется с врагом, заработает опыт => обновляем xml, увеличиваем характеристики и т.д.
Битва: а вот здесь я уже хз че делать...
Моя идея: при начатии боя на серваке создается какой-то файл с рандомным именем, в котором буду хранится данные боя, характеристика бойцов. Например пользователь шарахнул врага мечом, у него отнялось 40HP: на сервер отсылается параметр "удар мечом", там по всяким формулам высчитывается нанесенный урон. HP врага уменьшается. Файл о битве на серваке обновляется. И потом враг наносит ответный удар. Ну и так до победы.
Теперь вопросы: как организовать так чтобы сервер не путал какому пользователю принадлежит файл битвы... Т.е. чтобы правильно инициализировал битву, ведь постоянного коннекта с сервером нет, насколько я знаю. Тогда использовать cookie или сессию, значит?
И как удалять ненужные данные? Например битва закончилась. Сразу удалить файл, или просто поместить имя файла куда-нибудь, а потом где-то раз в час удалять разом все ненужные файлы?
Пока что вроде это все вопросы. Рационально ли так проектировать проект? Какие есть замечания???
Сервер писать буду на PHP ибо только его норм.знаю, но если писать большой проект, то тогда конечно надо на С++ писать. БД тоже думаю возьму стандартный MySQL. Для моих целей его хватит.
...
Пока что вроде это все вопросы. Рационально ли так проектировать проект? Какие есть замечания???
Интересно, а почему именно C++? Неужели Perl настолько плох? Вот по моей информации Гугл плавно переходит с ЦПП на Java.
А чем C++ плох? )) темболее, что работать явно быстрее будет. По мне так такое стоит писать или на C++ или на Java.
Привязать браузер по IP, Cookie?? Потому что хранить id сражения в браузере и потом передавать как идентефикатор - имхо бред, потому что можно подменить...
Так же как хранить данные о битве на сервере? Скорее всего создавать под них отдельную таблицу...
Это как раз и не бред.
Для примера.
Таблица: id боя, id первого игока, id второго игрока, активный бой (0 или 1).
id боя приходит из GET
id игока известен.
Выбираешь по id боя, id залогиненого игрока и активный бой = 1
Некорректный id боя ни на что не повлияет.
Некорректный id боя ни на что не повлияет.
Можно чужой id указать.
тогда сделаешь ход за другого игрока
1) Правельнее сказать не хеш, а зашифрованный id.
Потому как по хешу не всегда можно узнать
входное значение.
2) Можно заюзать HTTPS, но вообще
при организации любой защиты нужно оценить
заинтересованность хакера и отталкиваться от этого.
При большой заинтересованности HTTPS не поможет.
Мне тут друг сказал, что недавно закрытые ключи
научились быстро подбирать по открытым.
2) Каким мерилом ты оценишь заинтересованность хакера?
P.S. Против keylogger'a ваще ничего не поможет.
Ну например: онлайн проходят 4 матча, id допустим 324,325,326,327. В каждом матче по 2 игрока, соответственно у каждого свого uid.
Если узнать id другого матча, и id игрока, то вполне можно делать ход за любого игрока протекающих матчей. Так что просто надо привязку делать я думаю не только по id матча, но ещё и по IP и cookie. По идее можно и просто по cookie.
в игре то же самое... как делает БК (или раньше делал)... перед боём в куку кладётся сгенерённый id (или даже не в куку а в тупую в hidden поле формы боя), он передаётся на сервер, скрипт ловит этот ид, смотрит есть ли пользователь в этом бою и всё... за другого игрока ты удар не нанесёшь, ибо ты знаешь этот сгенерённый id, в другом бою не ударишь, ибо сервер проверит твой ид на соответствие бою... всё
Конечно, можно, если руки у программера не из того места растут.
Ну узнал ты id другого игрока, куда ты его вставишь так, чтобы сделать ход за него, если входные данные только id боя
Ну почему же "естественно" ?
Тут кажись про то и пишут, что не будут.
Будет передаваться особый id (его условно назвали id боя),
который однозначно генериться по
id матча и id игрока и однозначно их определяет.
Алгоритму генерации нужно постоянно менять
параметр/ключ, тогда взломать это дело будет трудно.