Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Карточка игра "переводной дурак"
 
 автор: pazha   (24.07.2012 в 11:58)   письмо автору
 
 

Здравствуйте, уважаемые пользователи форума! Я сейчас пишу на PHP игру переводного дурака. Планирую систему организовать между пользователями, в ней будут созданы столы и пользователи подключаются к ним. Сейчас остановился на том, что какие мне поля нужны в базе данных для хранения хода игры и как с ними нужно работать, что бы просчитать все возможные действия.

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

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

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

  Ответить  
 
 автор: pazha   (24.07.2012 в 11:59)   письмо автору
 
   для: pazha   (24.07.2012 в 11:58)
 

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

  Ответить  
 
 автор: Киналь   (24.07.2012 в 13:09)   письмо автору
 
   для: pazha   (24.07.2012 в 11:58)
 

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

> перевести картой
Это отдельное и явное действие игрока, он должен положить карту не на другую карту, а на стол. Для вас это означает, что нужно записать её не во второй массив, а в первый. Ну и изменить индекс игрока, который сейчас ходит.

> подкинуть карту
Аналогично предыдущему, только не меняется индекс.

> загребстись
Не понял термина.

> пропустить подкид карты.
Игрок просто не подкидывает, и всё.

  Ответить  
 
 автор: pazha   (24.07.2012 в 13:48)   письмо автору
 
   для: Киналь   (24.07.2012 в 13:09)
 

Мне после того как карты уходят в отбой необходимо будет раздавать карты в соответствии с тем кто первый ходил, потом кто отбился и т.п. Как с этим быть?

  Ответить  
 
 автор: Киналь   (24.07.2012 в 14:05)   письмо автору
 
   для: pazha   (24.07.2012 в 13:48)
 

Заведите ещё один список (типа FIFO, то есть буфер), куда будете вносит индексы ходивших игроков. Если в конце хода все карты отбиты, то туда же вносите индекс отбивавшегося игрока.

  Ответить  
 
 автор: pazha   (24.07.2012 в 14:20)   письмо автору
 
   для: Киналь   (24.07.2012 в 14:05)
 

Это как? FIFO, впервые слышу. расскажите пожалуйста подробней об этом

Вы имеете введу создать ещё одну таблицу в которой я буду хранить кто сделал ход какой картой и что именно это значило (отбился, подкинул, перевёл) в MYSQL?

  Ответить  
 
 автор: Киналь   (24.07.2012 в 16:13)   письмо автору
 
   для: pazha   (24.07.2012 в 14:20)
 

FIFO значит "First In - First Out" («первым вошёл - первым вышел»), в противоположность LIFO ("Last In - First Out", «последним вошёл - первым вышел»). В первом случае это буфер, во втором стек. В данном случае (и на PHP) можно реализовать в виде массива, куда вы поочерёдно записываете индексы игроков. То есть массив будет вида
[0] => 45
[1] => 7
[2] => 68
[3] => 42

Здесь 45, 7, 68 и 42 — индексы ходивших игроков. Первым был 45-й, последним — 42-й. Если отбивавшийся отбился, добавляете ещё один элемент в массив. А потом раздаёте карты, идя по порядку индексов этого массива.

  Ответить  
 
 автор: pazha   (24.07.2012 в 16:37)   письмо автору
 
   для: Киналь   (24.07.2012 в 16:13)
 

Идею понял. Я уже подготовил базу таким образом, как Вам такой вариант? Я тут ничего не упустил?

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 ;

  Ответить  
 
 автор: Киналь   (24.07.2012 в 16:45)   письмо автору
 
   для: pazha   (24.07.2012 в 16:37)
 

Проверьте и узнаете)

  Ответить  
 
 автор: pazha   (24.07.2012 в 16:49)   письмо автору
 
   для: Киналь   (24.07.2012 в 16:45)
 

Ну а на Ваше усмотрение? Я тут всё что нужно храню, либо мне чего-то не хватает?

  Ответить  
 
 автор: Киналь   (24.07.2012 в 16:51)   письмо автору
 
   для: pazha   (24.07.2012 в 16:49)
 

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

  Ответить  
 
 автор: pazha   (24.07.2012 в 18:15)   письмо автору
 
   для: Киналь   (24.07.2012 в 16:51)
 

Спасибо, буду делать!

  Ответить  
 
 автор: pazha   (01.08.2012 в 14:26)   письмо автору
 
   для: pazha   (24.07.2012 в 18:15)
 

Запутался, помогите понять. Мне нужно сделать что бы если в течении 40 секунд игрок ничего не сделал в игре, то за него делает ход компьютер.

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

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

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

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

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

  Ответить  
 
 автор: pazha   (01.08.2012 в 18:48)   письмо автору
 
   для: pazha   (01.08.2012 в 14:26)
 

Рассказываю что у меня есть. У меня имеется следующие таблицы:

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

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

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

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

  Ответить  
 
 автор: pazha   (05.08.2012 в 09:57)   письмо автору
 
   для: pazha   (01.08.2012 в 18:48)
 

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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования