用VC++mfc实现俄罗斯方块的程序详解(2)
//第一次开始游戏 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; //缺省游戏是结束的
}
for (i=0;i<100;i++) }
else //当前方块下降 { }
CView::OnTimer(nIDEvent);
RectDown(); 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;
for (j=0;j<100;j++)
GameStatus[i][j]=0;
//各种形状方块的接触面数据,参见设计书的接触面表格,
//5.判断游戏是否已结束: 碰了底,且第1行有小方块
Invalidate(FALSE); m_bGameEnd = TRUE; break;
// 函数:产生一个最大值不大于指定值的随机正整数(Random) // 参数:MaxNumber : 随机数的上限 // 返回值: 产生的随机数
int CSkyblue_RectView::Random(int MaxNumber) { } }
//内部函数:刷新当前的区域
void CSkyblue_RectView::InvalidateCurrent() {
int i;
for (i=0;i<4;i++) }
//布下随机种子
srand( (unsigned)time( NULL ) ); //产生随机数
int random = rand() % MaxNumber; //保证非0
if(random == 0 ) random++; return random;
}
}
m_iStartX+(ActiveStatus[i][1]+1)*m_iLarge+5, m_iStartY+(ActiveStatus[i][0]+1)*m_iLarge);
//InvalidateRect(&rect); Invalidate(FALSE);
// 内部函数:当前方块下降加速,左移,右移 void CSkyblue_RectView::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) { } break;
if ( (ActiveStatus[3][1]< m_iCol-1) && IsRightLitmit() && !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;
//添加新的移动后数据状态
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();
case RIGHT:
}
}
}
GameStatus[x3][y3]=MAP_STATE_EMPTY; GameStatus[x4][y4]=MAP_STATE_EMPTY;
//添加新的移动后数据状态
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; RectDown(); break;
case DOWN:
// 内部函数:方块的变形
void CSkyblue_RectView::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;
xx1=x1-1; yy1=y1+1; xx3=x3+1; yy3=y3-1; xx4=x4+2; yy4=y4-2;
case 11:
break; ……
//省略部分为同类实现的变形后小方块坐标计算代码 case 73: } } else
{//恢复原来状态 }
//判断是否已到底 IsBottom(); }
//绘图设备环境的初始化
void CSkyblue_RectView::DcEnvInitial(void) {
if(m_bFistPlay) {
m_bFistPlay = FALSE;
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; //改变形状代码
m_currentRect = m_lscurrentRect;
xx2=x2+1; yy2=y2-1; xx3=x3+2; yy3=y3-2; xx4=x4-1; yy4=y4-1; m_lscurrentRect = 7; break;
//黑色的黑笔
m_pBlackPen = new CPen(PS_SOLID,1,BLACK); //画刷
m_pGrayBrush = new CBrush(RGB(66,66,66)); m_pBlackBrush = new CBrush(BLACK); } }
void CSkyblue_RectView::DCEnvClear(void) {
//设备环境
m_memDC.DeleteDC(); m_memRectDC.DeleteDC(); //位图资源
DeleteObject(m_memBmp); DeleteObject(m_hMemRectBmp); delete(m_pBlackPen); delete(m_pGrayBrush); delete(m_pBlackBrush); }
void CSkyblue_RectView::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) { }
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) { }
//在游戏区域中状态为被占 …… 此处隐藏:4126字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [实用文档]李践-有效提升销售的12大黄金法则8-大
- [实用文档]党支部换届工作方案
- [实用文档]2013年下期电子商务专业部宣传工作计划
- [实用文档]方庄一矿通风、钻探绩效工资考核管理办
- [实用文档]项目一 认识企业物流认识企业物流
- [实用文档]MBI_Display_产品蓝图规画
- [实用文档]北京市建筑业劳务作业人员普法维权培训
- [实用文档]锅炉燃烧调整与运行优化
- [实用文档]4支付结算业务的核算
- [实用文档]米什金_货币金融学_第9版各章学习指导
- [实用文档]水泥混凝土路面硬化工程施工组织设计
- [实用文档]钢筋工程安全技术交底书
- [实用文档]关于公布华中师范大学本科毕业论文
- [实用文档]太原市园林绿化施工合同范本 2
- [实用文档]周日辅导 初中英语分类复习单项选择题(
- [实用文档]第四章 文化经纪人的管理形式 第二节
- [实用文档]学宪法讲宪法竞赛题库
- [实用文档]《数值计算方法》期末考试模拟试题二
- [实用文档]爱词霸学英语:每日一句( 十月)
- [实用文档]2014年国家公务员面试:无领导小组讨论
- 新课程主要理念和教学案例分析汇编(24
- 英国人的快乐源于幸福的家庭生活
- 七年级上册第一次月考模拟数学试卷
- 真丝及仿真丝的种类有哪些?
- 【最新】华师大版八年级数学下册第十六
- 高中英语3500个必背单词
- 我可以接受失败,但我不能接受放弃!
- 最近更新沪科版八年级物理上册期末试卷
- 绿化工作先进乡镇事迹材料
- 鲁教版九年级上册思想品德教学计划
- 英语音标的分类
- 地下室底板无梁楼盖与普通梁板结构形式
- 美容师黄金销售话术
- 雅思写作满分作文备考方法
- 血清甲状腺激素测定与高频彩色多普勒超
- 1度浅析装修对室内空气品质的影响
- 2017-2022年中国汞矿行业深度分析与投
- 计算机二级VB公共基础知识
- (何勇)秸秆禁烧_重在寻找出路
- 内外墙抹灰工程分包施工合同1




