#include
#include
#include
#include
#include
#define M 10 //面板横轴
#define N 22 //面板高度
void gotoxy(int x, int y);//移动光标
int color(int c);//设置方块颜色
void show();//绘制游戏界面
void keyboardControl();//输入游戏指令
void random();//随机生成方块
void change();//方块下降
void judge1();//方块落地判断
void HideCursor();//隐藏光标,避免闪屏
int judge2();//方块左右移动判断
int judge3();//方块边方向判断
void drew();//背景框
int map[M][N]=;//二维数组表示面板
int score=0;//分数
int a;//7个方块的代号
int c;//下一个方块代号
int b=0;//一个开关
int F[2]=;//方块的中心点位置坐标
int f=0;//不同形状的代号
int n=1;//难度
void gotoxy(int x, int y) {
COORD c;
c.X = x;
c.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}
int color(int c){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //更改文字颜色
return 0;
}
void show(){
int i,j;
color(8);
gotoxy(M*2+4,1);
printf("分数:%d",score);
gotoxy(M*2+4,5);
printf("难度:%d",n);
gotoxy(M*2+4,9);
printf("下一个方块:");
color(8);
switch(c){
case 0:
gotoxy(M*2+6,11);
printf(" ");
gotoxy(M*2+6,12);
printf("■■■■");
break;
case 1:
gotoxy(M*2+6,11);
printf(" ■■ ");
gotoxy(M*2+6,12);
printf(" ■■ ");
break;
case 2:
gotoxy(M*2+6,11);
printf(" ■ ");
gotoxy(M*2+6,12);
printf("■■■ ");
break;
case 4:
gotoxy(M*2+6,11);
printf(" ■■ ");
gotoxy(M*2+6,12);
printf("■■ ");
break;
case 3:
gotoxy(M*2+6,11);
printf("■■ ");
gotoxy(M*2+6,12);
printf(" ■■ ");
break;
case 5:
gotoxy(M*2+6,11);
printf("■ ");
gotoxy(M*2+6,12);
printf("■■■ ");
break;
case 6:
gotoxy(M*2+6,11);
printf(" ■ ");
gotoxy(M*2+6,12);
printf("■■■ ");
break;
}
for(j=2;j
for(i=0;i
gotoxy(i*2+2,j-1);
switch(map[i][j]){
case 0:
color(0);
printf(" ");
break;
case 1:
color(56);
printf("■");
break;
case 2:
color(56);
printf("■");
break;
}
}
}
}
void keyboardControl(){
char c;
int i,j;
if(kbhit()){
c=getch();
}
if(c=='w' || c=='W'){
b=0;
while(b==0){
change();
judge1();
}
b=0;
}
else if(c=='s' || c=='S'){
change();
judge1();
}
else if(c=='a' || c=='A'){
if(judge2()!=1){
F[0]--;
for(i=0;i
for(j=N-1;j>=0;j--){
if(map[i][j]==2){
map[i-1][j]=2;
map[i][j]=0;
}
}
}
}
}
else if(c=='d' || c=='D'){
if(judge2()!=2){
F[0]++;
for(i=M-1;i>=0;i--){
for(j=N-1;j>=0;j--){
if(map[i][j]==2){
map[i+1][j]=2;
map[i][j]=0;
}
}
}
}
}else if(c==' '){
switch(a){
case 0:
if(f==0&&judge3()==1){
map[F[0]-1][F[1]]=0;
map[F[0]+1][F[1]]=0;
map[F[0]+2][F[1]]=0;
map[F[0]][F[1]-1]=2;
map[F[0]][F[1]+1]=2;
map[F[0]][F[1]-2]=2;
f=1;
}else if(f==1&&judge3()==1){
map[F[0]-1][F[1]]=2;
map[F[0]+1][F[1]]=2;
map[F[0]+2][F[1]]=2;
map[F[0]][F[1]-1]=0;
map[F[0]][F[1]+1]=0;
map[F[0]][F[1]-2]=0;
f=0;
}
break;
case 2:
if(f==0&&judge3()==1){
map[F[0]+1][F[1]]=0;
map[F[0]][F[1]+1]=2;
f=1;
}else if(f==1&&judge3()==1){
map[F[0]][F[1]-1]=0;
map[F[0]+1][F[1]]=2;
f=2;
}else if(f==2&&judge3()==1){
map[F[0]-1][F[1]]=0;
map[F[0]][F[1]-1]=2;
f=3;
}else if(f==3&&judge3()==1){
map[F[0]][F[1]+1]=0;
map[F[0]-1][F[1]]=2;
f=0;
}
break;
case 3:
if(f==0&&judge3()==1){
map[F[0]+1][F[1]]=0;
map[F[0]-1][F[1]-1]=0;
map[F[0]-1][F[1]]=2;
map[F[0]-1][F[1]+1]=2;
f=1;
}else if(f==1&&judge3()==1){
map[F[0]+1][F[1]]=2;
map[F[0]-1][F[1]-1]=2;
map[F[0]-1][F[1]]=0;
map[F[0]-1][F[1]+1]=0;
f=0;
}
break;
case 4:
if(f==0&&judge3()==1){
map[F[0]+1][F[1]-1]=0;
map[F[0]-1][F[1]]=0;
map[F[0]+1][F[1]]=2;
map[F[0]+1][F[1]+1]=2;
f=1;
}else if(f==1&&judge3()==1){
map[F[0]+1][F[1]-1]=2;
map[F[0]-1][F[1]]=2;
map[F[0]+1][F[1]]=0;
map[F[0]+1][F[1]+1]=0;
f=0;
}
break;
case 5:
if(f==0&&judge3()==1){
map[F[0]+1][F[1]]=0;
map[F[0]-1][F[1]-1]=0;
map[F[0]][F[1]-1]=2;
map[F[0]][F[1]-2]=2;
f=1;
}else if(f==1&&judge3()==1){
map[F[0]][F[1]]=0;
map[F[0]-1][F[1]]=0;
map[F[0]][F[1]-2]=0;
map[F[0]-1][F[1]-1]=2;
map[F[0]+1][F[1]-1]=2;
map[F[0]+1][F[1]]=2;
f=2;
}else if(f==2&&judge3()==1){
map[F[0]+1][F[1]]=0;
map[F[0]+1][F[1]-1]=0;
map[F[0]-1][F[1]]=2;
map[F[0]-1][F[1]+1]=2;
f=3;
}else if(f==3&&judge3()==1){
map[F[0]][F[1]-1]=0;
map[F[0]-1][F[1]+1]=0;
map[F[0]][F[1]]=2;
map[F[0]+1][F[1]]=2;
f=0;
}
break;
case 6:
if(f==0&&judge3()==1){
map[F[0]+1][F[1]-1]=0;
map[F[0]-1][F[1]]=0;
map[F[0]][F[1]-1]=2;
map[F[0]][F[1]-2]=2;
f=1;
}else if(f==1&&judge3()==1){
map[F[0]][F[1]]=0;
map[F[0]+1][F[1]]=0;
map[F[0]][F[1]-2]=0;
map[F[0]+1][F[1]-1]=2;
map[F[0]-1][F[1]-1]=2;
map[F[0]-1][F[1]]=2;
f=2;
}else if(f==2&&judge3()==1){
map[F[0]-1][F[1]]=0;
map[F[0]-1][F[1]-1]=0;
map[F[0]+1][F[1]]=2;
map[F[0]+ 1][F[1]+1]=2;
f=3;
}else if(f==3&&judge3()==1){
map[F[0]][F[1]-1]=0;
map[F[0]+1][F[1]+1]=0;
map[F[0]][F[1]]=2;
map[F[0]-1][F[1]]=2;
f=0;
}
break;
}
}
}
void random(){
int i;
srand(time(NULL));
a=c;
c=rand()%7;
b=1;
f=0;
for(i=0;i
if(map[i][0]==1||map[i][1]==1){
gotoxy(0,N+2);
color(8);
printf("game over!");
exit(0);
}
}
switch(a){
case 0:
map[M/2-2][1]=2;
map[M/2-1][1]=2;
map[M/2][1]=2;
map[M/2+1][1]=2;
F[0]=M/2-1;F[1]=1;
break;
case 1:
map[M/2-1][0]=2;
map[M/2][0]=2;
map[M/2-1][1]=2;
map[M/2][1]=2;
break;
case 2:
map[M/2-2][1]=2;
map[M/2-1][1]=2;
map[M/2][1]=2;
map[M/2-1][0]=2;
F[0]=M/2-1;F[1]=1;
break;
case 3:
map[M/2-2][0]=2;
map[M/2-1][0]=2;
map[M/2-1][1]=2;
map[M/2][1]=2;
F[0]=M/2-1;F[1]=1;
break;
case 4:
map[M/2-2][1]=2;
map[M/2-1][1]=2;
map[M/2-1][0]=2;
map[M/2][0]=2;
F[0]=M/2-1;F[1]=1;
break;
case 5:
map[M/2-2][1]=2;
map[M/2-1][1]=2;
map[M/2][1]=2;
map[M/2-2][0]=2;
F[0]=M/2-1;F[1]=1;
break;
case 6:
map[M/2-2][1]=2;
map[M/2-1][1]=2;
map[M/2][1]=2;
map[M/2][0]=2;
F[0]=M/2-1;F[1]=1;
break;
}
}
void change(){
int i,j;
for(i=M-1;i>=0;i--){
for(j=N-1;j>=0;j--){
if(map[i][j]==2){
map[i][j+1]=map[i][j];
map[i][j]=map[i][j-1];
}
}
}
for(i=0;i
map[i][0]=0;
}
F[1]++;
}
void judge1(){
int flag=0;
int i,j,k;
//判断落地
for(i=0;i
if(map[i][N-1]==2){
flag=1;
break;
}
}
for(i=M-1;i>=0;i--){
for(j=N-2;j>0;j--){
if(map[i][j]==2&&map[i][j+1]==1){
flag=1;
break;
}
}
}
//刷新方块
if(flag==1){
for(i=M-1;i>=0;i--){
for(j=N-1;j>=0;j--){
if(map[i][j]==2){
map[i][j]=1;
}
}
}
random();
}
//判断是否消除
for(k=0;k
for(i=0;i
if(map[i][k]!=1){
break;
}
}
if(i==M){
score+=M;
for(j=k;j>0;j--){
for(i=0;i
if(map[i][j]==1){
map[i][j]=map[i][j-1];
}
}
}
}
}
}
void HideCursor(){
CONSOLE_CURSOR_INFO cursor_info = ;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
int judge2(){
int i;
int flag=0;
for(i=0;i
if(map[0][i]==2){
flag=1;
break;
}
}
for(i=0;i
if(map[M-1][i]==2){
flag=2;
break;
}
}
return flag;
}
int judge3(){
int flag=1;
switch(a){
case 0:
if(f==0){
if(F[1]==1)flag=0;
if(F[1]==N-1)flag=0;
if(map[F[0]][F[1]-1]==1)flag=0;
if(map[F[0]][F[1]-2]==1)flag=0;
if(map[F[0]][F[1]+1]==1)flag=0;
}else if(f==1){
if(map[F[0]-1][F[1]]==1)flag=0;
if(map[F[0]-2][F[1]]==1)flag=0;
if(map[F[0]+1][F[1]]==1)flag=0;
if(F[0]==0||F[0]==M-1||F[0]==M-2)flag=0;
}
break;
case 2:
if(f==0){
if(F[1]==N-1)flag=0;
if(map[F[0]][F[1]+1]==1)flag=0;
}else if(f==1){
if(F[0]==M-1)flag=0;
if(map[F[0]+1][F[1]]==1)flag=0;
}else if(f==2){
if(F[1]==N)flag=0;
if(map[F[0]][F[1]-1]==1)flag=0;
}else if(f==3){
if(F[0]==0)flag=0;
if(map[F[0]-1][F[1]]==1)flag=0;
}
break;
case 3:
if(f==0){
if(F[1]==N-1)flag=0;
if(map[F[0]-1][F[1]]==1)flag=0;
if(map[F[0]-1][F[1]+1]==1)flag=0;
}else if(f==1){
if(F[0]==M-1)flag=0;
if(map[F[0]+1][F[1]]==1)flag=0;
if(map[F[0]-1][F[1]-1]==1)flag=0;
}
break;
case 4:
if(f==0){
if(F[1]==N-1)flag=0;
if(map[F[0]+1][F[1]]==1)flag=0;
if(map[F[0]+1][F[1]+1]==1)flag=0;
}else if(f==1){
if(F[0]==0)flag=0;
if(map[F[0]-1][F[1]]==1)flag=0;
if(map[F[0]+1][F[1]-1]==1)flag=0;
}
break;
case 5:
if(f==0){
if(F[1]==1)flag=0;
if(map[F[0]][F[1]-2]==1)flag=0;
if(map[F[0]][F[1]-1]==1)flag=0;
}else if(f==1){
if(F[0]==M-1)flag=0;
if(map[F[0]-1][F[1]-1]==1)flag=0;
if(map[F[0]+1][F[1]]==1)flag=0;
if(map[F[0]+1][F[1]-1]==1)flag=0;
}else if(f==2){
if(F[1]==N-1)flag=0;
if(map[F[0]-1][F[1]]==1)flag=0;
if(map[F[0]-1][F[1]+1]==1)flag=0;
}else if(f=3){
if(F[0]==M-1)flag=0;
if(map[F[0]][F[1]]==1)flag=0;
if(map[F[0]+1][F[1]]==1)flag=0;
}
break;
case 6:
if(f==0){
if(F[1]==1)flag=0;
if(map[F[0]][F[1]-2]==1)flag=0;
if(map[F[0]][F[1]-1]==1)flag=0;
}else if(f==1){
if(F[0]==0)flag=0;
if(map[F[0]-1][F[1]-1]==1)flag=0;
if(map[F[0]-1][F[1]]==1)flag=0;
if(map[F[0]+1][F[1]-1]==1)flag=0;
}else if(f==2){
if(F[1]==N-1)flag=0;
if(map[F[0]+1][F[1]]==1)flag=0;
if(map[F[0]+1][F[1]+1]==1)flag=0;
}else if(f=3){
if(F[0]==0)flag=0;
if(map[F[0]][F[1]]==1)flag=0;
if(map[F[0]-1][F[1]]==1)flag=0;
}
break;
}
return flag;
}
void drew(){
int i;
for(i=0;i
gotoxy(i*2,0);
printf("■");
gotoxy(i,N-1);
printf("■");
}
for(i=0;i
gotoxy(0,i);
printf("■");
gotoxy(M*2+2,i);
printf("■");
gotoxy(M*2+16,i);
printf("■");
}
gotoxy(0,24);
}
void menu(){
char m1;
char n1;
while(1)
{
system("cls");
printf("俄罗斯方块\n\t1.开始游戏\n\t2.游戏说明\n");
printf("注:修改源码7,8行定义的宏中M,N的值可改变方块边界的长和宽");
m1=getchar();
if(m1=='1')
{
do{
system("cls");
printf("请选择游戏难度\n\t1.菜鸟\n\t2.老手\n\t3.变态\n");
n1=getchar();
}while(n1!='1' && n1!='2' && n1!='3');
if(n1=='1'){
n=3;
}else if(n1=='2'){
n=2;
}else if(n1=='3'){
n=1;
}
break;
}
else if(m1=='2')
{
system("cls");
getchar();
printf("请使用a,d或者,A,D控制方块左右移动\n");
printf("请使用s或者S使得方块额外下移一格\n");
printf("请使用w或者W使得方块额外下移一格\n");
printf("请使用空格使得方块直接落到低端\n");
printf("请按回车键返回开始菜单!\n");
getchar();
}
}
}
int main(){
int i=0;
menu();
drew();
random();
while(1){
show();
HideCursor();
keyboardControl();
if(i==n*10){
judge1();
change();
i=0;
}else{
i++;
}
}
}
领取专属 10元无门槛券
私享最新 技术干货