Библиотека Cards.dll

Предыдущая тема Следующая тема Перейти вниз

Библиотека Cards.dll

Сообщение  Замабувараев в Пн Авг 25, 2008 10:07 am

Карточные игры
Уверен, что многие из вас играли в карточные игры, входящие в состав Windows: "Солитёр", "Черви", "Косынка", "Паук". Это достаточно простые игры, в которые вы играли много раз. Но может быть вам хотелось поиграть в более слежные игры? В таком случае, напишите игру сами! Дело упрощается тем, что вышуепомянутые игры используют библиотеку cards.dll, которая поставляется с Windows XP. Опираясь на эту библиотеку, вы способны создать любую карточную игру на FreeBASIC'е по собственному вкусу. Нет необходимости самостоятельно рисовать все карты колоды, об этом уже позаботились программисты компании Microsoft.

Библиотека cards.dll входит в состав практически любой Windows. Но в каждой Windows использовались разные версии библиотеки, как 16-битные, так и 32-битные. Кроме того, иногда файлы этой библиотеки мели разные имена, например, cards32.dll. В нашем же случае мы рассматриваем только библиотеку, поставляемую с Windows XP.
Данная библиотека содержит три основные функции, необходимые для создания карточных игр:
Код:
Declare Function cdtInit Lib "cards.dll" (_
  ByRef Width As Integer, _
  ByRef Height As Integer) As Integer

Declare Function cdtDrawExt Lib "cards.dll" (ByVal hDC As HDC, _
  ByVal X As Integer, ByVal Y As Integer,
  ByVal Width As Integer, ByVal Height As Integer,
  ByVal Card As Integer, ByVal Suit As Integer, ByVal Color As Integer) As Integer

Declare Sub cdtTerm Lib "cards.dll" ()
Функция cdtInit применяется для инициализации библиотеки cards.dll. В переменных Width и Height содержатся размеры карт, необходимые при выводе их на экран. Функция cdtTerm служит для завершения работы с библиотекой cards.dll и освобождения ресурсов памяти. Основная функция, используемая для создания игры, - cdtDrawExt. Она служит для вывода карт на экран. Приведу параметры, используемые функцией:
hDC — контекст устройства формы
X — координата X левой стороны карты в пикселях
Y — координата Y верхней стороны карты в пикселях
Width — ширина карты
Height — высота карты
Card — число от 0 до 55, описывающее тип выводимой карты
Suit — значение, описывающее метод вывода карты
Color — инвертируемый цвет, не используется в Windows XP

Как известно, стандартная колода состоит из 52 карт. Карты имеют 4 масти по 13 наименований в каждой. Параметру Card соответствует число, определяющее достоинство карты. Числа в интервале 0-51 выводят одну из стандартных 52 карт колоды. Так, значение 0 соответствует тузу треф, 1 — тузу бубен, 2 — тузу червей, 3 — тузу пик и т.д. Последнее число 51 соответствует королю пик.
Код:

'Масти карт
Public Enum eSUIT
  Clubs = 0    ' трефы
  Diamond = 1  ' бубны
  Hearts = 2  ' черви
  Spades = 3  ' пики
End Enum

'Номинал карты
Public Enum eFace
  Ace = 0    ' туз
  Two = 1    ' двойка
  Three = 2  ' тройка
  Four = 3    ' четверка
  Five = 4    ' пятерка
  Six = 5    ' шестерка
  Seven = 6  ' семерка
  Eight = 7  ' восьмерка
  Nine  = 8  ' девятка
  Ten  = 9    ' десятка
  Jack  = 10  ' валет
  Queen = 11  ' дама
  King = 12  ' король
End Enum
Чтобы получить номер нужной карты, надо знать волшебную формулу:
Сard = eFace * 4 + eSuit
Например, нужно получить номер пиковой дамы. Подставляем в формулу нужные значения:
card = eFace.Queen * 4 + eSUIT.Diamond
Например, пиковой даме соответствует номер 47 (11 * 4 + 3).

Остальные числа от 52 до 55 выводят различные виды рубашек, а также несколько специальных картинок (X или O). Перечёркнутая красным крестом карта обозначает конец игры, а зелёная O указывает, что вы можете перемешать колоду для продолжения игры. Параметр Suit позволяет выводить различные состояния карты. Например, вы присвоили параметру Card значение от 0 до 51 (нормальный вид). В этом случае при значении 0 в параметре Suit вы выводите стандартный вид карты. Передавая значение 2, вы выводите эту же карту в инвертированном виде, показывая пользователю, что карта выбрана. Если же необходимо показать рубашку карты (обратную сторону), то используйте значение 1 в параметре Suit при значениях Card в интервале от 53 до 68.
Код:

' Картинки для рубашки
Public Enum eBack
  Crosshatch = 53 ' Сетка
  Sky = 54        ' Небо
  Mineral = 55    ' Минерал
  Fish = 56      ' Рыба
  Frog = 57      ' Лягушка
  Flower = 58    ' Цветок
  Island = 59    ' Остров с пальмами
  Sqiares = 60    ' Квадраты
  Magenta = 61    ' Фиолетовый узор
  Sanddunes = 62  ' Песчаные дюны
  Space = 63      ' Астронавт
  Lines = 64      ' Линии
  Cars = 65      ' Машинки
  Unused = 66    ' Неиспользуемая карта
  TheX = 67      ' Символ X
  TheO = 68      ' Символ 0
End Enum
Последний параметр Color функцией не используется, поэтому устанавливаем его значение равным 0.

Теперь перейдём к коду программы
Создайте модуль FreeBASIC с именем TestCards.bas, поместите туда следующий код
Код:
/'
   Cards Library Example, by zamabuvaraeu

   Компилировать:   fbc -s gui TestCards.rc TestCards.bas

'/
#Include Once "windows.bi" ' Включаем файл определений фнкций Windows
#define IDD_DLG1 1000 ' Наш диалог

Declare Function DlgProc(ByVal hWin As HWND, ByVal uMsg As UINT, ByVal wParam As WPARAM, ByVal lParam As LPARAM) As Integer

'''
''' Program start
'''

    ' Определение функций
    Dim Shared cdtInit As Function(ByRef Width As Integer, ByRef Height As Integer) As Integer
    Dim Shared cdtDrawExt As Function(ByVal hDC As HDC, ByVal X As Integer, ByVal Y As Integer, ByVal dX As Integer, ByVal dY As Integer, ByVal Card As Integer, ByVal Suit As Integer, ByVal Color As Integer) As Integer
    Dim Shared cdtTerm As Sub()


    ' Высота и ширина карты
    Dim Shared mintWidth As Integer
    Dim Shared mintHeight As Integer

   ' Дескриптор карточной библиотеки
   Dim hndlLib As Any Ptr
   ' Загружаем функции
   hndlLib=DyLibLoad("cards.dll")
   cdtInit=DyLibSymbol(hndlLib, "cdtInit")
   cdtDrawExt=DyLibSymbol(hndlLib, "cdtDrawExt")
   cdtTerm = DylibSymbol(hndlLib, "cdtTerm")
   ' Инициализация карточной библиотеки
   cdtInit(mintWidth, mintHeight)

   ' Создаём диалоговое окно
   DialogBoxParam(GetModuleHandle(NULL), Cast(ZString Ptr,IDD_DLG1), NULL, @DlgProc, NULL)
   
   
   ' Выгружаем библиотеку
   cdtTerm()
   DylibFree(hndlLib)

'''
''' Program end
'''

Function DlgProc(ByVal hWin As HWND,ByVal uMsg As UINT,ByVal wParam As WPARAM,ByVal lParam As LPARAM) As Integer
   Select Case uMsg
      Case WM_CLOSE
         EndDialog(hWin, 0)
         '
       Case WM_PAINT
            Dim pnt As PAINTSTRUCT
            Dim hDC As HDC
            Dim i As Integer
            ' Получаем Контекст устройства
            hDC = BeginPaint(hWin, @pnt)
            ' Рисуем пиковую даму
            cdtDrawExt(hDC, 10, 10, mintWidth, mintHeight, 47, 0, 0)
            ' Рисуем инвертированную пиковую даму
            cdtDrawExt(hDC, 100, 10, mintWidth, mintHeight, 47, 2, 0)
            ' Рисуем рубашку "Облака"
            cdtDrawExt(hDC, 200, 10, mintWidth, mintHeight, 54, 1, 0)
            
            ' Очистка
            EndPaint(hWin, @pnt)
            DeleteDC(hDC)
      Case Else
         Return FALSE
         '
   End Select
   Return TRUE

End Function
Также нам понадобится файл скрипта ресурсов с именем TestCards.rc (это обычный текстовый файл с расширением ".rc"), откройте его вашим любимым текстовым редактором и поместите туда следующий код:
Код:

#define IDD_DLG1 1000
IDD_DLG1 DIALOGEX 6,5,194,107
CAPTION "Cards Game"
FONT 8,"MS Sans Serif",400,0,0
STYLE 0x10CE0800
BEGIN
END
Скомпилируйте пример с помощью команды:
fbc -s gui TestCards.rc TestCards.bas
avatar
Замабувараев

Сообщения : 99
Дата регистрации : 2008-08-20
Возраст : 33
Откуда : Красноярск

Посмотреть профиль http://www.freebasic.su

Вернуться к началу Перейти вниз

Спасибо :)

Сообщение  ShenZN в Пн Авг 25, 2008 10:17 am

Отлично, теперь буду знать как с легкостью создать карточные игры на FreeBasic.

Спасибо! Very Happy

ShenZN

Сообщения : 155
Дата регистрации : 2008-02-18
Откуда : Ukraine

Посмотреть профиль http://lodestar-game.narod.ru

Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения