VC/MFC 俄罗斯方块双人版(基于MFC单文档)

游玩的鞋楦交界面被描画出现。:

这时写图片描述

登记详情:

技术职称提出要求

提及VC++程序设计者试验教师,将前番编制的dos版双人俄罗斯方块改写成VC交界面版。

效能询问

①完成双人俄罗斯方块
隐蔽处卡特尔栏、镗杆、状态栏
三。动乱是可以选择的。
四分之一,完成而且砖块预测效能。
累使结合成为整体统计学作用的完成,而且每一步撤销显示的分。
⑥完成下、左、右、旋转、减弱效能
装置音乐参加电台、电视节目的演出效能的完成
添加游玩扶助卡特尔
完成三维砖。
附加:忍住银幕闪烁的双缓冲。设置窗口堆积起来,禁用最大值化扣住,心不在焉鼠标落后头改建窗口堆积起来。。

总体设计

体系模块

这时写图片描述

体系加工流程

这时写图片描述

详尽的设计

砖前指示者:

砖前指示者的规律执意在第一到达砖块的时辰,每回找到2块砖。。而且将第2个砖前指示者,第阄似砖的掉了决定并宣布。。而且使死亡在前锋臀部显示的砖块。,新随机到达的砖前指示者。这么的一点钟词,我们家第一运用FLAG1特征来找到砖块吗?。

if (1 == flag1)
{
    bType1 = (使渐进) % NUM_BRICK_TYPES) + 1;
    iOrient1 = (unsignedint) (使渐进) % 4);
    flag1 = 0;
}

brickType = bType1;
initOrientation = iOrient1;if (0 == flag1)
{
    bType1 = (使渐进) % NUM_BRICK_TYPES) + 1;
    iOrient1 = (unsignedint) (使渐进) % 4);if (bType1 == 1)
        activeBrickY1 = new CIBrick;  elseif (bType1 == 2)
        activeBrickY1 = new CLBrick;
    elseif (bType1 == 3)
        activeBrickY1 = new CSBrick;
    
    activeBrickY1->setColour((unsignedchar)bType1);
    activeBrickY1->putAtTop(iOrient1, binWidth/2);
    binY1->getImage(outputImageY1); 
    activeBrickY1->operator>>(outputImageY1); 
}

分统计学:

在这时完成。,显示每个裁员的得分和竞赛的累使结合成为整体。。鉴于,我们家有一点钟作用ReleFuleRe线,归来来撤销大量行。,终于,我们家将归来值乘以使结合成为整体规章中间的值。,每个撤销的得分到达。。而且游玩的累使结合成为整体是累计分。。因砖是撤销4排最重要的东西。,因而这时我们家运用一点钟软鞭子()声明来完成。。MyNUM2是一点钟会员变量。,使守恒的是归来FulfFull的归来值。

switch(m_num2)
{
case0:
    {
        m_num2 = m_num2*0;
        numLines2 += m_num2;
    }break;
case1:
    {
        m_num2 = m_num2*50;
        numLines2 += m_num2;
    }break;
    case4:
    {
        m_num2 = m_num2*1000;
        numLines2 += m_num2;
    }break;
default:break;
}

砖石建筑打手势与游玩减弱的完成:

初期需求对用键盘举行操纵按事实作出回应经文。,终于,需求添加WMYKEYDOWN音讯回应经文。。而且作用传入的NCHAR。,这执意你按下的用键盘举行操纵值。,与游玩中设置的卖扣住举行比力。。结果使生效一致的的操纵。。同时,我们家葡萄汁熟习摆样子的秘密密钥法典。。
但是因我们家添加了位图扣住。,用键盘举行操纵击键不克不及对事实作出回应经文。,我们家在这时劳累了PRECTROSTATMESSIGE作用。,在很作用中举起秘密密钥音讯,终于保守。
一键脱扣:这是一点钟成圈。,在砖块与镶边干涉从前,不要终止瀑布。。
填空处减弱:减弱的规律是交换调制器。,KillTimer(1);/亲近的调制器
填空处持续:SetTimer(0,difficulty,空);/ /持续 回复原始下落高速

游玩难事选择:

默许的动乱很复杂。,复杂的安排作用的设定初值是动乱的。,因而动乱的选择是改建动乱的重视。,改建音高的高速。。

void CTetrisView::OnDiffEasy() 
{
    difficulty =500;
    OnGameStart();
}

参加电台、电视节目的演出装置音乐:

添加头证件:#include


PlaySound((LPCTSTR)IDR_WAVE1, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC);
PlaySound(NULL,NULL,SND_FILENAME);

游玩设置和扶助:

这时是一点钟对话框。,用于解说。。完成尺寸:
① 拔出对话框
② 将类与对话框相干
③ 在需求提出成绩D的作用中构成释义对话框的女朋友,而且DoModal()。提出成绩典型对话框。。

静力学倒转术超并置色和鼠标做法:

因静力学倒转术无法回应经文鼠标点击事实,因而我们家需求改建静力学倒转术的ID。,如:而且在做法中传单检验单。。这将使您能回应经文鼠标单击事实。。

接决定并宣布是将鼠标卖到超并置以显示手的形成。,这时我们家需求重读一点钟向导。。它初期是装载的。:手是可以的。,但当我重读它,波湾阴谋,指出IDCH向导未构成释义。。我反省了原始版本。,不支持手部形成。。

后头,谷歌找到了一种重读的方式。:
m_hCursor = ::LoadCursor(NULL, MAKEINTRESOURCE(32649));
也执意说,重读一点钟大局装满的游标作用。。在光标重读后来的,,添加鼠标打手势事实回应经文。,当鼠标卖到明确提出区域时,显示手光标。

而且执意衔接我本身的视频博客了ShellExecute很作用执意用来完成超并置的。我还做了一点钟下划线的书。,而且我又把它使死亡了。。记述是我不变卖方法买到默许书堆积起来的Syt。,我设置的书典型和把持区域不婚配。。


BOOL Chelp::PreTranslateMessage(谷氨酸一钠* 永磁同一时刻发电机 
{
    
    克利特岛 rect;
    GetDlgItem(IDC_STATIC_BK)->GetWindowRect(rect);
    if (PMSG)->message == WM_MOUSEMOVE)
    {
        if (PMSG)->pt.x > rect.left && pMsg->pt.x < rect.right && pMsg->pt.y > rect.top && pMsg->pt.y < rect.使生根)
        {
            SetCursor(m_hCursor);
        }
    }
    if (PMSG)->message == WM_LBUTTONDOWN)
    {
    if (PMSG)->pt.x > rect.left && pMsg->pt.x < rect.right && pMsg->pt.y > rect.top && pMsg->pt.y < rect.使生根)
        {
            ShellExecute(NULL,"open",TEXT(""),NULL,NULL, SW_SHOWNORMAL);
        }
    }
    return CDialog::PreTranslateMessage(永磁同一时刻发电机;
}

双缓冲机制:

忍住银幕太快造成银幕闪烁的成绩。,绍介了一种双缓存完成机制。。最首要的是将银幕映照到内存容易。,而且在银幕上画相当于在内存中暗中策划。,而且做所相当多的事实。,经过BitBlt()作用从内存稿件位图到银幕。,突变银幕以显示它。。忍住银幕闪烁。。

void CTetrisView::OnDraw(CDC* PDC)
{
    CTetrisDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    int m_nWidth,m_nHeight;
    CDC m_memDC;
    CBitmap m_memBmp;
    
    克利特岛 windowsRect;
    GetClientRect(&windowsRect);

    m_nWidth = ();
    m_nHeight = ();
    
    (PDC);
    
    (PDC),m_nWidth,m_nHeight);

    (&m_memBmp);
    DrawImage(bin1,BIN 2,binY1,binY2,outputImage1,outputImage2,outputImageY1,outputImageY2,&m_memDC);
    
    pDC->BitBlt(0,0,m_nWidth,m_nHeight,&m_memDC,0,0,SRCCOPY);

    ();
    ();
} 

装置位图拔出:

这是交界面丑化做零工。,只有因这么的的装置,完整的游玩才是B的好几倍。。第一文档,白垩质装置,太不友好了。。很装置图片取自4399。,而且我和PS.,使它契合我的提出要求。。


CBitmap bmp;
(IDB_BITMAP1); 
BMP)    

克利特岛 rect;
GetClientRect(&rect);
pDC->FillRect(rect,&m_brushBackground);

书色、使死亡堆积起来和书装置。:

理睬:FUNT1被构成释义为会员作用。。CreatePointFont()只需求两个限制因素。,运用方便。

font1.CreatePointFont(180,_T("华文彩云"));  
font2.CreatePointFont(300,_T("华文彩云")); 
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(251,163,1));

三维砖:

这时用到作用Draw3dRect()完成三维砖,需求3个限制因素。

限制因素:1。矩形面积; 限制因素2:RGB(); 限制因素3:RGB().

void Draw3dRect(LPCRECT lpRect,COLORREF clrTopLeft,COLORREF clrBottomRight);

后两个限制因素,从以下两个作用归来。详细法典列举如下:

COLORREFCTetrisView::GetLightColor(COLORREF m_crBody)
{
    BYTE r = GetRValue(m_crBody);
    BYTE g = GetGValue(m_crBody);
    BYTE b = GetBValue(m_crBody);
    r = r + COLOR_CHANGE>255?255:r+COLOR_CHANGE;
    g = g + COLOR_CHANGE>255?255:g+COLOR_CHANGE;
    b = b + COLOR_CHANGE>255?255:b+COLOR_CHANGE;
    returnRGB(r,g,b);
}
COLORREFCTetrisView::GetDarkColor(COLORREF m_crBody)
{
    BYTE r = GetRValue(m_crBody);
    BYTE g = GetGValue(m_crBody);
    BYTE b = GetBValue(m_crBody);
    r = r - COLOR_CHANGE<0?0:r-COLOR_CHANGE;
    g = g - COLOR_CHANGE<0?0:g-COLOR_CHANGE;
    b = b - COLOR_CHANGE<0?0:b-COLOR_CHANGE;
    returnRGB(r,g,b);
}

镗杆、卡特尔栏、状态栏隐蔽处,最大值化扣住禁用,窗口堆积起来设置

隐蔽处这些不必要的的东西。,看一眼眼色。很眼镜框与它公司或企业。,迷住这些都在眼镜框类中被修正。。


int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    
    SetMenu(NULL);
    ShowControlBar(&m_wndToolBar,FALSE,FALSE);
    ShowControlBar(&m_wndStatusBar,FALSE,FALSE);return0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& 政事司理事)
{
    if( !CFrameWnd::PreCreateWindow(政事司理事) )
        returnFALSE;
    
    cs.cx =790;
    cs.cy =615;
    cs.style &= ~WS_THICKFRAME;
    cs.style &= ~WS_MAXIMIZEBOX; returnTRUE;
}

俄罗斯方块双版的完成:

近乎最重要的双版本先前被省略了。,实际上,双版本的完成非常赞许地复杂。,它是废话FrReCt()的区域并将其卖到必然间隔。。自然,当你编制次货个游玩的法典时。,对立面,只需在反面显示参加电台、电视节目的演出器的交界面那就够了。,那无趣的。。同样地,预显示也这么。,即校准砖的显示臀部。。

//玩家1和球员2游玩面板显示法典:
for (i = 0; i < height; ++i)//一行一行的画砖块
{
    for (j = 0; j < width; ++j)
    {
        rc1 = 克利特岛(j*nSize+149, i*nSize+70, (j+1)*nSize+149, (i+1)*nSize+70);
        rc2 = 克利特岛(j*nSize+435, i*nSize+70, (j+1)*nSize+435, (i+1)*nSize+70);
        //暗中策划面板
        //交界面1player
        if (0 != image1[i][j])
        {
            pDC->FillRect(rc1, &CBrush(BrickColor[image1[i][j]]));//画法暂时砖(体育)
            pDC->Draw3dRect(rc1,GetLightColor(BrickColor[image1[i][j]]),GetDarkColor(BrickColor[image1[i][j]]));
        }
        //交界面2player
        if (0 != image2[i][j])
        {
            pDC->FillRect(rc2, &CBrush(BrickColor[image2[i][j]]));//画法暂时砖(体育)
            pDC->Draw3dRect(rc2,GetLightColor(BrickColor[image2[i][j]]),GetDarkColor(BrickColor[image2[i][j]]));
        }
    }
}

位图扣住的找到:

这时运用cBMPMAButt类。,位图扣住。位图扣住找到的尺寸:

  • 为扣住找到1到4个位图。
  • 构造cBMPMAPutt女朋友。
  • 喊叫CREATE作用找到Windows扣住管理。,并将其添加到cBMPMAPutt女朋友中。。
  • 喊叫会员作用重读位图来重读位图资源。

详细找到,请参阅我的以此类推视频博客。:[在这时戳]

把正式送入精神病院法典列举如下:
int CTetrisView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CView::OnCreate(lpCreateStruct) == -1)
        return -1;

    // TODO: Add your specialized creation code here
    //开端1扣住
    ("1",WS_VISIBLE|WS_CHILD|BS_OWNERDRAW,克利特岛(136,480,360,529),this,IDB_BT_START1);
    (IDB_BT_START1,IDB_BT_START2,IDB_BT_START1,IDB_BT_START1);
    ();  将扣住校准到图片堆积起来
    //...return0;
}

考验与完成

完整的游玩运转交界面图:

而且是在前锋臀部显示的。,点是每个集中块后来的买到的分。,XO用于参加电台、电视节目的演出/减弱装置音乐。,a,b,C是用来选择游玩难事的。。开端点击开端游玩。。上面并且一点钟行情统计学栏。。
这时写图片描述

游玩设置和扶助年史图:

这时写图片描述

总结

这是俄罗斯方块的双重版本。,首要提及VC 试验教师。,该交界面首要拔出到位图装置中。,该图取自4399。,而且PS秋天它需求的堆积起来并转变成.bmp体式。。拔出后,这是显示砖块和分的马上关心。,这么的的交界面先前预备停妥。。交界面上的扣住,我用位图扣住CBitmapButton完成了它。,这是一点钟小插曲。,这是4张相片的堆积起来。,我以为在鼠标点击时显示一张小图片。,像这样到达扣住印象。,因而我做了4个区分堆积起来的位图。,后头引起白垩质使渐进的发生。。对立面,鉴于添加了位图扣住引起了线索事实WM_KEYDOWN和鼠标点击事实WM_LBUTTONDOWN不克不及回应经文,我不变卖为什么。。侥幸的是,MFC中间的音讯被解释者和发送。,因而我就在PreTranslateMessage完成了线索和鼠标点击事实,后来,我不变卖出口的PMSG -> Pt是带有同等性质的相干。。引起失败的保守。,后头找到桌面和客户端区域带有同等性质的替换作用S。对立面并且一点钟成绩执意状态克利特岛的成绩,如:我构成释义了一点钟克利特岛 RCCT(10),10,100,100),而且我会重行顶。, rect.left…替换为CString type,而且PDC->倒转术出口(0)。,0,99,99)完全不懂为什么。。总的来说,很小游玩的编制,让我从本身没有人学到很多东西。,MFC的操纵也全部情况纯熟。,同时,也获得到了MSDN的本性。。

源法典下载:并置: 口令: lnry

发表评论