hdu 5374 Tetris 模拟俄罗斯方块

题目链接:

hdu5374




题意:

俄罗斯方块游戏, 给出一个玩家的操作序列(w,a,s,d,p), 和依次出现的n个方块的形状,

问最终玩家消除了几行.





解题思路:

大模拟,想清楚就好写了,

用一个数组保存 所有形状 所有状态下 四个点的相对位置

每进行一次操作时,判断是否合法(越界,重叠)

下落时判断是否重叠 ,如果重叠则不动 将方块加入地图,消行,换下一个方块继续




代码:

#include
#include
#include
using namespace std;
int dir[3][4][4][2]={
{ {0,0,0,1,1,0,1,1},{0,0,0,1,1,0,1,1},{0,0,0,1,1,0,1,1},{0,0,0,1,1,0,1,1} }, //方形
{ {0,0,0,1,0,2,0,3},{0,0,1,0,2,0,3,0},{0,0,0,1,0,2,0,3},{0,0,1,0,2,0,3,0} }, //I形
{ {0,0,0,1,1,0,2,0},{0,0,0,1,0,2,1,2},{0,1,1,1,2,1,2,0},{0,0,1,0,1,1,1,2} }  //L形
};
int map[15][15];
char op[1050];
int block[1050];
int ans;

int ok(int x,int y,int b,int state)                //判重叠 越界
{
    int tx,ty;
    for(int i=0;i<4;i++)
    {
        tx=x+dir[b][state][i][0];
        ty=y+dir[b][state][i][1];
        if(tx<1||tx>9||ty<1||ty>12||map[tx][ty]==1)
            return 0;
    }
    return 1;
}

void change_map(int x,int y,int b,int state)      //更新地图
{
    int tx,ty,flag,loc;
    for(int i=0;i<4;i++)
    {
        tx=x+dir[b][state][i][0];
        ty=y+dir[b][state][i][1];
        map[tx][ty]=1;
    }
//    for(int i=8;i>=1;i--){                      //方块下落全过程...
//        for(int j=1;j<=9;j++)
//        printf("%d",map[j][i]);
//        cout<n)
                    break;
            }
        }
        printf("Case %d: %d\n",Case++,ans);
    }
    return 0;
}


你可能感兴趣的:(算法,游戏相关)