求高手,求解答啊!!别人给的《俄罗斯方块》源代码,可是不是看的很懂,帮忙分析。
第一模版: #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;
}