码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 5374 Tetris 模拟俄罗斯方块

时间:2015-08-12 21:40:34      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:c++

题目链接:

hdu5374




题意:

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

问最终玩家消除了几行.





解题思路:

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

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

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

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




代码:

#include<iostream>
#include<cstdio>
#include<cstring>
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<<endl;
//    }
//    printf("-------------\n");
    while(1)
    {
        for(int i=1;i<=8;i++){
            flag=1;
            for(int j=1;j<=9;j++)
                if(map[j][i]==0)
                {
                    flag=0;
                    break;
                }
            if(flag){
                loc=i;
                break;
            }
        }
        if(!flag)
            return;
        ans++;
        for(int i=loc;i<=8;i++)
            for(int j=1;j<=9;j++)
                map[j][i]=map[j][i+1];
    }
}

int main()
{
    int T,n,s_x=4,s_y=9;
    int x,y,state,pos;
    int len;
    int Case=1;
    scanf("%d",&T);
    while(T--)
    {
        memset(map,0,sizeof(map));
        pos=1,x=s_x,y=s_y,state=0;          //每个方块的初始状态
        ans=0;
        scanf("%d",&n);
        scanf("%s",op);
        len=strlen(op);
        for(int i=1;i<=n;i++)
            scanf("%d",&block[i]);

        for(int i=0;i<len;i++)
        {
            if(op[i]=='w'&&ok(x,y,block[pos],(state+1)%4))
                state=(state+1)%4;
            else if(op[i]=='s'&&ok(x,y-1,block[pos],state))
                y--;
            else if(op[i]=='a'&&ok(x-1,y,block[pos],state))
                x--;
            else if(op[i]=='d'&&ok(x+1,y,block[pos],state))
                x++;

            if(ok(x,y-1,block[pos],state))
                y--;
            else {
                change_map(x,y,block[pos],state);
                x=s_x,y=s_y,state=0;
                pos++;
                if(pos>n)
                    break;
            }
        }
        printf("Case %d: %d\n",Case++,ans);
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 5374 Tetris 模拟俄罗斯方块

标签:c++

原文地址:http://blog.csdn.net/axuan_k/article/details/47451069

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!