C语言实现的俄罗斯方块,
仅能在windows平台编译运行。
#include<stdio.h>
#include<time.h>
#include<conio.h>
#include<windows.h>
#define MAX_Y 30
#define MAX_X 20
#define false 0
#define true 1
int gameBox[7][4][4]={
{ 0,0,0,0,
0,0,0,0,
1,1,1,1,
0,0,0,0,
},
{
0,0,0,0,
0,1,1,0,
0,1,0,0,
0,1,0,0,
},
{
0,0,0,0,
0,0,1,1,
0,0,0,1,
0,0,0,1,
},
{
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,0,0,
0,0,1,0,
0,1,1,1,
0,0,0,0,
},
{
0,0,0,0,
0,1,1,0,
0,1,1,0,
0,0,0,0,
}
};
int mapBox[MAX_Y+8][MAX_X+8];
int X=8,Y=0;
long t1;
int fen=0;
int change(int box[4][4],int newBox[4][4]){
int i1,i2;
for(i1=0;i1<4;i1++){
for(i2=0;i2<4;i2++){
newBox[i1][i2]=box[3-i2][i1];
}
}
return 0;
}
int timer(long t){
static int a;
long t2=clock();
if((t2-t1)>t){
t1=t2;
return 1;
}
return 0;
}
void gotoxy(int x, int y)
{
COORD pos = {x,y};
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut, pos);
}
int initMap(int max_y,int max_x){
int i1,i2;
t1=clock();
for(i1=0;i1<max_y;i1++){
for(i2=0;i2<max_x;i2++){
if(i1!=MAX_Y){
if((i2==3||i2==(MAX_X+4))&&i1<MAX_Y)mapBox[i1][i2]=1;
else mapBox[i1][i2]=0;
}
else if(i2>=3&&i2<=MAX_X+4)mapBox[i1][i2]=1;
}
}
return 0;
}
int drawMap(void){
int i,i1,i2;
gotoxy(0,0);
for(i1=0;i1<MAX_Y+8;i1++){
for(i2=0;i2<MAX_X+8;i2++){
if(mapBox[i1][i2]==1)printf("■");
else printf(" ");
}printf("\n");
}
gotoxy(26*2,10);printf("分数:%d",fen);
}
int drawBox(int box[4][4],int x,int y,int mode){
int i1,i2;
for(i1=0;i1<4;i1++){
for(i2=0;i2<4;i2++){
if(box[i1][i2]==1){gotoxy((x+i2)*2,y+i1);if(mode==1)printf("□");else printf(" ");}
}
}
}
int test(int box[4][4],int x,int y){
int i1,i2;
for(i1=0;i1<4;i1++)
for(i2=0;i2<4;i2++){
if(box[i1][i2]&mapBox[y+i1][x+i2])return 0;
}
return 1;
}
int write(int box[4][4],int x,int y){
int i1,i2;
for(i1=0;i1<4;i1++)
for(i2=0;i2<4;i2++){
mapBox[y+i1][x+i2]=box[i1][i2]||mapBox[y+i1][x+i2];
}
return 1;
}
int checkMap(void){
int i1,i2,i11,i22;
int flag=0;
for(i1=0;i1<MAX_Y;i1++){
for(i2=4;i2<25;i2++){
if(mapBox[i1][i2]!=1)flag=1;
}
if(flag==0){
Beep(264,110);Beep(495,100);fen=fen+10;
for(i11=i1;i11>0;i11--){
for(i22=4;i22<25;i22++){
mapBox[i11][i22]=mapBox[i11-1][i22];
}
}
}
flag=0;
}
}
int main(void){
int box[4][4];
int tempBox[4][4];
int i1,i2,n,i,daly_time=500,life=1;
srand((unsigned)time(NULL));
system("mode con cols=64 lines=40");
n=rand()%7;
for(i1=0;i1<4;i1++)
for(i2=0;i2<4;i2++)
box[i1][i2]=gameBox[n][i1][i2];
initMap(MAX_Y+8,MAX_X+8);
drawMap();
drawBox(box,X,Y,1);
while(life){
if(timer(daly_time)){
drawBox(box,X,Y,0);
if(test(box,X,Y+1))Y++;
else{
write(box,X,Y);
drawMap();
checkMap();
drawMap();
n=rand()%7;
for(i1=0;i1<4;i1++)
for(i2=0;i2<4;i2++)
box[i1][i2]=gameBox[n][i1][i2];
X=8;Y=0;
if(!test(box,X,Y))life=0;
}
drawBox(box,X,Y,1);
}
if(kbhit()){
switch(getch()){
case 'w' : if(X<4){if(test(box,4,Y)){drawBox(box,X,Y,0);X--;drawBox(box,4,Y,1);}X=4;}
if(X>20){if(test(box,20,Y)){drawBox(box,X,Y,0);X--;drawBox(box,20,Y,1);}X=20;}
change(box,tempBox);
if(test(tempBox,X,Y)){
drawBox(box,X,Y,0);
for(i1=0;i1<4;i1++)
for(i2=0;i2<4;i2++)
box[i1][i2]=tempBox[i1][i2];
drawBox(box,X,Y,1);
}break;
case 's' :daly_time=10;break;
case 'a' :if(test(box,X-1,Y)){drawBox(box,X,Y,0);X--;drawBox(box,X,Y,1);}break;
case 'd' :if(test(box,X+1,Y)){drawBox(box,X,Y,0);X++;drawBox(box,X,Y,1);}break;
}
}
else daly_time=500;
}
printf("\a");
printf("你挂了!游戏结束!");
}