由于字数有限。。我只粘了部分。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;
   }
}求求大神帮帮忙小女子真的不会啊俄罗斯方块

解决方案 »

  1.   

    // MytestView.cpp : implementation of the CMytestView class
    //
                     //游戏面板纵向单元格数
    #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;
      }
    }这是程序的前半部分