由于字数有限。。我只粘了部分。drop()函数。。看到木有。。是空的。。因为我不会写啊
void CMytestView::BlockDisplay()
{
CClientDC dc(this);
flag=1;
CString str1("游戏说明");
CString str2("向左、右、下方向的按键控制移动");
CString str3("向上的按键控制旋转");
CString str4("单击“设置”按钮可以选择游戏等级");
CString str5("单击“开始”按钮可以开始新游戏");
CString str6("单击“退出”按钮关闭游戏窗口");
CString str7("游戏说明");
CString str8("|");
CString str9("|");
CString str10("|");
CString str11("|");
CString str12("|");
CString str13("|");
CString str14("|");
dc.TextOut(500,100,str1);
dc.TextOut(500,150,str2);
dc.TextOut(500,200,str3);
dc.TextOut(500,250,str4);
dc.TextOut(500,300,str5);
dc.TextOut(500,350,str6);
dc.TextOut(500,400,str7);
dc.TextOut(752,100,str8);
dc.TextOut(752,150,str9);
dc.TextOut(752,200,str10);
dc.TextOut(752,250,str11);
dc.TextOut(752,300,str12);
dc.TextOut(752,350,str13);
dc.TextOut(752,400,str14);
//擦除之前画的方块,即以黑色覆盖轨迹
for(int a=0;a<4;a++)
{
dc.FillSolidRect(PanelX+dd[a].x*UNIT,PanelY+dd[a].y*UNIT,UNIT-1,UNIT-1,BLACK);
}
if(flag)
{
for(int a=0;a<4;a++)
{
//是方块形状的位置,则将cor[x][j]==1用于以后的方块局部重绘
cor[m_ptBlockInitial[a].x][m_ptBlockInitial[a].y]=1;
}
for(int x=0;x<UNITX;x++)
{
for(int y=0;y<UNITY;y++)
{
//根据方块形状初始将cor[x][y]==1,既是方块形状的位置
//将游戏面板上以初始方块颜色重绘显示
//重绘正在下降左右移动的方块
//避免擦除轨迹时闪屏造成方块运动不连续
if(cor[x][y]==1)
{
for(a=0;a<4;a++)
{
dc.FillSolidRect(PanelX+m_ptBlockInitial[a].x *UNIT,PanelY+m_ptBlockInitial[a].y *UNIT,UNIT-1,UNIT-1,m_clrBlockInitial);
}
}
}
}
//在游戏面板右部空白处提示显示下一个新产生的方块
for( x=0;x<UNITX;x++)
{
for(int y=0;y<UNITY;y++)
{
//根据方块的形状初始将cor[x][y]==1,既是方块形状的位置
//在游戏面板上以初始方块颜色重绘显示
if(cor[x][y]==1)
{
for(a=0;a<4;a++)
{
dc.FillSolidRect(PanelX+300+m_ptBlockCopy[a].x*UNIT,PanelY+m_ptBlockCopy[a].y *UNIT,UNIT-1,UNIT-1,m_clrBlockInitial);
dc.FillSolidRect(PanelX+190+m_ptBlockCopy[a].x*UNIT,PanelY+m_ptBlockCopy[a].y *UNIT,UNIT-1,UNIT-1,m_clrBlockInitial);
}
}
if(flag2)
{
for(int x=0;x<UNITX;x++)
{
for(int y=0;y<UNITY;y++)
{
//第一个方块到底后绘制黑色游戏面板
dc.FillSolidRect(PanelX+x*UNIT,PanelY+y*UNIT,UNIT-1,UNIT-1,BLACK);
}
//用背景色擦除游戏面板右上部分的原有图形
dc.FillSolidRect(PanelX+250,PanelY,150,150,WHITE);
}
for(x=0;x<UNITX;x++)
{
for(int y=0;y<UNITY;y++)
{
//重绘正在下落和到底的方块
if((cor[x][y]==1)||(cor[x][y]==2))
{
//落到面板不动的方块变色
dc.FillSolidRect(PanelX+x*UNIT,PanelY+y*UNIT,UNIT-1,UNIT-1,cor[x][y]);
}
}
}
flag2=0;
}
}
}
}
}
void CMytestView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
BlockCreate(); //产生方块
BlockDisplay(); //显示方块
// Do not call CView::OnPaint() for painting messages
}
void CMytestView::OnTimer(UINT nIDEvent)
{
if(key)
{
if(ArriveAtBottom())
{
flag=1;
BlockErase();
BlockDrop();
BlockDisplay();
key=1;
}else
{
GameOver(); //游戏面板已满,游戏结束,是否重新开始新游戏
BlockCreate();
BlockDisplay();
key=1;
flag=1;
}
}
Y=0;
CView::OnTimer(nIDEvent);
}void CMytestView::BlockErase()
{
for(int a=0;a<4;a++)
{
//将当前方块标志为0,游戏面板重绘时不显示方块
cor[m_ptBlockInitial[a].x][m_ptBlockInitial[a].y]=0;
//保存当前方块横坐标,重绘面板时删除之前轨迹
dd[a].x=m_ptBlockInitial[a].x;
//保存当前方块纵坐标,重绘面板时删除之前轨迹
dd[a].y=m_ptBlockInitial[a].y;
}
}void CMytestView::MoveToLeft()
{
for(int a=0;a<4;a++)
{
m_ptBlockInitial[a].x--; //方块每次向左移动,每次按键使横坐标减1
}
flag2=1;
}
void CMytestView::MoveToRight()
{
for(int a=0;a<4;a++)
{
m_ptBlockInitial[a].x++; //方块每次向右移动,每次按键使横坐标加1
}
}int CMytestView::MoveToBottom()
{
for(int o=0;o<4;o++)
{
//方块未到底则正常下降,每次按键使纵坐标加1
m_ptBlockInitial[o].y=m_ptBlockInitial[o].y+1;
}
return 1;
}void CMytestView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(!Y)
{
key=0;
switch(nChar)
{
case VK_LEFT: //左移
if(!(OutOfLeft()))
{
flag=1;
BlockErase();
MoveToLeft();
}
break;
case VK_RIGHT: //右移
if(!(OutOfRight()))
{
flag=1;
BlockErase();
MoveToRight();
}
break;
case VK_DOWN: //加速下降
{
BlockErase();
MoveToBottom();
GameOver();
BlockCreate();
}
break;
case VK_UP: //响应向上的键盘消息,及旋转
{
BlockErase();
MoveToRotate();
}
break;
}
key=1;
}
BlockDisplay();
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}int CMytestView::ArriveAtBottom()
{
for(int a=0;a<4;a++)
{
if(m_ptBlockInitial[a].y==19)
{
for(int c=0;c<4;c++)
{
//设置方块标志位为2
cor[m_ptBlockInitial[c].x][m_ptBlockInitial[c].y]=2;
//保存方块颜色,以备重绘
cor[m_ptBlockInitial[c].x][m_ptBlockInitial[c].y]=m_clrBlockInitial;
flag2=1;
}
return 0;
}
//落到以前到底的方块上
if(cor[m_ptBlockInitial[a].x][m_ptBlockInitial[a].y+1]==2)
{
for(int c=0;c<4;c++)
{
cor[m_ptBlockInitial[c].x][m_ptBlockInitial[c].y]=2;
cor[m_ptBlockInitial[c].x][m_ptBlockInitial[c].y]=m_clrBlockInitial;
flag2=1;
}
return 0;
}
}
return 1;
}void CMytestView::BlockDrop()
{
}void CMytestView::GameOver()
{
int flagover=0,n=0;
CString strcount;
for(int a=19;a>=0;a--)
{
flagover=0;
for(int b=0;b<10;b++)
{
if(cor[b][a]==2)
{
flagover++;
}
}
if(flagover==10)
{
count=count+100;
for(b=0;b<10;b++)
{
cor[b][a]=0;
color[b][a]=OLIVE;
}
for(int t=a;t>0;t--)
{
for(b=0;b<10;b++)
{
if(cor[b][t-1]==2) //消除满行后的方块还有其余显示部分
{//将其余显示部分下移,即对应该列的下一行方块标志为2
cor[b][t]=2;
color[b][t]=color[b][t-1]; //保存上一行的颜色值至下一行
flag2=1; //重绘
//将原来其余显示部分占的方块标志置为0,即重绘时不显示
cor[b][t-1]=0;
color[b][t-1]=OLIVE; //保存颜色值
}
}
}
a=a+1;
}
}
for(a=0;a<9;a++)
{
//如果游戏面板上面一行有任意方格标志为2,则表示游戏面板已满
if(cor[a][0]==2)
{
KillTimer(IDC_TIMER);
{
count=0;
for(int i=0;i<UNITX;i++)
{
for(int j=0;j<UNITY;j++)
{
cor[i][j]=0;
flag2=1;
}
}
SetTimer(IDC_TIMER,time,NULL);
}
}
CMytestView * frame=(CMytestView*)AfxGetMainWnd();
frame->m_wndStatusBar.SetPaneInfo(0,nID,SBPS_STRETCH|SBPS_NOMAL,cxWidth);
}
}int CMytestView::MoveToRotate()
{
int tempx=0,tempy=0,a,d=0,h=0;
int temp2=0,temp1=0;
int tempmax=0; CPoint m_ptNewOrigin;
CPoint m_ptNew;
for(a=0;a<4;a++)
{
bb[a].x=m_ptBlockInitial[a].x;
bb[a].y=m_ptBlockInitial[a].y;
}
switch(index)
{
case 1: //取直线型方块的中心为新坐标原点
m_ptNewOrigin.x=m_ptBlockInitial[2].x;
m_ptNewOrigin.y=m_ptBlockInitial[2].y;
h=2;
break;
default://其他方块的中心为组成图形的第2个点的坐标
m_ptNewOrigin.x=m_ptBlockInitial[1].x;
m_ptNewOrigin.y=m_ptBlockInitial[1].y;
h=1;
break;
}
for(a=0;a<4;a++)
{
if(a!=h)
{ //转换成新坐标系内的坐标
m_ptNew.x=(m_ptBlockInitial[a].x-m_ptNewOrigin.x);
m_ptNew.y=(m_ptBlockInitial[a].y-m_ptNewOrigin.y);
//在新坐标系内交换X轴和Y轴坐标,然后还原到原始坐标系
m_ptBlockInitial[a].y=m_ptNew.x+m_ptNewOrigin.y;
m_ptBlockInitial[a].x=-m_ptNew.y+m_ptNewOrigin.x; if((cor[m_ptBlockInitial[a].x][m_ptBlockInitial[a].y]==2)||(m_ptBlockInitial[a].x>9)||(m_ptBlockInitial[a].x<0)||
(m_ptBlockInitial[a].y>19)||(m_ptBlockInitial[a].y<0))
{
for(int d=0;d<4;d++)
{ //如果旋转后的坐标出了边界而不允许旋转
//仍然用之前保存的原坐标
m_ptBlockInitial[d].x=bb[d].x;
m_ptBlockInitial[d].y=bb[d].y;
}
return 0;
}
}
}
return 1;
}int CMytestView::OutOfLeft()
{
for(int a=0;a<4;a++)
{
//小于等于0出左边界
if((m_ptBlockInitial[a].x<=0)||(cor[m_ptBlockInitial[a].x-1][m_ptBlockInitial[a].y]==2))
return 1;
else
return 0;
}
}int CMytestView::OutOfRight()
{
for(int a=0;a<4;a++)
{
//大于等于9出右边界
if((m_ptBlockInitial[a].x>=9)||(cor[m_ptBlockInitial[a].x+1][m_ptBlockInitial[a].y]==2))
return 1;
else
return 0;
}
}求求大神帮帮忙小女子真的不会啊俄罗斯方块
void CMytestView::BlockDisplay()
{
CClientDC dc(this);
flag=1;
CString str1("游戏说明");
CString str2("向左、右、下方向的按键控制移动");
CString str3("向上的按键控制旋转");
CString str4("单击“设置”按钮可以选择游戏等级");
CString str5("单击“开始”按钮可以开始新游戏");
CString str6("单击“退出”按钮关闭游戏窗口");
CString str7("游戏说明");
CString str8("|");
CString str9("|");
CString str10("|");
CString str11("|");
CString str12("|");
CString str13("|");
CString str14("|");
dc.TextOut(500,100,str1);
dc.TextOut(500,150,str2);
dc.TextOut(500,200,str3);
dc.TextOut(500,250,str4);
dc.TextOut(500,300,str5);
dc.TextOut(500,350,str6);
dc.TextOut(500,400,str7);
dc.TextOut(752,100,str8);
dc.TextOut(752,150,str9);
dc.TextOut(752,200,str10);
dc.TextOut(752,250,str11);
dc.TextOut(752,300,str12);
dc.TextOut(752,350,str13);
dc.TextOut(752,400,str14);
//擦除之前画的方块,即以黑色覆盖轨迹
for(int a=0;a<4;a++)
{
dc.FillSolidRect(PanelX+dd[a].x*UNIT,PanelY+dd[a].y*UNIT,UNIT-1,UNIT-1,BLACK);
}
if(flag)
{
for(int a=0;a<4;a++)
{
//是方块形状的位置,则将cor[x][j]==1用于以后的方块局部重绘
cor[m_ptBlockInitial[a].x][m_ptBlockInitial[a].y]=1;
}
for(int x=0;x<UNITX;x++)
{
for(int y=0;y<UNITY;y++)
{
//根据方块形状初始将cor[x][y]==1,既是方块形状的位置
//将游戏面板上以初始方块颜色重绘显示
//重绘正在下降左右移动的方块
//避免擦除轨迹时闪屏造成方块运动不连续
if(cor[x][y]==1)
{
for(a=0;a<4;a++)
{
dc.FillSolidRect(PanelX+m_ptBlockInitial[a].x *UNIT,PanelY+m_ptBlockInitial[a].y *UNIT,UNIT-1,UNIT-1,m_clrBlockInitial);
}
}
}
}
//在游戏面板右部空白处提示显示下一个新产生的方块
for( x=0;x<UNITX;x++)
{
for(int y=0;y<UNITY;y++)
{
//根据方块的形状初始将cor[x][y]==1,既是方块形状的位置
//在游戏面板上以初始方块颜色重绘显示
if(cor[x][y]==1)
{
for(a=0;a<4;a++)
{
dc.FillSolidRect(PanelX+300+m_ptBlockCopy[a].x*UNIT,PanelY+m_ptBlockCopy[a].y *UNIT,UNIT-1,UNIT-1,m_clrBlockInitial);
dc.FillSolidRect(PanelX+190+m_ptBlockCopy[a].x*UNIT,PanelY+m_ptBlockCopy[a].y *UNIT,UNIT-1,UNIT-1,m_clrBlockInitial);
}
}
if(flag2)
{
for(int x=0;x<UNITX;x++)
{
for(int y=0;y<UNITY;y++)
{
//第一个方块到底后绘制黑色游戏面板
dc.FillSolidRect(PanelX+x*UNIT,PanelY+y*UNIT,UNIT-1,UNIT-1,BLACK);
}
//用背景色擦除游戏面板右上部分的原有图形
dc.FillSolidRect(PanelX+250,PanelY,150,150,WHITE);
}
for(x=0;x<UNITX;x++)
{
for(int y=0;y<UNITY;y++)
{
//重绘正在下落和到底的方块
if((cor[x][y]==1)||(cor[x][y]==2))
{
//落到面板不动的方块变色
dc.FillSolidRect(PanelX+x*UNIT,PanelY+y*UNIT,UNIT-1,UNIT-1,cor[x][y]);
}
}
}
flag2=0;
}
}
}
}
}
void CMytestView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
BlockCreate(); //产生方块
BlockDisplay(); //显示方块
// Do not call CView::OnPaint() for painting messages
}
void CMytestView::OnTimer(UINT nIDEvent)
{
if(key)
{
if(ArriveAtBottom())
{
flag=1;
BlockErase();
BlockDrop();
BlockDisplay();
key=1;
}else
{
GameOver(); //游戏面板已满,游戏结束,是否重新开始新游戏
BlockCreate();
BlockDisplay();
key=1;
flag=1;
}
}
Y=0;
CView::OnTimer(nIDEvent);
}void CMytestView::BlockErase()
{
for(int a=0;a<4;a++)
{
//将当前方块标志为0,游戏面板重绘时不显示方块
cor[m_ptBlockInitial[a].x][m_ptBlockInitial[a].y]=0;
//保存当前方块横坐标,重绘面板时删除之前轨迹
dd[a].x=m_ptBlockInitial[a].x;
//保存当前方块纵坐标,重绘面板时删除之前轨迹
dd[a].y=m_ptBlockInitial[a].y;
}
}void CMytestView::MoveToLeft()
{
for(int a=0;a<4;a++)
{
m_ptBlockInitial[a].x--; //方块每次向左移动,每次按键使横坐标减1
}
flag2=1;
}
void CMytestView::MoveToRight()
{
for(int a=0;a<4;a++)
{
m_ptBlockInitial[a].x++; //方块每次向右移动,每次按键使横坐标加1
}
}int CMytestView::MoveToBottom()
{
for(int o=0;o<4;o++)
{
//方块未到底则正常下降,每次按键使纵坐标加1
m_ptBlockInitial[o].y=m_ptBlockInitial[o].y+1;
}
return 1;
}void CMytestView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(!Y)
{
key=0;
switch(nChar)
{
case VK_LEFT: //左移
if(!(OutOfLeft()))
{
flag=1;
BlockErase();
MoveToLeft();
}
break;
case VK_RIGHT: //右移
if(!(OutOfRight()))
{
flag=1;
BlockErase();
MoveToRight();
}
break;
case VK_DOWN: //加速下降
{
BlockErase();
MoveToBottom();
GameOver();
BlockCreate();
}
break;
case VK_UP: //响应向上的键盘消息,及旋转
{
BlockErase();
MoveToRotate();
}
break;
}
key=1;
}
BlockDisplay();
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}int CMytestView::ArriveAtBottom()
{
for(int a=0;a<4;a++)
{
if(m_ptBlockInitial[a].y==19)
{
for(int c=0;c<4;c++)
{
//设置方块标志位为2
cor[m_ptBlockInitial[c].x][m_ptBlockInitial[c].y]=2;
//保存方块颜色,以备重绘
cor[m_ptBlockInitial[c].x][m_ptBlockInitial[c].y]=m_clrBlockInitial;
flag2=1;
}
return 0;
}
//落到以前到底的方块上
if(cor[m_ptBlockInitial[a].x][m_ptBlockInitial[a].y+1]==2)
{
for(int c=0;c<4;c++)
{
cor[m_ptBlockInitial[c].x][m_ptBlockInitial[c].y]=2;
cor[m_ptBlockInitial[c].x][m_ptBlockInitial[c].y]=m_clrBlockInitial;
flag2=1;
}
return 0;
}
}
return 1;
}void CMytestView::BlockDrop()
{
}void CMytestView::GameOver()
{
int flagover=0,n=0;
CString strcount;
for(int a=19;a>=0;a--)
{
flagover=0;
for(int b=0;b<10;b++)
{
if(cor[b][a]==2)
{
flagover++;
}
}
if(flagover==10)
{
count=count+100;
for(b=0;b<10;b++)
{
cor[b][a]=0;
color[b][a]=OLIVE;
}
for(int t=a;t>0;t--)
{
for(b=0;b<10;b++)
{
if(cor[b][t-1]==2) //消除满行后的方块还有其余显示部分
{//将其余显示部分下移,即对应该列的下一行方块标志为2
cor[b][t]=2;
color[b][t]=color[b][t-1]; //保存上一行的颜色值至下一行
flag2=1; //重绘
//将原来其余显示部分占的方块标志置为0,即重绘时不显示
cor[b][t-1]=0;
color[b][t-1]=OLIVE; //保存颜色值
}
}
}
a=a+1;
}
}
for(a=0;a<9;a++)
{
//如果游戏面板上面一行有任意方格标志为2,则表示游戏面板已满
if(cor[a][0]==2)
{
KillTimer(IDC_TIMER);
{
count=0;
for(int i=0;i<UNITX;i++)
{
for(int j=0;j<UNITY;j++)
{
cor[i][j]=0;
flag2=1;
}
}
SetTimer(IDC_TIMER,time,NULL);
}
}
CMytestView * frame=(CMytestView*)AfxGetMainWnd();
frame->m_wndStatusBar.SetPaneInfo(0,nID,SBPS_STRETCH|SBPS_NOMAL,cxWidth);
}
}int CMytestView::MoveToRotate()
{
int tempx=0,tempy=0,a,d=0,h=0;
int temp2=0,temp1=0;
int tempmax=0; CPoint m_ptNewOrigin;
CPoint m_ptNew;
for(a=0;a<4;a++)
{
bb[a].x=m_ptBlockInitial[a].x;
bb[a].y=m_ptBlockInitial[a].y;
}
switch(index)
{
case 1: //取直线型方块的中心为新坐标原点
m_ptNewOrigin.x=m_ptBlockInitial[2].x;
m_ptNewOrigin.y=m_ptBlockInitial[2].y;
h=2;
break;
default://其他方块的中心为组成图形的第2个点的坐标
m_ptNewOrigin.x=m_ptBlockInitial[1].x;
m_ptNewOrigin.y=m_ptBlockInitial[1].y;
h=1;
break;
}
for(a=0;a<4;a++)
{
if(a!=h)
{ //转换成新坐标系内的坐标
m_ptNew.x=(m_ptBlockInitial[a].x-m_ptNewOrigin.x);
m_ptNew.y=(m_ptBlockInitial[a].y-m_ptNewOrigin.y);
//在新坐标系内交换X轴和Y轴坐标,然后还原到原始坐标系
m_ptBlockInitial[a].y=m_ptNew.x+m_ptNewOrigin.y;
m_ptBlockInitial[a].x=-m_ptNew.y+m_ptNewOrigin.x; if((cor[m_ptBlockInitial[a].x][m_ptBlockInitial[a].y]==2)||(m_ptBlockInitial[a].x>9)||(m_ptBlockInitial[a].x<0)||
(m_ptBlockInitial[a].y>19)||(m_ptBlockInitial[a].y<0))
{
for(int d=0;d<4;d++)
{ //如果旋转后的坐标出了边界而不允许旋转
//仍然用之前保存的原坐标
m_ptBlockInitial[d].x=bb[d].x;
m_ptBlockInitial[d].y=bb[d].y;
}
return 0;
}
}
}
return 1;
}int CMytestView::OutOfLeft()
{
for(int a=0;a<4;a++)
{
//小于等于0出左边界
if((m_ptBlockInitial[a].x<=0)||(cor[m_ptBlockInitial[a].x-1][m_ptBlockInitial[a].y]==2))
return 1;
else
return 0;
}
}int CMytestView::OutOfRight()
{
for(int a=0;a<4;a++)
{
//大于等于9出右边界
if((m_ptBlockInitial[a].x>=9)||(cor[m_ptBlockInitial[a].x+1][m_ptBlockInitial[a].y]==2))
return 1;
else
return 0;
}
}求求大神帮帮忙小女子真的不会啊俄罗斯方块
//
//游戏面板纵向单元格数
#include "stdafx.h"
#include "Mytest.h"#include "MytestDoc.h"
#include "MytestView.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define BlockInitialX 0 //方块起始横坐标
#define BlockInitialY 0 //方块起始纵坐标
#define RED RGB(255,0,0) //红色
#define GREEN RGB(0,255,0) //绿色
#define BLUE RGB(0,0,255) //蓝色
#define WHITE RGB(255,255,255) //白色
#define BLACK RGB(0,0,0) //黑色
#define DARKORANGE RGB(255,140,0)//暗橘黄色
#define TOMATO RGB(255,99,71) //西红柿色
#define DEEPPINK RGB(255,20,147) //深粉红色
#define FUCHSIA RGB(255,0,255) //紫红色
#define OLIVE RGB(128,128,0) //橄榄色
#define PanelX 100 //游戏面板左上角起始横坐标
#define PanelY 20 //游戏面板左上角起始纵坐标
#define UNIT 10 //游戏面每个单元格长度
#define UNITX 10 //游戏面板横向单元格数
#define UNITY 20
/////////////////////////////////////////////////////////////////////////////
// CMytestViewIMPLEMENT_DYNCREATE(CMytestView, CView)BEGIN_MESSAGE_MAP(CMytestView, CView)
//{{AFX_MSG_MAP(CMytestView)
ON_WM_PAINT()
ON_WM_TIMER()
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CMytestView construction/destructionCMytestView::CMytestView()
{
m_wndStatusBar.Create(this);
index=0;
flag=1;
for(int i=0;i<20;i++)
{
for(int j=0;j<10;j++)
{
cor[j][i]=0;
}
}}CMytestView::~CMytestView()
{
}BOOL CMytestView::PreCreateWindow(CREATESTRUCT& cs)
{
return CView::PreCreateWindow(cs);
}/////////////////////////////////////////////////////////////////////////////
// CMytestView drawingvoid CMytestView::OnDraw(CDC* pDC)
{
CMytestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
}/////////////////////////////////////////////////////////////////////////////
// CMytestView diagnostics#ifdef _DEBUG
void CMytestView::AssertValid() const
{
CView::AssertValid();
}void CMytestView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}CMytestDoc* CMytestView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMytestDoc)));
return (CMytestDoc*)m_pDocument;
}
#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////
// CMytestView message handlersvoid CMytestView::BlockCreate()
{
for(int i=0;i<4;i++)
{
m_ptBlockInitial[i].x=0; //初始横坐标的位置
m_ptBlockInitial[i].y=0; //初始纵坐标的位置
}
for(int j=0;j<4;j++)
{
m_ptBlockCopy[j].x=0;
m_ptBlockCopy[j].y=0;
} index=rand()%7; //随机产生其中方块之一,rand()为随机数函数。
switch(index)
{
case 1: // 一 型
m_ptBlockInitial[0].x=BlockInitialX+5;
m_ptBlockInitial[0].y=BlockInitialY+0;
m_ptBlockInitial[1].x=BlockInitialX+6;
m_ptBlockInitial[1].y=BlockInitialY+0;
m_ptBlockInitial[2].x=BlockInitialX+4;
m_ptBlockInitial[2].y=BlockInitialY+0;
m_ptBlockInitial[3].x=BlockInitialX+3;
m_ptBlockInitial[3].y=BlockInitialY+0;
m_clrBlockInitial=OLIVE;
break;
case 2: //N 型
m_ptBlockInitial[0].x=BlockInitialX+5;
m_ptBlockInitial[0].y=BlockInitialY+0;
m_ptBlockInitial[1].x=BlockInitialX+6;
m_ptBlockInitial[1].y=BlockInitialY+0;
m_ptBlockInitial[2].x=BlockInitialX+6;
m_ptBlockInitial[2].y=BlockInitialY+1;
m_ptBlockInitial[3].x=BlockInitialX+7;
m_ptBlockInitial[3].y=BlockInitialY+1;
m_clrBlockInitial=RED;
break;
case 3://倒N型
m_ptBlockInitial[0].x=BlockInitialX+5;
m_ptBlockInitial[0].y=BlockInitialY+1;
m_ptBlockInitial[1].x=BlockInitialX+6;
m_ptBlockInitial[1].y=BlockInitialY+1;
m_ptBlockInitial[2].x=BlockInitialX+6;
m_ptBlockInitial[2].y=BlockInitialY+0;
m_ptBlockInitial[3].x=BlockInitialX+7;
m_ptBlockInitial[3].y=BlockInitialY+0;
m_clrBlockInitial=GREEN;
break;
case 4: //J型
m_ptBlockInitial[0].x=BlockInitialX+5;
m_ptBlockInitial[0].y=BlockInitialY+0;
m_ptBlockInitial[1].x=BlockInitialX+6;
m_ptBlockInitial[1].y=BlockInitialY+0;
m_ptBlockInitial[2].x=BlockInitialX+7;
m_ptBlockInitial[2].y=BlockInitialY+0;
m_ptBlockInitial[3].x=BlockInitialX+7;
m_ptBlockInitial[3].y=BlockInitialY+1;
m_clrBlockInitial=BLUE;
break;
case 5://L型
m_ptBlockInitial[0].x=BlockInitialX+5;
m_ptBlockInitial[0].y=BlockInitialY+1;
m_ptBlockInitial[1].x=BlockInitialX+6;
m_ptBlockInitial[1].y=BlockInitialY+1;
m_ptBlockInitial[2].x=BlockInitialX+7;
m_ptBlockInitial[2].y=BlockInitialY+1;
m_ptBlockInitial[3].x=BlockInitialX+7;
m_ptBlockInitial[3].y=BlockInitialY+0;
m_clrBlockInitial=DARKORANGE;
break;
case 6://T型
m_ptBlockInitial[0].x=BlockInitialX+5;
m_ptBlockInitial[0].y=BlockInitialY+0;
m_ptBlockInitial[1].x=BlockInitialX+5;
m_ptBlockInitial[1].y=BlockInitialY+1;
m_ptBlockInitial[2].x=BlockInitialX+6;
m_ptBlockInitial[2].y=BlockInitialY+1;
m_ptBlockInitial[3].x=BlockInitialX+4;
m_ptBlockInitial[3].y=BlockInitialY+1;
m_clrBlockInitial=DEEPPINK;
break;
case 7://田型
m_ptBlockInitial[0].x=BlockInitialX+5;
m_ptBlockInitial[0].y=BlockInitialY+0;
m_ptBlockInitial[1].x=BlockInitialX+6;
m_ptBlockInitial[1].y=BlockInitialY+0;
m_ptBlockInitial[2].x=BlockInitialX+5;
m_ptBlockInitial[2].y=BlockInitialY+1;
m_ptBlockInitial[3].x=BlockInitialX+6;
m_ptBlockInitial[3].y=BlockInitialY+1;
m_clrBlockInitial=FUCHSIA;
break;
}
}这是程序的前半部分