您的位置:首页 > 编程语言 > C语言/C++

俄罗斯方块游戏开发(VC++ mfc dialog模式)

2017-01-21 13:45 471 查看
          作为一个非计算机专业人士,由于对计算机感兴趣,在大学期间自学计算机知识,尤其喜好C++

语言(看到这里肯定有人要骂我啦,可是我就是喜欢C类语言),寒假里,突发奇想,是该用自己学的计算机知识,做点什么了,于是乎,开发起来俄罗斯方块。起初觉得应该不难,实际开发中发现好多小细节需要注意,总之,从设计游戏逻辑到调试结束,共3天时间,我是废寝忘食,终于完全独立开发出来我一生中第一个游戏,于是,小年夜,玩着自己的游戏,跨了他个年!!!(你能想象这是什么感觉)

        言归正传,游戏开发完成界面如下:





好了,游戏具体实现细节是怎样的呢?

这里主要是讲解数组的知识,具体图形界面知识,还需要查阅MSDN,以及某度,某歌现学现用,其实真正开发的难度倒不是数据处理,而是图形操作的不熟练。

大体绘制图形方式:

1:游戏背景(红色区域)涂色-使用pdc知识(初始设置背景矩形区域CRect(BackLeft,BackTpp,BackLeft+width*19,BackLeft+width*29);

2:背景数据为一个大的二维数组(我的采用19*29)值为1涂成小人像,值为0,涂成红色;

3:方块涂色:采用5*5的数组,涂色类别同上,设置当前数组boxNow[5][5],涂色时要根据数组矩形的左上顶点位置CPoint(BoxShowLeft,BoxShowTop);

4:每次下、左、右移一个方块的高度(我设置20像素);要检查是否与背景冲突(若下移之后BoxShowTop+=20,左移BoxShowLeft-=20)也就是根据下移后的方块数组和背景数组比较,看是否有同为1的值

5:上下左右移动时要检查是否越界(Boxshwleft和Backlerft比较);

=========================上代码====================================

// GameRussianBoxDlg.h : header file

//

#define MAX_C 7

 #include <Mmsystem.h>

#include "resource.h"

#include "MyButton.h"

#include "Introdlg.h"

#pragma comment(lib, "Winmm.lib")  

#if !defined(AFX_GAMERUSSIANBOXDLG_H__4844B7A7_8625_436B_A462_31E6F1229194__INCLUDED_)

#define AFX_GAMERUSSIANBOXDLG_H__4844B7A7_8625_436B_A462_31E6F1229194__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

/////////////////////////////////////////////////////////////////////////////

// CGameRussianBoxDlg dialog

class CGameRussianBoxDlg : public CDialog

{

public:

    bool OutSides(int BoxShowLeft,int BoxShowTop,int boxnumber[5][5]);

    bool CanChange(int BoxShowLeft,int BoxShowTop);

    void OnHappyNewYear();

    void OnIntroduceClk();

    

//    DWORD m_Volumn;

    bool m_PressMusic;

    bool m_backMusic;

    int Score;

    //枚举 游戏开始前,进行中,暂停中,结束

    enum GameState{preStart,Processing,Paused,Over} gameState;

    void PaintNextBack();

    void PaintNextPic(int nubers[5][5]);

    void CheckLine(int BackNumber[29][19]);

     void MoveCopy(int numbers[29][19],int line);

    CBitmap bitmap;

    bool m_left,m_right;

    int MoveSides(int boxNumber[5][5],int boxLeft,int boxTop);

    int FallTimes;

    int CheckTouch(int BoxNumber[5][5],int BackNumber[29][19],int left,int top);

    void PaintBackGround(int Number[29][19],int rows,int cols,int paintLeft,int paintTop,int width);

    CGameRussianBoxDlg(CWnd* pParent = NULL);    // standard constructor

void PaintByNumbers(int number[5][5],int rows,int cols,int paintLeft,int paintTop,int width);

    //定义总共有几种图形排列

    CRect dlgRect;//保留初始化的对话框大小

    int BackTop,BackLeft,BackWidth,BackHeight;

    int BoxShowLeft,BoxShowTop;

    int box[MAX_C][5][5];

    int BackGroundNumbers[29][19];

     int boxNow[5][5];

     int boxChange[5][5];

     int boxNext[5][5];

     bool isStarted;

     int width;

     CMyButton btnStart,btnPause,btnStop,btnBackMusic;

     CMenu* pMenu;

    //int box[MAX_C][5][5]=0;

// Dialog Data

    //{{AFX_DATA(CGameRussianBoxDlg)

    enum { IDD = IDD_GAMERUSSIANBOX_DIALOG };

    CString    m_Width;

    CString    m_Time;

    CString    m_Height;

    int        m_boxWidth;

    int        m_boxwei;

    int        m_Score;

    //}}AFX_DATA

    // ClassWizard generated virtual function overrides

    //{{AFX_VIRTUAL(CGameRussianBoxDlg)

    public:

    virtual BOOL PreTranslateMessage(MSG* pMsg);

    protected:

    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

    //}}AFX_VIRTUAL

// Implementation

protected:

    HICON m_hIcon;

    // Generated message map functions

    //{{AFX_MSG(CGameRussianBoxDlg)

    virtual BOOL OnInitDialog();

    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

    afx_msg void OnPaint();

    afx_msg HCURSOR OnQueryDragIcon();

    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);

    afx_msg void OnTimer(UINT nIDEvent);

    afx_msg void OnBUTTONGameStart();

    afx_msg void OnBUTTONGameStop();

    afx_msg void OnBUTTONChange();

    afx_msg void OnBUTTONpause();

    afx_msg void OnBUTTONmusic();

    afx_msg void OnBUTTONPressMusic();

    afx_msg void OnRADIOFast();

    afx_msg void OnRADIOMid();

    afx_msg void OnRADIOSlow();

    afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);

    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()

private:

    int Speed;

};

#endif // !defined(AFX_GAMERUSSIANBOXDLG_H__4844B7A7_8625_436B_A462_31E6F1229194__INCLUDED_)

=================================================

#include "stdafx.h"

#include "GameRussianBox.h"

#include "GameRussianBoxDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

class CAboutDlg : public CDialog

{

public:

    CAboutDlg();

// Dialog Data

    //{{AFX_DATA(CAboutDlg)

    enum { IDD = IDD_ABOUTBOX };

    //}}AFX_DATA

    // ClassWizard generated virtual function overrides

    //{{AFX_VIRTUAL(CAboutDlg)

    protected:

    virt
4000
ual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

    //}}AFX_VIRTUAL

protected:

    DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

    CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

    //{{AFX_MSG_MAP(CAboutDlg)

        // No message handlers

        //ON_WM_INTRODUCE()

    //}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CGameRussianBoxDlg dialog

CGameRussianBoxDlg::CGameRussianBoxDlg(CWnd* pParent /*=NULL*/)

    : CDialog(CGameRussianBoxDlg::IDD, pParent)

{

    isStarted =false;

Speed=500;

//    m_Volumn=300;

    width=20;

    FallTimes=0;

    m_left=false;

    m_right=false;

    gameState=preStart;

    Score=1000;

    m_backMusic=false;

    m_PressMusic=true;

    //{{AFX_DATA_INIT(CGameRussianBoxDlg)

    m_Width = _T("");

    m_Time = _T("");

    m_Height = _T("");

    m_boxWidth = 0;

    m_boxwei = 0;

    m_Score = 0;

    //}}AFX_DATA_INIT

    // Note that LoadIcon does not require a subsequent DestroyIcon in Win32

memset(BackGroundNumbers,0,sizeof(BackGroundNumbers));

//int temp[19]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};

//memcpy(BackGroundNumbers[28],temp,sizeof(temp));

for(int i=0;i<19;i++)

{

//    BackGroundNumbers[7][i]=1;

    BackGroundNumbers[27][i]=1;

    BackGroundNumbers[28][i]=1;

}

int box1[MAX_C][5][5] = { /*MAX_C(7)种预定义的盒子*/

{

{0,0,0,0,0},

{0,0,0,0,0},

{1,1,1,1,0},

{0,0,0,0,0},

{0,0,0,0,0}

},

{

{0,0,0,0,0},

{0,0,1,0,0},

{0,1,1,1,0},

{0,0,0,0,0},

{0,0,0,0,0}

},

{

{0,0,0,0,0},

{0,1,1,0,0},

{0,0,1,1,0},

{0,0,0,0,0},

{0,0,0,0,0}

},

{

{0,0,0,0,0},

{0,0,1,1,0},

{0,1,1,0,0},

{0,0,0,0,0},

{0,0,0,0,0}

},

{

{0,0,0,0,0},

{0,1,1,0,0},

{0,0,1,0,0},

{0,0,1,0,0},

{0,0,0,0,0}

},

{

{0,0,0,0,0},

{0,0,1,1,0},

{0,0,1,0,0},

{0,0,1,0,0},

{0,0,0,0,0}

},

{

{0,0,0,0,0},

{0,0,1,1,0},

{0,0,1,1,0},

{0,0,0,0,0},

{0,0,0,0,0}

}

};

    memcpy(box,box1,sizeof(box1));//初始化7种box样式

    //

    m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);

}

void CGameRussianBoxDlg::DoDataExchange(CDataExchange* pDX)

{

    CDialog::DoDataExchange(pDX);

    //{{AFX_DATA_MAP(CGameRussianBoxDlg)

    DDX_Text(pDX, IDC_EDIT_Time, m_Time);

    DDX_Text(pDX, IDC_EDIT_boxwei, m_boxwei);

    DDX_Text(pDX, IDC_EDIT_Score, m_Score);

    //}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CGameRussianBoxDlg, CDialog)

    //{{AFX_MSG_MAP(CGameRussianBoxDlg)

    ON_WM_SYSCOMMAND()

    ON_WM_PAINT()

    ON_WM_QUERYDRAGICON()

    ON_WM_CTLCOLOR()

    ON_WM_TIMER()

    ON_BN_CLICKED(IDC_BUTTON_GameStart, OnBUTTONGameStart)

    ON_BN_CLICKED(IDC_BUTTON_GameStop, OnBUTTONGameStop)

    ON_BN_CLICKED(IDC_BUTTON_Change, OnBUTTONChange)

    ON_BN_CLICKED(IDC_BUTTON_pause, OnBUTTONpause)

    ON_BN_CLICKED(IDC_BUTTON_music, OnBUTTONmusic)

    ON_BN_CLICKED(IDC_BUTTON_PressMusic, OnBUTTONPressMusic)

    ON_BN_CLICKED(IDC_RADIO_Fast, OnRADIOFast)

    ON_BN_CLICKED(IDC_RADIO_Mid, OnRADIOMid)

    ON_BN_CLICKED(IDC_RADIO_Slow, OnRADIOSlow)

    ON_COMMAND(ID_MENUITEM_Introduce, OnIntroduceClk)  

    ON_COMMAND(IDR_MENU1_Happy,OnHappyNewYear)

    ON_COMMAND(IDR_MENU1_Press,OnBUTTONPressMusic)

    ON_COMMAND(IDR_MENU1_Back,OnBUTTONmusic)

    ON_WM_DRAWITEM()

    //}}AFX_MSG_MAP

END_MESSAGE_MAP()

BOOL CGameRussianBoxDlg::OnInitDialog()

{

    CDialog::OnInitDialog();

    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);

    if (pSysMenu != NULL)

    {

        CString strAboutMenu;

        strAboutMenu.LoadString(IDS_ABOUTBOX);

        if (!strAboutMenu.IsEmpty())

        {

            pSysMenu->AppendMenu(MF_SEPARATOR);

            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

        }

    }

    SetIcon(m_hIcon, TRUE);            // Set big icon

    SetIcon(m_hIcon, FALSE);        // Set small icon

///======================

/*    this->SetFocus();

    this->SetForegroundWindow();

    this->SetActiveWindow ();*/

     pMenu=new CMenu();

     pMenu->LoadMenu(IDR_MENU1);

     SetMenu(pMenu);

     CRect dlgtemp(0,0,650,750);

     CWnd::SetWindowPos(NULL,0,0,dlgtemp.Width(),dlgtemp.Height(),SWP_NOZORDER|SWP_NOMOVE);

     dlgRect=dlgtemp;

     /////============

     ///调整控件位置

     GetDlgItem(IDC_STATIC_NextPic)->MoveWindow(dlgRect.right-230,dlgRect.top+80,54,20,TRUE);

      GetDlgItem(IDC_BUTTON_GameStart)->MoveWindow(dlgRect.right-160,dlgRect.top+210,80,24,TRUE);

       GetDlgItem(IDC_BUTTON_pause)->MoveWindow(dlgRect.right-160,dlgRect.top+250,80,24,TRUE);

       GetDlgItem(IDC_BUTTON_GameStop)->MoveWindow(dlgRect.right-160,dlgRect.top+290,80,24,TRUE);

       GetDlgItem(IDC_BUTTON_Change)->MoveWindow(dlgRect.right-160,dlgRect.top+330,80,24,TRUE);

       GetDlgItem(IDC_BUTTON_music)->MoveWindow(dlgRect.right-160,dlgRect.top+370,80,24,TRUE);

       GetDlgItem(IDC_BUTTON_PressMusic)->MoveWindow(dlgRect.right-160,dlgRect.top+410,80,24,TRUE);

      GetDlgItem(IDC_STATIC_Speed)->MoveWindow(dlgRect.right-160,dlgRect.top+470,110,130,TRUE);

       GetDlgItem(IDC_RADIO_Fast)->MoveWindow(dlgRect.right-145,dlgRect.top+490,70,20,TRUE);

       GetDlgItem(IDC_RADIO_Mid)->MoveWindow(dlgRect.right-145,dlgRect.top+530,70,20,TRUE);

       GetDlgItem(IDC_RADIO_Slow)->MoveWindow(dlgRect.right-145,dlgRect.top+570,70,20,TRUE);

      ((CButton *)GetDlgItem(IDC_RADIO_Mid))->SetCheck(TRUE); //选上

           

     //GetDlgItem()

     BackTop=120;

     BackLeft=40;

     BackWidth=380;

     BackHeight=580;

     BoxShowLeft=BackLeft+width*7;

     BoxShowTop=BackTop;

    CDC* pDC=GetDC();

    CRect rcBack=CRect(BackLeft,BackTop,BackLeft+BackWidth,BackTop+BackHeight);

    pDC->FillSolidRect(&rcBack,RGB(125,125,0));

    CRect rcLeft=CRect(BackLeft-30,BackTop,BackLeft,BackTop+BackHeight);

    pDC->FillSolidRect(&rcLeft,RGB(0,255,0));

    Invalidate(TRUE);

    ReleaseDC(pDC);

    CString strWidth,strHeight;

    strWidth.Format("%d",rcBack.Width());

    strHeight.Format("%d",rcBack.Height());

    m_Width=strWidth;

    m_Height=strHeight;

    CString strtime;

    CTime tm=CTime::GetCurrentTime();

    strtime=tm.Format("%Y-%m-%d-%X");

    m_Time=strtime;

    UpdateData(FALSE);

    PaintNextBack();

                //修改开始按钮的风格

   GetDlgItem(IDC_BUTTON_GameStart)->ModifyStyle(0,BS_OWNERDRAW,0);

GetDlgItem(IDC_BUTTON_pause)->ModifyStyle(0,BS_OWNERDRAW,0);

GetDlgItem(IDC_BUTTON_GameStop)->ModifyStyle(0,BS_OWNERDRAW,0);

GetDlgItem(IDC_BUTTON_music)->ModifyStyle(0,BS_OWNERDRAW,0);

//绑定控件IDC_BUTTON1与类CMyButton,响应重载函数DrawItem()

btnStart.Attach(IDC_BUTTON_GameStart,this);

//设置Button Down的背景色

btnStart.SetDownColor(RGB(255,0,0));

//设置Button Up的背景色

btnStart.SetUpColor(RGB(0,240,255));

////====================

btnPause.Attach(IDC_BUTTON_pause,this);

//设置Button Down的背景色

btnPause.SetDownColor(RGB(155,230,0));

//设置Button Up的背景色

btnPause.SetUpColor(RGB(230,0,255));

///IDC_BUTTON_music

btnBackMusic.Attach(IDC_BUTTON_music,this);

//设置Button Down的背景色

btnBackMusic.SetDownColor(RGB(155,230,0));

//设置Button Up的背景色

if(m_backMusic==true)

{

btnBackMusic.SetUpColor(RGB(230,0,0));

}

else

{

    btnBackMusic.SetUpColor(RGB(0,200,5));

}

//PS:如果连接代码时在m_cbBtn.Attach(IDC_BUTTON1,this);这句产生中断,可能的原因是IDC_BUTTON1控件已经绑定了一次消息,这里再次绑定当然不成功啦,

//改正方法为:将映射函数DoDataExchange()中

//DDX_Control(pDX, IDC_BUTTON1, m_cbBtn);//这句注释掉就可以了。

////=======

btnStop.Attach(IDC_BUTTON_GameStop,this);

btnStop.SetDownColor(RGB(255,0,0));

//设置Button Up的背景色

btnStop.SetUpColor(RGB(250,0,35));

           m_Score=Score;

            UpdateData(false);

GetDlgItem(IDC_STATIC)->SetFocus();

 PaintNextBack();

    return FALSE; //一般只需要return true但是如果需要自己设定控件的focus就return false

    // return TRUE  unless you set the focus to a control

}

void CGameRussianBoxDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

    if ((nID & 0xFFF0) == IDM_ABOUTBOX)

    {

        CAboutDlg dlgAbout;

        dlgAbout.DoModal();

    }

    else

    {

        CDialog::OnSysCommand(nID, lParam);

    }

}

void CGameRussianBoxDlg::OnPaint()

{

    if (IsIconic())

    {

        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

        // Center icon in client rectangle

        int cxIcon = GetSystemMetrics(SM_CXICON);

        int cyIcon = GetSystemMetrics(SM_CYICON);

        CRect rect;

        GetClientRect(&rect);

        int x = (rect.Width() - cxIcon + 1) / 2;

        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon

        dc.DrawIcon(x, y, m_hIcon);

    }

    else

    {

        CDialog::OnPaint();

    }

      PaintBackGround(BackGroundNumbers,29,19,BackLeft,BackTop,20);

      PaintNextBack();

      //PaintSides();

}

HCURSOR CGameRussianBoxDlg::OnQueryDragIcon()

{

    return (HCURSOR) m_hIcon;

}

HBRUSH CGameRussianBoxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    if(nCtlColor==CTLCOLOR_EDIT)

    {

        pDC->SetBkMode(TRANSPARENT);

        pDC->SetTextColor(RGB(250,0,0));

        pDC->SetBkColor(RGB(150,40,20));

        HBRUSH b=CreateSolidBrush(RGB(190,190,10));

        return b;

 

    }

    /*if(nCtlColor==CTLCOLOR_BTN)

    {

        pDC->SetBkMode(TRANSPARENT);

        pDC->SetTextColor(RGB(255,0,0));

        pDC->SetBkColor(RGB(20,0,20));

        //HBRUSH b=CreateSolidBrush(RGB(190,190,10));

        return hbr;

 

    }*/

    else if(nCtlColor==CTLCOLOR_STATIC)//静态文本

    {

        pDC->SetTextColor(RGB(255,255,255));

    pDC->SetBkColor(RGB(200,100,90));

    HBRUSH b=CreateSolidBrush(RGB(200,140,70));

    return b;

    }

    if(pWnd->GetDlgCtrlID()==IDC_STATIC_NextPic)

    {

        pDC->SetTextColor(RGB(255,0,0));  //设置字体颜色

       //pDC->SetBkMode(TRANSPARENT); //设置字体背景为透明

       return (HBRUSH)::GetStockObject(BLACK_BRUSH);  // 设置背景色

    }

    return hbr;

}

void CGameRussianBoxDlg::OnTimer(UINT nIDEvent)

{

    switch (nIDEvent)

    {

            case 1:

            {    

                PaintNextPic(boxNext);

                PaintBackGround(BackGroundNumbers,29,19,BackLeft,BackTop,width);

                PaintByNumbers(boxNow,5,5,BoxShowLeft,BoxShowTop,width);

            //    PaintSides();

                int touch= CheckTouch(boxNow,BackGroundNumbers,BoxShowLeft,BoxShowTop);

                if (touch==1)

                {

                    //如果到底的时候检查高度

                    if(BoxShowTop<BackTop+20)

                    {

                     OnBUTTONGameStop();

                     break;

                    }

            

                 int backI=(BoxShowTop-BackTop)/width;

                 int backJ=(BoxShowLeft-BackLeft)/width;

                 for(int i=0;i<5;i++)

                 {

                     for(int j=0;j<5;j++)

                         if(boxNow[i][j]==1)

                         {

                             BackGroundNumbers[backI+i][backJ+j]=boxNow[i][j];    

                         }

                 }

                 CheckLine(BackGroundNumbers);

                 memcpy(boxNow,boxNext,sizeof(boxNow));

                 memcpy(boxNext,box[rand()%7],sizeof(boxNext));

                 BoxShowLeft=BackLeft+width*7;

                 BoxShowTop=120;

                 break;

                }

                BoxShowTop+=20;

                CString str;

                CTime tm=CTime::GetCurrentTime();

                str=tm.Format("%Y-%m-%d-%X");

                m_Time=str;

                m_Score=Score;

                UpdateData(FALSE);

                break;

            }

            case 2:

            {

            //    PlaySound(MAKEINTRESOURCE(IDR_WAVE6), GetModuleHandle(0), SND_RESOURCE | SND_ASYNC | SND_LOOP);

            break;

            }

    }

    CDialog::OnTimer(nIDEvent);

}

void CGameRussianBoxDlg::OnBUTTONGameStart()

{

  if(gameState==preStart||gameState==Over)

  {

     BoxShowLeft=BackLeft+width*7;

     BoxShowTop=BackTop;

    memcpy(boxNow,box[rand()%7],sizeof(boxNow));

    memcpy(boxNext,box[rand()%7],sizeof(boxNext));

    gameState=Processing;

  }

  if(gameState==Paused)

  {

      gameState=Processing;

  }

        SetTimer(1,Speed,NULL);

}

void CGameRussianBoxDlg::OnBUTTONGameStop()

{

         if(gameState==Processing||gameState==Paused)

        {

            gameState=Over;

                KillTimer(1);

                CString scoreStr;

                scoreStr.Format("本局游戏结束,总得分为:%d!!",Score);

                Score=1000;//重置

                for(int i=0;i<27;i++)

                memset(BackGroundNumbers[i],0,sizeof(BackGroundNumbers[i]));

                //MessageBox(scoreStr);

                MessageBox(scoreStr,"最终分数!!",MB_ICONINFORMATION);

        }

     

        

    //鼠标左键被按下时,播放音乐

    

}

void CGameRussianBoxDlg::PaintByNumbers(int number[5][5],int rows,int cols,int paintLeft,int paintTop,int width)

{

    for(int i=0;i<rows;i++)

    {

        for(int j=0;j<cols;j++)

        {   

            

            int Left=paintLeft+j*width;

            int Top=paintTop+i*width;

            int backi=(Top-BackTop)/width;

            int backj=(Left-BackLeft)/width;

            CDC *pDC=GetDC();

         CDC memDC;//定义一个设备上下文

     memDC.CreateCompatibleDC(pDC);//创建兼容的设备上下文

     CBitmap bmp;//定义位图对象

   /*  int index=rand()%3;

     if(index==0)

    

     bmp.LoadBitmap(IDB_BITMAP2);

     if(index==1)

         bmp.LoadBitmap(IDB_BITMAP3);

     if(index==2)

         bmp.LoadBitmap(IDB_BITMAP4);*/

     bmp.LoadBitmap(IDB_BITMAP1);

     //加载位图

     memDC.SelectObject(&bmp);//选中位图对象

     //pDC->BitBlt(30,20,180,180,&memDC,1,1,SRCCOPY);//绘制位图

            CRect rcpaint=CRect(Left,Top,Left+width,Top+width);

                if(number[i][j]==0)

                {

                    //如果数值是0不需要填充什么也不做

                    //pDC->FillSolidRect(&rcpaint,RGB(125,0,0));

                }

                else

                {

                    if(BackTop+27*width<=Top)

                    {

                        pDC->FillSolidRect(&rcpaint,RGB(0,0,0));

                    }

                    else

                    pDC->BitBlt(rcpaint.left,rcpaint.top,width,width,&memDC,1,1,SRCCOPY);//绘制位图

                //pDC->FillSolidRect(&rcpaint,RGB(0,255,0));

                }

            ReleaseDC(pDC);

        }

    }

}

void CGameRussianBoxDlg::PaintBackGround(int Number[29][19],int rows,int cols,int paintLeft,int paintTop,int width)

{

                  CDC *pDC=GetDC();

                   CRect rect;

                       

         CDC memDC;//定义一个设备上下文

     memDC.CreateCompatibleDC(pDC);//创建兼容的设备上下文

     CBitmap bmp;//定义位图对象

     bmp.LoadBitmap(IDB_BITMAP1);//加载位图

     memDC.SelectObject(&bmp);//选中位图对象

    /*CRect rcLeft=CRect(BackLeft-40,BackTop,BackLeft,BackTop+BackHeight);

    pDC->FillSolidRect(&rcLeft,RGB(0,125,0));*/

       for(int i=0;i<rows;i++)

       {

           for(int j=0;j<cols;j++)

                {

    

                int top=paintTop+i*width;

                int left=paintLeft+j*width;

                 rect=CRect(left,top,left+width,top+width);

                  if(Number[i][j]==0)

                       pDC->FillSolidRect(&rect,RGB(125,0,0));

                  if(Number[i][j]==1)

                  {

                      if(i>=27)//如果是最后的两条边涂成黑色即可

                      pDC->FillSolidRect(&rect,RGB(0,0,0));

                      else

                          //pDC->FillSolidRect(&rect,RGB(0,255,0));

                              pDC->BitBlt(rect.left,rect.top,width,width,&memDC,1,1,SRCCOPY);//绘制位图

                  }

                }

       }

                ReleaseDC(pDC);

}

//boxNow,BackGroundNumbers,BoxShowLeft,BoxShowTop

int CGameRussianBoxDlg::CheckTouch(int BoxNumber[5][5],int BackNumber[29][19],int left,int top)

{

    

    for(int i=4;i>=0;i--)

    {

        for(int j=4;j>=0;j--)

        {

           if(BoxNumber[i][j]==1)

           {

                int checkPointleft=left+j*width;

                int checkPointtop=top+i*width+width;

                //根据checkpointleft 和checkpointtop找到backnumber数组的值

                  int backj=(checkPointleft-BackLeft)/width;

                  int backi=(checkPointtop-BackTop)/width;

                  m_boxwei=backi;

                  UpdateData(false);

                 if(BackNumber[backi][backj]==1)

                 {

                     return 1;

                 }      

           }

        }

    }

    return 0;

}

void CGameRussianBoxDlg::OnBUTTONChange()

{

    // TODO: Add your control notification handler code here

    if(gameState==Processing)

    {

        bool canchange=CanChange(BoxShowLeft,BoxShowTop);

        

        

            if(canchange)

            {

                int xxx[5][5];

                for(int i=0;i<5;i++)

                {

                    for(int j=0;j<5;j++)

                    {

                        xxx[i][j]=boxNow[5-1-j][i];

                    }

                }

                memcpy(boxNow,xxx,sizeof(boxNow));

                    

                if(m_PressMusic==true)

                {

                    PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT);

                }

            

            }

    }

}

BOOL CGameRussianBoxDlg::PreTranslateMessage(MSG* pMsg)

{

    // TODO: Add your specialized code here and/or call the base class

        if(pMsg->message==WM_KEYDOWN&&(pMsg->wParam==VK_LEFT||pMsg->wParam==VK_RIGHT||pMsg->wParam==VK_UP||pMsg->wParam==VK_DOWN))

    {

    

        return false;

    }

            if(pMsg->message==WM_KEYUP&&(pMsg->wParam==VK_LEFT||pMsg->wParam==VK_RIGHT||pMsg->wParam==VK_UP||pMsg->wParam==VK_DOWN))

    {

    

        return false;

    }

    if(pMsg->message==WM_KEYDOWN&&(pMsg->wParam=='A'||pMsg->wParam=='a'))

    {

        //MessageBox("left");

        if(m_left==false)

        {

            m_left=true;

            if(!OutSides(BoxShowLeft-20,BoxShowTop,boxNow)&&MoveSides(boxNow,BoxShowLeft-20,BoxShowTop)==1)

                         BoxShowLeft-=20;

            }

        return true;

    }

    if(pMsg->message==WM_KEYUP&&(pMsg->wParam=='A'||pMsg->wParam=='a'))

    {

        m_left=false;

        return true;

    }

    

    if(pMsg->message==WM_KEYDOWN&&(pMsg->wParam=='d'||pMsg->wParam=='D'))

    {

        if(m_right==false)

        {

            m_right=true;

                   if(!OutSides(BoxShowLeft+20,BoxShowTop,boxNow)&&MoveSides(boxNow,BoxShowLeft+20,BoxShowTop)==1)

                         BoxShowLeft+=20;

            

        }

        return true;

    }

    if(pMsg->message==WM_KEYUP&&(pMsg->wParam=='d'||pMsg->wParam=='D'))

    {

        m_right=false;

        return true;

    }

    ///

    if(pMsg->message==WM_CHAR&&(pMsg->wParam=='w'||pMsg->wParam=='W'))

    {

        //MessageBox("up");

        OnBUTTONChange();

        return true;

    }

/*    if(pMsg->message==WM_KEYDOWN&&(pMsg->wParam==VK_UP))

    {

    MessageBox("UP");

    }*/

    return CDialog::PreTranslateMessage(pMsg);

}

int CGameRussianBoxDlg::MoveSides(int boxNumber[5][5],int boxLeft,int boxTop)

{

    for(int j=0;j<4;j++)

    {

        for(int i=0;i<4;i++)

        {

              if(boxNumber[i][j]==1)

              {

                  /*if(boxLeft+width*j<=BackLeft)

                      return 0;*/

                  int backi=(boxTop+i*width-BackTop)/width;

                  int backj=(boxLeft+j*width-BackLeft)/width;//检查此时是否和back有冲突是否有图案

                  if(BackGroundNumbers[backi][backj]==1)

                      return 0;

              }

        }

    }

 

       return 1;

}

//DEL int CGameRussianBoxDlg::MoveSidesRight(int boxNumber[5][5],int boxLeft,int boxTop)

//DEL {

//DEL     for(int i=4;i>=0;i--)

//DEL     {

//DEL         for(int j=4;j>=0;j--)

//DEL         {

//DEL               if(boxNumber[i][j]==1)

//DEL               {

//DEL                   if(boxLeft+width*j+width>=BackLeft+BackWidth)

//DEL                       return 0;

//DEL                    int backi=(boxTop+i*width-BackTop)/width;

//DEL                   int backj=(boxLeft+j*width-BackLeft)/width;

//DEL                   if(BackGroundNumbers[backi][backj]==1)

//DEL                       return 0;

//DEL               }

//DEL         }

//DEL

//DEL     }

//DEL  

//DEL        return 1;

//DEL

//DEL }

void CGameRussianBoxDlg::CheckLine(int BackNumber[29][19])

{

    

    for(int i=0;i<27;i++)

    

    {

        int isline=1;

        for(int j=0;j<19;j++)

        {

            if(BackNumber[i][j]==0)

            {

                isline=0;

            }

        }

        if(isline==1)

        {

            Score+=100;

            

            m_Score=Score;

            UpdateData(false);

            //发现一行满了就加分

           MoveCopy(BackNumber,i);

        }

    }

}

 void CGameRussianBoxDlg::MoveCopy(int BackNumber[29][19],int line)

 {

   for(int x=line;x>0;x--)

     {

             memcpy(BackNumber[x],BackNumber[x-1],sizeof(BackNumber[x]));

     }

    memset(BackNumber[0],0,sizeof(BackNumber[0]));

 

 }

void CGameRussianBoxDlg::PaintNextPic(int numbers[5][5])

{

for(int i=0;i<5;i++)

    {

        for(int j=0;j<5;j++)

        {   

            

            int Left=dlgRect.right-160+j*width;

            int Top=dlgRect.top+80+i*width;

            

             CDC *pDC=GetDC();

             CDC memDC;//定义一个设备上下文

             memDC.CreateCompatibleDC(pDC);//创建兼容的设备上下文

             CBitmap bmp;//定义位图对象

        //     bmp.LoadBitmap(IDB_BITMAP4);//加载位图

             bmp.LoadBitmap(IDB_BITMAP1);

             memDC.SelectObject(&bmp);//选中位图对象

            CRect rcpaint=CRect(Left,Top,Left+width,Top+width);

                if(numbers[i][j]==1)

                    pDC->BitBlt(rcpaint.left,rcpaint.top,width,width,&memDC,1,1,SRCCOPY);//绘制位图

                else

                    

                    pDC->FillSolidRect(&rcpaint,RGB(190,180,230));

                

            ReleaseDC(pDC);

        }

    }

}

void CGameRussianBoxDlg::PaintNextBack()

{

             CDC *pDC=GetDC();

            CRect rcpaint=CRect(dlgRect.right-160,dlgRect.top+80,dlgRect.right-60,dlgRect.top+180);

            pDC->FillSolidRect(&rcpaint,RGB(200,190,240));

               

                

            ReleaseDC(pDC);

}

void CGameRussianBoxDlg::OnBUTTONpause()

{

    if(gameState==Processing)

    {

        gameState=Paused;

        KillTimer(1);

    }

    

}

void CGameRussianBoxDlg::OnBUTTONmusic()

{

    // TODO: Add your control notification handler code here

    // TODO: Add your control notification handler code here

    //    PlaySound(MAKEINTRESOURCE(IDR_WAVE5),AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT);

if(!m_backMusic)

{

    m_backMusic=true;

    //    PlaySound(MAKEINTRESOURCE(IDR_WAVE5),AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT);

    PlaySound(MAKEINTRESOURCE(IDR_WAVE6), GetModuleHandle(0), SND_RESOURCE | SND_ASYNC | SND_LOOP); //鼠标左键被按下时,播放音乐    

}

else

{

    m_backMusic=false;

    PlaySound(NULL,NULL,NULL);

}

}

void CGameRussianBoxDlg::OnBUTTONPressMusic()

{

    if(m_PressMusic==false)

        m_PressMusic=true;

    else

        m_PressMusic=false;

    

}

void CGameRussianBoxDlg::OnIntroduceClk()

{

CIntrodlg  *pDlg=new CIntrodlg;

 pDlg->Create(IDD_DIALOG_Introduce,this);

 pDlg->ShowWindow(SW_SHOW);

}

void CGameRussianBoxDlg::OnRADIOFast()

{

    // TODO: Add your control notification handler code here

    Speed=200;

    ((CButton *)GetDlgItem(IDC_RADIO_Fast))->SetCheck(TRUE); //选上

    GetDlgItem(IDC_STATIC)->SetFocus();

    if(gameState==Processing)

    OnBUTTONGameStart() ;

}

void CGameRussianBoxDlg::OnRADIOMid()

{

    // TODO: Add your control notification handler code here

    Speed=500;    

    ((CButton *)GetDlgItem(IDC_RADIO_Mid))->SetCheck(TRUE); //选上

    GetDlgItem(IDC_STATIC)->SetFocus();

    if(gameState==Processing)

    OnBUTTONGameStart() ;

}

void CGameRussianBoxDlg::OnRADIOSlow()

{

    // TODO: Add your control notification handler code here

    Speed=1000;

    ((CButton *)GetDlgItem(IDC_RADIO_Slow))->SetCheck(TRUE); //选上

        GetDlgItem(IDC_STATIC)->SetFocus();

        if(gameState==Processing)

        OnBUTTONGameStart() ;

}

//DEL void CGameRussianBoxDlg::OnHappyNewYear()

//DEL {

//DEL

//DEL }

void CGameRussianBoxDlg::OnHappyNewYear()

{

  MessageBox("恭喜发财!!@_@","新年快乐",MB_ICONINFORMATION);

}

void CGameRussianBoxDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)

{

    // TODO: Add your message handler code here and/or call default

    

    CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);

}

bool CGameRussianBoxDlg::CanChange(int BoxShowLeft,int BoxShowTop)

{

    

    /*if(BoxShowLeft==BackLeft)

    {

              int backi=(BoxShowTop+100-BackTop)/width;//检查底册

              for(int tx=0;tx<5;tx++)

              {

                  int backj=(BoxShowLeft+width*tx-BackLeft)/width;

                if(BackGroundNumbers[backi][backj]==1)

                  return false;

              }

              int backj=(BoxShowLeft+width*5-BackLeft)/width;//j检查右侧

              

              for(int ty=0;ty<5;ty++)

              {

                  int backi=(BoxShowTop+ty*width-BackTop)/width;

                  if(BackGroundNumbers[backi][backj]==1)

                      return false;

              }

    }

    if(BoxShowLeft==BackLeft+BackWidth-width*5)

    {

             int backi=(BoxShowTop+100-BackTop)/width;//检查底册

              for(int tx=0;tx<5;tx++)

              {

                  int backj=(BoxShowLeft+width*tx-BackLeft)/width;

                if(BackGroundNumbers[backi][backj]==1)

                  return false;

              }

                 int backj=(BoxShowLeft+width*5-BackLeft)/width-6;//j检查左侧侧

              

              for(int ty=0;ty<5;ty++)

              {

                  int backi=(BoxShowTop+ty*width-BackTop)/width;

                  if(BackGroundNumbers[backi][backj]==1)

                      return false;

              }

           

    }

    else

    {

        int backi=(BoxShowTop+100-BackTop)/width;//检查底册

              for(int tx=0;tx<5;tx++)

              {

                  int backj=(BoxShowLeft+width*tx-BackLeft)/width;

                if(BackGroundNumbers[backi][backj]==1)

                  return false;

              }

              int backj=(BoxShowLeft+width*5-BackLeft)/width;//j检查右侧

              

              for(int ty=0;ty<5;ty++)

              {

                  int backi=(BoxShowTop+ty*width-BackTop)/width;

                  if(BackGroundNumbers[backi][backj]==1)

                      return false;

              }

              int backjj=(BoxShowLeft+width*5-BackLeft)/width-6;//j检查左侧侧

              

              for(int tyy=0;tyy<5;tyy++)

              {

                  int backi=(BoxShowTop+ty*width-BackTop)/width;

                  if(BackGroundNumbers[backi][backjj]==1)

                      return false;

              }

    }*/

                   int temp[5][5];

                for(int i=0;i<5;i++)

                {

                    for(int j=0;j<5;j++)

                    {

                        temp[i][j]=boxNow[5-1-j][i];

                    }

                }

                //memcpy(boxNow,xxx,sizeof(boxNow));

                if(OutSides(BoxShowLeft,BoxShowTop,temp))//如果变形后出界就returnfalse

                    return false;

                if(MoveSides(temp,BoxShowLeft,BoxShowTop)==0)

                    return false;

    return true;

}

//DEL void CGameRussianBoxDlg::PaintSides()

//DEL {

//DEL              CDC *pDC=GetDC();

//DEL             CRect rcpaint=CRect(20,120,40,700);

//DEL             pDC->FillSolidRect(&rcpaint,RGB(10,110,150));

//DEL              CRect rcPaintright=CRect(420,120,440,700);  

//DEL                 pDC->FillSolidRect(&rcPaintright,RGB(10,110,150));    

//DEL             ReleaseDC(pDC);

//DEL }

bool CGameRussianBoxDlg::OutSides(int BoxShowLeft,int BoxShowTop,int boxnumber[5][5])

{//检查是否左右出街出界,注意是检查number=1的位置

for(int i=0;i<5;i++)

{

    for(int j=0;j<5;j++)

    {

        if( boxnumber[i][j]==1)

        {

              if(BoxShowLeft+j*width<BackLeft)

                  return true;

              if(BoxShowLeft+j*width+width>BackLeft+BackWidth)

                  return true;

        }

 

    }

}

return false;

}

================================

#if !defined(AFX_INTRODLG_H__1DC57AF5_78C3_4B38_8C7D_E8BACAE8650D__INCLUDED_)

#define AFX_INTRODLG_H__1DC57AF5_78C3_4B38_8C7D_E8BACAE8650D__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

// Introdlg.h : header file

//

/////////////////////////////////////////////////////////////////////////////

// CIntrodlg dialog

class CIntrodlg : public CDialog

{

// Construction

public:

    

    CString welcome;

    CIntrodlg(CWnd* pParent = NULL);   // standard constructor

// Dialog Data

    //{{AFX_DATA(CIntrodlg)

    enum { IDD = IDD_DIALOG_Introduce };

        // NOTE: the ClassWizard will add data members here

    //}}AFX_DATA

// Overrides

    // ClassWizard generated virtual function overrides

    //{{AFX_VIRTUAL(CIntrodlg)

    protected:

    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

    //}}AFX_VIRTUAL

// Implementation

protected:

    // Generated message map functions

    //{{AFX_MSG(CIntrodlg)

    afx_msg void OnPaint();

    virtual BOOL OnInitDialog();

    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);

    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_INTRODLG_H__1DC57AF5_78C3_4B38_8C7D_E8BACAE8650D__INCLUDED_)

=====================================================================

// Introdlg.cpp : implementation file

//

#include "stdafx.h"

#include "gamerussianbox.h"

#include "Introdlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CIntrodlg dialog

CIntrodlg::CIntrodlg(CWnd* pParent /*=NULL*/)

    : CDialog(CIntrodlg::IDD, pParent)

{

    welcome="\r\n          欢迎试玩本游戏,新年快乐!\r\n\r\n 游戏规则:a和A 或 d和D 控制箱子\r\n\r\n左右移动,字母键w或者W控制箱体变形\r\n\r\n玩的愉快!";

}

void CIntrodlg::DoDataExchange(CDataExchange* pDX)

{

    CDialog::DoDataExchange(pDX);

    //{{AFX_DATA_MAP(CIntrodlg)

        // NOTE: the ClassWizard will add DDX and DDV calls here

    //}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CIntrodlg, CDialog)

    //{{AFX_MSG_MAP(CIntrodlg)

    ON_WM_PAINT()

    ON_WM_CTLCOLOR()

    //}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CIntrodlg message handlers

void CIntrodlg::OnPaint()

{

    CPaintDC dc(this);

    

}

BOOL CIntrodlg::OnInitDialog()

{

    CDialog::OnInitDialog();

    

    // TODO: Add extra initialization here

GetDlgItem(IDC_EDIT_Introduction)->SetWindowText(welcome);

    GetDlgItem(IDC_STATIC_Welcome)->SetFocus();

    

    return FALSE;  // return TRUE unless you set the focus to a control

                  // EXCEPTION: OCX Property Pages should return FALSE

}

HBRUSH CIntrodlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    

     if(nCtlColor==CTLCOLOR_EDIT)

    {

        pDC->SetBkMode(TRANSPARENT);

        pDC->SetTextColor(RGB(250,0,0));

        pDC->SetBkColor(RGB(150,40,20));

        HBRUSH b=CreateSolidBrush(RGB(190,190,10));

        return b;

 

    }

         else if(nCtlColor==CTLCOLOR_STATIC)//静态文本

    {

       pDC->SetTextColor(RGB(0,0,0));

       pDC->SetBkColor(RGB(230,200,200));

       HBRUSH b=CreateSolidBrush(RGB(230,200,200));

       return b;

    }

    return hbr;

}

欢迎试玩本游戏,游戏和所有的代码http://download.csdn.net/detail/wonderful_codes/9742630下载地址:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息