//#include<iostream> //using namespace std; //double x=2,sum,num,n; //int main() //{ // cin>>n; // while(n>sum) // { // sum+=x; // x*=0.98; // num++; // } // cout<<num; // return 0; //} //俄罗斯方块 /*******************************/ /******Writer: GJ **/ /Language: C / /Date: 2013 3 23 / // #include<iostream> #include<stdio.h> //#include<conio.h> #include<string.h> #include<time.h> #include<stdlib.h># #include<windows.h> using namespace std; #define me(a) memset(a,0,sizeof(a)) #define judge(bl,ok) for(i=0;i<5;i++)if(bl[i].x&&map[bl[i].x][bl[i].y])ok=0 #define is_pure(node,ok) if(map[node.x][node.y])ok=0 const int HEIGHT=24,LENGTH=40,SIDE=22;

char INIT_MAP[HEIGHT+1][LENGTH+1]; int map[HEIGHT][SIDE]; struct node{int x,y;int color;}; const int TIME_DWELL=1000; int state=0;

/获取句柄/ HANDLE Output=GetStdHandle(STD_OUTPUT_HANDLE); HANDLE Input=GetStdHandle(STD_INPUT_HANDLE);

/设置光标位置/ void SetCursor(int x,int y){ COORD cd={x,y}; SetConsoleCursorPosition(Output,cd); }

/初始化图/ void INITMAP() { for(int i=0;i<HEIGHT;i++) for(int j=0;j<SIDE;j++){ if(i0||iHEIGHT-1||j0||jSIDE-1)map[i][j]=1; else map[i][j]=0; } }

/**右上方提前显示方块/ node bl[5]; void Former_Print_block(int n) { int i; for(i=0;i<5;i++){bl[i].x=bl[i].y=0;} if(n0){ bl[0].x=3,bl[0].y=28; bl[1].x=3,bl[1].y=30; bl[2].x=4,bl[2].y=30; bl[3].x=4,bl[3].y=32; } if(n1){ bl[0].x=3,bl[0].y=32; bl[1].x=3,bl[1].y=30; bl[2].x=4,bl[2].y=30; bl[3].x=4,bl[3].y=28; } if(n2){ bl[0].x=3,bl[0].y=30; bl[1].x=4,bl[1].y=28; bl[2].x=4,bl[2].y=30; bl[3].x=4,bl[3].y=32; } if(n3){ bl[0].x=3,bl[0].y=27; bl[1].x=3,bl[1].y=29; bl[2].x=3,bl[2].y=31; bl[3].x=3,bl[3].y=33; } if(n4){ bl[0].x=3,bl[0].y=29; bl[1].x=3,bl[1].y=31; bl[2].x=4,bl[2].y=29; bl[3].x=4,bl[3].y=31; } if(n5){ bl[0].x=3,bl[0].y=28; bl[1].x=4,bl[1].y=28; bl[2].x=4,bl[2].y=30; bl[3].x=4,bl[3].y=32; } if(n==6){ bl[0].x=3,bl[0].y=32; bl[1].x=4,bl[1].y=28; bl[2].x=4,bl[2].y=30; bl[3].x=4,bl[3].y=32; } for(i=0;i<5;i++){ SetCursor(bl[i].y,bl[i].x); printf("■"); } }

/获取不同的方块,出现在中间**/ node block[5];//全局使用的核心!!! void print_block(int n) {int i; for(i=0;i<5;i++){block[i].x=block[i].y=0;} if(n0){ block[0].x=1,block[0].y=7; block[1].x=1,block[1].y=9; block[2].x=2,block[2].y=9; block[3].x=2,block[3].y=11; } if(n1){ block[0].x=1,block[0].y=11; block[1].x=1,block[1].y=9; block[2].x=2,block[2].y=9; block[3].x=2,block[3].y=7; } if(n2){ block[0].x=1,block[0].y=9; block[1].x=2,block[1].y=7; block[2].x=2,block[2].y=9; block[3].x=2,block[3].y=11; } if(n3){ block[0].x=1,block[0].y=7; block[1].x=1,block[1].y=9; block[2].x=1,block[2].y=11; block[3].x=1,block[3].y=13; } if(n4){ block[0].x=1,block[0].y=9; block[1].x=1,block[1].y=11; block[2].x=2,block[2].y=9; block[3].x=2,block[3].y=11; } if(n5){ block[0].x=1,block[0].y=7; block[1].x=2,block[1].y=7; block[2].x=2,block[2].y=9; block[3].x=2,block[3].y=11; } if(n==6){ block[0].x=1,block[0].y=11; block[1].x=2,block[1].y=7; block[2].x=2,block[2].y=9; block[3].x=2,block[3].y=11; } for(i=0;i<5;i++){ SetCursor(block[i].y,block[i].x); printf("■"); } }

/按 上 键 旋转/ void Exchange(int m) { int i,ok=1; node blo[5]; for(i=0;i<5;i++)blo[i]=block[i]; if(m0){ if(state0){ blo[0].x+=1;blo[0].y+=2;blo[2].x-=1;blo[2].y+=2;blo[3].x-=2; judge(blo,ok); if(map[blo[0].x][blo[0].y-2])ok=0; if(ok){for(i=0;i<5;i++)block[i]=blo[i];state=1;} } else{ blo[0].x-=1;blo[0].y-=2;blo[2].x+=1;blo[2].y-=2;blo[3].x+=2; judge(blo,ok); if(map[blo[1].x-1][blo[1].y])ok=0; if(ok){for(i=0;i<5;i++)block[i]=blo[i];state=0;} } } else if(m1){ if(state0){ blo[0].x-=1;blo[0].y-=2;blo[2].x-=1;blo[2].y+=2;blo[3].y+=4; judge(blo,ok); if(map[blo[1].x][blo[1].y-2])ok=0; if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=1;} } else { blo[0].x+=1;blo[0].y+=2;blo[2].x+=1;blo[2].y-=2;blo[3].y-=4; judge(blo,ok); if(map[blo[0].x-1][blo[0].y])ok=0; if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=0;} } } else if(m2) { if(state0) { blo[0].x+=1;blo[0].y-=2; blo[1].x+=1;blo[1].y+=2;blo[3].x-=1;blo[3].y-=2; judge(blo,ok); if(map[blo[0].x+1][blo[0].y]||map[blo[0].x-1][block[0].y]||map[blo[3].x][blo[3].y+2])ok=0; if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=1;} } else if(state1) { blo[0].x+=1;blo[0].y+=2; blo[1].x-=1;blo[1].y+=2;blo[3].x+=1;blo[3].y-=2; judge(blo,ok); if(map[blo[0].x][blo[0].y+2]||map[blo[0].x][blo[0].y-2]||map[blo[3].x-1][blo[3].y])ok=0; if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=2;} } else if(state2) { blo[0].x-=1;blo[0].y+=2; blo[1].x-=1;blo[1].y-=2;blo[3].x+=1;blo[3].y+=2; judge(blo,ok); if(map[blo[0].x+1][blo[0].y]||map[blo[0].x-1][blo[0].y]||map[blo[3].x][blo[3].y-2])ok=0; if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=3;} } else{ blo[0].x-=1;blo[0].y-=2; blo[1].x+=1;blo[1].y-=2;blo[3].x-=1;blo[3].y+=2; judge(blo,ok); if(map[blo[0].x][blo[0].y+2]||map[blo[0].x][blo[0].y-2]||map[blo[3].x+1][blo[1].y])ok=0; if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=0;} } } else if(m3) { if(state0){ blo[0].x+=1;blo[0].y+=2;blo[2].x-=1;blo[2].y-=2;blo[3].x-=2;blo[3].y-=4; judge(blo,ok); if(map[blo[0].x][blo[0].y-2]||map[blo[2].x][blo[2].y+2])ok=0; if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=1;} } else { blo[0].x-=1;blo[0].y-=2;blo[2].x+=1;blo[2].y+=2;blo[3].x+=2;blo[3].y+=4; judge(blo,ok); if(map[blo[0].x+1][blo[0].y]||map[blo[2].x-1][blo[2].y])ok=0; if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=0;} } } else if(m5) { if(state0) { blo[0].x+=2;blo[1].x+=1;blo[1].y+=2;blo[3].x-=1;blo[3].y-=2; judge(blo,ok); if(map[blo[3].x][blo[3].y+2])ok=0; if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=1;} } else if(state1) { blo[0].y+=4;blo[1].x-=1;blo[1].y+=2;blo[3].x+=1;blo[3].y-=2; judge(blo,ok); if(map[blo[3].x-1][blo[3].y])ok=0; if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=2;} } else if(state2) { blo[0].x-=2;blo[1].x-=1;blo[1].y-=2;blo[3].x+=1;blo[3].y+=2; judge(blo,ok); if(map[blo[3].x][blo[3].y-2])ok=0; if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=3;} } else{ blo[0].y-=4;blo[1].x+=1;blo[1].y-=2;blo[3].x-=1;blo[3].y+=2; judge(blo,ok); if(map[blo[3].x+1][blo[3].y])ok=0; if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=0;} } } else if(m6) { if(state0) { blo[0].y-=4;blo[1].x+=1;blo[1].y+=2;blo[3].x-=1;blo[3].y-=2; judge(blo,ok); if(map[blo[1].x][blo[1].y-2])ok=0; if(ok){for(i=0;i<5;i++)block[i]=blo[i];state=1;} } else if(state1) { blo[0].x+=2;blo[1].x-=1;blo[1].y+=2;blo[3].x+=1;blo[3].y-=2; judge(blo,ok); if(map[blo[1].x+1][blo[1].y])ok=0; if(ok){for(i=0;i<5;i++)block[i]=blo[i];state=2;} } else if(state2) { blo[0].y+=4;blo[1].x-=1;blo[1].y-=2;blo[3].x+=1;blo[3].y+=2; judge(blo,ok); if(map[blo[1].x][blo[1].y+2])ok=0; if(ok){for(i=0;i<5;i++)block[i]=blo[i];state=3;} } else{ blo[0].x-=2;blo[1].x+=1;blo[1].y-=2;blo[3].x-=1;blo[3].y+=2; judge(blo,ok); if(map[blo[1].x-1][blo[1].y])ok=0; if(ok){for(i=0;i<5;i++)block[i]=blo[i];state=0;} } } }

/清除当前方块*/ void clear_cube(node* block) { for(int i=0;i<5;i++){ if(block[i].x){ SetCursor(block[i].y,block[i].x); printf(" ");} } }

/打印当前方块**/ void printt_cube(node* block) { for(int i=0;i<5;i++){ if(block[i].x){ SetCursor(block[i].y,block[i].x); printf("■"); } } }

/按键*/ void Move(int m,int n){ int i; if(n0){//左 for(i=0;i<5&&block[i].x;i++)if(block[i].y)block[i].y-=2; } if(n1){//右 for(i=0;i<5&&block[i].x;i++)if(block[i].y)block[i].y+=2; } if(n2)//上 { Exchange(m); } if(n3)//下 { int ok=1; while(ok){ for(i=0;i<5;i++)if(block[i].x) if(map[block[i].x+1][block[i].y])ok=0; if(ok)for(i=0;i<5;i++)if(block[i].x) block[i].x+=1; } } }

/判断是否可以向左移动/ int If_Can_Left(node block) { int ok=1,i; int min=22; for(i=0;i<5&&block[i].x;i++)if(block[i].y<min)min=block[i].y; if(min-2<1)ok=0; for(i=0;i<5&&block[i].x;i++)if(block[i].x) if(map[block[i].x][block[i].y-2])ok=0; return ok; }

/判断是否可以向右移动**/ int If_Can_Right(node* block) { int ok=1,i; int max=0; for(i=0;i<5&&block[i].x;i++)if(block[i].y>max)max=block[i].y; if(max+2>19)ok=0; for(i=0;i<5&&block[i].x;i++)if(block[i].x) if(map[block[i].x][block[i].y+2])ok=0; return ok; }

/打印图*/ void print_map() { int i,j; me(INIT_MAP); for(i=0;i<HEIGHT;i++) { if(i0||i23){ for(j=0;j<LENGTH;j++)printf("%c",INIT_MAP[i][j]='-'); } else{ printf("%c",INIT_MAP[i][0]='|'); for(j=1;j<SIDE-1;j++)printf("%c",INIT_MAP[i][j]=' '); printf("%c%c",INIT_MAP[i][j++]='|',INIT_MAP[i][j++]='|'); for(;j<LENGTH-1;j++)printf("%c",INIT_MAP[i][j]=' '); printf("%c",INIT_MAP[i][j]='|'); } cout<<endl; } SetCursor(SIDE+1,10); printf(""); SetCursor(SIDE+1,11); printf("Speed"); SetCursor(SIDE+1,13); printf(""); SetCursor(SIDE+1,14); printf("Score"); SetCursor(SIDE+1,16); printf("================"); SetCursor(SIDE+1,19); printf(" Created By "); SetCursor(SIDE+1,20); printf(" Gong Jing "); }

/下降一格/ void cube_drop(node *block) { int i; for(i=0;i<5;i++)if(block[i].x) block[i].x+=1; }

/到达底部返回1**/ int is_at_botton(node* block) { for(int i=0;i<5;i++) if(block[i].x&&map[block[i].x+1][block[i].y])return 1; return 0; }

void print_map(node *block) { int i; for(i=0;i<5;i++){ if(block[i].x){ map[block[i].x][block[i].y]=1; SetCursor(block[i].y,block[i].x); printf("■"); } } }

int Can_It_Cut() { int i,j; int cut=0; for(i=HEIGHT-2;i>1;i--){ int ok=1; for(j=1;j<SIDE-1;j+=2) if(map[i][j]==0){ok=0;break;} if(ok){ for(j=i;j>1;j--)for(int k=1;k<SIDE-1;k+=2) map[j][k]=map[j-1][k]; cut++;i++; } } for(i=HEIGHT-2;i>1;i--) for(int j=1;j<SIDE-1;j+=2) { SetCursor(j,i); if(map[i][j])printf("■"); else printf(" "); } return cut; }

/是否GameOver/ int is_gameover(int num) { int i,j,ok=1; print_block(num); for(i=0;i<5;i++)if(block[i].x&&map[block[i].x][block[i].y])ok=0; if(!ok){ char aa[20]={"菜逼!!!"}; for(i=9;i<12;i++) { if(i==10){ int t=0; for(int j=4;j<18;j++){ SetCursor(j,i); if(j>=5&&j<17)printf("%c",aa[t++]); else printf(" "); } } else for(j=4;j<18;j++){ SetCursor(j,i); printf(" "); } } SetCursor(1,12);printf(" Enter To Continue. "); SetCursor(1,13);printf(" Esc To Escape. "); SetCursor(1,14);printf(" "); } return ok; }

/*游戏结束,再来一局,清理屏幕/ void Clear_map() { for(int i=22;i>0;i--) for(int j=1;j<SIDE-1;j+=2) { map[i][j]=0; SetCursor(j,i); printf(" "); } }

int main() { srand(time(NULL)); print_map(); INITMAP(); int gameover=1; int ok=1;//用于判断游戏是否结束 while(gameover){ int Score=0; int Speed=0; int numm=(rand()%7)(rand()%7)%7; Sleep(TIME_DWELL); while(ok) { SetCursor(SIDE+4+Speed,12); printf(" "); SetCursor(SIDE+4,15); printf(" "); SetCursor(SIDE+4+Speed,12); printf(""); SetCursor(SIDE+4,15); printf("%d",Score); Sleep(200); int num=numm; //第num个方块,初始时为0这个状态 numm=(rand()%7)*(rand()%7)%7; //提前显示的方块 clear_cube(bl); Former_Print_block(numm); //打印提前显示的方块 print_block(num); //打印要落下的方块初始位置 state=0; int botton=1;//用于判断是否已经落到底部 while(botton) { clear_cube(block); /键位响应/ if(GetAsyncKeyState(VK_LEFT)&&If_Can_Left(block))Move(num,0); else if(GetAsyncKeyState(VK_RIGHT)&&If_Can_Right(block))Move(num,1); else if(GetAsyncKeyState(VK_UP))Move(num,2); else if(GetAsyncKeyState(VK_DOWN)){Move(num,3);botton=0;}

if(!is_at_botton(block))cube_drop(block);
               else botton=0;
               printt_cube(block);//打印当前方块
               if(!botton)print_map( block);
               Sleep(100*(4-Score/80));
           }
           int cut=Can_It_Cut();
           if(cut){
               Score+=cut*10;
               Speed=Score/80;
           }
           ok=is_gameover(numm);
       }
       if(GetAsyncKeyState(VK_ESCAPE))gameover=0;
       else if(GetAsyncKeyState(VK_RETURN)){Clear_map();ok=1;}
   }
   return 0;

}

0 条评论

目前还没有评论...