2015-10-17 13 views
0

Я создаю небольшой веб-сайт для хобби, в основном на Python и SQL на заднем конце, и я не уверен, как концептуально подойти к проблеме.Участник многопользовательской игры, подходящий для 3 или более пользователей

Что представляет собой эффективный способ получить трех или более игроков, сопоставленных в многопользовательской игре? Сначала я планировал сделать большую часть этого с помощью операторов SQL, где каждый активный игрок попадает в таблицу SQL, давайте назовем это, активную таблицу игр, на них, указывая, что они хотят играть в игру. После этого у меня будет таблица активных игр SQL, выполняющая триггерную функцию, где, когда указанное количество игроков вводится в эту таблицу, всем им назначается некоторый идентификатор игры, который указывает, что они должны быть привязаны к определенной игре , Затем этот game_id используется, чтобы гарантировать, что все действия происходят однозначно среди этих членов. Кроме того, для активных игроков должны быть тайм-ауты, если очередь слишком длинная.

Это эффективный способ приблизиться к этой задаче? Я обеспокоен тем, что это большое количество команд базы данных SQL. Я также недавно слышал, что использование триггеров SQL для часто используемых команд обычно недооценивается. Если это не разумный способ приблизиться к этому, то какие еще более эффективные/масштабируемые способы приближения к совпадению пользователей для многопользовательских матчей? Пожалуйста, как можно подробнее рассмотрите шаги алгоритма. Кажется очевидным, что это было сделано довольно часто, учитывая, сколько многопользовательских игр существует, но я действительно изо всех сил пытался найти материал или любой другой источник руководства о том, как подойти к нему.

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

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

+0

Вам нужно гораздо больше параметров. Например, существует ли минимальное и максимальное количество игроков в игре? Существуют ли какие-либо критерии, с помощью которых игроки получают соответствие друг другу (например, уровень квалификации, географическая близость)? Все игры сопоставляются через лобби или кто-то может создать частную игру? Etc и т. Д. Любой способ, которым вы разрезаете это, я не думаю, что триггеры - это путь. Наличие некоторого процесса, который периодически просыпается и соответствует игрокам, кажется лучшим подходом. Но это просто предположение, основанное на ограниченной информации, которую я имею сейчас. –

+0

Я отредактировал выше, чтобы лучше объяснить соответствующие параметры. Хорошо. Я считал что-то похожее на то, что, как я думаю, вы упомянули.Вы имеете в виду что-то вроде хранимой процедуры? Есть ли способ, и вы бы порекомендовали, способ связать это с событиями, созданными пользователем? Игроки I.E 10 вдруг решили сыграть в один и тот же тип игры, как бы хранимая процедура, которая происходит с временными интервалами, сортирует этих игроков по группам из трех? Я предполагаю, что это может быть сделано с помощью SQL-группы по заявлению, добавленному в временную хранимую процедуру? Спасибо за предложения до сих пор, кстати. – JStewy

ответ

0

Превратив наш разговор в ответ, хранимая процедура - именно то, что я имел в виду. В реализации, что у меня в голове, выглядит примерно так:

create procedure dbo.matchPlayers 
as 
begin 
    declare @gameID int; 
    declare @players table (
     PlayerID int 
    ); 
    while ((select count(*) from dbo.waitingPlayers) > 3) 
    begin 
     begin transaction; 

     exec @gameID = dbo.createGame; 

     update top(3) p 
     set gameID = @gameID 
     output inserted.PlayerID into @players 
     from dbo.Player as p 
     join dbo.waitingPlayers as w 
      on p.PlayerID = w.PlayerID 
     order by p.SkillLevel; 

     delete w 
     from dbo.waitingPlayers as w 
     join @players as p 
      on w.PlayerID = p.PlayerID; 

     delete @players; 
     commit transaction; 
    end 
end 

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

  1. Что делать, если осталось меньше трех?
  2. У вас могут быть более сложные критерии соответствия. Здесь я сопоставляю ближайшие три. Но нет никакой гарантии, что у вас не будет одного игрока с высокими навыками, соответствующего двум навыкам с гораздо меньшим мастерством.
  3. Многое, гораздо больше, что вы будете знать о своих требованиях.
+0

Это отлично. Благодарю. – JStewy

 Смежные вопросы

  • Нет связанных вопросов^_^