Библиотека Cards.dll
Участников: 2
Страница 1 из 1
Библиотека Cards.dll
Карточные игры
Уверен, что многие из вас играли в карточные игры, входящие в состав Windows: "Солитёр", "Черви", "Косынка", "Паук". Это достаточно простые игры, в которые вы играли много раз. Но может быть вам хотелось поиграть в более слежные игры? В таком случае, напишите игру сами! Дело упрощается тем, что вышуепомянутые игры используют библиотеку cards.dll, которая поставляется с Windows XP. Опираясь на эту библиотеку, вы способны создать любую карточную игру на FreeBASIC'е по собственному вкусу. Нет необходимости самостоятельно рисовать все карты колоды, об этом уже позаботились программисты компании Microsoft.
Библиотека cards.dll входит в состав практически любой Windows. Но в каждой Windows использовались разные версии библиотеки, как 16-битные, так и 32-битные. Кроме того, иногда файлы этой библиотеки мели разные имена, например, cards32.dll. В нашем же случае мы рассматриваем только библиотеку, поставляемую с Windows XP.
Данная библиотека содержит три основные функции, необходимые для создания карточных игр:
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 соответствует королю пик.
С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.
Теперь перейдём к коду программы
Создайте модуль FreeBASIC с именем TestCards.bas, поместите туда следующий код
fbc -s gui TestCards.rc TestCards.bas
Уверен, что многие из вас играли в карточные игры, входящие в состав 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" ()
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
Теперь перейдём к коду программы
Создайте модуль 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
- Код:
#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
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|