Основная часть пасьянса
Перевод карты в индекс картинки
Но прежде всего надо научиться вычислять позицию карты в объекте 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