?? hwrectview.cpp
字號(hào):
// HWRECTView.cpp : implementation of the CHWRECTView class
//
#include "stdafx.h"
#include "HWRECT.h"
#include "OptionDlg.h"
#include "mmsystem.h"
#include "HWRECTDoc.h"
#include "HWRECTView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CHWRECTView
IMPLEMENT_DYNCREATE(CHWRECTView, CView)
BEGIN_MESSAGE_MAP(CHWRECTView, CView)
//{{AFX_MSG_MAP(CHWRECTView)
ON_WM_KEYDOWN()
ON_WM_TIMER()
ON_COMMAND(ID_GAME_START, OnGameStart)
ON_COMMAND(ID_GAME_END, OnGameEnd)
ON_COMMAND(ID_GAME_OPTION, OnGameOption)
ON_UPDATE_COMMAND_UI(ID_GAME_START, OnUpdateGameStart)
ON_UPDATE_COMMAND_UI(ID_GAME_OPTION, OnUpdateGameOption)
ON_UPDATE_COMMAND_UI(ID_GAME_END, OnUpdateGameEnd)
ON_UPDATE_COMMAND_UI(ID_GAME_EXIT, OnUpdateGameExit)
ON_UPDATE_COMMAND_UI(ID_HELP_ABOUT, OnUpdateHelpAbout)
ON_UPDATE_COMMAND_UI(ID_HELP_HELP, OnUpdateHelpHelp)
ON_WM_CREATE()
ON_COMMAND(ID_HELP_HELP, OnHelpHelp)
ON_UPDATE_COMMAND_UI(ID_OPTION_AREA1, OnUpdateOptionArea1)
ON_UPDATE_COMMAND_UI(ID_OPTION_AREA2, OnUpdateOptionArea2)
ON_UPDATE_COMMAND_UI(ID_OPTION_AREA3, OnUpdateOptionArea3)
ON_UPDATE_COMMAND_UI(ID_OPTION_AREA4, OnUpdateOptionArea4)
ON_COMMAND(ID_OPTION_AREA1, OnOptionArea1)
ON_COMMAND(ID_OPTION_AREA2, OnOptionArea2)
ON_COMMAND(ID_OPTION_AREA3, OnOptionArea3)
ON_COMMAND(ID_OPTION_AREA4, OnOptionArea4)
ON_UPDATE_COMMAND_UI(ID_OPTION_LEVEL1, OnUpdateOptionLevel1)
ON_UPDATE_COMMAND_UI(ID_OPTION_LEVEL2, OnUpdateOptionLevel2)
ON_UPDATE_COMMAND_UI(ID_OPTION_LEVEL3, OnUpdateOptionLevel3)
ON_UPDATE_COMMAND_UI(ID_OPTION_LEVEL4, OnUpdateOptionLevel4)
ON_UPDATE_COMMAND_UI(ID_OPTION_LEVEL5, OnUpdateOptionLevel5)
ON_UPDATE_COMMAND_UI(ID_OPTION_LEVEL6, OnUpdateOptionLevel6)
ON_COMMAND(ID_OPTION_LEVEL1, OnOptionLevel1)
ON_COMMAND(ID_OPTION_LEVEL2, OnOptionLevel2)
ON_COMMAND(ID_OPTION_LEVEL3, OnOptionLevel3)
ON_COMMAND(ID_OPTION_LEVEL4, OnOptionLevel4)
ON_COMMAND(ID_OPTION_LEVEL5, OnOptionLevel5)
ON_COMMAND(ID_OPTION_LEVEL6, OnOptionLevel6)
ON_UPDATE_COMMAND_UI(ID_OPTION_GRID, OnUpdateOptionGrid)
ON_COMMAND(ID_OPTION_GRID, OnOptionGrid)
ON_UPDATE_COMMAND_UI(ID_OPTION_MUSIC, OnUpdateOptionMusic)
ON_COMMAND(ID_OPTION_MUSIC, OnOptionMusic)
ON_UPDATE_COMMAND_UI(ID_GAME_PAUSH, OnUpdateGamePaush)
ON_COMMAND(ID_GAME_PAUSH, OnGamePaush)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHWRECTView construction/destruction
/* * * * * * * * * * * * * * * * * * * * * * * * *
*
* 名稱:構(gòu)造函數(shù)
*
* 功能:初始化變量
*
* 最后修改時(shí)間:1999.3.22
*
* * * * * * * * * * * * * * * * * * * * * * * * */
CHWRECTView::CHWRECTView()
{
//缺省為不是游戲暫停狀態(tài)
m_bGamePaush = FALSE;
//缺省為不插放背景音樂(lè)
m_bMusic = FALSE;
//缺省為畫(huà)網(wǎng)格線
m_bDrawGrid = TRUE;
//總分值清零
m_iPerformance = 0;
//測(cè)試值:為12行,10列
m_iRow = 12;
m_iCol = 10;
//左上角X,Y坐標(biāo)
m_iStartX = 10;
m_iStartY = 10;
//缺省級(jí)別為3級(jí)
m_iLevel = 2;
//缺省方塊大小為m_iLarge個(gè)象素
m_iLarge = 30;
//缺省游戲是結(jié)束的
m_bGameEnd = TRUE;
int i,j;
//賦初值
for (i=0;i<100;i++)
for (j=0;j<100;j++)
GameStatus[i][j]=0;
//各種形狀方塊的接觸面數(shù)據(jù),參見(jiàn)設(shè)計(jì)書(shū)的接觸面表格, 如果某種形狀的方塊沒(méi)有4個(gè)接觸面,則后面的數(shù)據(jù)填-1
for (i=0;i<74;i++)
for (j=0;j<4;j++)
InterFace[i][j] = -1;
InterFace[1][0] = 3;
InterFace[11][0] = 0; InterFace[11][1] = 1; InterFace[11][2] = 2; InterFace[11][3] = 3;
InterFace[2][0] = 1; InterFace[2][1] = 3;
InterFace[3][0] = 0; InterFace[3][1] = 2; InterFace[3][2] = 3;
InterFace[31][0] = 2; InterFace[31][1] = 3;
InterFace[32][0] = 0; InterFace[32][1] = 2; InterFace[32][2] = 3;
InterFace[33][0] = 0; InterFace[33][1] = 3;
InterFace[4][0] = 1; InterFace[4][1] = 3;
InterFace[41][0] = 0; InterFace[41][1] = 2; InterFace[41][2] = 3;
InterFace[5][0] = 1; InterFace[5][1] = 3;
InterFace[51][0] = 0; InterFace[51][1] = 2; InterFace[51][2] = 3;
InterFace[6][0] = 0; InterFace[6][1] = 3;
InterFace[61][0] = 1; InterFace[61][1] = 2; InterFace[61][2] = 3;
InterFace[62][0] = 2; InterFace[62][1] = 3;
InterFace[63][0] = 0; InterFace[63][1] = 1; InterFace[63][2] = 3;
InterFace[7][0] = 2; InterFace[7][1] = 3;
InterFace[71][0] = 1; InterFace[71][1] = 2; InterFace[71][2] = 3;
InterFace[72][0] = 0; InterFace[72][1] = 3;
InterFace[73][0] = 0; InterFace[73][1] = 1; InterFace[73][2] = 3;
}
/* * * * * * * * * * * * * * * * * * * * * * * * *
*
* 名稱:析構(gòu)函數(shù)
*
* 功能:無(wú)
*
* 最后修改時(shí)間:1999.3.22
*
* * * * * * * * * * * * * * * * * * * * * * * * */
CHWRECTView::~CHWRECTView()
{
}
BOOL CHWRECTView::PreCreateWindow(CREATESTRUCT& cs)
{
return CView::PreCreateWindow(cs);
}
//創(chuàng)建一些設(shè)備
int CHWRECTView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
//白色的黑筆
whitePen = new CPen(PS_SOLID,1,WHITE);
//黑色的黑筆
blackPen = new CPen(PS_SOLID,1,BLACK);
//畫(huà)刷
grayBrush = new CBrush(RGB(0,255,255));
blueBrush = new CBrush(BLUE);
blackBrush = new CBrush(BLACK);
//決定第一次掉下來(lái)的方塊的樣式
m_inextStatus = Random(7);
if (m_inextStatus==0) m_inextStatus++;
return 0;
}
/* * * * * * * * * * * * * * * * * * * * * * * * *
*
* 名稱:OnDraw
*
* 功能:承擔(dān)所有繪制屏幕工作
*
* 最后修改時(shí)間:1999.3.22
*
* * * * * * * * * * * * * * * * * * * * * * * * */
void CHWRECTView::OnDraw(CDC* pDC)
{
CHWRECTDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int i,j;
//CBrush *oldBrush =
pDC -> SelectObject(blackBrush);
CRect rect;
GetClientRect(&rect);
pDC -> Rectangle(rect);
pDC -> SelectObject(grayBrush);
pDC -> Rectangle(m_iStartY ,m_iStartX, m_iStartY + 301, m_iStartX + 360);
pDC -> SelectObject(blueBrush);
//CPen *oldPen =
pDC->SelectObject(blackPen);
//畫(huà)網(wǎng)格線
if (m_bDrawGrid)
{
//畫(huà)橫線
for (i=0;i<m_iRow;i++)
{
pDC->MoveTo(m_iStartY, m_iStartX + i*m_iLarge);
pDC->LineTo(m_iStartY+300, m_iStartX +i*m_iLarge);
}
//畫(huà)豎線
for (i=0;i<m_iCol;i++)
{
pDC->MoveTo(m_iStartY+i*m_iLarge, m_iStartX);
pDC->LineTo(m_iStartY+i*m_iLarge, m_iStartX+360);
}
}
//畫(huà)方塊
for (i=0;i<m_iRow;i++)
for (j=0;j<m_iCol;j++)
{
if (GameStatus[i][j]==1)
{
//劃的方塊比規(guī)定的大小略微小一點(diǎn)
//畫(huà)小方塊邊框黑線
pDC -> SelectObject(blackPen);
pDC -> MoveTo(m_iStartY+j*m_iLarge +1, m_iStartX+i*m_iLarge +1);
pDC -> LineTo(m_iStartY+j*m_iLarge +1, m_iStartX+(i+1)*m_iLarge -1);
pDC -> MoveTo(m_iStartY+j*m_iLarge +1, m_iStartX+(i+1)*m_iLarge -1);
pDC -> LineTo(m_iStartY+(j+1)*m_iLarge -1, m_iStartX+(i+1)*m_iLarge -1);
//畫(huà)小方塊邊框白線
pDC -> SelectObject(whitePen);
pDC -> MoveTo(m_iStartY+j*m_iLarge +1, m_iStartX+i*m_iLarge +1);
pDC -> LineTo(m_iStartY+(j+1)*m_iLarge -1,m_iStartX+i*m_iLarge +1);
pDC -> MoveTo(m_iStartY+(j+1)*m_iLarge -1,m_iStartX+i*m_iLarge +1);
pDC -> LineTo(m_iStartY+(j+1)*m_iLarge -1,m_iStartX+(i+1)*m_iLarge -1);
//每個(gè)方塊填充綠色的背景
pDC -> Rectangle(m_iStartY+j*m_iLarge +2,m_iStartX+i*m_iLarge +2,m_iStartY+(j+1)*m_iLarge -2,m_iStartX+(i+1)*m_iLarge -2);
}
}
//顯示游戲區(qū)域及游戲級(jí)別的漢字描述
if (!m_bGameEnd)
{
pDC -> SetBkColor(BLACK);
pDC -> SetTextColor(WHITE);
pDC -> TextOut(m_iStartY+320, m_iStartX+220, "游戲區(qū)域大小:");
pDC -> TextOut(m_iStartY+320, m_iStartX+240,m_strArea);
pDC -> TextOut(m_iStartY+320, m_iStartX+280, "游戲級(jí)別:");
pDC -> TextOut(m_iStartY+320, m_iStartX+300,m_strLevel);
}
//顯示總分
if (!m_bGameEnd)
{
CString lsStr;
lsStr.Format("總分為:%d 分",m_iPerformance);
pDC -> SetBkColor(BLACK);
pDC -> SetTextColor(WHITE);
pDC -> TextOut(m_iStartY+320, m_iStartX+180,lsStr);
}
//畫(huà)下一次將要出現(xiàn)的方塊,用于提示用戶
if (!m_bGameEnd)
{
pDC -> SetBkColor(BLACK);
pDC -> SetTextColor(WHITE);
pDC -> TextOut(m_iStartY+320, m_iStartX,"下一個(gè)方塊:");
for (UINT k=0;k<4;k++)
{
i = NextStatus[k][0];
j = NextStatus[k][1];
//劃的方塊比規(guī)定的大小略微小一點(diǎn)
//畫(huà)小方塊邊框黑線
pDC -> SelectObject(blackPen);
pDC -> MoveTo(m_iStartY+j*30 +1+320, m_iStartX+i*30 +1+30);
pDC -> LineTo(m_iStartY+j*30 +1+320, m_iStartX+(i+1)*30 -1+30);
pDC -> MoveTo(m_iStartY+j*30 +1+320, m_iStartX+(i+1)*30 -1+30);
pDC -> LineTo(m_iStartY+(j+1)*30 -1+320, m_iStartX+(i+1)*30 -1+30);
//畫(huà)小方塊邊框白線
pDC -> SelectObject(whitePen);
pDC -> MoveTo(m_iStartY+j*30 +1+320, m_iStartX+i*30 +1+30);
pDC -> LineTo(m_iStartY+(j+1)*30 -1+320, m_iStartX+i*30 +1+30);
pDC -> MoveTo(m_iStartY+(j+1)*30 -1+320, m_iStartX+i*30 +1+30);
pDC -> LineTo(m_iStartY+(j+1)*30 -1+320, m_iStartX+(i+1)*30 -1+30);
//每個(gè)方塊填充藍(lán)色的背景
pDC -> Rectangle(m_iStartY+j*30 +2+320,m_iStartX+i*30 +2+30,
m_iStartY+(j+1)*30 -2+320,m_iStartX+(i+1)*30 -2+30);
}
}
// pDC -> SelectObject(oldPen);
// pDC -> SelectObject(oldBrush);
}
/////////////////////////////////////////////////////////////////////////////
// CHWRECTView diagnostics
#ifdef _DEBUG
void CHWRECTView::AssertValid() const
{
CView::AssertValid();
}
void CHWRECTView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CHWRECTDoc* CHWRECTView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CHWRECTDoc)));
return (CHWRECTDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CHWRECTView message handlers
/* * * * * * * * * * * * * * * * * * * * * * * * *
*
* 名稱:OnTimer
*
* 功能:承擔(dān)所有驅(qū)動(dòng)工作
*
* 最后修改時(shí)間:1999.3.22
*
* * * * * * * * * * * * * * * * * * * * * * * * */
void CHWRECTView::OnTimer(UINT nIDEvent)
{
//如果原來(lái)的方塊已到底或游戲剛開(kāi)始,則掉下一個(gè)新的方塊
int i,j,k;
if (m_isBottom)
{
m_icurrentStatus = m_inextStatus;
m_inextStatus = Random(7); //得到下一次的方塊樣式
if (m_inextStatus==0) m_inextStatus++;
m_currentRect = m_icurrentStatus; //當(dāng)前落下的方塊的形狀代碼
RectStatusToActiveStatus( m_icurrentStatus );
ActiveStatusToGameStatus();
m_isBottom = FALSE;
ActiveIsBottom();
InvalidateCurrent();
//在屏幕右邊顯示下一次將會(huì)出來(lái)的方塊的模樣
RectStatusToNextStatus( m_inextStatus );
CRect rect(m_iStartY+320, m_iStartX, m_iStartY+440, m_iStartX+160);
InvalidateRect(&rect);
//判斷游戲是否已結(jié)束: 碰了底,且第1行有小方塊
if (m_isBottom)
for (i=0;i<m_iCol;i++)
if (GameStatus[0][i])
{
KillTimer(1);
AfxMessageBox("游戲已結(jié)束!");
for (j=0;j<m_iRow;j++)
for (k=0;k<m_iCol;k++)
GameStatus[j][k]=0;
Invalidate();
m_bGameEnd = TRUE;
break;
}
}
else //當(dāng)前方塊下降
{
RectDown();
}
CView::OnTimer(nIDEvent);
}
/* * * * * * * * * * * * * * * * * * * * * *
* 內(nèi)部函數(shù):產(chǎn)生一個(gè)最大值不大于指定值的隨機(jī)整數(shù)(Random)
*
* 參數(shù):MaxNumber : 隨機(jī)數(shù)的上限
*
* 返回值: 產(chǎn)生的隨機(jī)數(shù)
*
* 最后修改日期:1999.1.22
* * * * * * * * * * * * * * * * * * * * * */
int CHWRECTView::Random(int MaxNumber)
{
int currentClock = (int)clock();
srand(currentClock);
return (rand() % MaxNumber);
}
/* * * * * * * * * * * * * * * * * * * * * *
* 內(nèi)部函數(shù):將當(dāng)前動(dòng)態(tài)數(shù)組中的數(shù)據(jù)反映到大數(shù)組中
*
* 最后修改日期:1999.1.22
* * * * * * * * * * * * * * * * * * * * * */
void CHWRECTView::ActiveStatusToGameStatus()
{
int x1,x2,x3,x4,y1,y2,y3,y4;
x1 = ActiveStatus[0][0];
x2 = ActiveStatus[1][0];
x3 = ActiveStatus[2][0];
x4 = ActiveStatus[3][0];
y1 = ActiveStatus[0][1];
y2 = ActiveStatus[1][1];
y3 = ActiveStatus[2][1];
y4 = ActiveStatus[3][1];
GameStatus[x1][y1]=1;
GameStatus[x2][y2]=1;
GameStatus[x3][y3]=1;
GameStatus[x4][y4]=1;
}
/* * * * * * * * * * * * * * * * * * * * * *
* 內(nèi)部函數(shù):初始掉落時(shí),將根據(jù)方塊的樣式?jīng)Q定當(dāng)前動(dòng)態(tài)數(shù)組的值
*
* 最后修改日期:1999.1.22
* * * * * * * * * * * * * * * * * * * * * */
void CHWRECTView::RectStatusToActiveStatus(int m_which)
{
switch(m_which)
{
case 1:
ActiveStatus[0][0] = 0; ActiveStatus[0][1] = 5; ActiveStatus[1][0] = 1; ActiveStatus[1][1] = 5;
ActiveStatus[2][0] = 2; ActiveStatus[2][1] = 5; ActiveStatus[3][0] = 3; ActiveStatus[3][1] = 5;
break;
case 2:
ActiveStatus[0][0] = 0; ActiveStatus[0][1] = 5; ActiveStatus[1][0] = 1; ActiveStatus[1][1] = 5;
ActiveStatus[2][0] = 0; ActiveStatus[2][1] = 6; ActiveStatus[3][0] = 1; ActiveStatus[3][1] = 6;
break;
case 3:
ActiveStatus[0][0] = 1; ActiveStatus[0][1] = 4; ActiveStatus[1][0] = 0; ActiveStatus[1][1] = 5;
ActiveStatus[2][0] = 1; ActiveStatus[2][1] = 5; ActiveStatus[3][0] = 1; ActiveStatus[3][1] = 6;
break;
case 4:
ActiveStatus[0][0] = 0; ActiveStatus[0][1] = 5; ActiveStatus[1][0] = 1; ActiveStatus[1][1] = 5;
ActiveStatus[2][0] = 1; ActiveStatus[2][1] = 6; ActiveStatus[3][0] = 2; ActiveStatus[3][1] = 6;
break;
case 5:
ActiveStatus[0][0] = 1; ActiveStatus[0][1] = 5; ActiveStatus[1][0] = 2; ActiveStatus[1][1] = 5;
ActiveStatus[2][0] = 0; ActiveStatus[2][1] = 6; ActiveStatus[3][0] = 1; ActiveStatus[3][1] = 6;
break;
case 6:
ActiveStatus[0][0] = 0; ActiveStatus[0][1] = 5; ActiveStatus[1][0] = 0; ActiveStatus[1][1] = 6;
ActiveStatus[2][0] = 1; ActiveStatus[2][1] = 6; ActiveStatus[3][0] = 2; ActiveStatus[3][1] = 6;
break;
case 7:
ActiveStatus[0][0] = 0; ActiveStatus[0][1] = 5; ActiveStatus[1][0] = 1; ActiveStatus[1][1] = 5;
ActiveStatus[2][0] = 2; ActiveStatus[2][1] = 5; ActiveStatus[3][0] = 0; ActiveStatus[3][1] = 6;
break;
}
}
/* * * * * * * * * * * * * * * * * * * * * *
* 內(nèi)部函數(shù):初始掉落時(shí),將根據(jù)方塊的樣式?jīng)Q定下一次將要掉下來(lái)的動(dòng)態(tài)數(shù)組的值
*
* 最后修改日期:1999.1.22
* * * * * * * * * * * * * * * * * * * * * */
void CHWRECTView::RectStatusToNextStatus(int m_which)
{
switch(m_which)
{
case 1:
NextStatus[0][0] = 0; NextStatus[0][1] = 1; NextStatus[1][0] = 1; NextStatus[1][1] = 1;
NextStatus[2][0] = 2; NextStatus[2][1] = 1; NextStatus[3][0] = 3; NextStatus[3][1] = 1;
break;
case 2:
NextStatus[0][0] = 0; NextStatus[0][1] = 1; NextStatus[1][0] = 1; NextStatus[1][1] = 1;
NextStatus[2][0] = 0; NextStatus[2][1] = 2; NextStatus[3][0] = 1; NextStatus[3][1] = 2;
break;
case 3:
NextStatus[0][0] = 1; NextStatus[0][1] = 0; NextStatus[1][0] = 0; NextStatus[1][1] = 1;
NextStatus[2][0] = 1; NextStatus[2][1] = 1; NextStatus[3][0] = 1; NextStatus[3][1] = 2;
break;
case 4:
NextStatus[0][0] = 0; NextStatus[0][1] = 1; NextStatus[1][0] = 1; NextStatus[1][1] = 1;
NextStatus[2][0] = 1; NextStatus[2][1] = 2; NextStatus[3][0] = 2; NextStatus[3][1] = 2;
break;
case 5:
NextStatus[0][0] = 1; NextStatus[0][1] = 1; NextStatus[1][0] = 2; NextStatus[1][1] = 1;
NextStatus[2][0] = 0; NextStatus[2][1] = 2; NextStatus[3][0] = 1; NextStatus[3][1] = 2;
break;
case 6:
NextStatus[0][0] = 0; NextStatus[0][1] = 1; NextStatus[1][0] = 0; NextStatus[1][1] = 2;
NextStatus[2][0] = 1; NextStatus[2][1] = 2; NextStatus[3][0] = 2; NextStatus[3][1] = 2;
break;
case 7:
NextStatus[0][0] = 0; NextStatus[0][1] = 1; NextStatus[1][0] = 1; NextStatus[1][1] = 1;
NextStatus[2][0] = 2; NextStatus[2][1] = 1; NextStatus[3][0] = 0; NextStatus[3][1] = 2;
break;
}
}
/* * * * * * * * * * * * * * * * * * * * * *
* 內(nèi)部函數(shù):當(dāng)前方塊下降
*
* 最后修改日期:1999.1.22
* * * * * * * * * * * * * * * * * * * * * */
void CHWRECTView::RectDown()
{
ActiveIsBottom();
if (!m_isBottom)
{
//清除以前的方塊
int x1,x2,x3,x4,y1,y2,y3,y4;
x1 = ActiveStatus[0][0];
x2 = ActiveStatus[1][0];
x3 = ActiveStatus[2][0];
x4 = ActiveStatus[3][0];
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -