教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 实用文档 >

用VC++mfc实现俄罗斯方块的程序详解(2)

来源:网络收集 时间:2026-09-14
导读: //第一次开始游戏 m_bFistPlay = TRUE; //缺省为不是游戏暂停状态 m_bGamePaush = FALSE; //缺省为不插放背景音乐 m_bMusic = FALSE; //缺省为画网格线 m_bDrawGrid = TRUE; //总分值清零 m_iPerformance = 0; //测

//第一次开始游戏 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字,全部文档内容请下载后查看。喜欢就下载吧 ……

用VC++mfc实现俄罗斯方块的程序详解(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/136841.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)