Основная часть пасьянса

Перевод карты в индекс картинки

Но прежде всего надо научиться вычислять позицию карты в объекте IList (список изображений карт, от 0 до 51) по ее масти и значению. Для этого определим два похожих метода —

int GetPackImageIndex();

который вернет номер картинки в IList для верхней карты колоды, и int Get Image Index(int line, int pos);

который вернет номер картинки для карты, лежащей в стопке pos группы line (как уже говорилось, группы нумеруются так: 0 — стена, 1 — колонна, 2 — пристенок, 3 — склад, 4 — вспомогательный ряд).

Предварительно в файле MainUnit.h надо определить две константы:

const BACK_NUM = PACK_LEN;

const NONE_NUM = PACK_LEN+1;

Константа BACK_NUM, фактически равная 52 — это индекс рубашки карты, а константа NONE_NUM — индекс подложки.

В методе GetPackl mage IndexQ происходит перебор всех карт колоды, начиная с нуля, и как только встречается карта, которая в колоде действительно есть (переменная Is соответствующего элемента равна true), то возвращается индекс элемента в списке IList, вычисляемый по очевидной формуле:

масть*13 + значение

Именно поэтому так важно, чтобы все карты в списке IList были упорядочены по мастям: трефы — бубны — червы — пики и по возрастающему значению карт, от туза (самой младшей карты) до короля.

Если же колода пуста, то возвращается индекс подложки NONEJMUM, по внешнему виду которой будет понятно, что карт в колоде больше нет.

int TFormI::GetPackImageIndex()

{

int i ;

for( i = 0; i < PACK_TOTAL; i ++ ) if( Pack.GetIndexCard(i).Is )

return Pack.GetIndexCard(i).GetSuit()^VALUE_NUM

+ Pack.GetIndexCard(i).GetValue() ;

return NONE_NUM;

}

199