【VC开源代码栏目提醒】:网学会员--在 VC开源代码编辑为广大网友搜集整理了:Cards.cpp绩等信息,祝愿广大网友取得需要的信息,参考学习。
//
// 卡片游戏
//
// Copyright (c) 2000 Chihiro.SAKAMOTO (HyperWorks)
//
#include "StdAfx.h"
#include "Cards.h"
#include <stdlib.h>
#include <time.h>
// 纸牌的范围
const CRect CCards::rects[] = {
CRect( 80, 370, 80 + CARD_WIDTH, 370 + CARD_HEIGHT),
CRect(184, 370, 184 + CARD_WIDTH, 370 + CARD_HEIGHT),
CRect(288, 370, 288 + CARD_WIDTH, 370 + CARD_HEIGHT),
CRect(392, 370, 392 + CARD_WIDTH, 370 + CARD_HEIGHT),
CRect(496, 370, 496 + CARD_WIDTH, 370 + CARD_HEIGHT),
CRect(236, 196, 236 + CARD_WIDTH, 196 + CARD_HEIGHT),
CRect(340, 196, 340 + CARD_WIDTH, 196 + CARD_HEIGHT),
} ;
// 纸牌的大小
const CSize CCards::card_size(CARD_WIDTH, CARD_HEIGHT);
// 构造函数
//
CCards::CCards()
{
capture = -1;
status = StatusSelectCard;
}
// 析构函数
//
CCards::~CCards()
{
}
// 建立纸牌的点阵图
//
bool CCards::LoadImage()
{
// 读入背景档
if (!board_image.LoadBmp("board.bmp")) {
TRACE("图档不能读取!\n");
return false;
}
// 制作纸牌图像图
if (!card_image.Create(CARD_WIDTH * 13, CARD_HEIGHT * 4, 24)) {
TRACE("内存不足!\n");
return false;
}
// 制作显示用的图像图
if (!view_image.Create(640, 480, 24)) {
TRACE("内存不足!\n");
return false;
}
view_image.Copy(board_image);
static char name[][4] = {
"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"
} ;
CFont suit_normal, suit_revers;
CFont number_normal, number_revers;
// 建立字型
suit_normal.CreateFont(14, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE,
SYMBOL_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH, "Symbol");
number_normal.CreateFont(13, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE,
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH, "Arial");
suit_revers.CreateFont(14, 0, 1800, 1800, FW_DONTCARE, FALSE, FALSE, FALSE,
SYMBOL_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH, "Symbol");
number_revers.CreateFont(13, 0, 1800, 1800, FW_DONTCARE, FALSE, FALSE, FALSE,
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH, "Arial");
CFont suit;
suit.CreateFont(28, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE,
SYMBOL_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH, "Symbol");
CFont ace_of_spade;
ace_of_spade.CreateFont(48, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE,
SYMBOL_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH, "Symbol");
CDibDC dc(card_image);
dc.FillSolidRect(0, 0, card_image.Width(), card_image.Height(), RGB(0, 255, 0));
dc.SelectStockObject(WHITE_BRUSH);
dc.SelectStockObject(BLACK_PEN);
dc.SetBkMode(TRANSPARENT);
enum { // 纸牌图案符号的范围
_OX = 20,
_OY = 15,
_MW = CARD_WIDTH - 42,
_MH = CARD_HEIGHT - 33,
} ;
static const POINT one[1] = {
{ _OX + _MW / 2, _OY + _MH / 2 },
} ;
static const POINT two[2] = {
{ _OX + _MW / 2, _OY },
{ _OX + _MW / 2, _OY + _MH },
} ;
static const POINT four[4] = {
{ _OX, _OY },
{ _OX, _OY + _MH },
{ _OX + _MW, _OY },
{ _OX + _MW, _OY + _MH },
} ;
static const POINT six[2] = {
{ _OX, _OY + _MH / 2 },
{ _OX + _MW, _OY + _MH / 2 },
} ;
static const POINT seven[1] = {
{ _OX + _MW / 2, _OY + _MH / 4 },
} ;
static const POINT eight[1] = {
{ _OX + _MW / 2, _OY + _MH * 3 / 4 },
} ;
static const POINT nine[4] = {
{ _OX, _OY + _MH * 1 / 3 },
{ _OX, _OY + _MH * 2 / 3 },
{ _OX + _MW, _OY + _MH * 1 / 3 },
{ _OX + _MW, _OY + _MH * 2 / 3 },
} ;
static const POINT ten[2] = {
{ _OX + _MW / 2, _OY + _MH / 5 },
{ _OX + _MW / 2, _OY + _MH * 4 / 5 },
} ;
struct MARKS {
const POINT *points;
int npoints;
const MARKS *chain;
} ;
#define SETMARKS(_p, _c) { _p, sizeof(_p) / sizeof(_p[0]), _c }
static const MARKS marks[] = {
SETMARKS(one, 0),
SETMARKS(two, 0),
SETMARKS(one, marks + 1),
SETMARKS(four, 0),
SETMARKS(one, marks + 3),
SETMARKS(six, marks + 3),
SETMARKS(seven, marks + 5),
SETMARKS(eight, marks + 6),
SETMARKS(nine, marks + 4),
SETMARKS(ten, marks + 10),
SETMARKS(nine, marks + 3),
} ;
for (int i=0; i<4; i++) {
int y = i * CARD_HEIGHT;
COLORREF color = (i == DIAMOND || i == HEART)? RGB(255, 0, 0): RGB(0, 0, 0);
dc.SetTextColor(color);
for (int j=0; j<13; j++) {
int x = j * CARD_WIDTH;
dc.RoundRect(x, y, x + CARD_WIDTH, y + CARD_HEIGHT, 10, 10);
CRect rect;
rect.SetRect(x + 1, y + 1, x + 14, y + 14);
CFont *oldFont = dc.SelectObject(&number_normal);
dc.DrawText(name[j], strlen(name[j]), &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOCLIP);
rect.SetRect(x + CARD_WIDTH - 5, y + CARD_HEIGHT - 2, x + CARD_WIDTH + 8, y + CARD_HEIGHT + 11);
dc.SelectObject(&number_revers);
dc.DrawText(name[j], strlen(name[j]), &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOCLIP);
char tmp = (char)0xa7 + i; // Symbol字型中是以0xa7到0xaa的范围来制作纸牌的图案符号
rect.SetRect(x + 1, y + 14, x + 14, y + 20);
dc.SelectObject(&suit_normal);
dc.DrawText(&tmp, 1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOCLIP);
rect.SetRect(x + CARD_WIDTH - 5, y + CARD_HEIGHT - 8, x + CARD_WIDTH + 8, y + CARD_HEIGHT - 2);
dc.SelectObject(&suit_revers);
dc.DrawText(&tmp, 1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOCLIP);
if (j < 10) {
if (i == SPADE && j == 0) // 黑桃A
dc.SelectObject(&ace_of_spade);
else
dc.SelectObject(&suit);
for (const MARKS *p = marks + j; p; p = p->chain) {
for (int i=0; i<p->npoints; i++) {
rect.right = 1 + (rect.left = x + p->points[i].x);
rect.bottom = 1 + (rect.top = y + p->points[i].y);
dc.DrawText(&tmp, 1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOCLIP);
}
}
}
else {
dc.Rectangle(x + 10, y + 10, x + CARD_WIDTH - 10, y + CARD_HEIGHT - 10);
}
dc.SelectObject(oldFont);
}
}
// card_image.SaveBmp("cardimage.bmp");
return true;
}
// 描绘
//
void CCards::Draw(CDC &dc)
{
if (view_image.IsOK())
view_image.Draw(dc, 0, 0, view_image.Width(), view_image.Height());
}
// 初始化
//
void CCards::InitGame()
{
srand((unsigned)time(0)); // 乱数的初始化
for (int j=0; j<sizeof(hands) / sizeof(hands[0]); j++)
hands[j] = -1;
// 清除
UpdateImage(CRect(0, 0, view_image.Width(), view_image.Height()));
Wnd->Invalidate(FALSE);
for (int i=0; i<52; i++)
cards[i] = i;
ncards = 52;
cards_pos = 0;
draw_pos = 0;
Suffle();
CardAnime(CARD_DECK, CARD1, GetCard());
}
// 洗牌
//
void CCards::Suffle()
{
for (int i=0; i<ncards; i++) {
int x = rand() % ncards;
if (x != i) {
int tmp = cards[x]; // 交换2张牌
cards[x] = cards[i];
cards[i] = tmp;
}
}
}
// 将牌重新放回牌堆
//
int CCards::GetCard()
{
if (cards_pos == ncards) { // 牌堆空了
// 将牌
上一篇:
CarDriverDlg.cpp
下一篇:
汝康皮肤护理液医治烧伤的可行性和效果分析