Как хранить варианты расположения фишек в игре

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Как хранить варианты расположения фишек в игре

Сообщение Георгий2 » 19.01.2009 (Пн) 12:08

В игре 20 ячеек, в каждой ячейке может находиться от 0 до 9 фишек одного цвета, фишек в игре 2 цвета, по 15 штук каждого цвета. Должны быть сгенерированы все возможные комбинации расположения фишек на поле, ну, не ВСЕ конкретно, но ужас как много. Как поветуете хранить информацию ? Одна из самых примитивных(идиотских?) идей: просто число в 20 разрядов типа 16003091203006210410, одно для черных фишек, одно для белых, то есть в первой ячейке 1 фишка, во второй 6, в 3-4 по ни одной, и т.д. Ну есть ещё идейки но всё такого же ламерского уровня, например: 01100111010001011001 биты показывают наличие/отсутствие фишки в соответствующей ячейке и в комплекте идёт число с количествами фишек 122 1342, будет ли в таком случае экономия памяти?
Подозреваю, что это всё БСК(бред сивой кобылы), может кто подскажет дельную идею?

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Как хранить варианты расположения фишек в игре

Сообщение RazArt » 19.01.2009 (Пн) 12:11

Создать массив логической переменной, как известно она не много памяти ест и записывать всё в неё, а что тут трудного?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Как хранить варианты расположения фишек в игре

Сообщение Viper » 19.01.2009 (Пн) 12:28

Решение - массив битовых флагов.
Весь мир матрица, а мы в нем потоки байтов!

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Re: Как хранить варианты расположения фишек в игре

Сообщение Георгий2 » 19.01.2009 (Пн) 12:37

RazArt, Viper
Простите, не совсем(совсем не) понимаю. Будьте добры чуть поподробней.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Как хранить варианты расположения фишек в игре

Сообщение Viper » 19.01.2009 (Пн) 13:09

Навскидку два варианта.
Вариант раз: Делаешь массив из 20 элементов. Каждый элемент - целое число типа Long (даже Integer хватит). Один бит на цвет (то есть при наличии бита цвет номер один, при отсутствии номер два). Дополнительно к биту цвета занимаешь в этом флаге один байт на число фишек в ячейке.
Вариант два: Массив из 30 элементов типа Byte. Каждый содержит номер ячейки занимаемы фишкой.
Весь мир матрица, а мы в нем потоки байтов!

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Как хранить варианты расположения фишек в игре

Сообщение RazArt » 19.01.2009 (Пн) 13:13

Код: Выделить всё
Dim FishkaPos(1 To 30) As Byte 'Здесь записывается позиция фишки
Dim Fishka(1 To 30) As Boolean 'Здесь записывается цвет фишки

Private Sub LoadFishki()
For x = 1 To 30
    If Fishka(x) = False Then
        'здесь действие создающее чёрную фишку в FishkaPos(x) ячейке
    Else
        'здесь действие создающее белую фишку в FishkaPos(x) ячейке
    End If
Next x
End Sub

Private Sub <Тут действие срабатывающее при перемешении фишки>()
    FishkaPos (<Номер фишки>)=<Номер ячейки>
End Sub

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Re: Как хранить варианты расположения фишек в игре

Сообщение Георгий2 » 19.01.2009 (Пн) 13:28

Спасибо вам большое! буду думать/экспериментировать.

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Re: Как хранить варианты расположения фишек в игре

Сообщение Георгий2 » 19.01.2009 (Пн) 18:27

RazArt, Viper
скажите пожалуйста, а как вы оцените расход байтов по приведённым вами вариантам? то есть сколько байт требуется чтоб описать состояние доски в 20 ячеек при возможном максимуме 9 фишек в ячейке, 2 цвета фишек. я по своему оценил, но могу ошибаться, ваши цифры будут надёжней.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как хранить варианты расположения фишек в игре

Сообщение iGrok » 19.01.2009 (Пн) 18:57

Георгий2 писал(а):RazArt, Viper
скажите пожалуйста, а как вы оцените расход байтов по приведённым вами вариантам?


Viper писал(а):Вариант раз: Делаешь массив из 20 элементов. Каждый элемент - целое число типа Long (даже Integer хватит).
Вариант два: Массив из 30 элементов типа Byte. Каждый содержит номер ячейки занимаемы фишкой.

При первом варианте - 40(80 для Long) байт на размещение. При втором - 30 байт на размещение.
label:
cli
jmp label

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Re: Как хранить варианты расположения фишек в игре

Сообщение Георгий2 » 19.01.2009 (Пн) 19:18

А в "придуманном" мной варианте получается 8 байт, но мне на другом форуме говорят что даже из-за такой экономии не стоит такие извращённые конструкции строить! :oops:

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как хранить варианты расположения фишек в игре

Сообщение iGrok » 19.01.2009 (Пн) 20:34

Георгий2 писал(а):А в "придуманном" мной варианте получается 8 байт, но мне на другом форуме говорят что даже из-за такой экономии не стоит такие извращённые конструкции строить! :oops:
А можно поподробнее, как ты это в 8 байт-то впихнул? 0_o
Но вообще правильно говорят. Не та это экономия.
ИМХО, оптимально взять вариант с массивом из двадцати Integer'ов. (40 байт) С ним будет проще всего работать.

UPD:
Есть ещё неплохой вариант с массивом из 20 байт.
Первые 4 бита каждого байта будут определять число чёрных фишек, следующие - число белых.
Тогда:
Код: Выделить всё
black_count = (all_count AND &HF0) / &H10
white_count = all_count AND &HF


all_count = ((black_count AND &hF) & &H10) OR (white_count AND &HF)

Если честно, я не вижу нормального способа хранить нужную информацию более экономно без серьёзных потерь удобства использования.
Последний раз редактировалось iGrok 19.01.2009 (Пн) 21:02, всего редактировалось 2 раз(а).
label:
cli
jmp label

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Re: Как хранить варианты расположения фишек в игре

Сообщение Георгий2 » 19.01.2009 (Пн) 20:52

Ну, чему быть тому не миновать! Только по почкам не бейте! :D
То есть (вроде бы) скажем тип Single позволяет записать число длиной 38 знаков и тратится на это 4 байта(ой, боюсь опять фигню спорол ) но если это так то выходит что тот же "снимок" поля можно записать заняв 8 байт: 4 байта на цветность фишек + 4 байта на количество. То есть 2 Single числа : первое 20 разрядное даёт нам количества фишек, и второе содержит 0 и 1 (0 - фишка белая, 1-фишка чёрная) ну например такое число 10050301603072040008 даёт инфу о количестве фишек в ячейках, а второе, такого типа: 10010202101022010002 даёт инфу в какой ячейке какого цвета фишки. Есть смысл в моей логике? или маразм? (боюсь что второе :oops: )

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как хранить варианты расположения фишек в игре

Сообщение iGrok » 19.01.2009 (Пн) 21:15

Хе.. ) В принципе, всё логично. Только попробуй сам:
Код: Выделить всё
Sub TEST()
    Dim s as Single
    s = 99999999999999999999
End Sub

И поймёшь, почему так не получится. )

Вообще, чтобы хранить числа от 0 до 9 нам нужно 4 бита. Плюс один бит на цвет = 5 бит. Клеток всего 20. Т.е. 5 * 20 = 100 бит. Или 12 байт + 4 бита. Т.е. 13 байт. Это абсолютный минимум при таком способе. При этом чтобы выковырять нужную нам информацию придётся постараться, ибо с отдельными битами VB не очень хорошо обращается. Экономия по сравнению с предложенным в предыдущем моём посте менее извращённым способом - 7 байт. Не думаю, что оно того стоит.

Можно копать в другую сторону. У нас есть 30 фишек. Для каждой надо хранить номер клетки, в которой она лежит.
Чтобы хранить числа от 1 до 20(или от 0 до 19) нам нужно тоже 5 бит. При этом у нас 30 фишек. Т.е. 5 * 30 = 150 бит. Или 19 байт. Получилось даже больше. Не катит.
label:
cli
jmp label

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Re: Как хранить варианты расположения фишек в игре

Сообщение Георгий2 » 19.01.2009 (Пн) 22:51

Большо, большое спасибо за помощь !!! очень всем благодарен!

ЗЫ
s = 1E+20 -какой облом !!! никогда с сингл не имел дела - оказывается вон оно как! :(

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Как хранить варианты расположения фишек в игре

Сообщение Viper » 20.01.2009 (Вт) 8:01

Георгий2 писал(а):s = 1E+20 -какой облом !!! никогда с сингл не имел дела - оказывается вон оно как! :(
Облом тут ни причем, просто SingleDouble) надо использовать там где они нужны. Т есть там, где нужны числа с плавающей запятой одинарной или двойной точности. А для хранения битовых флагов надо использовать целочисленные типы - Byte, Integer и Long.
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37

    TopList  
cron