#include <iostream>
#include <string>
#include <cstring>
#include <iomanip>
#include <windows.h>
#include <conio.h>
#include <ctime>
#include <cstdio>
#define BLUE 0x0001 // text color contains blue.
#define GREEN 0x0002 // text color contains green.
#define LIGHTBLUE 0x0003
#define RED 0x0004 // text color contains red.
#define PINK 0x0005
#define YELLOW 0x0006
#define WHITE 0x0007
#define INTENSITY 0x0008 // text color is intensified.
using namespace std;
///map[x][y]中,x是行数1<=x<=22,1<=y<=12,y是列数!!!!!!!!!!!!!切记!!!!!!!!!!
int map[51][51],state,pox,poy,printmap[51][51],po[8],speed[8],nowspeed,mapcolor[51][51],blockcolor,starttime,pausetime;
int nowblock,nextblock,blockstate,colornumber;
int block[8][5][5][5]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0};
int score1,score2;
void initial();
void slowdrop();
void print();
void printmapwithnumber();
void printinitialmap();
void backprintmap();
void formprintmap();
void moveleft();
void moveright();
void playing();
void nextsecond();
void moving(char x);
void turnover();
void movedown();
void newblock();
void eraseblock();
void eraseline(int x);
void changespeed();
void lastaction();
void setcolor(int x);
int whethercandrop();
int whethercanleft();
int whethercanright();
int whethercanturnover();
int main()
{
int x;
printf("Welcome to my game----unoffical Tetris.\n请用WSAD来控制上下左右.\n可以随时按空格键暂停游戏。\nTo Start Game, Please press any key.");
getch();
while(1)
{
initial();
print();
playing();
cout<<"Would Like To play Again??\nPlease press 1 to play again,press -1 to quit";
cin>>x;
if(x==-1) return 0;
}
return 0;
}
void initial()
{
blockstate=1;
int i,j;
state=0;
colornumber=14;
srand(GetTickCount());
nowblock=rand()%7+1;
blockcolor=rand()%colornumber+1;
nextblock=rand()%7+1;
//nowblock=4;
nowspeed=1;
starttime=time(0);
pausetime=0;
po[1]=-1;po[2]=0;po[3]=0;po[4]=0;po[5]=0;po[6]=0;po[7]=0;
speed[0]=0;speed[1]=1000;speed[2]=800;speed[3]=600;speed[4]=500;speed[5]=400;speed[6]=300;speed[7]=220;
pox=po[nowblock];poy=5;
score1=score2=0;
for(i=0;i<=50;i++)
for(j=0;j<=50;j++)
{
map[i][j]=printmap[i][j]=0;
mapcolor[i][j]=7;
}
for(i=1;i<=12;i++)
{map[1][i]=printmap[1][i]=0;
map[22][i]=printmap[22][i]=2;}///标记第22行全是围墙。
for(i=1;i<=22;i++)
{map[i][1]=map[i][12]=printmap[i][1]=printmap[i][12]=2;}///标记第1和第12列全是围墙。
}
void slowdrop()
{
pox++;
}
void fastenblock()
{
int i,j;
formprintmap();
for(i=2;i<=21;i++)
for(j=2;j<=11;j++)
map[i][j]=printmap[i][j];
}
void printmapwithnumber()
{
int i,j;
for(i=1;i<=22;i++)
{
for(j=1;j<=12;j++)
cout<<map[i][j];
cout<<endl;
}
}
void setprintmap()
{
int i,j;
for(i=2;i<=21;i++)
for(j=2;j<=11;j++)
printmap[i][j]=map[i][j];
}
void formprintmap()
{
int i,j;
for(i=0;i<=3;i++)
for(j=0;j<=3;j++)
{
if(block[nowblock][blockstate][i+1][j+1]==1)mapcolor[pox+i][poy+j]=blockcolor;
printmap[pox+i][poy+j]+=block[nowblock][blockstate][i+1][j+1];
}
}
void backprintmap()
{
int i,j;
for(i=0;i<=3;i++)
for(j=0;j<=3;j++)
{
printmap[pox+i][poy+j]-=block[nowblock][blockstate][i+1][j+1];
if(block[nowblock][blockstate][i+1][j+1]==1)mapcolor[pox+i][poy+j]=7;
}
}
void print()
{
int i,j;
system("CLS");
formprintmap();
for(i=2;i<=22;i++)
{
//cout<<setw(2)<<i<<":";
for(j=1;j<=12;j++)
{
if(printmap[i][j]==0){setcolor(7);printf("□");continue;}
if(printmap[i][j]==1){setcolor(mapcolor[i][j]);printf("■");continue;}
if(printmap[i][j]==2){setcolor(7);printf("★");continue;}
}
if(i==3) printf(" Next block is :");
if(i==4) {cout<<" ";for(j=1;j<=4;j++)
{
if(block[nextblock][1][1][j]==0){printf(" ");continue;}
if(block[nextblock][1][1][j]==1){printf("■");continue;}
}
}
if(i==5) {cout<<" ";for(j=1;j<=4;j++)
{
if(block[nextblock][1][2][j]==0){printf(" ");continue;}
if(block[nextblock][1][2][j]==1){printf("■");continue;}
}
}
if(i==6) {cout<<" ";for(j=1;j<=4;j++)
{
if(block[nextblock][1][3][j]==0){printf(" ");continue;}
if(block[nextblock][1][3][j]==1){printf("■");continue;}
}
}
if(i==7) {cout<<" ";for(j=1;j<=4;j++)
{
if(block[nextblock][1][4][j]==0){printf(" ");continue;}
if(block[nextblock][1][4][j]==1){printf("■");continue;}
}
}
if(i==10){cout<<" Your Score now is :";}
if(i==11)cout<<" "<<score1;
if(i==14) cout<<" Speed is :";
if(i==15) cout<<" LEVEL "<<nowspeed;
if(i==17) cout<<" Playing Time is :";
if(i==18) cout<<" "<<setw(4)<<time(0)-starttime-pausetime<<" Seconds.";
printf("\n");
}
backprintmap();
cout<<endl;
}
void moveleft()
{
poy--;
}
void moveright()
{
poy++;
}
int whethercanright()
{
if(poy>=11) return 0;
poy++;
int i,j,mark=0;
for(i=0;i<=3;i++)
{
for(j=0;j<=3;j++)
{