| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 794 人关注过本帖
标题:求高手,求解答啊!!别人给的《俄罗斯方块》源代码,可是不是看的很懂,帮 ...
取消只看楼主 加入收藏
编程小铁
Rank: 1
来 自:广东惠州
等 级:新手上路
帖 子:6
专家分:0
注 册:2012-11-5
结帖率:100%
收藏
 问题点数:0 回复次数:1 
求高手,求解答啊!!别人给的《俄罗斯方块》源代码,可是不是看的很懂,帮忙分析。
第一模版:                        

#include"FANG.h"
#include<iostream>
using namespace std;

Fang::Fang()  //构造函数
{

    defen=0;
    srand((unsigned)time(0));
    IO=true;
    for(int ia=0;ia<23;ia++)
    {
        for(int ja=0;ja<22;ja++)
        {
            if(ia==0 || ia==22|| ja==0 || ja==12 || ja==21 )
             face[ia][ja]=1;  //1代表打印■
            else
             face[ia][ja]=0;
        }
    }
    int fk1[7][4][4]=  //定义fk1对fk进行赋值
    {
    {   {0,0,0,0},
        {1,1,1,1},
        {0,0,0,0},
        {0,0,0,0}
    },
    {
        {0,0,0,0},
        {0,1,0,0},
        {1,1,1,0},
        {0,0,0,0}
    },
    {   {0,0,0,0},
        {1,1,0,0},
        {0,1,1,0},   
        {0,0,0,0}
    },
    {
        {0,0,0,0},
        {0,1,1,0},
        {1,1,0,0},
        {0,0,0,0}
    },
    {
        {0,1,1,0},
        {0,0,1,0},
        {0,0,1,0},
        {0,0,0,0}
    },
    {
        {0,1,1,0},
        {0,1,0,0},
        {0,1,0,0},
        {0,0,0,0}
    },
    {   {0,0,0,0},
        {0,1,1,0},
        {0,1,1,0},   
        {0,0,0,0}
    }
};
    for(int aa=0;aa<7;aa++)   //对fk进行赋值
    {
        for(int bb=0;bb<4;bb++)
        {
            for(int cc=0;cc<4;cc++)
                fk[aa][bb][cc]=fk1[aa][bb][cc];
        }
    }
  random();
  give();

}

bool Fang::IORO() //控制结束
{
    return IO;
}


void Fang::give()//把形状的数组给予NowFK[][]
{
   
    for(int g1i=0;g1i<4;g1i++)
        for(int g2i=0;g2i<4;g2i++)
            NowFk[g1i][g2i]=fk[nran][g1i][g2i];

}



void Fang::FirstPrint()  //初始化打印
{
   
   
       for(int ib=0;ib<23;ib++)
    {
        for(int jb=0;jb<22;jb++)
        {
            switch(face[ib][jb])
            {
            case 0:
                cout<<"  ";
                break;
            default:
                cout<<"■";
            }
            
        }
        cout<<endl;
    }
    gotoxy(26,2);
    cout<<"当前等级:"<<speed;
    gotoxy(26,4);
    cout<<"当前分数:0";
    gotoxy(26,6);
    cout<<"下一个方块:";
    gotoxy(26,14);
    cout<<"←→↓↑控制"<<endl;
    gotoxy(26,16);
    cout<<"方块位置和形状";
    gotoxy(26,16);
    cout<<"按空格键暂停游戏";
    gotoxy(26,18);
    cout<<"按ESC退出游戏";
    nextfk();
    random();
    nextone();


}


void Fang::nextone()  ////控制右边下一个方块窗口打印
{
    for(int n1=0;n1<4;n1++)
    {
        gotoxy(27,8+n1);
        for(int n2=0;n2<4;n2++)
        {
            switch(fk[nran][n1][n2])
            {
            case 0:
                cout<<"  ";
                break;
            default:
                cout<<"■";
            }
        }
    }
}


void Fang::gotoxy(int x,int y)  //坐标定位   (坐标禾face[a][b]的换算,1/2x=a,y=b)
{
     COORD pos = {x,y};   
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);   
}


void Fang::random() //随机数
{
    nran=int(rand()%7);

}



int Fang::test(int NX,int NY)   //测试能否放下,可以就返回1,不可以返回0
{
   
    for(int a1=0;a1<4;a1++)
    {
        for(int a2=0;a2<4;a2++)
        {if(NowFk[a1][a2]&&face[a1+NY][a2+(NX)/2])  //都为1时不可以放下
        return 0;}
   
    }
         return 1;

   
}

int Fang::nextfk()  //下一个方块,可以放下就返回1,不可以放下就返回0
{
  CurrentX=8;CurrentY=1;
  if(test(CurrentX,CurrentY))
  {
   CurrentY=0;
   fkPrint();
   
   return 1;
  }
  return 0;
}

int Fang::dowm()  //下落函数,可以下落返回1
{

   
    int NewY;
    NewY=CurrentY+1;
    if((test(CurrentX,NewY)))
    {   
        delfk();  //先清除原来的方块显示
        CurrentY=NewY;fkPrint();
        return 1;
    }
    newbegan();
    return 0;
}

void Fang::fkPrint() //方块单独打印
{
  
  for(int ap=0;ap<4;ap++)
  {
   for(int bp=0;bp<4;bp++)
   {
     if(NowFk[ap][bp])
     {
         if(CurrentY+ap>0) //如果CurrentY==0,即刚出来时最上面那一行不打印;
         {gotoxy(CurrentX+bp*2,CurrentY+ap);
         cout<<"■";}
     }
   }
  }
}

void Fang::delfk() //清除方块
{
  
  for(int cp=0;cp<4;cp++)
  {
   for(int dp=0;dp<4;dp++)
   {
     if(NowFk[cp][dp])
     {
         if(CurrentY+cp>0)
         {gotoxy(CurrentX+dp*2,CurrentY+cp);
         cout<<"  ";}
     }
   }
  }
}

void Fang::newbegan() //方块停下,新方块的开始
{
  for(int ne=0;ne<4;ne++)
  {
   for(int me=0;me<4;me++)
   {
     if(NowFk[ne][me])
         face[ne+CurrentY][me+(CurrentX)/2]=NowFk[ne][me];
   }
  }
  man();
  give();
  random();
  nextone();
  if(nextfk()==0)
  {IO=false;}

}


 //接收键盘值 72上、75左、77右、80下、27 ESC
int Fang::key()
{
    int k;
    if(kbhit())
    {
        k=getch();
        return k;
    }
    return 0;
}

void Fang::move(int NX) //左右平移
{
    int NewX;
    switch(NX)
    {
    case 1:
        NewX=CurrentX-2;break;
    default:
        NewX=CurrentX+2;
    }

   
   


    if((test(NewX,CurrentY)))
    {  
        delfk(); //先清除原来的方块
        CurrentX=NewX;fkPrint();
     
    }
}

void Fang::change()  //方块变形
{
    int change[4][4];
    for(int chi=0;chi<4;chi++)
     for(int chj=0;chj<4;chj++)
         change[chi][chj]=NowFk[chj][3-chi];
     
     
    int ka;  //通过ka判断能否放下  
    ka=1;
    for(int u1=0;u1<4;u1++)
    {
        for(int u2=0;u2<4;u2++)
            if(change[u1][u2]&&face[u1+CurrentY][u2+CurrentX/2])  //都为1时不可以放下
            {ka=0;break;}
            
    }
   
    if(ka)
      {
        delfk();
       for(int chk=0;chk<4;chk++)
        for(int chl=0;chl<4;chl++)
         NowFk[chk][chl]= change[chk][chl];

         fkPrint();
      }
}
int heng=0; //记录消行数
int Fang::man() //判断是否满行
{
    int bei=0; //记录得分倍数,一次消行的次数越多得分位数越高
    for(int my=1;my<22;my++) //my为行
    {
        int full=1;  //用full=1代表一行满
        for(int mx=1;mx<12;mx++)
            if(face[my][mx]==0)
            {full=0;break;}

        if(full)
        {
            bei=bei+1;
            for(int ny=my;ny>0;ny--)
            {
                gotoxy(2,ny);
                for(int nx=1;nx<12;nx++)
                {
                    if(ny>1)
                       face[ny][nx]=face[ny-1][nx];
                    else
                        face[ny][nx]=0;   //最上面一行的为0

                  if(face[ny][nx])
                    cout<<"■";
                  else
                    cout<<"  ";
                }
            }
        }
            
    }
    if(bei>0)
    {
    defen=defen+50*bei*bei; //得分增加
    gotoxy(35,4);cout<<defen;
    heng=heng+bei;
   
    if(heng>=30&& heng%30==0 && speed<11)
    {
        speed=speed+1;
        gotoxy(36,2);cout<<speed;
    }
}


 return 0;
}

void Fang::Tend() //方块结束打印
{
    gotoxy(0,0);
 int over[24][23]=
{
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,1,1,1,1,1},
    {1,1,0,1,1,1,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,1},
    {1,1,0,1,1,1,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,1},
    {1,1,0,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,1},
    {1,1,0,1,1,1,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,1},
    {1,1,0,1,1,1,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,1},
    {1,1,0,0,0,0,1,1,0,1,1,0,1,1,0,0,0,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
   
 };

for(int t1=0;t1<23;t1++)
{
    for(int t2=0;t2<22;t2++)
    {
        if(over[t1][t2]==1)
            cout<<"■";
        else
            cout<<"  ";
    }
    cout<<endl;

};

}

第二模版:
#include<windows.h>
#include<iostream>
#include<ctime>
#include<stdlib.h>
#include<string>
#include<stdlib.h>
#include<fstream>
#include<conio.h>
#include<cstdlib>

using namespace std;
extern int speed; //控制速度1-10,数值越大,级别越高;

class Fang
{

    int face[23][22];   //界面
    int fk[7][4][4];   //记录方块形状
    int CurrentX;     //当前方块左上角的坐标X,Y
    int CurrentY;
    int NowFk[4][4]; //保存当前方块形状
    int nran; //当前方块
    bool IO;  //控制程序结束
    int defen;//记录得分
public:
    Fang();   //构造函数
    void give(); //产生新方块并把形状的数组给予NowFK[][]
    void FirstPrint(); //初始化界面
    void gotoxy(int x,int y);
    void random();  //产生随机数
   
    void nextone(); //控制下一个方块窗口打印

    void Print();  //游戏整体打印
    void fkPrint(); //方块打印
    int nextfk();  //下一个方块主界面的打印

    int test(int,int);   //测试能否放下
    void change();  //改变
    int dowm();   //下落函数
    void delfk(); //清除方块
 
    void newbegan(); //方块停下,新方块的开始

       bool IORO();   //控制结束
    int key();  //返回键盘输入的ASCII码
    void move(int); //左右平移
   
    int man();  //判断一行是否满
    void Tend();//结束打印

};

第三模版:
#include<iostream>
#include<cstdlib>

#include"FANG.h"
using namespace std;

int speed; //控制速度1-10,数值越大,级别越高;
void main()
{
  

    cout<<"------------------------------------------------------------------"<<endl;
    cout<<endl;
    cout<<"                                    块"<<endl;
    cout<<endl;
   
   
    cout<<endl;
    cout<<"  请选择游戏等级(1-10),数值越大,级别越高,游戏速度越快"<<endl;
    cin>>speed;

    for(int aa=0;aa<4;aa++)
    {
    if(speed<11 && speed>0)
        break;
   
    else
     {cout<<"你输入的不是有效等级,请重新输入";
     cin>>speed;
    }   
    }
    system("cls");
 

    Fang fang;
    int keyin;
   
    fang.FirstPrint(); //初始化界面
    fang.gotoxy(2,1);
    int finish=clock();
    int start=0;
    int kk=0;
    for(;;)
    {
     if(()==false)
         break;

     if((finish-start)>(550-50*speed))  //控制循环时间
     {
      fang.dowm();     
      start=finish;
     }
      finish=clock();
    keyin=fang.key(); //记录键盘输入
      if( keyin)    //返回键盘值72上、75左、77右、80下、27 ESC、32空格
      {
          switch(keyin)
          {
          case 72:
             fang.change();break;
          case 75:
             fang.move(1);break;
          case 77:
             fang.move(2);break;
          case 80:
              fang.dowm();break;
          case 27:
              goto sg;
          case 32:
              {
               fang.gotoxy(2,23);
               system("pause"); //实现空格暂停
               fang.gotoxy(2,23);cout<<"                          ";
              }
          }
      }


    }




sg:fang.Tend();

   cout<<"THE END"<<endl;
//return 0;
   
}
搜索更多相关主题的帖子: 俄罗斯方块 include 源代码 
2012-11-15 18:07
编程小铁
Rank: 1
来 自:广东惠州
等 级:新手上路
帖 子:6
专家分:0
注 册:2012-11-5
收藏
得分:0 
回复 2楼 mmmmmmmmmmmm
不是运行不了。是你没有去定义类吧?我这里是直接复制的源代码。你要的话,我传给你。

在那棵梨树下守候你归来的少年,已经开始自己的人生了。
2012-11-17 00:32
快速回复:求高手,求解答啊!!别人给的《俄罗斯方块》源代码,可是不是看的很懂 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027927 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved