?? hgameview.cpp
字號:
// HGAMEView.cpp : CHGAMEView 類的實現
//
#include "stdafx.h"
#include "HGAME.h"
#include "HGAMEDoc.h"
#include "HGAMEView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CHGAMEView
IMPLEMENT_DYNCREATE(CHGAMEView, CView)
BEGIN_MESSAGE_MAP(CHGAMEView, CView)
//{{AFX_MSG_MAP(CSkyblue_RectView)
ON_COMMAND(ID_GAME_EXIT, OnGameExit)
ON_COMMAND(ID_HELP_ABOUT, OnHelpAbout)
//}}AFX_MSG_MAP
// Standard printing commands
ON_WM_KEYDOWN()
ON_WM_TIMER()
ON_COMMAND(ID_GAME_START, OnGameStart)
ON_COMMAND(ID_GAME_END, OnGameEnd)
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_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_GAME_PAUSH, OnUpdateGamePaush)
ON_COMMAND(ID_GAME_PAUSH, OnGamePaush)
END_MESSAGE_MAP()
// CHGAMEView 構造/析構
CHGAMEView::CHGAMEView()
{
// TODO: 在此處添加構造代碼
//第一次開始游戲
m_bFistPlay = TRUE;
//缺省為不是游戲暫停狀態
m_bGamePaush = FALSE;
//缺省為畫網格線
m_bDrawGrid = TRUE;
//總分值清零
m_iPerformance = 0;
//測試值:為12行,10列
m_iRow = 12;
m_iCol = 10;
//左上角X,Y坐標
m_iStartX = 10;
m_iStartY = 10;
//缺省級別為3級
m_iLevel = 2;
//第一種樣式
m_iBlockSytle = 0;
//缺省方塊大小為m_iLarge個象素
m_iLarge = 30;
//缺省游戲是結束的
m_bGameEnd = TRUE;
int i,j;
//賦初值
for (i=0;i<100;i++)
for (j=0;j<100;j++)
GameStatus[i][j]=0;
//各種形狀方塊的接觸面數據
//如果某種形狀的方塊沒有4個接觸面,則后面的數據填-1
for (i=0;i<74;i++)
for (j=0;j<4;j++)
InterFace[i][j] = -1;
/*
1 ----
*/
InterFace[1][0] = 3;
InterFace[11][0] = 0; InterFace[11][1] = 1; InterFace[11][2] = 2; InterFace[11][3] = 3;
/*
2 --
--
*/
InterFace[2][0] = 1; InterFace[2][1] = 3;
/*
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;
/*
4 --
--
*/
InterFace[4][0] = 1; InterFace[4][1] = 3;
InterFace[41][0] = 0; InterFace[41][1] = 2; InterFace[41][2] = 3;
/*
5 --
--
*/
InterFace[5][0] = 1; InterFace[5][1] = 3;
InterFace[51][0] = 0; InterFace[51][1] = 2; InterFace[51][2] = 3;
/*
6 --
-
-
*/
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;
/*
7 --
-
-
*/
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;
}
CHGAMEView::~CHGAMEView()
{
}
BOOL CHGAMEView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此處通過修改
// CREATESTRUCT cs 來修改窗口類或樣式
return CView::PreCreateWindow(cs);
}
int CHGAMEView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
//決定第一次掉下來的方塊的樣式
m_inextStatus = Random(7);
return 0;
}
// CHGAMEView 繪制
void CHGAMEView::OnDraw(CDC* pDC)
{
CHGAMEDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此處為本機數據添加繪制代碼
DcEnvInitial();
DrawGame(&m_memDC); //在內存位圖的游戲區域繪制
pDC->BitBlt(0,0,m_nWidth,m_nHeight,&m_memDC,0,0,SRCCOPY);
}
void CHGAMEView::DcEnvInitial(void)
{
if(m_bFistPlay)
{
m_bFistPlay = FALSE;
//用默認的參數,獲取當前屏幕設備環境
CDC *pWindowDC = GetDC();
//1.用于映射屏幕的內存設備環境
//獲取游戲窗口的大小用于下面設置內存位圖的尺寸
CRect windowRect;
GetClientRect(&windowRect);
m_nWidth = windowRect.Width();
m_nHeight = windowRect.Height();
//內存設備環境與屏幕設備環境關聯(兼容)
m_memDC.CreateCompatibleDC(pWindowDC);
//內存位圖與與屏幕關聯(兼容),大小為游戲窗口的尺寸
m_memBmp.CreateCompatibleBitmap(pWindowDC,m_nWidth,m_nHeight);
//內存設備環境與內存位圖關聯,以便通過m_memDC在內存位圖上作畫
m_memDC.SelectObject(&m_memBmp);
//2.存儲方塊位圖的內存資源
//內存設備環境與屏幕設備環境關聯(兼容)
m_memRectDC.CreateCompatibleDC(pWindowDC);
//相當于將外部位圖rect.bmp動態載入m_hMemRectBmp中
m_hMemRectBmp=(HBITMAP)LoadImage(NULL,L"rect.bmp",IMAGE_BITMAP,30,30,LR_LOADFROMFILE);
//內存設備環境與內存位圖關聯,以便通過m_memDC在內存位圖上作畫
SelectObject(m_memRectDC.m_hDC, m_hMemRectBmp);
//黑色的黑筆
m_pBlackPen = new CPen(PS_SOLID,1,BLACK);
//畫刷
m_pGrayBrush = new CBrush(RGB(66,66,66));
m_pBlackBrush = new CBrush(BLACK);
}
}
void CHGAMEView::DCEnvClear(void)
{
//設備環境
m_memDC.DeleteDC();
m_memRectDC.DeleteDC();
//位圖資源
DeleteObject(m_memBmp);
DeleteObject(m_hMemRectBmp);
delete(m_pBlackPen);
delete(m_pGrayBrush);
delete(m_pBlackBrush);
}
void CHGAMEView::DrawGame(CDC *pDC)
{
int i,j;
//選用黑色畫刷,繪制整個游戲所在窗口的背景
pDC -> SelectObject(m_pBlackBrush);
CRect rect;
GetClientRect(&rect);
pDC -> Rectangle(rect);
//選用灰色畫刷,繪制游戲區域的背景
pDC -> SelectObject(m_pGrayBrush);
pDC -> Rectangle(m_iStartY ,m_iStartX, m_iStartY + 301, m_iStartX + 360);
pDC->SelectObject(m_pBlackPen);
//畫網格線
if (m_bDrawGrid)
{
//畫橫線
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);
}
//畫豎線
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);
}
}
int x,y,nW,nH;
//小方塊的繪制
for (i=0;i<m_iRow;i++)
for (j=0;j<m_iCol;j++)
{
if (GameStatus[i][j]==MAP_STATE_NOT_EMPTY)
{
//在游戲區域中狀態為被占用狀態的區域繪制小方塊
x = m_iStartY+j*m_iLarge +2;
y = m_iStartX+i*m_iLarge +2;
nW = m_iLarge-4;
nH = m_iLarge-4;
pDC->BitBlt(x,y,nW,nH,&m_memRectDC,m_iBlockSytle*30,0,SRCCOPY);
}
}
//顯示游戲區域及游戲級別的漢字描述
if (!m_bGameEnd)
{
pDC -> SetBkColor(BLACK);
pDC -> SetTextColor(WHITE);
pDC -> TextOut(m_iStartY+320, m_iStartX+280, L"游戲級別:");
pDC -> TextOut(m_iStartY+320, m_iStartX+300,m_strLevel);
}
//顯示總分
if (!m_bGameEnd)
{
CString lsStr;
lsStr.Format(L"總分為:%d 分",m_iPerformance);
pDC -> SetBkColor(BLACK);
pDC -> SetTextColor(WHITE);
pDC -> TextOut(m_iStartY+320, m_iStartX+180,lsStr);
}
//畫下一次將要出現的方塊,用于提示用戶
if (!m_bGameEnd)
{
pDC -> SetBkColor(BLACK);
pDC -> SetTextColor(WHITE);
pDC -> TextOut(m_iStartY+320, m_iStartX,L"下一個方塊:");
int x,y,nW,nH;
for (UINT k=0;k<4;k++)
{
i = NextStatus[k][0];
j = NextStatus[k][1];
x = m_iStartY+j*30 +2+320;
y = m_iStartX+i*30 +2+30;
nW = m_iLarge-4;
nH = m_iLarge-4;
pDC->BitBlt(x,y,nW,nH,&m_memRectDC,m_iBlockSytle*30,0,SRCCOPY);
}
}
}
void CHGAMEView::OnTimer(UINT nIDEvent)
{
//如果原來的方塊已到底或游戲剛開始,則掉下一個新的方塊
int i,j,k;
if (m_isBottom)
{
//1.產生下一個隨機下墜物
m_icurrentStatus = m_inextStatus;
m_inextStatus = Random(7); //得到下一次的方塊樣式
// if (m_inextStatus==0) m_inextStatus++;
//2.修改新的“下一下墜物”
RectStatusToNextStatus( m_inextStatus );
// CRect rect(m_iStartY+320, m_iStartX, m_iStartY+440, m_iStartX+160);
// InvalidateRect(&rect);
// Invalidate(FALSE);
//3.將舊的“下一下墜物”用作當前使用
m_currentRect = m_icurrentStatus;
//根據當前下墜物的形狀去初始化激活狀態下的下墜物坐標
RectStatusToActiveStatus( m_icurrentStatus );
//將當前動態數組中的數據反映到大數組中
ActiveStatusToGameStatus();
m_isBottom = FALSE;
//4.判斷當前方塊是否已到底
IsBottom();
//5.判斷游戲是否已結束: 碰了底,且第1行有小方塊
if (m_isBottom)
for (i=0;i<m_iCol;i++)
if (GameStatus[0][i])
{
KillTimer(1);
AfxMessageBox(L"游戲已結束!");
for (j=0;j<m_iRow;j++)
for (k=0;k<m_iCol;k++)
GameStatus[j][k]=0;
Invalidate(FALSE);
m_bGameEnd = TRUE;
break;
}
}
else //當前方塊下降
{
RectDown();
}
CView::OnTimer(nIDEvent);
}
int CHGAMEView::Random(int MaxNumber)
{
//部下隨機種子
srand( (unsigned)time( NULL ) );
//產生隨機數
int random = rand() % MaxNumber;
//保證非0
if(random == 0 ) random++;
return random;
}
void CHGAMEView::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]=MAP_STATE_NOT_EMPTY;
GameStatus[x2][y2]=MAP_STATE_NOT_EMPTY;
GameStatus[x3][y3]=MAP_STATE_NOT_EMPTY;
GameStatus[x4][y4]=MAP_STATE_NOT_EMPTY;
}
void CHGAMEView::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;
}
}
void CHGAMEView::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;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -