📄 russianview.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 + -