Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.10.2011, 19:58
Paul Ololo вне форума Посмотреть профиль Отправить личное сообщение для Paul Ololo Найти все сообщения от Paul Ololo
  № 1  
Ответить с цитированием
Paul Ololo

Регистрация: Apr 2011
Сообщений: 17
По умолчанию Коннект 2 игроков для онлайн игры

Всем привет!

Столкнулся с проблемой коннекта 2 игроков для онлайн игры.

На PHP написан обработчик, с помощью которого я (по нажатию кнопки "играть") GET-ом записываю в БД id пользователя и его уровень. Дальше, тем же GET-ом, с помощью того же обработчика, я пытаюсь получить id пользователя, который мне по уровню подходит. Если такой игрок получен, то я отправляю запрос на удаление из таблицы и первого, и второго игрока.

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

Если есть идеи как модифицировать мой алгоритм коннекта или как правильно сделать новый, подскажите плз.

Заранее благодарен.

Старый 24.10.2011, 20:03
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 2  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Транзакции
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 24.10.2011, 20:13
Paul Ololo вне форума Посмотреть профиль Отправить личное сообщение для Paul Ololo Найти все сообщения от Paul Ololo
  № 3  
Ответить с цитированием
Paul Ololo

Регистрация: Apr 2011
Сообщений: 17
Можно подробнее?

Старый 24.10.2011, 21:11
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 4  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Гуглить (думаю можно и в яндексе) слово "транзакции". Получить общее представление, что это такое. Потом гуглить транзакции для вашей БД, примеры.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 25.10.2011, 11:22
DaFive вне форума Посмотреть профиль Отправить личное сообщение для DaFive Посетить домашнюю страницу DaFive Найти все сообщения от DaFive
  № 5  
Ответить с цитированием
DaFive
 
Аватар для DaFive

Регистрация: May 2008
Адрес: {0,0}
Сообщений: 754
Записей в блоге: 1
Отправить сообщение для DaFive с помощью ICQ
А зачем тут транзакции? Кажись проблема не в этом. Скорее php-обработчик косячит, выбирая то, что не должен.
__________________
Кодинг, багинг, алгоритминг. me @

Старый 25.10.2011, 11:30
Genzo вне форума Посмотреть профиль Отправить личное сообщение для Genzo Посетить домашнюю страницу Genzo Найти все сообщения от Genzo
  № 6  
Ответить с цитированием
Genzo
 
Аватар для Genzo

блогер
Регистрация: Feb 2010
Адрес: MSK
Сообщений: 859
Записей в блоге: 3
Отправить сообщение для Genzo с помощью ICQ Отправить сообщение для Genzo с помощью Skype™
Цитата:
Дальше, тем же GET-ом, с помощью того же обработчика, я пытаюсь получить id пользователя, который мне по уровню подходит. Если такой игрок получен, то я отправляю запрос на удаление из таблицы и первого, и второго игрока.
Т.е. вы 2 запроса посылаете, что в корне не верно, удаляйте их в момент нахождения или ставьте им статус найдены и т.п., вообще не особо правильная структура сервера...
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works.

Старый 25.10.2011, 11:44
Tr1te вне форума Посмотреть профиль Отправить личное сообщение для Tr1te Найти все сообщения от Tr1te
  № 7  
Ответить с цитированием
Tr1te
 
Аватар для Tr1te

Регистрация: Jun 2009
Сообщений: 461
Решил след образом: сначала кидаешь в комнату гранату, потом смотришь кто был в комнате.

Например мне нужно найти пару в тонне пользователей. Есть БД с именем ждущего пользователя и пустое поле для напарника. Второй отправляет гет, а пхп в этот момент не глядя добавляет второго пользователя в то пустое поле ждущего. Прямо сразу Апдейт (SQL) где второе поле = null. И только потом смотришь добавил ли ты вообще, если добавил, то клиенту возвращаешь того кто был в первой графе той строки куда добавил. Если не добавил, когда все строки были заняты, или их вообще не было создано, то после отрицательного ответа от базы, добавляешь себя как ждущего, себя пишешь в первую графу, а вторая остается пустая, и ждешь пока кто нить себя не впишет во вторую графу.

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

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

PS: А что за игра, жанр, геймплей?

Старый 25.10.2011, 13:26
Paul Ololo вне форума Посмотреть профиль Отправить личное сообщение для Paul Ololo Найти все сообщения от Paul Ololo
  № 8  
Ответить с цитированием
Paul Ololo

Регистрация: Apr 2011
Сообщений: 17
Цитата:
Т.е. вы 2 запроса посылаете, что в корне не верно, удаляйте их в момент нахождения или ставьте им статус найдены и т.п., вообще не особо правильная структура сервера...
Если не сложно, напиши плз правильную структуру, на твой взгляд.

Старый 25.10.2011, 14:06
Genzo вне форума Посмотреть профиль Отправить личное сообщение для Genzo Посетить домашнюю страницу Genzo Найти все сообщения от Genzo
  № 9  
Ответить с цитированием
Genzo
 
Аватар для Genzo

блогер
Регистрация: Feb 2010
Адрес: MSK
Сообщений: 859
Записей в блоге: 3
Отправить сообщение для Genzo с помощью ICQ Отправить сообщение для Genzo с помощью Skype™
Есть таблица Games в ней поля (id ,player1_id , player2_id , start_time , finish_time и т.п.), игрок 1 вызывает метод startGame , добавляется запись с проверкой того, что у этого игрока нету уже записи где он играет. Получается (id , player1_id , null , null , null), это и есть игра которая еще не началась, первый игрок периодически посылает запрос checkGameStatus(id) и получает start = false, потом второй игрок посылает запрос joinGame(id) , ставится запись (id , player1_id , player2_ID , now() , null) - finish_time = null - означает, что игра еще не закончилась, ну и первый игрок на checkGameStatus(id) ,получает start = true;

Это что-то вроде эмуляции socket сервера получается, только с периодическими запросами статусов
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works.

Старый 25.10.2011, 18:34
Paul Ololo вне форума Посмотреть профиль Отправить личное сообщение для Paul Ololo Найти все сообщения от Paul Ololo
  № 10  
Ответить с цитированием
Paul Ololo

Регистрация: Apr 2011
Сообщений: 17
Цитата:
удаляйте их в момент нахождения
Сделал так. Роботает гораздо лучше, но баги такой же природы проскакивают.
Нагуглил MySQL write lock. Кто знает как им пользоваться?

Создать новую тему Ответ Часовой пояс GMT +4, время: 13:40.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 13:40.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.