vc项目开发:俄罗斯方块制作日志
vc项目日志,俄罗斯方块开发
----July
mfc初学一个月时,所写的俄罗斯方块。共享下源码。
July、2010/10/21
-------------------------------------------------------------
此为View.h文件
- /*-------------------------------------
- View.h文件
- July/2010、10月
- --------------------------------------*/
- // skyjuly_RecTTView.h : interface of the CSkyjuly_RecTTView class
- //
- /
- #if !defined(AFX_SKYJULY_RECTTVIEW_H__BBD13113_594E_4BE6_9DA5_1DAE3EC53ED8__INCLUDED_)
- #define AFX_SKYJULY_RECTTVIEW_H__BBD13113_594E_4BE6_9DA5_1DAE3EC53ED8__INCLUDED_
- #if _MSC_VER > 1000
- #pragma once
- #endif // _MSC_VER > 1000
- // 宏变量:白色和黑色
- #define WHITE RGB(255,255,255)
- #define BLACK RGB(0,0,0)
- #define BLUE RGB(0,0,255)
- //中断操作的运动趋势
- #define LEFT 0 //向左移动
- #define RIGHT 1 //向左移动
- #define UP 2 //向上(变形)
- #define DOWN 3 //向下移动(加速)
- //游戏区域地图最大限制
- #define MAX_ROW 100 //地图的最大行数
- #define MAX_COL 100 //地图的最大列数
- //地图状态
- #define MAP_STATE_EMPTY 0 //空(未被占据)
- #define MAP_STATE_NOT_EMPTY 1 //被占据
- class CSkyjuly_RecTTView : public CView
- {
- protected : // create from serialization only
- CSkyjuly_RecTTView();
- DECLARE_DYNCREATE(CSkyjuly_RecTTView)
- // Attributes
- public :
- CSkyjuly_RecTTDoc* GetDocument();
- // Operations
- public :
- // Overrides
- // ClassWizard generated virtual function overrides
- //{{AFX_VIRTUAL(CSkyblue_RectView)
- public :
- virtual void OnDraw(CDC* pDC); // overridden to draw this view
- virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
- //}}AFX_VIRTUAL
- // Implementation
- public :
- virtual ~CSkyjuly_RecTTView();
- protected :
- int m_nWidth; //子窗口的宽度
- int m_nHeight; //子窗口的高度
- //列与行的数量
- int m_iCol;
- int m_iRow;
- //小方块的大小,它会随着行与列的不同而不同,具体为:
- // 12行10列,30个象素的正方形
- // 18行15列,20
- // 24行20列,15
- // 30行25列,12
- int m_iLarge;
- //当前的级别,换算成速度的算法为:1500 - m_iLevel*200
- int m_iLevel;
- //当前选择的方块显示样式
- int m_iBlockSytle;
- //游戏区域左上角的坐标
- int m_iStartX;
- int m_iStartY;
- BOOL IsLeftLimit(); //下坠物件是否可向左移动
- BOOL IsRightLimit();
- //接触面二维数组,记录1~7种下坠物的1~4种形态的接触面信息
- //我们把该下坠物的某种形态种的4个方块,有接触面则记录方位,无则为-1标识。
- int InterFace[74][4];
- //当前的方块形状
- int m_currentRect;
- //判断当前方块是否到底
- void IsBottom();
- //当前方块下降
- void RectDown();
- //当前方块加速:UP,左移:LEFT,右移:RIGHT
- void RectArrow( int m_Type);
- //根据下坠物的类型映射出它的具体形态 功能组
- //根据旧的下一下坠物映射出当前激活状态下的下坠物形态
- void RectStatusToActiveStatus( int m_which);
- //根据下坠物形态映射出下一下坠物的形态
- void RectStatusToNextStatus( int m_which);
- //将当前的状态映射到地图游戏区域
- void ActiveStatusToGameStatus();
- int Random( int MaxNumber);
- //标识方块已到底的变量,到底为TRUE
- BOOL m_isBottom;
- //用于标志方块状态的数组,大小由横格与竖格数据决定,为1表示该方块显示,或者不显示
- //画形状只需要修改数组中相应元素的状态值即可
- //由时钟控制,定时在OnPaint函数中根据数组画方块
- int GameStatus[MAX_ROW][MAX_COL];
- //用于保存当前方块的动态位置,4个小方块分别在大数组中的位置
- //存放位置为先左后右,每一列又遵循先上后下的原则
- int ActiveStatus[4][2];
- //存入下一次要出来的方块的模样的数组
- int NextStatus[4][2];
- // Generated message map functions
- protected :
- BOOL m_bGamePaush;
- void StopMid();
- void PlayMid();
- void CurrentAreaAndLevel();
- //用于记录当前区域大小与当前级别的字符串,用于显示在屏幕上提示用户当前状态
- CString m_strArea;
- CString m_strLevel;
- //当前的样式 ,下一个将会出现的样式
- int m_icurrentStatus;
- int m_inextStatus;
- //OnDraw中需要用到的设备名称
- CPen *m_pBlackPen;
- CBrush *m_pGrayBrush;
- CBrush *m_pBlackBrush;
- //是否画网格线
- BOOL m_bDrawGrid;
- //是否插放背景音乐
- BOOL m_bMusic;
- //游戏总成绩
- int m_iPerformance;
- //游戏是否已结束,为FALSE表示开始,否则为结束
- BOOL m_bGameEnd;
- //刷新指定的区域,它的大小为:四个小方块所在的正方形的大小
- void InvalidateCurrent();
- //内存绘图设备的处理
- CDC m_memDC; //内存设备环境
- CBitmap m_memBmp; //内存位图
- CDC m_memRectDC; //方块内存设备环境
- HBITMAP m_hMemRectBmp; //方块内存位图句柄
- int m_bFistPlay; //是否是第一次开始游戏
- void DcEnvInitial( void );
- void DCEnvClear( void );
- void DrawGame(CDC *pDC);
- // Generated message map functions
- protected :
- void RectChange();
- //{{AFX_MSG(CSkyjuly_RecTTView)
- afx_msg void OnGameStart();
- afx_msg void OnGamePaush();
- afx_msg void OnGameEnd();
- afx_msg void OnGameExit();
- afx_msg void OnGameOption();
- afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
- afx_msg void OnTimer( UINT nIDEvent);
- afx_msg void OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags);
- //}}AFX_MSG
- DECLARE_MESSAGE_MAP()
- };
- #ifndef _DEBUG // debug version in skyjuly_RecTTView.cpp
- inline CSkyjuly_RecTTDoc* CSkyjuly_RecTTView::GetDocument()
- { return (CSkyjuly_RecTTDoc*)m_pDocument; }
- #endif
- /
- //{{AFX_INSERT_LOCATION}}
- // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
- #endif // !defined(AFX_SKYJULY_RECTTVIEW_H__BBD13113_594E_4BE6_9DA5_1DAE3EC53ED8__INCLUDED_)
/*------------------------------------- View.h文件 July/2010、10月 --------------------------------------*/ // skyjuly_RecTTView.h : interface of the CSkyjuly_RecTTView class // / #if !defined(AFX_SKYJULY_RECTTVIEW_H__BBD13113_594E_4BE6_9DA5_1DAE3EC53ED8__INCLUDED_) #define AFX_SKYJULY_RECTTVIEW_H__BBD13113_594E_4BE6_9DA5_1DAE3EC53ED8__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // 宏变量:白色和黑色 #define WHITE RGB(255,255,255) #define BLACK RGB(0,0,0) #define BLUE RGB(0,0,255) //中断操作的运动趋势 #define LEFT 0 //向左移动 #define RIGHT 1 //向左移动 #define UP 2 //向上(变形) #define DOWN 3 //向下移动(加速) //游戏区域地图最大限制 #define MAX_ROW 100 //地图的最大行数 #define MAX_COL 100 //地图的最大列数 //地图状态 #define MAP_STATE_EMPTY 0 //空(未被占据) #define MAP_STATE_NOT_EMPTY 1 //被占据 class CSkyjuly_RecTTView : public CView { protected: // create from serialization only CSkyjuly_RecTTView(); DECLARE_DYNCREATE(CSkyjuly_RecTTView) // Attributes public: CSkyjuly_RecTTDoc* GetDocument(); // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CSkyblue_RectView) public: virtual void OnDraw(CDC* pDC); // overridden to draw this view virtual BOOL PreCreateWindow(CREATESTRUCT& cs); //}}AFX_VIRTUAL // Implementation public: virtual ~CSkyjuly_RecTTView(); protected: int m_nWidth; //子窗口的宽度 int m_nHeight; //子窗口的高度 //列与行的数量 int m_iCol; int m_iRow; //小方块的大小,它会随着行与列的不同而不同,具体为: // 12行10列,30个象素的正方形 // 18行15列,20 // 24行20列,15 // 30行25列,12 int m_iLarge; //当前的级别,换算成速度的算法为:1500 - m_iLevel*200 int m_iLevel; //当前选择的方块显示样式 int m_iBlockSytle; //游戏区域左上角的坐标 int m_iStartX; int m_iStartY; BOOL IsLeftLimit(); //下坠物件是否可向左移动 BOOL IsRightLimit(); //接触面二维数组,记录1~7种下坠物的1~4种形态的接触面信息 //我们把该下坠物的某种形态种的4个方块,有接触面则记录方位,无则为-1标识。 int InterFace[74][4]; //当前的方块形状 int m_currentRect; //判断当前方块是否到底 void IsBottom(); //当前方块下降 void RectDown(); //当前方块加速:UP,左移:LEFT,右移:RIGHT void RectArrow(int m_Type); //根据下坠物的类型映射出它的具体形态 功能组 //根据旧的下一下坠物映射出当前激活状态下的下坠物形态 void RectStatusToActiveStatus(int m_which); //根据下坠物形态映射出下一下坠物的形态 void RectStatusToNextStatus(int m_which); //将当前的状态映射到地图游戏区域 void ActiveStatusToGameStatus(); int Random(int MaxNumber); //标识方块已到底的变量,到底为TRUE BOOL m_isBottom; //用于标志方块状态的数组,大小由横格与竖格数据决定,为1表示该方块显示,或者不显示 //画形状只需要修改数组中相应元素的状态值即可 //由时钟控制,定时在OnPaint函数中根据数组画方块 int GameStatus[MAX_ROW][MAX_COL]; //用于保存当前方块的动态位置,4个小方块分别在大数组中的位置 //存放位置为先左后右,每一列又遵循先上后下的原则 int ActiveStatus[4][2]; //存入下一次要出来的方块的模样的数组 int NextStatus[4][2]; // Generated message map functions protected: BOOL m_bGamePaush; void StopMid(); void PlayMid(); void CurrentAreaAndLevel(); //用于记录当前区域大小与当前级别的字符串,用于显示在屏幕上提示用户当前状态 CString m_strArea; CString m_strLevel; //当前的样式 ,下一个将会出现的样式 int m_icurrentStatus; int m_inextStatus; //OnDraw中需要用到的设备名称 CPen *m_pBlackPen; CBrush *m_pGrayBrush; CBrush *m_pBlackBrush; //是否画网格线 BOOL m_bDrawGrid; //是否插放背景音乐 BOOL m_bMusic; //游戏总成绩 int m_iPerformance; //游戏是否已结束,为FALSE表示开始,否则为结束 BOOL m_bGameEnd; //刷新指定的区域,它的大小为:四个小方块所在的正方形的大小 void InvalidateCurrent(); //内存绘图设备的处理 CDC m_memDC; //内存设备环境 CBitmap m_memBmp; //内存位图 CDC m_memRectDC; //方块内存设备环境 HBITMAP m_hMemRectBmp; //方块内存位图句柄 int m_bFistPlay; //是否是第一次开始游戏 void DcEnvInitial(void); void DCEnvClear(void); void DrawGame(CDC *pDC); // Generated message map functions protected: void RectChange(); //{{AFX_MSG(CSkyjuly_RecTTView) afx_msg void OnGameStart(); afx_msg void OnGamePaush(); afx_msg void OnGameEnd(); afx_msg void OnGameExit(); afx_msg void OnGameOption(); afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; #ifndef _DEBUG // debug version in skyjuly_RecTTView.cpp inline CSkyjuly_RecTTDoc* CSkyjuly_RecTTView::GetDocument() { return (CSkyjuly_RecTTDoc*)m_pDocument; } #endif / //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_SKYJULY_RECTTVIEW_H__BBD13113_594E_4BE6_9DA5_1DAE3EC53ED8__INCLUDED_)
以下为View.cpp文件。
- /*--------------------------------------
- View.cpp文件。
- July、2010/10月
- --------------------------------------*/
- // skyjuly_RecTTView.cpp : implementation of the CSkyjuly_RecTTView class
- //
- #include "stdafx.h"
- #include "skyjuly_RecTT.h"
- #include "skyjuly_RecTTDoc.h"
- #include "skyjuly_RecTTView.h"
- #include "OptionDlg.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /
- // CSkyjuly_RecTTView
- IMPLEMENT_DYNCREATE(CSkyjuly_RecTTView, CView)
- BEGIN_MESSAGE_MAP(CSkyjuly_RecTTView, CView)
- //{{AFX_MSG_MAP(CSkyjuly_RecTTView)
- ON_COMMAND(ID_GAME_START, OnGameStart)
- ON_COMMAND(ID_GAME_PAUSH, OnGamePaush)
- ON_COMMAND(ID_GAME_END, OnGameEnd)
- ON_COMMAND(ID_GAME_EXIT, OnGameExit)
- ON_COMMAND(ID_GAME_OPTION, OnGameOption)
- ON_WM_CREATE()
- ON_WM_TIMER()
- ON_WM_KEYDOWN()
- //}}AFX_MSG_MAP
- // Standard printing commands
- ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
- ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
- ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
- END_MESSAGE_MAP()
- /
- // CSkyjuly_RecTTView construction/destruction
- CSkyjuly_RecTTView::CSkyjuly_RecTTView()
- {
- // TODO: add construction code here
- //第一次开始游戏
- m_bFistPlay = TRUE;
- //缺省为不是游戏暂停状态
- m_bGamePaush = FALSE;
- //缺省为不插放背景音乐
- m_bMusic = 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;
- }
- CSkyjuly_RecTTView::~CSkyjuly_RecTTView()
- {
- }
- BOOL CSkyjuly_RecTTView::PreCreateWindow(CREATESTRUCT& cs)
- {
- // TODO: Modify the Window class or styles here by modifying
- // the CREATESTRUCT cs
- return CView::PreCreateWindow(cs);
- }
- /
- // CSkyjuly_RecTTView drawing
- void CSkyjuly_RecTTView::OnDraw(CDC* pDC)
- {
- /*CSkyjuly_RecTTDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);*/
- // TODO: add draw code for native data here
- DcEnvInitial();
- DrawGame(&m_memDC); //在内存位图的游戏区域绘制
- pDC->BitBlt(0,0,m_nWidth,m_nHeight,&m_memDC,0,0,SRCCOPY);
- }
- /
- // CSkyjuly_RecTTView diagnostics
- #ifdef _DEBUG
- #endif //_DEBUG
- /
- // CSkyjuly_RecTTView message handlers
- void CSkyjuly_RecTTView::OnGameStart()
- {
- // TODO: Add your command handler code here
- if (!m_bGamePaush) //如果不是游戏暂停状态,则必须作些初始工作
- {
- m_bGameEnd = FALSE;
- //总分值清零, 并显示总分记分牌
- m_iPerformance = 0;
- //显示当前的区域及游戏级别的汉字描述
- // CurrentAreaAndLevel();
- CRect rect(m_iStartY, m_iStartX, m_iStartY+440, m_iStartX+370);
- InvalidateRect(&rect);
- }
- m_bGamePaush = FALSE;
- SetTimer(1,1500-250*m_iLevel,NULL);
- }
- void CSkyjuly_RecTTView::OnGamePaush()
- {
- // TODO: Add your command handler code here
- m_bGamePaush = TRUE;
- KillTimer(1);
- }
- void CSkyjuly_RecTTView::OnGameEnd()
- {
- // TODO: Add your command handler code here
- m_bGameEnd = TRUE;
- int i,j;
- for (i=0;i<m_iRow;i++)
- for (j=0;j<m_iCol;j++)
- GameStatus[i][j]=0;
- CRect rect(m_iStartY, m_iStartX, m_iStartY+440, m_iStartX+370);
- InvalidateRect(&rect);
- m_bGamePaush = FALSE; //清除游戏暂停状态
- KillTimer(1);
- }
- void CSkyjuly_RecTTView::OnGameExit()
- {
- // TODO: Add your command handler code here
- }
- void CSkyjuly_RecTTView::OnGameOption()
- {
- // TODO: Add your command handler code here
- //参数顺序: 区域大小代码:0-3,分别为:12X10,18X15,24X20,m_iLargeX25
- //级别:0-5,分别为:1500,1200,1000,800,600,400
- //背景音乐:TRUE 或者 FALSE
- int m_lsArea;
- /* switch(m_iRow)
- {
- case 12:
- m_lsArea = 0;
- break;
- case 18:
- m_lsArea = 1;
- break;
- case 24:
- m_lsArea = 2;
- break;
- case 30:
- m_lsArea = 3;
- break;
- }*/
- COptionDlg dlg(m_lsArea,m_iLevel,m_iBlockSytle,m_bMusic,m_bDrawGrid);
- if (dlg.DoModal()==IDOK)
- {
- //确定区域的大小
- /* switch(dlg.m_iArea)
- {
- case 0:
- m_iRow = 12;
- m_iCol = 10;
- m_iLarge = 30;
- break;
- case 1:
- m_iRow = 18;
- m_iCol = 15;
- m_iLarge = 20;
- break;
- case 2:
- m_iRow = 24;
- m_iCol = 20;
- m_iLarge = 15;
- break;
- case 3:
- m_iRow = 30;
- m_iCol = 25;
- m_iLarge = 12;
- break;
- }
- //确定级别
- m_iLevel = dlg.m_iLevel;
- //选择的样式
- m_iBlockSytle = dlg.m_iBlockStyle;
- //确定是否绘网格背景
- m_bDrawGrid = dlg.m_bDrawGrid;
- //检查是否插放音乐
- m_bMusic = dlg.m_bMusic;
- // if (m_bMusic)
- // PlayMid();
- // else
- // StopMid();
- Invalidate();*/
- }
- }
- void CSkyjuly_RecTTView::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+220, "游戏区域大小:" );
- pDC -> TextOut(m_iStartY+320, m_iStartX+240,m_strArea);
- pDC -> TextOut(m_iStartY+320, m_iStartX+280, "游戏级别:" );
- 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);
- }
- //画下一次将要出现的方块,用于提示用户
- if (!m_bGameEnd)
- {
- pDC -> SetBkColor(BLACK);
- pDC -> SetTextColor(WHITE);
- pDC -> TextOut(m_iStartY+320, m_iStartX,"下一个方块:" );
- 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 CSkyjuly_RecTTView::DcEnvInitial()
- {
- 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, "rect.bmp" ,IMAGE_BITMAP,150,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(0,60,0));
- m_pBlackBrush = new CBrush(BLACK);
- }
- }
- void CSkyjuly_RecTTView::DCEnvClear()
- {
- //设备环境
- m_memDC.DeleteDC();
- m_memRectDC.DeleteDC();
- //位图资源
- DeleteObject(m_memBmp);
- DeleteObject(m_hMemRectBmp);
- delete (m_pBlackPen);
- delete (m_pGrayBrush);
- delete (m_pBlackBrush);
- }
- int CSkyjuly_RecTTView::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CView::OnCreate(lpCreateStruct) == -1)
- return -1;
- //决定第一次掉下来的方块的样式
- m_inextStatus = Random(7);
- return 0;
- }
- int CSkyjuly_RecTTView::Random( int MaxNumber)
- {
- //部下随机种子
- srand( (unsigned)time( NULL ) );
- //产生随机数
- int random = rand() % MaxNumber;
- //保证非0
- if (random == 0 )
- random++;
- return random;
- }
- void CSkyjuly_RecTTView::RectDown()
- {
- IsBottom();
- 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];
- y1 = ActiveStatus[0][1];
- y2 = ActiveStatus[1][1];
- y3 = ActiveStatus[2][1];
- y4 = ActiveStatus[3][1];
- GameStatus[x1][y1]=MAP_STATE_EMPTY;
- GameStatus[x2][y2]=MAP_STATE_EMPTY;
- GameStatus[x3][y3]=MAP_STATE_EMPTY;
- GameStatus[x4][y4]=MAP_STATE_EMPTY;
- InvalidateCurrent();
- //方块下落
- ActiveStatus[0][0] += 1;
- ActiveStatus[1][0] += 1;
- ActiveStatus[2][0] += 1;
- ActiveStatus[3][0] += 1;
- GameStatus[x1+1][y1]=MAP_STATE_NOT_EMPTY;
- GameStatus[x2+1][y2]=MAP_STATE_NOT_EMPTY;
- GameStatus[x3+1][y3]=MAP_STATE_NOT_EMPTY;
- GameStatus[x4+1][y4]=MAP_STATE_NOT_EMPTY;
- InvalidateCurrent();
- }
- }
- void CSkyjuly_RecTTView::InvalidateCurrent()
- {
- int i;
- for (i=0;i<4;i++)
- {
- CRect rect(m_iStartX+ActiveStatus[i][1]*m_iLarge,
- m_iStartY+ActiveStatus[i][0]*m_iLarge,
- m_iStartX+(ActiveStatus[i][1]+1)*m_iLarge+5,
- m_iStartY+(ActiveStatus[i][0]+1)*m_iLarge);
- //InvalidateRect(&rect);
- Invalidate(FALSE);
- }
- }
- void CSkyjuly_RecTTView::IsBottom()
- {
- //到底有两种概念:1是已到底部,2是下面碰到了另外的方块
- int x1,x2,x3,x4;
- int x,xx,yy,i;
- x1 = ActiveStatus[0][0];
- x2 = ActiveStatus[1][0];
- x3 = ActiveStatus[2][0];
- x4 = ActiveStatus[3][0];
- //是否为底部的判断
- //1。到达游戏区域的底部
- //2。与接触面正下方的小方块区域为被占用状态
- if (x1>=m_iRow-1 || x2>=m_iRow-1 || x3>=m_iRow-1 || x4>=m_iRow-1)
- m_isBottom = TRUE;
- else
- {
- for (i=0;i<4;i++)
- {
- if (InterFace[m_currentRect][i] > -1)
- {//取当前下坠物有接触面的方块
- //获取有接触面的小方块的编号
- x=InterFace[m_currentRect][i];
- //根据编号获取ActiveStatus中该小方块的整下方的坐标
- xx=ActiveStatus[x][0]+1;
- yy=ActiveStatus[x][1];
- //判断该接触面整下方的小方块区域是否为被占用状态
- if (GameStatus[xx][yy]==MAP_STATE_NOT_EMPTY)
- m_isBottom = TRUE;
- }
- }
- }
- BOOL m_bIsSucced;
- int k,j;
- int m_iMuch=0; //本次销掉的行数
- //计分规则:一次销掉一行,加100分,一次销掉两行,加400分,三行,900分
- //例如销掉x行,则分数为:x*(x*100)
- if (m_isBottom)
- {
- //判断是否已得分
- for (i=0;i<m_iRow;i++)
- {
- m_bIsSucced = TRUE;
- for (j=0;j<m_iCol;j++)
- if (GameStatus[i][j]==MAP_STATE_EMPTY)
- m_bIsSucced = FALSE;
- //如果得分,则销掉此行
- if (m_bIsSucced)
- {
- for (k=i;k>0;k--)
- for (j=0;j<m_iCol;j++)
- GameStatus[k][j] = GameStatus[k-1][j];
- //第1行清零
- for (j=0;j<m_iCol;j++)
- GameStatus[0][j]=MAP_STATE_EMPTY;
- m_iMuch += 1;
- }
- }
- if (m_iMuch>0)
- {
- m_iPerformance += m_iMuch * m_iMuch * 100;
- //刷新游戏区域
- CRect rect1(m_iStartY, m_iStartX, m_iStartY+300, m_iStartX+360);
- //InvalidateRect(&rect1);
- //刷新分数区域
- CRect rect2(m_iStartY+320, m_iStartX+180, m_iStartY+440, m_iStartX+200);
- //InvalidateRect(&rect2);
- Invalidate(FALSE);
- }
- }
- }
- //映射下一个方快,显示下一个降落的方块
- void CSkyjuly_RecTTView::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 CSkyjuly_RecTTView::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("游戏已结束!" );
- 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);
- }
- void CSkyjuly_RecTTView::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 CSkyjuly_RecTTView::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 ;
- }
- }
- void CSkyjuly_RecTTView::RectArrow( int m_Type)
- {
- //获取当前下坠物4个小方块的位置坐标
- 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];
- //对不同的移动命令指示进行分类实现
- switch (m_Type)
- {
- case LEFT:
- //对每种不同的移动命令指示特性作相应的可移动分析
- if ( (ActiveStatus[0][1]>0) && IsLeftLimit() && !m_isBottom)
- {
- //清原来的方块
- GameStatus[x1][y1]=MAP_STATE_EMPTY;
- GameStatus[x2][y2]=MAP_STATE_EMPTY;
- GameStatus[x3][y3]=MAP_STATE_EMPTY;
- GameStatus[x4][y4]=MAP_STATE_EMPTY;
- // InvalidateCurrent();
- //添加新的移动后数据状态
- ActiveStatus[0][1] -= 1;
- ActiveStatus[1][1] -= 1;
- ActiveStatus[2][1] -= 1;
- ActiveStatus[3][1] -= 1;
- GameStatus[x1][y1-1]=MAP_STATE_NOT_EMPTY;
- GameStatus[x2][y2-1]=MAP_STATE_NOT_EMPTY;
- GameStatus[x3][y3-1]=MAP_STATE_NOT_EMPTY;
- GameStatus[x4][y4-1]=MAP_STATE_NOT_EMPTY;
- InvalidateCurrent();
- }
- break ;
- case RIGHT:
- if ( (ActiveStatus[3][1]< m_iCol-1) && IsRightLimit() && !m_isBottom)
- {
- //清原来的方块
- GameStatus[x1][y1]=MAP_STATE_EMPTY;
- GameStatus[x2][y2]=MAP_STATE_EMPTY;
- GameStatus[x3][y3]=MAP_STATE_EMPTY;
- GameStatus[x4][y4]=MAP_STATE_EMPTY;
- // InvalidateCurrent();
- //添加新的移动后数据状态
- ActiveStatus[0][1] += 1;
- ActiveStatus[1][1] += 1;
- ActiveStatus[2][1] += 1;
- ActiveStatus[3][1] += 1;
- GameStatus[x1][y1+1]=MAP_STATE_NOT_EMPTY;
- GameStatus[x2][y2+1]=MAP_STATE_NOT_EMPTY;
- GameStatus[x3][y3+1]=MAP_STATE_NOT_EMPTY;
- GameStatus[x4][y4+1]=MAP_STATE_NOT_EMPTY;
- InvalidateCurrent();
- }
- break ;
- case DOWN:
- RectDown();
- break ;
- }
- }
- void CSkyjuly_RecTTView::OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags)
- {
- switch (nChar)
- {
- case VK_LEFT:
- RectArrow(LEFT);
- break ;
- case VK_RIGHT:
- RectArrow(RIGHT);
- break ;
- case VK_UP:
- RectChange();
- break ;
- case VK_DOWN:
- RectArrow(DOWN);
- break ;
- }
- CView::OnKeyDown(nChar, nRepCnt, nFlags);
- }
- BOOL CSkyjuly_RecTTView::IsLeftLimit()
- {
- 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];
- //根据当前下坠物的具体形态,分析判断其是否有向左移动的空间
- switch (m_currentRect)
- {
- // "1"字形形态类型,判断其四个方块的正左边都没有任何物件(空间没有被占据)
- case 1:
- if (GameStatus[x1][y1-1] || GameStatus[x2][y2-1] || GameStatus[x3][y3-1] || GameStatus[x4][y4-1])
- return FALSE;
- break ;
- case 11:
- if (GameStatus[x1][y1-1])
- return FALSE;
- break ;
- case 2:
- if (GameStatus[x1][y1-1] || GameStatus[x2][y2-1])
- return FALSE;
- break ;
- case 3:
- if (GameStatus[x1][y1-1] || GameStatus[x2][y2-1])
- return FALSE;
- break ;
- case 31:
- if (GameStatus[x1][y1-1] || GameStatus[x2][y2-1] || GameStatus[x3][y3-1])
- return FALSE;
- break ;
- case 32:
- if (GameStatus[x1][y1-1] || GameStatus[x3][y3-1])
- return FALSE;
- break ;
- case 33:
- if (GameStatus[x1][y1-1] || GameStatus[x2][y2-1] || GameStatus[x4][y4-1])
- return FALSE;
- break ;
- case 4:
- if (GameStatus[x1][y1-1] || GameStatus[x2][y2-1] || GameStatus[x4][y4-1])
- return FALSE;
- break ;
- case 41:
- if (GameStatus[x1][y1-1] || GameStatus[x2][y2-1])
- return FALSE;
- break ;
- case 5:
- if (GameStatus[x1][y1-1] || GameStatus[x2][y2-1] || GameStatus[x3][y3-1])
- return FALSE;
- break ;
- case 51:
- if (GameStatus[x1][y1-1] || GameStatus[x3][y3-1])
- return FALSE;
- break ;
- case 6:
- if (GameStatus[x1][y1-1] || GameStatus[x3][y3-1] || GameStatus[x4][y4-1])
- return FALSE;
- break ;
- case 61:
- if (GameStatus[x1][y1-1] || GameStatus[x2][y2-1])
- return FALSE;
- break ;
- case 62:
- if (GameStatus[x1][y1-1] || GameStatus[x2][y2-1] || GameStatus[x3][y3-1])
- return FALSE;
- break ;
- case 63:
- if (GameStatus[x1][y1-1] || GameStatus[x3][y3-1])
- return FALSE;
- break ;
- case 7:
- if (GameStatus[x1][y1-1] || GameStatus[x2][y2-1] || GameStatus[x3][y3-1])
- return FALSE;
- break ;
- case 71:
- if (GameStatus[x1][y1-1] || GameStatus[x2][y2-1])
- return FALSE;
- break ;
- case 72:
- if (GameStatus[x1][y1-1] || GameStatus[x2][y2-1] || GameStatus[x3][y3-1])
- return FALSE;
- break ;
- case 73:
- if (GameStatus[x1][y1-1] || GameStatus[x4][y4-1])
- return FALSE;
- break ;
- }
- return TRUE;
- }
- BOOL CSkyjuly_RecTTView::IsRightLimit()
- {
- 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];
- switch (m_currentRect)
- {
- case 1:
- if (GameStatus[x1][y1+1] || GameStatus[x2][y2+1] || GameStatus[x3][y3+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 11:
- if (GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 2:
- if (GameStatus[x3][y3+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 3:
- if (GameStatus[x2][y2+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 31:
- if (GameStatus[x1][y1+1] || GameStatus[x3][y3+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 32:
- if (GameStatus[x3][y3+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 33:
- if (GameStatus[x2][y2+1] || GameStatus[x3][y3+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 4:
- if (GameStatus[x1][y1+1] || GameStatus[x3][y3+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 41:
- if (GameStatus[x3][y3+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 5:
- if (GameStatus[x2][y2+1] || GameStatus[x3][y3+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 51:
- if (GameStatus[x2][y2+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 6:
- if (GameStatus[x2][y2+1] || GameStatus[x3][y3+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 61:
- if (GameStatus[x2][y2+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 62:
- if (GameStatus[x1][y1+1] || GameStatus[x2][y2+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 63:
- if (GameStatus[x3][y3+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 7:
- if (GameStatus[x2][y2+1] || GameStatus[x3][y3+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 71:
- if (GameStatus[x1][y1+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 72:
- if (GameStatus[x2][y2+1] || GameStatus[x3][y3+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- case 73:
- if (GameStatus[x3][y3+1] || GameStatus[x4][y4+1])
- return FALSE;
- break ;
- }
- return TRUE;
- }
- void CSkyjuly_RecTTView::RectChange()
- {
- //先预先变形,然后判断变形后的方块是否有空间,如有足够空间,则进行实际变形,否则不变
- int xx1,xx2,xx3,xx4,yy1,yy2,yy3,yy4;
- int m_lscurrentRect;
- CString lsStr;
- 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];
- //变形后位置在数组中的存放顺序仍需遵循先左后右,在同一列中先上后下
- xx1=x1; xx2=x2; xx3=x3; xx4=x4; yy1=y1; yy2=y2; yy3=y3; yy4=y4;
- switch (m_currentRect)
- {
- case 1:
- xx1=x1+1; yy1=y1-1; xx3=x3-1; yy3=y3+1; xx4=x4-2; yy4=y4+2;
- m_lscurrentRect = 11;
- break ;
- case 11:
- xx1=x1-1; yy1=y1+1; xx3=x3+1; yy3=y3-1; xx4=x4+2; yy4=y4-2;
- m_lscurrentRect = 1;
- break ;
- case 2:
- m_lscurrentRect=2;
- break ;
- case 3:
- xx1=x1-2; yy1=y1+1; xx4=x4-1; yy4=y4;
- m_lscurrentRect = 31;
- break ;
- case 31:
- xx1=x1+1; yy1=y1-1;
- m_lscurrentRect = 32;
- break ;
- case 32:
- xx1=x1+1; yy1=y1; xx4=x4+2; yy4=y4-1;
- m_lscurrentRect=33;
- break ;
- case 33:
- xx4=x4-1; yy4=y4+1;
- m_lscurrentRect=3;
- break ;
- case 4:
- xx1=x1+2; yy1=y1-1; xx3=x3+1; yy3=y3-1; xx4=x4-1;
- m_lscurrentRect = 41;
- break ;
- case 41:
- xx1=x1-2; yy1=y1+1; xx3=x3-1; yy3=y3+1; xx4=x4+1;
- m_lscurrentRect = 4;
- break ;
- case 5:
- xx1=x1-1; xx2=x2-2; yy2=y2+1; xx3=x3+1; yy4=y4+1;
- m_lscurrentRect = 51;
- break ;
- case 51:
- xx1=x1+1; xx2=x2+2; yy2=y2-1; xx3=x3-1; yy4=y4-1;
- m_lscurrentRect = 5;
- break ;
- case 6:
- xx2=x1+1; yy2=y2-1; xx3=x3-1; xx4=x4-2; yy4 = yy4+1;
- m_lscurrentRect = 61;
- break ;
- case 61:
- xx3=x3+2; yy3=y3-1; xx4=x4+2; yy4=y4-1;
- m_lscurrentRect = 62;
- break ;
- case 62:
- xx1=x1+1; yy1=y1-1; xx3=x3-2; yy3=y3+1; xx4=x4-1;
- m_lscurrentRect = 63;
- break ;
- case 63:
- xx1=x1-2; yy1=y1+1; xx2=x2-2; yy2=y2+1;
- m_lscurrentRect = 6;
- break ;
- case 7:
- xx3=x3-1; yy3=y3+1; xx4=x4+1; yy4=y4+1;
- m_lscurrentRect = 71;
- break ;
- case 71:
- xx1=x1+2; xx2=x2-1; yy2=y2+1; xx4=x4+1; yy4=y4-1;
- m_lscurrentRect = 72;
- break ;
- case 72:
- xx1=x1-2; xx3=x3-1; yy3=y3+1; xx4=x4-1; yy4=y4+1;
- m_lscurrentRect = 73;
- break ;
- case 73:
- xx2=x2+1; yy2=y2-1; xx3=x3+2; yy3=y3-2; xx4=x4-1; yy4=y4-1;
- m_lscurrentRect = 7;
- break ;
- }
- //如果变形后所在的区域内无其他方块,则表示有足够空间,可以变形
- //且不能超越边界
- GameStatus[x1][y1] = MAP_STATE_EMPTY;
- GameStatus[x2][y2] = MAP_STATE_EMPTY;
- GameStatus[x3][y3] = MAP_STATE_EMPTY;
- GameStatus[x4][y4] = MAP_STATE_EMPTY;
- if (GameStatus[xx1][yy1]==MAP_STATE_EMPTY &&
- GameStatus[xx2][yy2]==MAP_STATE_EMPTY &&
- GameStatus[xx3][yy3]==MAP_STATE_EMPTY &&
- GameStatus[xx4][yy4]==MAP_STATE_EMPTY
- && yy1>=0 && yy4<=m_iCol-1
- && !(xx1<0 || xx2<0 || xx3<0 || xx4<0)
- && !(xx1>m_iRow-1 || xx2>m_iRow-1 || xx3>m_iRow-1 || xx4>m_iRow-1) )
- {
- InvalidateCurrent();
- ActiveStatus[0][0]=xx1;
- ActiveStatus[1][0]=xx2;
- ActiveStatus[2][0]=xx3;
- ActiveStatus[3][0]=xx4;
- ActiveStatus[0][1]=yy1;
- ActiveStatus[1][1]=yy2;
- ActiveStatus[2][1]=yy3;
- ActiveStatus[3][1]=yy4;
- GameStatus[xx1][yy1] = MAP_STATE_NOT_EMPTY;
- GameStatus[xx2][yy2] = MAP_STATE_NOT_EMPTY;
- GameStatus[xx3][yy3] = MAP_STATE_NOT_EMPTY;
- GameStatus[xx4][yy4] = MAP_STATE_NOT_EMPTY;
- InvalidateCurrent();
- //改变形状代码
- m_currentRect = m_lscurrentRect;
- }
- else
- {//恢复原来状态
- 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;
- }
- //判断是否已到底
- IsBottom();
- }
//给的注释已经够详尽了,我就不再写多余的分析了。
//July、2010/10月。
Dlg.h文件。
- #if !defined(AFX_OPTIONDLG_H__570435A5_9237_4DE0_8215_48D075E106AD__INCLUDED_)
- #define AFX_OPTIONDLG_H__570435A5_9237_4DE0_8215_48D075E106AD__INCLUDED_
- #if _MSC_VER > 1000
- #pragma once
- #endif // _MSC_VER > 1000
- // OptionDlg.h : header file
- //
- /
- // COptionDlg dialog
- class COptionDlg : public CDialog
- {
- // Construction
- public :
- int m_iBlockStyle;
- int m_iLevel;
- int m_iArea;
- COptionDlg(int m_iArea, int m_iLevel, int m_iBlockStyle, BOOL m_bMusic, BOOL m_bDrawGrid, CWnd* pParent = NULL);
- // Dialog Data
- //{{AFX_DATA(COptionDlg)
- enum { IDD = IDD_DLG_OPTION };
- BOOL m_bDrawGrid;
- BOOL m_bMusic;
- //}}AFX_DATA
- // Overrides
- // ClassWizard generated virtual function overrides
- //{{AFX_VIRTUAL(COptionDlg)
- protected :
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
- //}}AFX_VIRTUAL
- // Implementation
- protected :
- int m_oldArea;
- int m_oldLevel;
- int m_oldBlockSytle;
- BOOL m_oldMusic;
- BOOL m_oldDrawGrid;
- // Generated message map functions
- //{{AFX_MSG(COptionDlg)
- afx_msg void OnCheckGrid();
- virtual void OnOK();
- virtual BOOL OnInitDialog();
- afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
- afx_msg void OnGameOption();
- //}}AFX_MSG
- DECLARE_MESSAGE_MAP()
- };
- //{{AFX_INSERT_LOCATION}}
- // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
- #endif // !defined(AFX_OPTIONDLG_H__570435A5_9237_4DE0_8215_48D075E106AD__INCLUDED_)
#if !defined(AFX_OPTIONDLG_H__570435A5_9237_4DE0_8215_48D075E106AD__INCLUDED_) #define AFX_OPTIONDLG_H__570435A5_9237_4DE0_8215_48D075E106AD__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // OptionDlg.h : header file // / // COptionDlg dialog class COptionDlg : public CDialog { // Construction public: int m_iBlockStyle; int m_iLevel; int m_iArea; COptionDlg(int m_iArea, int m_iLevel,int m_iBlockStyle, BOOL m_bMusic,BOOL m_bDrawGrid, CWnd* pParent = NULL); // Dialog Data //{{AFX_DATA(COptionDlg) enum { IDD = IDD_DLG_OPTION }; BOOL m_bDrawGrid; BOOL m_bMusic; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(COptionDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: int m_oldArea; int m_oldLevel; int m_oldBlockSytle; BOOL m_oldMusic; BOOL m_oldDrawGrid; // Generated message map functions //{{AFX_MSG(COptionDlg) afx_msg void OnCheckGrid(); virtual void OnOK(); virtual BOOL OnInitDialog(); afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnGameOption(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_OPTIONDLG_H__570435A5_9237_4DE0_8215_48D075E106AD__INCLUDED_)
Dlg.cpp文件。
- // OptionDlg.cpp : implementation file
- //
- #include "stdafx.h"
- #include "skyjuly_RecTT.h"
- #include "OptionDlg.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /
- // COptionDlg dialog
- COptionDlg::COptionDlg(int m_iArea, int m_iLevel, int m_iBlockStyle, BOOL m_bMusic, BOOL m_bDrawGrid, CWnd* pParent /*=NULL*/ )
- : CDialog(COptionDlg::IDD, pParent)
- {
- //{{AFX_DATA_INIT(COptionDlg)
- m_bDrawGrid = FALSE;
- m_bMusic = FALSE;
- //}}AFX_DATA_INIT
- }
- void COptionDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(COptionDlg)
- DDX_Check(pDX, IDC_CHECK_GRID, m_bDrawGrid);
- DDX_Check(pDX, IDC_CHECK_MUSIC, m_bMusic);
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(COptionDlg, CDialog)
- //{{AFX_MSG_MAP(COptionDlg)
- ON_BN_CLICKED(IDC_CHECK_GRID, OnCheckGrid)
- ON_WM_CREATE()
- ON_COMMAND(ID_GAME_OPTION, OnGameOption)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /
- // COptionDlg message handlers
- void COptionDlg::OnCheckGrid()
- {
- // TODO: Add your control notification handler code here
- }
- void COptionDlg::OnOK()
- {
- // TODO: Add extra validation here
- CDialog::OnOK();
- }
- BOOL COptionDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // TODO: Add extra initialization here
- return TRUE; // return TRUE unless you set the focus to a control
- // EXCEPTION: OCX Property Pages should return FALSE
- }
- int COptionDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CDialog::OnCreate(lpCreateStruct) == -1)
- return -1;
- // TODO: Add your specialized creation code here
- return 0;
- }
- void COptionDlg::OnGameOption()
- {
- // TODO: Add your command handler code here
- }
// OptionDlg.cpp : implementation file // #include "stdafx.h" #include "skyjuly_RecTT.h" #include "OptionDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif / // COptionDlg dialog COptionDlg::COptionDlg(int m_iArea, int m_iLevel, int m_iBlockStyle,BOOL m_bMusic, BOOL m_bDrawGrid, CWnd* pParent /*=NULL*/) : CDialog(COptionDlg::IDD, pParent) { //{{AFX_DATA_INIT(COptionDlg) m_bDrawGrid = FALSE; m_bMusic = FALSE; //}}AFX_DATA_INIT } void COptionDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(COptionDlg) DDX_Check(pDX, IDC_CHECK_GRID, m_bDrawGrid); DDX_Check(pDX, IDC_CHECK_MUSIC, m_bMusic); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(COptionDlg, CDialog) //{{AFX_MSG_MAP(COptionDlg) ON_BN_CLICKED(IDC_CHECK_GRID, OnCheckGrid) ON_WM_CREATE() ON_COMMAND(ID_GAME_OPTION, OnGameOption) //}}AFX_MSG_MAP END_MESSAGE_MAP() / // COptionDlg message handlers void COptionDlg::OnCheckGrid() { // TODO: Add your control notification handler code here } void COptionDlg::OnOK() { // TODO: Add extra validation here CDialog::OnOK(); } BOOL COptionDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } int COptionDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here return 0; } void COptionDlg::OnGameOption() { // TODO: Add your command handler code here }
//至此,大部分源码,已经贴出,欢迎各位 就俄罗斯方块算法交流指正。
//曾经 单单玩这个游戏,便 玩了好几个月。;-)。
vc项目开发:俄罗斯方块制作日志相关推荐
- vc项目开发:俄罗斯方块制作日志 [上]
vc项目日志,俄罗斯方块开发 ----July mfc初学一个月时,所写的俄罗斯方块.共享下源码. July.2010/10/21 ---------------------------------- ...
- iOS项目开发实战——制作视图的缩放动画
视图的大小应该是随时可控的.今天我们就来实现对一个View的缩放动画.该动画的实现与位移动画,透明度动画稍有不同. 详细实现例如以下: import UIKitclass ScaleViewContr ...
- 深入c语言pdf,深入体验C语言项目开发1.pdf
深入体验C 语言项目开发 薛小龙 清华大学出版社 2011 07 本丛书的主要编写人员有陈强.李佐彬.李淑芳.蒋凯. 王梦.王书鹏.张子言.张建敏.陈德春.李藏.关立勋. 秦雪薇.薛多鸯.李强.刘海洋 ...
- WPF 项目开发入门(二) WPF 页面布局
WPF 项目开发入门(一) 安装运行 WPF 项目开发入门(二) WPF 页面布局 WPF 项目开发入门(三)WPF 窗体与页面 WPF 项目开发入门(四) MVVM 模式 与 TreeView树组件 ...
- iOS项目开发实战——设置视图的透明度改变动画
在iOS中 ,透明度的改变可以让View视图以一种渐变的效果动态的出现或者消退,非常有意思.这里我们将会对一个View控件的色块执行透明度改变的动画.关于其他的动画效果可以参考我的其他几篇博客< ...
- 100个vc小项目开发:二、一步一点设计音乐播放器 [I]
100个vc小项目开发:二.一步一点设计音乐播放器 [源码解读] 文章作者: July 软件来源:开源 ================== 1.有不正之处,恳请指正. 2.本文贴出的是关键实现代码部 ...
- uni-app项目开发-----初级入门教程(从0到1制作打包自己的app)
uni-app项目开发-----初级入门教程(从0到1制作打包自己的app) uni-app实现了一套代码,同时运行到多个平台.支持iOS模拟器.Android模拟器.H5.微信开发者工具.支付宝小程 ...
- javaweb项目开发日志的原理,方式
2019独角兽企业重金招聘Python工程师标准>>> 日志框架可以做什么? 日志框架可以帮助各类项目人员,,记录各种项目运行时信息; 以便其,通过日志信息,了解和监控项目的状态,解 ...
- vc/vs开发的应用程序添加dump崩溃日志转
原贴地址:https://blog.csdn.net/wangkui1331/article/details/78029940 vc/vs开发的应用程序出现崩溃的时候,由于没有任何记录,导致开发人员很 ...
最新文章
- Conda安装Glossary词汇表
- HDU 1711 -Number Sequence(KMP)
- Nginx的rewrite案例之目录合并
- 低成本DIY视频预览遥控小车
- 最小,独立,可分发的跨平台Web服务器
- DeFi协议TrueFi:TRU/ETH流动性挖矿将从Uniswap迁移至SushiSwap
- easyui 控制某列显示不显示_实验八 LED数码管显示控制实验
- 按颜色分类:蓝紫色系(Purple Blue)
- 【AAAA级LED护眼学习台灯照明方案】PWM内部转模拟,调光深度1%,无频闪顾虑,低亮无抖动LED恒流驱动芯片FP7102/FP7103/FP7208/FP7209
- QT创建一个excel文件(通过save as 方法)
- 网络营销实战密码——策略、技巧、案例(修订版)
- 测试点击屏幕次数的软件_红蜘蛛5校色仪怎么用?显示器校色及测试色域和色彩精准度详细教程...
- android 平板重装系统,平板电脑系统重装方法
- 创文明城市在路上,信息报送有高招
- php 正则匹配座机号、手机号
- 2020中兴软件测试面经
- IESM项目实训四——Web Audio录音和字符串转拼音
- java 继承extends
- poi获取段落位置_apache poi word提取段落
- C#快递单号查询接口物流路由信息快递鸟api代码接入.Net
热门文章
- 基于git(分布式版本控制系统)的各种服务器权限工具对比 Gitlab服务器搭建 以及邮箱、LDAP配置 实现公司多人协同开发
- c语言判断两个字母相等,C语言:比较两个字符串是否相等
- 两电脑使用网线连接传文件方法
- 个人计算机全都是多媒体计算机系统组成,多媒体计算机系统组成
- Rest_Assured接口测试学习汇总
- 文章转载---西工大博士生文言文答辩致谢
- C语言分数相加并将最后结果化为最简分式(新手程序!!!)
- stata怎么画分类图_Stata中的图形制作(绝对自己总结)
- 每日算法 - 列出24点游戏的所有解法
- json批量转换成label图像