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

📄 russianview.cpp

📁 一个可以在嵌入式平台上面开发的俄罗斯方块程序
💻 CPP
字号:
// RussianView.cpp : implementation of the CRussianView class
//

#include "stdafx.h"
#include "Russian.h"

#include "RussianDoc.h"
#include "RussianView.h"
#include "mainfrm.h"

#include "math.h"
#include "Russian2.h"
#include "playerdlg.h"
#include "playerHistorydlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

int Square_Kind;
int array[xGrid][yGrid];//save two dimension array's status.

struct Calcul_Score_Level{//计算分数和等级
	int TotalScore;//TotalScore:总分
	int UnitScore;//UnitScore:基分,每消掉一行时为50分,每落一次但不消行为10分
	int nRemoveRow;//统计一次消去的行数(当同时填满多行时,可成倍加分).消行结束时,将其复位为0
	int nTotalRemoveRow;//统计总共消去的行数(用于进行升等级计算的依据:当该值达到20行时升
						//一级,同时将其复位为0)
	int Level;//记录当前的游戏等级:最高设为10级
	int nLevelRow;//设置升级的行数(及当消去的行数大于等于该值时升一级)
} Score_Level;

//游戏数据库属性标识
const WORD PROP_NAME=100,//玩家姓名
		   PROP_SCORE=101;

/////////////////////////////////////////////////////////////////////////////
// CRussianView

IMPLEMENT_DYNCREATE(CRussianView, CFormView)

BEGIN_MESSAGE_MAP(CRussianView, CFormView)
	//{{AFX_MSG_MAP(CRussianView)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart)
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_BUTTON_DOWN, OnButtonDown)
	ON_BN_CLICKED(IDC_BUTTON_LEFT, OnButtonLeft)
	ON_BN_CLICKED(IDC_BUTTON_RIGHT, OnButtonRight)
	ON_COMMAND(IDM_PAUSE, OnPause)
	ON_COMMAND(IDM_REPLAY, OnReplay)
	ON_COMMAND(IDM_START, OnStart)
	ON_COMMAND(IDM_CONTINUE, OnContinue)
	ON_BN_CLICKED(IDC_BUTTON_UP, OnButtonUp)
	ON_COMMAND(IDM_PLAYER, OnPlayer)
	ON_WM_KEYUP()
	ON_BN_CLICKED(IDB_DELETE, OnDelete)
	ON_COMMAND(ID_BUTTON_EXIT, OnExit)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRussianView construction/destruction

CRussianView::CRussianView()
	: CFormView(CRussianView::IDD)
{
	//{{AFX_DATA_INIT(CRussianView)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// TODO: add construction code here
	m_nStartSpeed=1000;
	SpeedDifference=100;
	nTimeID=1;
	bHaveTimer=false;
	m_1square=new CSquare1;				  
	m_2square=new CSquare2;
	m_3square=new CSquare3;				  
	m_4square=new CSquare4;				  
	m_5square=new CSquare5;				  
	m_6square=new CSquare6;				  
	m_7square=new CSquare7;				  
	square=NULL;

	WhiteBrush.CreateSolidBrush(RGB(255,255,255));
	rect.left=ulPosx+frmwidth;
	rect.top=ulPosy+frmwidth;
	rect.right=ulPosx+frmwidth+xGrid*mWidth;
	rect.bottom=ulPosy+frmwidth+mHeight*yGrid;
	
	//CE数据库初始化:
	m_pSortProp[0]=CCeDBProp(CCeDBProp::Type_String, PROP_NAME,  CCeDBProp::Sort_Ascending );
	m_pSortProp[1]=CCeDBProp(CCeDBProp::Type_ULong , PROP_SCORE, CCeDBProp::Sort_Ascending );
//	m_pValProp[0]=NULL;
//	m_pValProp[1]=NULL;
	m_PlayerName=_T("No Name");
	m_Score=0;

	//全局变量的初始化:
	InitGlobal();
}

CRussianView::~CRussianView()
{
	//	KillTimer(nTimeID);
	delete  m_1square;				  
	delete 	m_2square;
	delete 	m_3square;				  
	delete 	m_4square;				  
	delete 	m_5square;				  
	delete 	m_6square;				  
	delete 	m_7square;				  
	m_DBPlayer.Close();
}

void CRussianView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CRussianView)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BOOL CRussianView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CFormView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CRussianView diagnostics

#ifdef _DEBUG
void CRussianView::AssertValid() const
{
	CFormView::AssertValid();
}

void CRussianView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}

CRussianDoc* CRussianView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRussianDoc)));
	return (CRussianDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CRussianView message handlers

void CRussianView::OnTimer(UINT nIDEvent) 
{
	int status=0;
	CDC *pDC=GetDC();
	if(square!=NULL)
	{
		status=square->Down(pDC);
		if(!status)//0:不能继续下落(遇到障碍物或到底,但方格未顶到头,则产生新方块)
			{
			OnButtonStart();
			}
		if(status==2)
		{
			KillTimer(nTimeID);
			bHaveTimer=false;
			AfxMessageBox(_T("游戏结束"));
			//记录对话框(记录玩家信息)
			AppendRecord();
			pDC->FillRect(&rect,&WhiteBrush);
			m_nStartSpeed=1000;//重置起始速度
			InitGlobal();
		}
	}
	ReleaseDC(pDC);
	CFormView::OnTimer(nIDEvent);
}


void CRussianView::OnButtonStart() 
{
	//显示当前总分:
	TCHAR a[20];
	wsprintf(a,_T("%d"),Score_Level.TotalScore);
	GetDlgItem(IDL_SCORE)->SetWindowText(a);
	//计算,设置和显示当前的游戏等级:
	if(Score_Level.nTotalRemoveRow>=Score_Level.nLevelRow)//升等级
	{	
		m_nStartSpeed-=SpeedDifference;
		Score_Level.nTotalRemoveRow=0;
		Score_Level.Level+=1;
		KillTimer(nTimeID);
		SetTimer(nTimeID,m_nStartSpeed-SpeedDifference,NULL);
	}
	TCHAR b[1];
	wsprintf(b,_T("%d"),Score_Level.Level);
	GetDlgItem(IDL_LEVEL)->SetWindowText(b);

	if(!bHaveTimer)
	{
		SetTimer(nTimeID,m_nStartSpeed,NULL);
		bHaveTimer=true;
	}

	//srand((unsigned)time(NULL));//use system time as a seed to initialize pseudorandom generator.
	//srand((unsigned)time(NULL));//use system time as a seed to initialize pseudorandom generator.
	//SYSTEMTIME st;
	//::GetSystemTime(&st);
	//srand((unsigned)st.wMilliseconds);
	
	srand(GetTickCount()*GetTickCount());

	Square_Kind=rand()%7+1;//generates pseudorandom between 1-7.
	//for test goal:
	//	Square_Kind=2;
	switch(Square_Kind)
	{
	case 1:									  
		square=m_1square;				  
		break;
	case 2:									  
		square=m_2square;
		break;
	case 3:									 
		square=m_3square;		  
		break;
	case 4:									  
		square=m_4square;				  
		break;
	case 5:									 
		square=m_5square;				  
		break;
	case 6:								
		square=m_6square;				
		break;
	case 7:								
		square=m_7square;				
		break;
	}
	square->Init();
	//画提示方块(即下一个将要出现的是什么)
	DrawPromptSquare(Square_Kind);
}



void CRussianView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
	// TODO: Add your specialized code here and/or call the base class
	long lwStyle = ::GetWindowLong(GetSafeHwnd(), GWL_STYLE);
			lwStyle &= ~WS_VSCROLL;
				lwStyle &= ~WS_HSCROLL;
			::SetWindowLong(GetSafeHwnd(), GWL_STYLE, lwStyle);

	
}

//全局变量的初始化:
void CRussianView::InitGlobal()
{
	for(int i=0;i<xGrid;i++)
	for(int j=0;j<yGrid;j++)
		array[i][j]=0;
	
	Score_Level.TotalScore=0;
	Score_Level.UnitScore=10;
	Score_Level.nRemoveRow=0;
	Score_Level.nTotalRemoveRow=0;
	Score_Level.Level=0;
	Score_Level.nLevelRow=2;
}

void CRussianView::OnButtonUp() 
{
	if(!bHaveTimer)
		return;
	if(square==NULL)return;
	CDC *pDC=GetDC();
	square->Rotate(pDC);
	ReleaseDC(pDC);
}

void CRussianView::OnButtonDown() 
{
	if(!bHaveTimer)
		return;
	int status=0;//用于记录游戏状态

	if(square==NULL)return;
	CDC *pDC=GetDC();
	if(square!=NULL)
		{
			for(;;)
			{
			status=square->Down(pDC);
			if(!status)//0:不能继续下落(遇到障碍物或到底,但方格未顶到头)
				{
				OnButtonStart();
				return;
				}
			if(status==2)//方格顶到头
				{
				KillTimer(nTimeID);
				bHaveTimer=false;
				AfxMessageBox(_T("游戏结束"));
				//记录对话框(记录玩家信息)
				AppendRecord();
				pDC->FillRect(&rect,&WhiteBrush);
				m_nStartSpeed=1000;//复位起始速度
				InitGlobal();
				return;
				}
			}
		}
	ReleaseDC(pDC);
}

void CRussianView::OnButtonLeft() 
{
	if(!bHaveTimer)
		return;

	if(square==NULL)return;
	CDC *pDC=GetDC();
	square->Left(pDC);
	ReleaseDC(pDC);	
}

void CRussianView::OnButtonRight() 
{
	if(!bHaveTimer)
		return;

	if(square==NULL)return;
	CDC *pDC=GetDC();
	square->Right(pDC);
	ReleaseDC(pDC);	
}

void CRussianView::OnPause() 
{
	KillTimer(nTimeID);
	bHaveTimer=false;

	HWND hWnd=((CMainFrame*)(AfxGetApp()->m_pMainWnd))->m_hCommandBar;
	::SendMessage(hWnd,TB_ENABLEBUTTON,IDM_PAUSE,MAKELONG(false,0));
	::SendMessage(hWnd,TB_ENABLEBUTTON,IDM_CONTINUE,MAKELONG(1,0));
	::SendMessage(hWnd,TB_ENABLEBUTTON,IDM_REPLAY,MAKELONG(0,0));
	GetDlgItem(IDC_BUTTON_DOWN)->EnableWindow(0);
	GetDlgItem(IDC_BUTTON_UP)->EnableWindow(0);
	GetDlgItem(IDC_BUTTON_LEFT)->EnableWindow(0);
	GetDlgItem(IDC_BUTTON_RIGHT)->EnableWindow(0);

}

void CRussianView::OnReplay() 
{
	KillTimer(nTimeID);
	bHaveTimer=false;
	CDC* pDC=GetDC();
	pDC->FillRect(&rect,&WhiteBrush);
	ReleaseDC(pDC);
	m_nStartSpeed=1000;//复位起始速度
	InitGlobal();
	OnButtonStart();
}

void CRussianView::OnStart() 
{
	HWND hWnd=((CMainFrame*)(AfxGetApp()->m_pMainWnd))->m_hCommandBar;
	::SendMessage(hWnd,TB_ENABLEBUTTON,IDM_START,MAKELONG(false,0));
	OnButtonStart();

	::SendMessage(hWnd,TB_ENABLEBUTTON,IDM_PAUSE,MAKELONG(1,0));
	::SendMessage(hWnd,TB_ENABLEBUTTON,IDM_CONTINUE,MAKELONG(0,0));
	::SendMessage(hWnd,TB_ENABLEBUTTON,IDM_REPLAY,MAKELONG(1,0));
	GetDlgItem(IDC_BUTTON_DOWN)->EnableWindow(1);
	GetDlgItem(IDC_BUTTON_UP)->EnableWindow(1);
	GetDlgItem(IDC_BUTTON_LEFT)->EnableWindow(1);
	GetDlgItem(IDC_BUTTON_RIGHT)->EnableWindow(1);

}


void CRussianView::OnContinue() 
{
	SetTimer(nTimeID,m_nStartSpeed,NULL);
	bHaveTimer=true;

	HWND hWnd=((CMainFrame*)(AfxGetApp()->m_pMainWnd))->m_hCommandBar;
	::SendMessage(hWnd,TB_ENABLEBUTTON,IDM_PAUSE,MAKELONG(1,0));
	::SendMessage(hWnd,TB_ENABLEBUTTON,IDM_CONTINUE,MAKELONG(0,0));
	::SendMessage(hWnd,TB_ENABLEBUTTON,IDM_REPLAY,MAKELONG(1,0));
	GetDlgItem(IDC_BUTTON_DOWN)->EnableWindow(1);
	GetDlgItem(IDC_BUTTON_UP)->EnableWindow(1);
	GetDlgItem(IDC_BUTTON_LEFT)->EnableWindow(1);
	GetDlgItem(IDC_BUTTON_RIGHT)->EnableWindow(1);

}




void CRussianView::AppendRecord()
{
	CPlayerDlg dlg;
	dlg.DoModal();
	if(dlg.m_name.IsEmpty())
		return;
		//dlg.m_name=_T("No Name");
	m_PlayerName=dlg.m_name;
	m_Score=Score_Level.TotalScore;
	m_pValProp[0]=CCeDBProp((LPWSTR)(LPCTSTR)m_PlayerName,PROP_NAME);
	m_pValProp[1]=CCeDBProp(m_Score,PROP_SCORE);
	m_Record.AddProps(m_pValProp,2);
	m_DBPlayer.AddRecord(&m_Record);
	m_Record.DeleteAllProps();
}

void CRussianView::OnPlayer() 
{
	CPlayerHistoryDlg dlg(this);
	dlg.DoModal();
}


void CRussianView::OnDelete() 
{
	m_DBPlayer.Delete();	
}

void CRussianView::OnInitialUpdate() 
{
	CFormView::OnInitialUpdate();
	
	VERIFY(leftButton.AutoLoad(IDC_BUTTON_LEFT, this));
	VERIFY(rightButton.AutoLoad(IDC_BUTTON_RIGHT, this));
	VERIFY(upButton.AutoLoad(IDC_BUTTON_UP, this));
	VERIFY(downButton.AutoLoad(IDC_BUTTON_DOWN, this));
/*	//打开游戏数据库:
	if(!CCeDBDatabase::Exists(_T("\\Square_Player.cd")))
		m_DBPlayer.Create(_T("\\Square_Player.cd"),1976723,2,m_pSortProp);
	if(!m_DBPlayer.Open(_T("\\Square_Player.cd"),&m_pSortProp[1]))
		if(AfxMessageBox(_T("打开游戏数据库出错,\n您是否继续?"),MB_YESNO)!=IDYES)
			SendMessage(WM_QUIT);
*/
	HWND hWnd=((CMainFrame*)(AfxGetApp()->m_pMainWnd))->m_hCommandBar;
	::SendMessage(hWnd,TB_ENABLEBUTTON,IDM_PAUSE,MAKELONG(false,0));
	::SendMessage(hWnd,TB_ENABLEBUTTON,IDM_CONTINUE,MAKELONG(false,0));
	::SendMessage(hWnd,TB_ENABLEBUTTON,IDM_REPLAY,MAKELONG(false,0));
	GetDlgItem(IDC_BUTTON_DOWN)->EnableWindow(0);
	GetDlgItem(IDC_BUTTON_UP)->EnableWindow(0);
	GetDlgItem(IDC_BUTTON_LEFT)->EnableWindow(0);
	GetDlgItem(IDC_BUTTON_RIGHT)->EnableWindow(0);
}

void CRussianView::OnDraw(CDC* pDC) 
{
}

void CRussianView::DrawPromptSquare(int Square_Kind)
{
	CBitmap bmp;
	if(!bmp.LoadBitmap(Square_Kind+1999))
	{
	//AfxMessageBox(_T("Cann't load bitmap!"));
	return;
	}
	
	CDC* pDC=GetDlgItem(IDC_PROMPTFRAME)->GetDC();
	//GetDlgItem(IDC_PROMPTFRAME)->GetWindowRect(&PromptFrame);
	::GetClientRect(GetDlgItem(IDC_PROMPTFRAME)->GetSafeHwnd(),&PromptFrame); 
	CBrush black(RGB(255,255,255));
	pDC->FillRect(&PromptFrame,&black);
	CDC MemDC;
	MemDC.CreateCompatibleDC(pDC);
	CBitmap* pOrgBmp=MemDC.SelectObject(&bmp);
	
//	pDC->BitBlt(PromptFrame.left,PromptFrame.top,PromptFrame.Width(),PromptFrame.Height(),&MemDC,0,0,SRCCOPY);
pDC->StretchBlt(PromptFrame.left+PromptFrame.Width()/4,PromptFrame.top+PromptFrame.Height()/4,
				PromptFrame.Width()/2,PromptFrame.Height()/2,&MemDC,PromptFrame.left,PromptFrame.top,PromptFrame.Width(),PromptFrame.Height(),SRCCOPY);
  

	MemDC.SelectObject(pOrgBmp);
	bmp.DeleteObject();

	GetDlgItem(IDC_PROMPTFRAME)->ReleaseDC(pDC);
}

void CRussianView::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	dc.Rectangle(ulPosx,ulPosy,
				   ulPosx+frmwidth*2+xGrid*mWidth,
				   ulPosy+frmwidth*2+yGrid*mHeight);
	// Do not call CFormView::OnPaint() for painting messages
	DrawPromptSquare(Square_Kind);

}

void CRussianView::OnExit() 
{
	//SendMessage(WM_CLOSE);	
	PostQuitMessage(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -