一、题目
二、解题
1.题目
这段程序是一个俄罗斯方块的简化版本,以下是该程序的思路:
- 定义一个 20 行 10 列的数组 g,用来表示俄罗斯方块的游戏细胞地图,g 中的元素值为 1 表示该细胞为空,为 0 表示该细胞为方块。
- 通过输入,将前 15 行 10 列的数字读入数组 g 中,表示游戏开始时的状态。
- 定义一个 4 行 4 列的数组 p,用来表示下落的俄罗斯方块,p 中的元素值为 1 表示该细胞有方块,为 0 表示该细胞为空。
- 通过输入,将俄罗斯方块 p 的形状读入数组 p 中。
- 定义一个变量 c,用来表示俄罗斯方块在第几列下落,通过输入得到该值。
- 通过循环,将俄罗斯方块依次向下下落并检查是否能够落在 g 中,如果能够落下则将其放入 g 中(即在 g 中相应位置将元素从 1 变为 0)并退出循环。
- 循环结束后,输出更新后的 g 值,表示下落后的游戏状态。
2.代码
dev c++ 5.11
#include<iostream>
#include<cstring>
using namespace std;
bool g[20][10];
bool p[4][4];
int main(){
memset(g,1,sizeof(g));
for(int i=1;i<=15;i++){
for(int j=1;j<=10;j++){
cin>>g[i][j];
}
}
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
cin>>p[i][j];
}
}
int c;
cin>>c;
for(int r=1;;r++){
bool st=false;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(p[i][j] && g[r+i][c+j]){
st=true;
break;
}
}
if(st) break;
}
if(st){
r--;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(p[i][j]) g[r+i][c+j]=p[i][j];
}
}
break;
}
}
for(int i=1;i<=15;i++){
for(int j=1;j<=10;j++){
cout<<g[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
3.提交结果
总结
1.解释
if(st){
r--;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(p[i][j]) g[r+i][c+j]=p[i][j];
}
}
break;
}
在这段代码中,if (st)表示如果找到可以放置形状的位置,即找到g数组中的一部分与p数组重叠的位置,则将形状放在这个位置上。
在for (int r = 1; r; r++)这个循环中,r–的作用是将r的值减1,因为当前位置无法放置形状时,r已经自增1,所以通过r–可以回到上一个位置,在那个位置上尝试放置形状。如果在先前的位置上找到了可以放置形状的位置,则在该位置上放置形状并跳出循环。
通过这样的方式,循环将在可以放置形状的位置上停止。如果在所有位置上都无法放置形状,则循环将继续执行,直到达到特定条件为止。