📄 rectangleview.cpp
字号:
// RectangleView.cpp : implementation of the CRectangleView class
//
#include "stdafx.h"
#include "Rectangle.h"
#include "RectangleDoc.h"
#include "RectangleView.h"
#include<stdlib.h>
#include<time.h>
#include<memory.h>
#include<string>
using namespace std;
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CRectangleView
IMPLEMENT_DYNCREATE(CRectangleView, CView)
BEGIN_MESSAGE_MAP(CRectangleView, CView)
//{{AFX_MSG_MAP(CRectangleView)
ON_COMMAND(ID_NORMAL, OnNormal)
ON_WM_MOUSEMOVE()
ON_WM_ERASEBKGND()
ON_WM_LBUTTONUP()
ON_COMMAND(ID_PUZZLE, OnPuzzle)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRectangleView construction/destruction
CRectangleView::CRectangleView()
{
gamestart=false;
}
CRectangleView::~CRectangleView()
{
}
BOOL CRectangleView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CRectangleView drawing
void CRectangleView::OnDraw(CDC* pDC)
{
CRectangleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC myDC;
myDC.CreateCompatibleDC(pDC);
CDC MDC;
MDC.CreateCompatibleDC(NULL);
CBitmap m_bmpBuf;
m_bmpBuf.CreateCompatibleBitmap(pDC,curRect.Width(),curRect.Height());
MDC.SelectObject(m_bmpBuf);
BITMAP bmpinfo;
m_bmpBuf.GetBitmap(&bmpinfo);
if(gamestart){
//整体背景
MDC.FillSolidRect(curRect,RGB(0,0,0));
myDC.SelectObject(pDoc->score);
MDC.BitBlt(SIDE,SIDE,pDoc->width[SCORE],pDoc->height[SCORE],&myDC,0,0,SRCCOPY);
myDC.SelectObject(pDoc->frame);
MDC.BitBlt(SIDE+SCOREAREA+SIDE,SIDE+EDGE,pDoc->width[FRAME],pDoc->height[FRAME],&myDC,0,0,SRCCOPY);
myDC.SelectObject(pDoc->nextbar);
MDC.BitBlt(SIDE+SCOREAREA+SIDE+GAMEAREASIDE*2+GAMEAREA+SIDE,SIDE,pDoc->width[NEXT],pDoc->height[NEXT],&myDC,0,0,SRCCOPY);
//上层待发射方块
if(curG.pro==2){
myDC.SelectObject(pDoc->item);
MDC.BitBlt(SIDE+SCOREAREA+SIDE+GAMEAREASIDE+toprect*EDGE,SIDE,EDGE,EDGE,&myDC,0,curG.num*EDGE,SRCCOPY);
}
else if(curG.pro==1){
myDC.SelectObject(pDoc->bomb);
MDC.BitBlt(SIDE+SCOREAREA+SIDE+GAMEAREASIDE+toprect*EDGE,SIDE,EDGE,EDGE,&myDC,0,curG.num*EDGE,SRCCOPY);
}
else if(curG.pro==0){
myDC.SelectObject(pDoc->rect);
MDC.BitBlt(SIDE+SCOREAREA+SIDE+GAMEAREASIDE+toprect*EDGE,SIDE,EDGE,EDGE,&myDC,0,curG.num*EDGE,SRCCOPY);
}
else{
tempRect.SetRect(SIDE+SCOREAREA+SIDE+GAMEAREASIDE+toprect*EDGE,SIDE,SIDE+SCOREAREA+SIDE+GAMEAREASIDE+toprect*EDGE+EDGE,SIDE+EDGE);
MDC.FillSolidRect(tempRect,RGB(0,0,0));
}
//右方next方块
if(nextG.pro==2){
myDC.SelectObject(pDoc->item);
MDC.BitBlt(SIDE+SCOREAREA+SIDE*2+GAMEAREASIDE*2+GAMEAREA+12,SIDE+142,EDGE,EDGE,&myDC,0,nextG.num*EDGE,SRCCOPY);
}
else if(nextG.pro==1){
myDC.SelectObject(pDoc->bomb);
MDC.BitBlt(SIDE+SCOREAREA+SIDE*2+GAMEAREASIDE*2+GAMEAREA+12,SIDE+142,EDGE,EDGE,&myDC,0,nextG.num*EDGE,SRCCOPY);
}
else if(nextG.pro==0){
myDC.SelectObject(pDoc->rect);
MDC.BitBlt(SIDE+SCOREAREA+SIDE*2+GAMEAREASIDE*2+GAMEAREA+12,SIDE+142,EDGE,EDGE,&myDC,0,nextG.num*EDGE,SRCCOPY);
}
else{
tempRect.SetRect(SIDE+SCOREAREA+SIDE*2+GAMEAREASIDE*2+GAMEAREA+12,SIDE+142,SIDE+SCOREAREA+SIDE*2+GAMEAREASIDE*2+GAMEAREA+12+EDGE,SIDE+142+EDGE);
MDC.FillSolidRect(tempRect,RGB(0,0,0));
}
//游戏区域刷屏
for(int i=0;i<12;i++)
for(int j=0;j<7;j++){
if(grid[i][j].pro==2){
myDC.SelectObject(pDoc->item);
MDC.BitBlt(SIDE+SCOREAREA+SIDE+GAMEAREASIDE+j*EDGE,SIDE+EDGE+i*EDGE,EDGE,EDGE,&myDC,0,grid[i][j].num*EDGE,SRCCOPY);
}
else if(grid[i][j].pro==1){
myDC.SelectObject(pDoc->bomb);
MDC.BitBlt(SIDE+SCOREAREA+SIDE+GAMEAREASIDE+j*EDGE,SIDE+EDGE+i*EDGE,EDGE,EDGE,&myDC,0,grid[i][j].num*EDGE,SRCCOPY);
}
else if(grid[i][j].pro==0){
myDC.SelectObject(pDoc->rect);
MDC.BitBlt(SIDE+SCOREAREA+SIDE+GAMEAREASIDE+j*EDGE,SIDE+EDGE+i*EDGE,EDGE,EDGE,&myDC,0,grid[i][j].num*EDGE,SRCCOPY);
}
else{
tempRect.SetRect(SIDE+SCOREAREA+SIDE+GAMEAREASIDE+j*EDGE,SIDE+EDGE+i*EDGE,SIDE+SCOREAREA+SIDE+GAMEAREASIDE+(j+1)*EDGE,SIDE+EDGE+(i+1)*EDGE);
MDC.FillSolidRect(tempRect,RGB(0,0,0));
}
}
//纪录板刷屏
myDC.SelectObject(pDoc->board);
MDC.BitBlt(SIDE+25,SIDE+50,pDoc->width[BOARD],pDoc->height[BOARD],&myDC,0,0,SRCCOPY);
myDC.SelectObject(pDoc->number);
int t;
if(gamemode==NORMAL){
t=normallevel+1;
MDC.BitBlt(SIDE+45,SIDE+80,8,20,&myDC,((t/10)%10)*8,0,SRCCOPY);
MDC.BitBlt(SIDE+55,SIDE+80,8,20,&myDC,(t%10)*8,0,SRCCOPY);
}
else{
t=puzzlelevel+1;
MDC.BitBlt(SIDE+45,SIDE+80,8,20,&myDC,((t/10)%10)*8,0,SRCCOPY);
MDC.BitBlt(SIDE+55,SIDE+80,8,20,&myDC,(t%10)*8,0,SRCCOPY);
}
t=curscore;
MDC.BitBlt(SIDE+35,SIDE+140,8,20,&myDC,(t/1000)*8,0,SRCCOPY);
MDC.BitBlt(SIDE+45,SIDE+140,8,20,&myDC,(t/100)%10*8,0,SRCCOPY);
MDC.BitBlt(SIDE+55,SIDE+140,8,20,&myDC,(t/10)%10*8,0,SRCCOPY);
MDC.BitBlt(SIDE+65,SIDE+140,8,20,&myDC,(t%10)*8,0,SRCCOPY);
t=maxcombo;
MDC.BitBlt(SIDE+45,SIDE+200,8,20,&myDC,((t/10)%10)*8,0,SRCCOPY);
MDC.BitBlt(SIDE+55,SIDE+200,8,20,&myDC,(t%10)*8,0,SRCCOPY);
if(curcombo>=2){
myDC.SelectObject(pDoc->combo);
MDC.BitBlt(SIDE,SIDE+280,pDoc->width[COMBO],pDoc->height[COMBO],&myDC,0,0,SRCCOPY);
}
if(showlevel){
myDC.SelectObject(pDoc->levelup);
MDC.BitBlt(SIDE,SIDE+330,pDoc->width[LEVELUP],pDoc->height[LEVELUP],&myDC,0,0,SRCCOPY);
}
}
else{
if(lose==true){
myDC.SelectObject(pDoc->gameover);
MDC.BitBlt(140,200,pDoc->width[GAMEOVER],pDoc->height[GAMEOVER],&myDC,0,0,SRCCOPY);
}
else if(win==true){
}
else{
myDC.SelectObject(pDoc->start);
MDC.BitBlt(140,150,pDoc->width[START],pDoc->height[START],&myDC,0,0,SRCCOPY);
}
}
pDC->BitBlt(0,0,curRect.Width(),curRect.Height(),&MDC,0,0,SRCCOPY);
ReleaseDC(&myDC);
ReleaseDC(&MDC);
}
/////////////////////////////////////////////////////////////////////////////
// CRectangleView diagnostics
#ifdef _DEBUG
void CRectangleView::AssertValid() const
{
CView::AssertValid();
}
void CRectangleView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CRectangleDoc* CRectangleView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRectangleDoc)));
return (CRectangleDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CRectangleView message handlers
void CRectangleView::OnInitialUpdate()
{
CView::OnInitialUpdate();
CClientDC dc(this);
GetClientRect(curRect);
ReleaseDC(&dc);
gameRect.SetRect(SIDE+SCOREAREA+SIDE+GAMEAREASIDE,SIDE+EDGE,SIDE+SCOREAREA+SIDE+GAMEAREASIDE+GAMEAREA,SIDE+EDGE+GAMEY);
scrollRect.SetRect(SIDE+SCOREAREA+SIDE+GAMEAREASIDE,SIDE,SIDE+SCOREAREA+SIDE+GAMEAREASIDE+GAMEAREA,SIDE+EDGE);
nextGem.SetRect(SIDE+SCOREAREA+SIDE+GAMEAREASIDE*2+GAMEAREA+SIDE+12,SIDE+142,SIDE+SCOREAREA+SIDE+GAMEAREASIDE*2+GAMEAREA+SIDE+12+EDGE,SIDE+142+EDGE);
d[0][0]=1; d[0][1]=0;
d[1][0]=0; d[1][1]=1;
d[2][0]=-1; d[2][1]=0;
d[3][0]=0; d[3][1]=-1;
d[4][0]=1; d[4][1]=1;
d[5][0]=1; d[5][1]=-1;
d[6][0]=-1; d[6][1]=1;
d[7][0]=-1; d[7][1]=-1;
nd[0].colornum=2;
nd[0].time=7;
nd[0].bombrate=35;
nd[0].rewardrate=20; //20
nd[0].standard=100;
nd[1].colornum=2;
nd[1].time=6;
nd[1].bombrate=30;
nd[1].rewardrate=18;
nd[1].standard=300;
nd[2].colornum=3;
nd[2].time=6;
nd[2].bombrate=27;
nd[2].rewardrate=18;
nd[2].standard=600;
nd[3].colornum=3;
nd[3].time=6;
nd[3].bombrate=25;
nd[3].rewardrate=15;
nd[3].standard=1000;
nd[4].colornum=3;
nd[4].time=5;
nd[4].bombrate=22;
nd[4].rewardrate=15;
nd[4].standard=1500;
nd[5].colornum=3;
nd[5].time=5;
nd[5].bombrate=20;
nd[5].rewardrate=13;
nd[5].standard=2000;
nd[6].colornum=4;
nd[6].time=5;
nd[6].bombrate=20;
nd[6].rewardrate=13;
nd[6].standard=2500;
nd[7].colornum=4;
nd[7].time=4;
nd[7].bombrate=17;
nd[7].rewardrate=10;
nd[7].standard=3000;
nd[8].colornum=4;
nd[8].time=4;
nd[8].bombrate=17;
nd[8].rewardrate=10;
nd[8].standard=3500;
nd[9].colornum=4;
nd[9].time=4;
nd[9].bombrate=15;
nd[9].rewardrate=7;
nd[9].standard=4000;
nd[10].colornum=4;
nd[10].time=3;
nd[10].bombrate=12;
nd[10].rewardrate=5;
nd[10].standard=4500;
nd[11].colornum=4;
nd[11].time=3;
nd[11].bombrate=10;
nd[11].rewardrate=3;
nd[11].standard=5000;
}
void CRectangleView::OnNormal()
{
gamestart=true;
win=false;
lose=false;
showlevel=false;
normallevel=0;
curscore=0;
curtime=0;
maxcombo=0;
toprect=0;
pos=0;
nowpos=0;
gamemode=NORMAL;
srand(time(NULL));
randRect(&curG);
randRect(&nextG);
for(int i=0;i<12;i++)
for(int j=0;j<7;j++){
grid[i][j].pro=-1;
grid[i][j].num=-1;
}
memset(mark,0,sizeof(mark));
RedrawWindow();
}
void CRectangleView::OnMouseMove(UINT nFlags, CPoint point)
{
if(gamestart)
if(point.x>SIDE+SCOREAREA+SIDE+GAMEAREASIDE&&point.x<SIDE+SCOREAREA+SIDE+GAMEAREASIDE+GAMEAREA){
toprect=(point.x-SIDE-SCOREAREA-SIDE-GAMEAREASIDE)/EDGE;
RedrawWindow();
}
CView::OnMouseMove(nFlags, point);
}
void CRectangleView::randRect(G *gem){
int randp=rand()%100;
if(randp<nd[normallevel].rewardrate) gem->pro=2;
else if(randp<nd[normallevel].rewardrate+nd[normallevel].bombrate) gem->pro=1;
else gem->pro=0;
gem->num=rand()%nd[normallevel].colornum;
}
BOOL CRectangleView::OnEraseBkgnd(CDC* pDC)
{
return true;
}
void CRectangleView::OnLButtonUp(UINT nFlags, CPoint point)
{
if(gamestart){
if(point.x>SIDE+SCOREAREA+SIDE+GAMEAREASIDE&&point.x<SIDE+SCOREAREA+SIDE+GAMEAREASIDE+GAMEAREA){
pos=(point.x-SIDE-SCOREAREA-SIDE-GAMEAREASIDE)/EDGE;
drop();
if(lose){
gamestart=false;
RedrawWindow();
return;
}
bobo();
if(gamemode==NORMAL){
curtime=(curtime+1)%nd[normallevel].time;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -