⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rectangleview.cpp

📁 VC++制作的方块小游戏 游戏方法有点儿像祖马宝石方块
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -