MFC编程:数字配对游戏

下载链接:https://download.csdn.net/download/leochen64/21107937

Introduction

这是MFC编写的一个小游戏。玩游戏的规则很简单。您需要翻转卡片以找到对以清除所有 16 张卡片。有一些基本的编程技巧可以从这个游戏中学到。

I. Using CImage class to load image from file, then assign it to object.

II. Using CButton class with Bitmap support style to set the image and display it.

III. Implementing a simple routine to generate shuffled cards for playing it.

Background

我写这个游戏的背景是因为我的孩子和我的妹妹。我妹妹有作业要使用 Pyhton 制作卡片匹配应用程序。当我妹妹完成她的家庭作业并与我分享她的游戏时,这让我产生使用MFC编写游戏的想法。这个游戏是我为孩子们设计的第一个电脑游戏。我希望我的孩子会喜欢这个游戏,让他们有兴趣学习Windows平台下的MFC/C++编程。

Using the code

源代码和项目由 VS2005 编写,带有 MFC 支持的应用程序。如果读者想使用较新的Visual Studio,则需要导入该项目或新建项目来复制必要的源文件。

这个程序一共有三个主要部分,下面会解释。

Part I: Data structure, class member functions and properties definition.

该游戏定义了 16 个插槽,可插入 16 张卡。卡片的初始值全部显示在背面以隐藏真实数字。 16 个数列定义为 {1,2,3,4,5,6,7,8,1,2,3,4,5,6,78}。游戏开始时,卡片将被洗牌以放入插槽。

[Data Structure]:

struct CARD_OBJECT
{
    int nCardNumber; // number is in range {1,8}x2
    int nCardIndex; // Card ID
    int nCurDisplayImgID; // 2: Display removed img, 1: Display CardNumber, 0: Display Cover img
    CBitmap m_bitmapCover,m_bitmapDispNumber,m_bitmapDispRemoved;
};

struct SLOT_OBJECT
{
    int nCardPresenceState; // 2:removed, 1:displaying #, 0:displaying cover
    int nSlotIndex; // button id
    struct CARD_OBJECT mCardObject;
};

[Class member functions and properties]:

class CSelectSameCardPrjDlg : public CDialog
{

private:
    struct SLOT_OBJECT m_slotList[16]; // There are total 16 slots for Card to insert in
    int m_nCountingNumberOfCardsDisplayingNumber;
    int m_nCountingNumberOfCardsAreRemoved;
    int m_nGameState;

private:
    void GenerateRandLst(int nRndLst[16]);
    void InitializeGameParms();
    void ProcessingGameStateMachine(int nSlotIdx); // nSlotIdx means which button has been clicked
    void DisplayCardImg(int nImgIdx); // Idx 0: show cover side, 1: show the number, 2: show removed side

:

}

Part II: Basic image processing to display the cards on CButton Class.

下面介绍一些制作通用MFC按钮在上面显示图片的程序技巧。我们可以将我们预定义的数据结构(struct CARD_OBJECT)中的图像信息存储到这 16​​ 个按钮中。这是我们接收鼠标点击事件并在相应的事件处理程序中添加流程代码的一种简单方式。

一些提示对于读者来说很重要: 这里我们包括 CImage 和 CButton 类。 CImage 类帮助我们加载图像并抛出 CButton 的位图图像句柄。根据 MSDN,我们需要包含 2 个头文件才能使用 CImage 类。如果不引入这 2 个头文件,则会发生编译错误。
/*------- Below 2 headers need to be added into project for using CImage Class -------*
#include <afxstr.h >
#include <atlimage.h.>
/*------- Above 2 headers need to be added into project for using CImage Class -------*

void CSelectSameCardPrjDlg::InitializeGameParms()
{
    int i=0,nTmpIdxInfo[16]={0};
    CImage image;
    char pchImgPath[128];
    CButton *pbtn;
    CStatic *pstaticBanner;
:
:
        // Store Bitmap image to Card object
        image.Load(pchImgPath); // just change extension to load jpg
        m_slotList[i].mCardObject.m_bitmapDispNumber.Attach(image.Detach());
:
:
:
}

void CSelectSameCardPrjDlg::OnBnClickedButton1()
{
    // TODO: Add your control notification handler code here
    ProcessingGameStateMachine(BTN1_PRESSED);
}

void CSelectSameCardPrjDlg::OnBnClickedButton2()
{
    // TODO: Add your control notification handler code here
    ProcessingGameStateMachine(BTN2_PRESSED);
}
ProcessingGameStateMachine() 成员函数在这个游戏中处理用户输入和交互行为。例如,在这个游戏中最多有 2 张卡片来表示数字。所有其他人要么被清除,要么处于未翻转状态。然后用户需要清除所有的 16 张牌才能获胜。

Part III: Small routine to generate out a random number of arry within 1-16.

有一个简单的成员函数,它生成一个 {1-16} 范围内的随机数列表来洗牌 16 张牌。
void CSelectSameCardPrjDlg::GenerateRandLst(int nRndLst[16])
{
    int i=0,j=0,totalcount=16;
    int nRand=0;
    int nTmpIdxCounted=0xFF;

// Below nIdxArray is for recording random index is processed or not used.
// First element[0] stores if the IdxArray has been selected (1) or unselected(0)
// Seconde element[1] stores the new index order.

    int nIdxArray[16][2];

    // Initialize array
    for(i=0;i<16;i++)
:
:
:
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值