重写了一个俄罗斯方块,主要代码3~4个小时就写完了,,自动下落的研究了好久才弄出来。。。。菜啊 不过现在回头再看以前写的俄罗斯方块真是太垃圾了。。。。VC++6.0下编译通过 #include<iostream> #include<conio.h> #include<windows.h> #include <time.h> #pragma comment(lib, "winmm.lib") using namespace std; #define MAPSIZEH 20 #define MAPSIZEL 15 /* 操作:上下左右wsad 空格是速降 */ char GRA[24][4][4]= { {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,1,1,1,0,0,0,0}, /*横*/ {0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}, /*竖*/ {0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0}, /*上土*/ {0,0,0,0,0,1,0,0,0,1,1,0,0,1,0,0}, /*右土*/ {0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0}, /*下土*/ {0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0}, /*左土*/ {0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0}, /*Z*/ {0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0}, /*Z*/ {0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0}, /*Z*/ {0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0}, /*Z*/ {0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0}, /*-|*/ {0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0}, /*__|*/ {0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0}, /*||_*/ {0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0}, /*|--*/ {0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0}, /*||-*/ {0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0}, /*--|*/ {0,0,1,0,0,0,1,0,0,1,1,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,1,1,1,0,1,1,1,0,1,1,1}, /*超级大田*/ {0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0}, /*大竖*/ {0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0}, /*大横*/ {0,0,0,0,0,1,0,0,1,1,1,0,0,1,0,0}, /*十*/ {0,0,0,0,0,1,1,1,0,1,0,1,0,1,1,1}, /*空心大田*/ }; char MAP[MAPSIZEH][MAPSIZEL]; int STARTX,STARTY/*起始XY坐标*/,TYPE/*当前图形类型*/,NEXTTYPE/*下一个图形*/,SOCER/*当前分数*/,TURN[24]={0,2,1,4,5,6,3,8,7,10,9,12,13,14,11,16,17,18,15,19,21,20,22,23}; /*旋转状态跳转*/ struct move { int x,y; }move[4]={0,-1,0,1,1,0,0,0}; /*左右下和不动,不动的用于判定方块是否能旋转*/ bool decidemove(int type,int dis) /*判断方块是否能够移动或旋转*/ { int i,j; for(i=0;i<4;i++) for(j=0;j<4;j++) if(GRA[type][i][j]) { if(STARTX+i+move[dis].x<0||STARTX+i+move[dis].x>=MAPSIZEH||STARTY+j+move[dis].y<0||STARTY+j+move[dis].y>=MAPSIZEL||MAP[STARTX+i+move[dis].x][STARTY+j+move[dis].y]==1) return false; } return true; } void lockinmap(int s) /*将方块固定在地图上*/ { int i,j; for(i=0;i<4;i++) for(j=0;j<4;j++) if(GRA[TYPE][i][j]) MAP[STARTX+i][STARTY+j]=s; } void moving(int type,int dis) /*将方块在屏幕上移动*/ { int i,j; lockinmap(0); /*将MAP中的'2'置为0*/ STARTX+=move[dis].x; STARTY+=move[dis].y; /*移动方块*/ lockinmap(2); } void gotoxy(int x,int y) /*移动光标*/ { COORD C; C.X = x; C.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),C); } void show() /*显示屏*/ { gotoxy(0,0); int i,j; for(i=0;i<MAPSIZEH;i++,cout<<endl) for(j=0;j<MAPSIZEL;j++) if(MAP[i][j]) cout<<"■"; else cout<<" "; gotoxy(MAPSIZEL*2+4,2); for(i=0;i<4;i++,gotoxy(MAPSIZEL*2+4,2+i)) for(j=0;j<4;j++) if(GRA[NEXTTYPE][i][j]) cout<<"■"; else cout<<" "; gotoxy(MAPSIZEL*2+4,2+10); cout<<" SCORE "; gotoxy(MAPSIZEL*2+4,2+12); cout<<" "<<SOCER; gotoxy(MAPSIZEL*3+1,MAPSIZEH); } void creat() /*生成随机方块*/ { STARTX=0; STARTY=MAPSIZEL/2-1; TYPE=NEXTTYPE; srand((unsigned)time(NULL)); NEXTTYPE=rand(); if(NEXTTYPE<0) NEXTTYPE*=-1; NEXTTYPE%=24; /*生成随机数*/ if(TYPE<0) TYPE*=-1; TYPE%=24; if(decidemove(TYPE,3)==false) { system("cls"); cout<<" GAME END"<<endl<<"YOUR SOCER IS "; PlaySound("end.wav",NULL,SND_ALIAS|SND_ASYNC); Sleep(2000); cout<<SOCER<<endl; KillTimer(NULL,1); system("pause"); exit(0); } moving(TYPE,3); } void check() /*判定消行和记分函数*/ { int i,j,res=0,sum; for(i=MAPSIZEH-1;i>-1;i--) { for(j=MAPSIZEL-1,sum=0;j>-1;j--) sum+=MAP[i][j]; if(sum==MAPSIZEL) /*如果发现满行则消行*/ { res++; int k=i,s; for(;k>0;k--) for(s=0;s<MAPSIZEL;s++) MAP[k][s]=MAP[k-1][s]; memset(MAP,0,sizeof(char)*MAPSIZEL); i++; } } if(res) PlaySound("AK47A.wav",NULL,SND_ALIAS|SND_ASYNC); else PlaySound("oned.wav",NULL,SND_ALIAS|SND_ASYNC); SOCER+=100*res*res; /*消行分数计算*/ } void OnTime() /*回调函数*/ { if(true==decidemove(TYPE,2)) { moving(TYPE,2); } else { lockinmap(1); check(); creat(); } show(); } void operate() /*控制方块移动函数*/ { char op; int s=0; while(s!=100) { if(kbhit()) /*如果没有操作则略过*/ { op=getch(); if(op=='a'||op=='A') { if(true==decidemove(TYPE,0)) { moving(TYPE,0); show();} } else if(op=='d'||op=='D') { if(true==decidemove(TYPE,1)) { moving(TYPE,1); show(); } } else if(op=='w'||op=='W') { if(decidemove(TURN[TYPE],3)==true) { lockinmap(0); TYPE=TURN[TYPE]; moving(TYPE,3); show(); PlaySound("sound1.wav",NULL,SND_ALIAS|SND_ASYNC); } } else if(op=='s'||op=='S') { if(true==decidemove(TYPE,2)) moving(TYPE,2); else { lockinmap(1); check(); creat(); } show(); } else if(op==0x20) { while(true==decidemove(TYPE,2)) moving(TYPE,2); lockinmap(1); check(); creat(); show(); } } s++; Sleep(2); } OnTime(); } void first() /*初始化界面*/ { memset(MAP,0,sizeof(MAP)); SOCER=0; srand((unsigned)time(NULL)); NEXTTYPE=rand(); if(NEXTTYPE<0) NEXTTYPE*=-1; NEXTTYPE%=24; creat(); show(); int i; for(i=0;i<MAPSIZEH;i++) { gotoxy(MAPSIZEL*2,i); cout<<"┃"; gotoxy(MAPSIZEL*3,i); cout<<"┃"; } gotoxy(0,MAPSIZEH); for(i=0;i<MAPSIZEL*1.5;i++) cout<<"━"; } int main() { first(); /*初始化界面*/ while(1) /*进入游戏*/ operate(); return 0; }