本文主要是介绍HDU 5374 模拟俄罗斯方块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
模拟俄罗斯方块游戏
完全按照俄罗斯方块的规则来做
注意规则即可:
1:每种图形开始出现时绿点均在(4,9)位置
2:先做变换,再下降一格
3:若碰到操作无法被执行的则不执行,依次进行下个操作
#include "stdio.h"
#include "string.h"struct Type
{int a,b,x,y;
}type;
char str[1010];
int n,a[1010],ans,flag,mark,now;
int mp[20][20];void tianchong(int op) // 将方块所在占的位置消除或者填充
{if (type.a==0){mp[type.x][type.y]=op;mp[type.x+1][type.y]=op;mp[type.x][type.y+1]=op;mp[type.x+1][type.y+1]=op;}if (type.a==1){if (type.b==1){mp[type.x][type.y]=op;mp[type.x][type.y+1]=op;mp[type.x][type.y+2]=op;mp[type.x][type.y+3]=op;}else{mp[type.x][type.y]=op;mp[type.x+1][type.y]=op;mp[type.x+2][type.y]=op;mp[type.x+3][type.y]=op;}}if (type.a==2){if (type.b==1)mp[type.x][type.y]=mp[type.x][type.y+1]=mp[type.x+1][type.y]=mp[type.x+2][type.y]=op;if (type.b==2)mp[type.x][type.y]=mp[type.x][type.y+1]=mp[type.x][type.y+2]=mp[type.x+1][type.y+2]=op;if (type.b==3)mp[type.x][type.y+1]=mp[type.x+1][type.y+1]=mp[type.x+2][type.y+1]=mp[type.x+2][type.y]=op;if (type.b==4)mp[type.x][type.y]=mp[type.x+1][type.y]=mp[type.x+1][type.y+1]=mp[type.x+1][type.y+2]=op;}}void change()
{if (type.a==0) return ;if (type.a==1){if (type.b==1){if (mp[type.x+1][type.y]==0 && mp[type.x+2][type.y]==0 && mp[type.x+3][type.y]==0){tianchong(0);type.b=2;tianchong(1);}}else{if (mp[type.x][type.y+1]==0 && mp[type.x][type.y+2]==0 && mp[type.x][type.y+3]==0){tianchong(0);type.b=1;tianchong(1);}}}if (type.a==2){if (type.b==1){if (mp[type.x][type.y+2]==0 && mp[type.x+1][type.y+2]==0){tianchong(0);type.b=2;tianchong(1);}}elseif (type.b==2){if (mp[type.x+1][type.y+1]==0 && mp[type.x+2][type.y+1]==0 && mp[type.x+2][type.y]==0){tianchong(0);type.b=3;tianchong(1);}}elseif (type.b==3){if (mp[type.x][type.y]==0 && mp[type.x+1][type.y]==0 && mp[type.x+1][type.y+2]==0){tianchong(0);type.b=4;tianchong(1);}}elseif (type.b==4){if (mp[type.x][type.y+1]==0 && mp[type.x+2][type.y]==0){tianchong(0);type.b=1;tianchong(1);}}}
}void left()
{if (type.a==0){if (type.x==1 || mp[type.x-1][type.y]==1 || mp[type.x-1][type.y+1]==1 ) return ;tianchong(0);type.x--;tianchong(1);}if (type.a==1){if (type.b==1){if (type.x==1 || mp[type.x-1][type.y]==1 || mp[type.x-1][type.y+1]==1 || mp[type.x-1][type.y+2]==1 || mp[type.x-1][type.y+3]==1) return ;tianchong(0);type.x--;tianchong(1);}else{if (type.x==1 || mp[type.x-1][type.y]==1) return ;tianchong(0);type.x--;tianchong(1);}}if (type.a==2){if (type.b==1){if (type.x==1 || mp[type.x-1][type.y]==1 || mp[type.x-1][type.y+1]==1) return ;tianchong(0);type.x--;tianchong(1);}if (type.b==2){if (type.x==1 || mp[type.x-1][type.y]==1 || mp[type.x-1][type.y+1]==1 || mp[type.x-1][type.y+2]==1) return ;tianchong(0);type.x--;tianchong(1);}if (type.b==3){if (type.x==1 || mp[type.x-1][type.y+1]==1 || mp[type.x+1][type.y]==1) return ;tianchong(0);type.x--;tianchong(1);}if (type.b==4){if (type.x==1 || mp[type.x-1][type.y]==1 || mp[type.x][type.y+1]==1 || mp[type.x][type.y+2]==1) return ;tianchong (0);type.x--;tianchong(1);}}
}void right()
{if (type.a==0){if (type.x==8 || mp[type.x+2][type.y]==1 || mp[type.x+2][type.y+1]==1) return ;tianchong(0);type.x++;tianchong(1);}if (type.a==1){if (type.b==1){if (type.x==9 || mp[type.x+1][type.y]==1 || mp[type.x+1][type.y+1]==1 || mp[type.x+1][type.y+2]==1 || mp[type.x+1][type.y+3]==1) return ;tianchong(0);type.x++;tianchong(1);}else{if (type.x==6 || mp[type.x+4][type.y]==1) return ;tianchong(0);type.x++;tianchong(1);}}if (type.a==2){if (type.b==1){if (type.x==7 || mp[type.x+1][type.y+1]==1 || mp[type.x+3][type.y]==1) return ;tianchong(0);type.x++;tianchong(1);}if (type.b==2){if (type.x==8 || mp[type.x+1][type.y]==1 || mp[type.x+1][type.y+1]==1 || mp[type.x+2][type.y+2]==1) return ;tianchong(0);type.x++;tianchong(1);}if (type.b==3){if (type.x==7 || mp[type.x+3][type.y]==1 || mp[type.x+3][type.y+1]==1) return ;tianchong(0);type.x++;tianchong(1);}if (type.b==4){if (type.x==8 || mp[type.x+2][type.y]==1 || mp[type.x+2][type.y+1]==1 || mp[type.x+2][type.y+2]==1) return ;tianchong(0);type.x++;tianchong(1);}}
}void down()
{if (type.y==1) {flag=1; return ;}if (type.a==0 && (mp[type.x][type.y-1]==1 || mp[type.x+1][type.y-1]==1) ) { flag=1; return ;}if (type.a==1){if (type.b==1 && mp[type.x][type.y-1]==1) {flag=1; return ;}if (type.b==2 && (mp[type.x][type.y-1]==1 || mp[type.x+1][type.y-1]==1 || mp[type.x+2][type.y-1]==1 || mp[type.x+3][type.y-1]==1) ){flag=1;return ;}}if (type.a==2){if (type.b==1 && (mp[type.x][type.y-1]==1 || mp[type.x+1][type.y-1]==1 || mp[type.x+2][type.y-1]==1 ) ){flag=1;return ;}if (type.b==2 && (mp[type.x][type.y-1]==1 || mp[type.x+1][type.y+1]==1) ){flag=1;return ;}if (type.b==3 && (mp[type.x][type.y]==1 || mp[type.x+1][type.y]==1 || mp[type.x+2][type.y-1]) ){flag=1;return ;}if (type.b==4 && (mp[type.x][type.y-1]==1 || mp[type.x+1][type.y-1]==1)){flag=1;return ;}}tianchong(0);type.y--;tianchong(1);
}void check_xiao()
{int i,j,xiao,k;i=0;while (i<12){i++;xiao=1;for (j=1;j<=9;j++)if (mp[j][i]==0) {xiao=0; break;}if (xiao==1){ans++;for (j=i+1;j<=12;j++)for (k=1;k<=9;k++)mp[k][j-1]=mp[k][j];i--;}}
}void bfs()
{int now,i,j,len;memset(mp,0,sizeof(mp));ans=0;now=0; // 记录当前处理到哪个动作len=strlen(str);mark=1; // 记录当前处理到哪个方块type.a=a[1]; type.b=1; type.x=4; type.y=9; // a记录形状,b记录角度,x,y记录绿点坐标;tianchong(1);while (now<len){flag=0;if (str[now]=='w') change(); // 变换if (str[now]=='a') left(); // 左移if (str[now]=='d') right(); // 右移if (str[now]=='s') down(); // 下降/* for (i=12;i>=1;i--){for (j=1;j<=9;j++)printf("%d",mp[j][i]);printf("\n");}printf("\n");*/now++;if (flag==1){check_xiao(); // 检查是否有可以消除的行mark++;type.a=a[mark]; type.b=1; type.x=4; type.y=9;}else{down();if (flag==1){check_xiao();mark++;type.a=a[mark]; type.b=1; type.x=4; type.y=9;}}}
}
int main()
{int t,ii,i;scanf("%d",&t);for (ii=1;ii<=t;ii++){scanf("%d",&n);scanf("%s",str);for (i=1;i<=n;i++)scanf("%d",&a[i]);bfs();printf("Case %d: %d\n",ii,ans);}return 0;
}
这篇关于HDU 5374 模拟俄罗斯方块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!