[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Что и как нужно хранить базе для игры Дурак?
p.pavluxa
Здравствуйте, уважаемые пользователи форума! Я сейчас пишу на PHP игру переводного дурака. Планирую систему организовать между пользователями, в ней будут созданы столы и пользователи подключаются к ним. Сейчас остановился на том, что какие мне поля нужны в базе данных для хранения хода игры и как с ними нужно работать, что бы просчитать все возможные действия.

Например, игрок хочет сделать ход, мне нужно проверить что бы был сейчас его ход и что бы на столе не лежали чужие карты.

Соответственно есть ещё несколько ситуаций: отбить картой, перевести картой, подкинуть карту, загребстись и пропустить подкид карты.

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



Спустя 19 минут, 44 секунды (24.07.2012 - 11:15) vagrand написал(а):
ну так это получится что мы фактически за вас игру и напишем

Спустя 1 час, 34 минуты, 23 секунды (24.07.2012 - 12:50) p.pavluxa написал(а):
Ну это Вы конечно загнули... Я прошу только помочь с правильным составлением базы данных, так как у самого не хватает мозга

Спустя 30 секунд (24.07.2012 - 12:50) p.pavluxa написал(а):
Может кто нибудь писал эту игру? Что бы не придумывать колесо

Спустя 44 минуты, 30 секунд (24.07.2012 - 13:35) vagrand написал(а):
хех ну так игра то в данном случае и будет состоять из 2-х частей БД и код, если за вас составить БД то это половина работы по написанию игры

Спустя 7 минут, 34 секунды (24.07.2012 - 13:42) p.pavluxa написал(а):
Ладно, давайте по другому. У кого есть уже готовый дурак на PHP?

Спустя 21 минута, 14 секунд (24.07.2012 - 14:04) dron4ik написал(а):
как я понимаю создаем дерево хода, если ход первый то есть возможность перевода, если последующий то записываем игрока и даем другому ход... игра на двоих?

ид игрока за столом
карта
номер партии
номер хода после сброса
ход или бита

Спустя 25 минут, 17 секунд (24.07.2012 - 14:29) p.pavluxa написал(а):
Игра на динамическое количество игроков (от 2 до 6). У меня имеется в базе данных таблица столы, в ней такие поля:
№ стола
Тип игры (подкидкой/переводной)
Количество игроков (от 2 до 6)
Пользователи (записаны при помощи json_encode массив ID игроков)
Козырь (номер карты от 0 до 35)
cardPack (массив json_encode списка оставшихся в колоде карт с учетом козыря)
whoseTurn - чьё сейчас действие (порядковый номер игрока)
status - статус стола (ожидает игроков/идёт игра)

А так же я создал таблицу в которой я буду хранить все ходы за текущую партию в таком виде:
№ хода
№ стола
Порядковый номер игрока
№ карты
Статус - походил/побил/перевёл/подкинул

Всё вернО?

Спустя 8 минут, 22 секунды (24.07.2012 - 14:37) dron4ik написал(а):
а как вы узнаете первый ли это ход?
Если мне не изменяет память то переводить можно только до первой битой... так я и думаю что нужно тоже кудато писать это.

Спустя 5 минут, 25 секунд (24.07.2012 - 14:43) p.pavluxa написал(а):
Не, переводить можно только если ещё никто не отбивался, то есть я смотрю в таблице ходов если там есть ход со стастусом побил то уже перевести нельзя. Как Вам идея?

Спустя 55 минут, 27 секунд (24.07.2012 - 15:38) p.pavluxa написал(а):
Вот как выглядит база, посмотрите, это нормально? Или я что-то упустил?

CREATE TABLE IF NOT EXISTS `XeronDurak` (
`iID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '№',
`eKindOfPlay` enum('0','1') NOT NULL COMMENT 'Вид игры: 0 - подкидкой, 1 - переводной',
`fBetAmount` decimal(11,2) NOT NULL COMMENT 'Сумма ставки',
`eBetCurrency` enum('USD','RUB') NOT NULL COMMENT 'Валюта ставки',
`eSeatsNumber` enum('2','3','4','5','6') NOT NULL COMMENT 'Количество мест',
`aUsers` tinytext NOT NULL COMMENT 'Игроки',
`sReadyDate` datetime DEFAULT NULL COMMENT 'Дата отсчета готовности',
`aReadyUsers` tinytext COMMENT 'Готовности игроков',
`aUsersCards` tinytext COMMENT 'Карты игроков',
`iRoyalCard` tinyint(2) DEFAULT NULL COMMENT 'Козырная карта',
`aCardPack` tinytext COMMENT 'Оставшиеся колода карт',
`eWhoseTurn` enum('0','1','2','3','4','5') DEFAULT NULL COMMENT 'Чей сейчас ход?',
`eWhoseDefended` enum('0','1','2','3','4','5') DEFAULT NULL COMMENT 'Кто защищается ?',
`eStatus` enum('0','1','2') NOT NULL DEFAULT '0' COMMENT 'Статус: 0 - ожидание игроков, 1 - ожидание готовности, 2 - идёт игра',
UNIQUE KEY `ID` (`iID`)
)
ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Столы игры "Дурак"' AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `XeronDurakTurns` (
`iID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '№',
`iGameID` bigint(20) NOT NULL COMMENT '№ игры',
`eUserIndex` enum('0','1','2','3','4','5') NOT NULL COMMENT '№ порядка игрока',
`iCard` tinyint(2) NOT NULL COMMENT '№ карты',
`eStatus` enum('0','1','2') NOT NULL COMMENT 'Статус: 0 - походил/подкинул, 1 - отбился, 2 - перевел',
UNIQUE KEY `iID` (`iID`),
KEY `iGameID` (`iGameID`)
)
ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Буфер ходов в игре "Дурак"' AUTO_INCREMENT=1 ;

Спустя 1 день, 23 часа, 11 минут, 30 секунд (26.07.2012 - 14:50) dron4ik написал(а):
Цитата (p.pavluxa @ 24.07.2012 - 12:38)
Вот как выглядит база, посмотрите, это нормально? Или я что-то упустил?

CREATE TABLE IF NOT EXISTS `XeronDurak` (
`iID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '№',
`eKindOfPlay` enum('0','1') NOT NULL COMMENT 'Вид игры: 0 - подкидкой, 1 - переводной',
`fBetAmount` decimal(11,2) NOT NULL COMMENT 'Сумма ставки',
`eBetCurrency` enum('USD','RUB') NOT NULL COMMENT 'Валюта ставки',
`eSeatsNumber` enum('2','3','4','5','6') NOT NULL COMMENT 'Количество мест',
`aUsers` tinytext NOT NULL COMMENT 'Игроки',
`sReadyDate` datetime DEFAULT NULL COMMENT 'Дата отсчета готовности',
`aReadyUsers` tinytext COMMENT 'Готовности игроков',
`aUsersCards` tinytext COMMENT 'Карты игроков',
`iRoyalCard` tinyint(2) DEFAULT NULL COMMENT 'Козырная карта',
`aCardPack` tinytext COMMENT 'Оставшиеся колода карт',
`eWhoseTurn` enum('0','1','2','3','4','5') DEFAULT NULL COMMENT 'Чей сейчас ход?',
`eWhoseDefended` enum('0','1','2','3','4','5') DEFAULT NULL COMMENT 'Кто защищается ?',
`eStatus` enum('0','1','2') NOT NULL DEFAULT '0' COMMENT 'Статус: 0 - ожидание игроков, 1 - ожидание готовности, 2 - идёт игра',
UNIQUE KEY `ID` (`iID`)
)
ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Столы игры "Дурак"' AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `XeronDurakTurns` (
`iID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '№',
`iGameID` bigint(20) NOT NULL COMMENT '№ игры',
`eUserIndex` enum('0','1','2','3','4','5') NOT NULL COMMENT '№ порядка игрока',
`iCard` tinyint(2) NOT NULL COMMENT '№ карты',
`eStatus` enum('0','1','2') NOT NULL COMMENT 'Статус: 0 - походил/подкинул, 1 - отбился, 2 - перевел',
UNIQUE KEY `iID` (`iID`),
KEY `iGameID` (`iGameID`)
)
ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Буфер ходов в игре "Дурак"' AUTO_INCREMENT=1 ;

зачем все в одно место пихать?

Какая игра и какой ход розделяем...

Спустя 59 минут, 19 секунд (26.07.2012 - 15:49) neadekvat написал(а):
Какая нафиг база? Рано для базы.

Сначала должна быть продумана логика, алгоритмы, общая картина должна иметь место в твоей головы.

База данных - она уже сама по себе вытечет из вышеназванного. Надо будет только подвести ее к нормальной форме (ну или денормализации, если на то будут причины).

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

Спустя 3 дня, 20 часов, 30 минут, 13 секунд (30.07.2012 - 12:19) p.pavluxa написал(а):
Как Вы думаете, как лучше хранить последовательность ходов(удары переводы и т.д.) именно то что сейчас на столе лежит. В таблице типа MEMORY, но как сохранить последовательность? Записывать дату этого действия, либо сделать автоинскрумент?

Спустя 1 день, 1 час, 7 минут, 13 секунд (1.08.2012 - 13:26) p.pavluxa написал(а):
Запутался, помогите понять. Мне нужно сделать что бы если в течении 40 секунд игрок ничего не сделал в игре, то за него делает ход компьютер.

Если этот игрок должен был ходить (либо подкидывать) то ход переходит к следующему игроку.
Если этот игрок должен был отбиваться, то он загребётся.

Вопрос, а как мне определять что он должен делать? В базе данных я храню позицию игрока (за столом) который сейчас делает действие, и время отсчета этого действия.

По идее мне нужно хранить где-то те карты которые лежает на столе.

Если их там нет, значить этот человек делает ход. Иначе: если последняя карта его, либо человека на которого сейчас ход, то это подкидывание, иначе он отбивается.

Как вот это всё дело нужно хранить? И что именно, я уже 5-й день пытаюсь понять, и даже сам с собой в дурака играю но не хватает сосредоточенности понять.
Помогите пожалуйста, толи мне нужно в буфере (отдельной таблицей хранить ходы партии, но если да то нужно же и карту хранить которой был ход сделал) помогите пожалуйста понять

Спустя 1 час, 4 минуты, 33 секунды (1.08.2012 - 14:31) DarkLynx написал(а):
Я бы в базе хранил сразу, кто чей ход и что он должен делать, отбиваться или подкидывать.

Спустя 7 минут, 43 секунды (1.08.2012 - 14:39) p.pavluxa написал(а):
Я уже до этого тоже дошел, я храню: кто сейчас должен делать ход (его позиция), и что он делаеть должен (защищаться или атаковать). Если он защищается, то у него есть 3 возможных действия: отбиться картой, загребстись, перевести на другого. А если он атакует, то два: пропустить ход, подкинуть карту.

Но нужно сама логика, что когда за чем делать. Может есть у кого нибудь алгоритм готовый?

Спустя 2 минуты, 25 секунд (1.08.2012 - 14:41) DarkLynx написал(а):
Саму логику ты уже написал.. А просишь ты реализацию =)

Спустя 13 минут, 28 секунд (1.08.2012 - 14:55) inpost написал(а):
Один скрипт готовый, второй скрипт готовый... Молодец, ты программист!

Спустя 5 минут, 30 секунд (1.08.2012 - 15:00) p.pavluxa написал(а):
Эм... Я прошу не реализацию, а алгоритм.

Спустя 7 минут, 33 секунды (1.08.2012 - 15:08) DarkLynx написал(а):
Ну я бы даже понял если реализацию.. Алгоритм уже у тебя есть... В твоем сообщении, читай и думай

Спустя 2 минуты, 17 секунд (1.08.2012 - 15:10) p.pavluxa написал(а):
Это огрызок от алгоритма, мне нужно что то более полное

Спустя 2 часа, 7 минут, 52 секунды (1.08.2012 - 17:18) p.pavluxa написал(а):
Помогите раздуплиться. Что мне нужно хранить в базе что бы понять сколькими картами текущий пользователь был атакован

Спустя 4 минуты, 11 секунд (1.08.2012 - 17:22) inpost написал(а):
1 таблица игроков, вторая таблица партий, которая связывает игроков и определяет, кто в какой игре. Третья таблица карт, которая и определяет АБСОЛЮТНО всё, где карта, какая карта и в каком положении находится.

Спустя 23 минуты, 35 секунд (1.08.2012 - 17:46) p.pavluxa написал(а):
Рассказываю что у меня есть. У меня имеется следующие таблицы:

1. Таблица столов, в ней: № стола, тип игры (подкидной/переводной), количество мест, козырная карта, колода карт, № позиции игрока который сейчас атакует, № позиции игрока который отбивается.

2. Таблица игроков, в ней: № стола, № позиции (место за которым сидит), № пользователя (ID), его карты.

3. Таблица ходов (буфер): № хода (автоинструмент - что бы сортировать если потребуется), № стола, № позиции игрока который кинул карту, сама карта, статус (0-пропустил ход (либо загрёбся если владелец её тот кто защищается), 1 - атаковал(либо отбился в зависимости от того кто кинул эту карту)).
При этом карта может принимать NULL (если человек пропустил ход либо загребается).

Например человек который сейчас отбивается решил загребстись, мне необходимо определить, сколько на него было атак (что бы понять скоко ему карт ещё можно подкинуть). Как вот это осуществить я не пойму

Спустя 9 минут, 5 секунд (1.08.2012 - 17:55) inpost написал(а):
количество карт статично, и меняется лишь расположение карты. Поэтому лучше всего было бы вообще сделать таблицу для всех КАРТ, то есть таблица будет называться "Колода".
У карты есть статус: "атакующая", далее считаешь количество карт, которые на данный момент имеют статус "атакующая".

Спустя 10 минут, 12 секунд (1.08.2012 - 18:05) p.pavluxa написал(а):
Дело в том что столов будет много, и в них количество игроков везде разное

Спустя 6 минут, 43 секунды (1.08.2012 - 18:12) inpost написал(а):
Таблица карт:
Запись №1: ID1, Валет, Статус атакующий, расположение в столе №5.

Спустя 4 минуты, 46 секунд (1.08.2012 - 18:16) p.pavluxa написал(а):
Эм... Не понял к чему это

Спустя 13 минут, 7 секунд (1.08.2012 - 18:29) inpost написал(а):
к тому, что ты зарание делаешь неправильную структуру БД. Точнее ты сделал не думая, а теперь задумался о том, как это будет работать и в тупике.
Для начала надо подумать о том, что и как должно работать, а уже потом создавать, то есть обратный порядок. Аналогия с морским боем, где ты так же неверно создал структуру и из-за чего возникли проблемы дописания скрипта.

Спустя 26 минут, 9 секунд (1.08.2012 - 18:56) p.pavluxa написал(а):
Я понял о чём ты. То есть ты предлагаешь создать список карт (которые лежат на столе) и у них в статусе хранить Побитая ли она или нет. Правильно я понимаю?

Спустя 20 минут, 36 секунд (1.08.2012 - 19:16) inpost написал(а):
p.pavluxa
я бы даже сказал, что на столе может быть 6 карт и 6 сверху, итого 12 позиций.

Спустя 5 минут, 40 секунд (1.08.2012 - 19:22) p.pavluxa написал(а):
То есть список всех карт которые на столе. Но что мне нужно хранить по мимо того какая это карта и кто её бросил?

Спустя 7 минут, 27 секунд (1.08.2012 - 19:29) inpost написал(а):
Всё, что тебе может понадобиться в твоей игре.

Спустя 7 минут, 17 секунд (1.08.2012 - 19:37) p.pavluxa написал(а):
а вот что может понадобиться?

Спустя 1 минута, 31 секунда (1.08.2012 - 19:38) inpost написал(а):
p.pavluxa
думай, не буду же я всё делать за тебя...

Спустя 48 секунд (1.08.2012 - 19:39) p.pavluxa написал(а):
Ну пожалуйстааааа... Я всё таки справился с морским боем и шашками

Спустя 5 дней, 18 часов, 56 минут, 45 секунд (7.08.2012 - 14:36) p.pavluxa написал(а):
Ну что ребята. Осталось теперь написать функионал.

Будет несколько интерфейсов:
№1 сделать ход: принимает № карты которой сделать ход.
№2 отбиться: принимает № карты которой отбиться, и № карты на столе которую побить.
№3 пропустить ход.
№4 перевести: принимает № карты.

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

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.