俄罗斯方块

转载:http://blog.csdn.net/calamity_coming/article/details/40986557
#include<cstdio>
#include<cstring>
#include<iostream>
#include<ctime>
#include<string>
using namespace std;
#include<windows.h>
#include<conio.h>
#define mem(a,b) memset(a,b,sizeof(a))
const int sudu=40;
const int dir[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
const string fk="■";//方块
const string bian="▉";
const string di="▉";
bool map[100][100];
void gotoxy(int x,int y)
{
    COORD loc;
    loc.X  =  y;
    loc.Y  =  x;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), loc);
}//坐标定位函数
void HideCursor()//隐藏光标
{
    CONSOLE_CURSOR_INFO cursor_info= {1,0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
void fanfk();
void chushifk();
void yzxz1();
void yzxz2();
void yzxz4();
struct zuobiao
{
    int x,y;
} xz[7][4],xzz[7][4],nxz4[4][4],nxz1[4][4],nxz2[4][4]; //表示坐标形状表示的是7种方块的样式和翻转后的形状
class fangkuai
{
    zuobiao a[4];//每种形状有4的方块
    int xing;//表示方块的形状
    int he;//表示是翻转还是竖着就是目前的翻转情况
    int px,py;//表示运动了多少
public:
    fangkuai()
    {
        srand(time(NULL));
        he=0,px=0,py=0;
        xing=rand()%7;//随机一种形状
        for(int i=0; i<4; i++)
        {
            a[i].x=xz[xing][i].x;
            a[i].y=xz[xing][i].y;
        }
    }
    void print()
    {
        for(int i=0; i<4; i++) //将这4个点画出来
        {
            gotoxy(a[i].x+px,a[i].y+py);
            cout<<fk;
        }
    }
    void qing()//清除
    {
        for(int i=0; i<4; i++)
        {
            gotoxy(a[i].x+px,a[i].y+py);
            printf("  ");
        }
    }
    void zuoy()//左移
    {
        bool qw=true;
        for(int i=0;i<4;i++)
        {
            if(map[a[i].x+px][a[i].y+py-2]||a[i].y+py-2<2)
            {
                qw=false;
                break;
            }
        }
        if(qw)
        {
            qing();
            py-=2;
            print();
        }
    }
    void youy()//右移
    {
        bool qw=true;
        for(int i=0;i<4;i++)//判断将要移动的位置是否可走
        {
            if(map[a[i].x+px][a[i].y+py-+2]||a[i].y+py+2>32)
            {
                qw=false;
                break;
            }
        }
        if(qw)
        {
            qing();
            py+=2;
            print();
        }
    }
    bool xiay()//下移
    {
        if(!map[a[1].x+1+px][a[1].y+py]&&!map[a[2].x+1+px][a[2].y+py]&&!map[a[3].x+1+px][a[3].y+py]&&a[1].x+1+px<=20)
        {
            qing();
            px++;
            print();
            return true;
        }//能走的时候
        else
        {
            for(int i=0; i<4; i++)
            {
                map[a[i].x+px][a[i].y+py]=true;
            }
            return false;
        }//不能走就标记到地图
    }
    void fanz()//翻转
    {
        qing();
        if(xing!=4&&xing!=1&&xing!=2)//只存在两种变形的方块
        {
            if(!he)
            {
                he=1;
                bool qw=true;
                for(int i=0;i<4;i++)//判断变形后的位置是否可以容纳下
                {
                    if(map[xzz[xing][i].x+px][xzz[xing][i].y+py]||xzz[xing][i].y+py>32||xzz[xing][i].y+py<2)
                    {
                        qw=false;
                        break;
                    }
                }
                if(qw)
                for(int i=0;i<4;i++)
                {
                    a[i].x=xzz[xing][i].x;
                    a[i].y=xzz[xing][i].y;
                }
                print();
                return ;
            }
            else
            {
                he=0;
                bool qw=true;
                for(int i=0;i<4;i++)//同理
                {
                    if(map[xz[xing][i].x+px][xz[xing][i].y+py]||xz[xing][i].y+py<2||xz[xing][i].y+py>32)
                    {
                        qw=false;
                        break;
                    }
                }
                if(qw)
                for(int i=0;i<4;i++)
                {
                    a[i].x=xz[xing][i].x;
                    a[i].y=xz[xing][i].y;
                }
                print();
                return ;
            }
        }
        else if(xing==4)//下面的是四种方块变形的方法
        {
            he=(he+1)%4;
            bool qw=true;
                for(int i=0;i<4;i++)//同理判断
                {
                    if(map[nxz4[xing][i].x+px][nxz4[xing][i].y+py]||nxz4[xing][i].y+py>32||nxz4[xing][i].y+py<2)
                    {
                        qw=false;
                        break;
                    }
                }
                if(qw)
            for(int i=0;i<4;i++)
            {
                a[i].x=nxz4[he][i].x;
                a[i].y=nxz4[he][i].y;
            }
            print();
        }
        else if(xing==1)
        {
            he=(he+1)%4;
            bool qw=true;
                for(int i=0;i<4;i++)//同理
                {
                    if(map[nxz1[xing][i].x+px][nxz1[xing][i].y+py]||nxz1[xing][i].y+py<2||nxz1[xing][i].y+py>32)
                    {
                        qw=false;
                        break;
                    }
                }
                if(qw)
            for(int i=0;i<4;i++)
            {
                a[i].x=nxz1[he][i].x;
                a[i].y=nxz1[he][i].y;
            }
            print();
        }
        else
        {
            he=(he+1)%4;
            bool qw=true;
            for(int i=0;i<4;i++)//同理
            {
                if(map[nxz2[xing][i].x+px][nxz2[xing][i].y+py]||nxz2[xing][i].y+py>32||nxz2[xing][i].y+py<2)
                {
                    qw=false;
                    break;
                }
            }
            if(qw)
            for(int i=0;i<4;i++)
            {
                a[i].x=nxz2[he][i].x;
                a[i].y=nxz2[he][i].y;
            }
            print();
        }
    }
    bool over()//判断游戏失败
    {
        bool q=false;
        for(int i=0;i<4;i++)
        {
            if(map[a[i].x][a[i].y])
            {
                q=true;
                break;
            }
        }
        return q;
    }
    void printwai()//下一个方块的位置
    {
        for(int i=0; i<4; i++)
        {
            gotoxy(a[i].x+2,a[i].y+30);
            cout<<fk;
        }
    }
    void qingwai()//清除
    {
        for(int i=0; i<4; i++)
        {
            gotoxy(a[i].x+2,a[i].y+30);
            cout<<"  ";
        }
    }
};
void blmap()//遍历地图
{
    for(int i=1;i<=20;i++)//清屏
    for(int j=2;j<=32;j+=2)
    {
        gotoxy(i,j);
        printf("  ");
    }
    for(int i=20; i>=1;)//消除
    {
        bool q=true;
        for(int j=2; j<=32; j+=2)
        if(!map[i][j])
        {
            q=false;
            break;
        }
        if(q)
            for(int j=i; j>=1; j--)
            for(int k=2; k<=32; k+=2)
                map[j][k]=map[j-1][k];
        else
            i--;
    }
    for(int i=1; i<=20; i++)//输出地图
    for(int j=2; j<=32; j+=2)
        if(map[i][j])
        {
            gotoxy(i,j);
            cout<<fk;
        }
}
void huab()//辅助信息
{
    for(int i=0;i<=34;i+=2)
    {
        gotoxy(0,i);
        cout<<di;
        gotoxy(21,i);
        cout<<di;
    }
    for(int i=0;i<=20;i++)
    {
        gotoxy(i,0);
        cout<<bian;
        gotoxy(i,34);
        cout<<bian;
    }
    gotoxy(8,45);
    puts("用上下左右移动");
}
int main()
{
    huab();
    chushifk();
    fanfk();
    yzxz4();
    yzxz1();
    yzxz2();//调用他们的初始化
    HideCursor();
    mem(map,false);
    fangkuai a,b;
    b.printwai();
    a.print();
    while(!a.over())
    {
        while(_kbhit())
        {
            char q=getch();
            if(q==-32)
            {
                q=getch();
                if(q==75)
                    a.zuoy();
                else if(q==72)
                    a.fanz();
                else if(q==77)
                    a.youy();
                else if(q==80)
                {
                    while(a.xiay());
                    a=b;
                    b.qingwai();
                    fangkuai c;
                    b=c;
                    b.printwai();
                    if(a.over())
                        break;
                    blmap();
                }
            }
        }
        while(!_kbhit())
        {
            if(_kbhit())
                break;
            Sleep(sudu);
            if(_kbhit())
                break;
            Sleep(sudu);
            if(_kbhit())
                break;
            Sleep(sudu);
            if(_kbhit())
                break;
            Sleep(sudu);
            if(_kbhit())
                break;
            Sleep(sudu);
            if(_kbhit())
                break;
            Sleep(sudu);
            a.qing();
            if(a.xiay())
            {
                if(_kbhit())
                break;
                Sleep(sudu);
                if(_kbhit())
                break;
                Sleep(sudu);
                if(_kbhit())
                break;
                Sleep(sudu);
                if(_kbhit())
                break;
                Sleep(sudu);
                if(_kbhit())
                break;
                Sleep(sudu);
                if(_kbhit())
                break;
                Sleep(sudu);
            }
            else
            {
                a=b;
                b.qingwai();
                fangkuai c;
                b=c;
                b.printwai();
                if(a.over())
                break;
                blmap();
            }
        }
    }
    system("cls");
    gotoxy(10,20);
    puts("GAME OWER");
}
void chushifk()//七种方块的初始坐标
{
    xz[0][0].x=1;xz[0][0].y=16;xz[0][1].x=4;xz[0][1].y=16;xz[0][2].x=3;xz[0][2].y=16;xz[0][3].x=2;xz[0][3].y=16;
    xz[1][0].x=1;xz[1][0].y=16;xz[1][1].x=3;xz[1][1].y=16;xz[1][2].x=2;xz[1][2].y=16;xz[1][3].x=3;xz[1][3].y=18;
    xz[2][0].x=1;xz[2][0].y=16;xz[2][1].x=3;xz[2][1].y=16;xz[2][2].x=3;xz[2][2].y=14;xz[2][3].x=2;xz[2][3].y=16;
    xz[3][0].x=1;xz[3][0].y=16;xz[3][1].x=2;xz[3][1].y=14;xz[3][2].x=1;xz[3][2].y=14;xz[3][3].x=2;xz[3][3].y=16;
    xz[4][0].x=1;xz[4][0].y=16;xz[4][1].x=2;xz[4][1].y=16;xz[4][2].x=2;xz[4][2].y=14;xz[4][3].x=2;xz[4][3].y=18;
    xz[5][0].x=1;xz[5][0].y=16;xz[5][1].x=3;xz[5][1].y=14;xz[5][2].x=2;xz[5][2].y=14;xz[5][3].x=2;xz[5][3].y=16;
    xz[6][0].x=1;xz[6][0].y=16;xz[6][1].x=3;xz[6][1].y=18;xz[6][2].x=2;xz[6][2].y=16;xz[6][3].x=2;xz[6][3].y=18;
}
void fanfk()//翻转后的方块两种变形的方块
{
    xzz[0][0].x=1;xzz[0][0].y=16;xzz[0][1].x=1;xzz[0][1].y=18;xzz[0][2].x=1;xzz[0][2].y=14;xzz[0][3].x=1;xzz[0][3].y=20;
    xzz[1][0].x=1;xzz[1][0].y=18;xzz[1][1].x=2;xzz[1][1].y=16;xzz[1][2].x=2;xzz[1][2].y=14;xzz[1][3].x=2;xzz[1][3].y=18;
    xzz[2][0].x=1;xzz[2][0].y=14;xzz[2][1].x=2;xzz[2][1].y=16;xzz[2][2].x=2;xzz[2][2].y=14;xzz[2][3].x=2;xzz[2][3].y=18;
    xzz[3][0].x=1;xzz[3][0].y=16;xzz[3][1].x=2;xzz[3][1].y=14;xzz[3][2].x=1;xzz[3][2].y=14;xzz[3][3].x=2;xzz[3][3].y=16;
    xzz[4][0].x=1;xzz[4][0].y=16;xzz[4][1].x=2;xzz[4][1].y=16;xzz[4][2].x=2;xzz[4][2].y=14;xzz[4][3].x=2;xzz[4][3].y=18;
    xzz[5][0].x=1;xzz[5][0].y=16;xzz[5][1].x=2;xzz[5][1].y=16;xzz[5][2].x=1;xzz[5][2].y=14;xzz[5][3].x=2;xzz[5][3].y=18;
    xzz[6][0].x=1;xzz[6][0].y=16;xzz[6][1].x=2;xzz[6][1].y=16;xzz[6][2].x=2;xzz[6][2].y=14;xzz[6][3].x=1;xzz[6][3].y=18;
}
void yzxz1()//1号方块有4种变形
{
     nxz1[0][0].x=1;nxz1[0][0].y=16;nxz1[0][1].x=3;nxz1[0][1].y=16;nxz1[0][2].x=2;nxz1[0][2].y=16;nxz1[0][3].x=3;nxz1[0][3].y=18;
     nxz1[1][0].x=1;nxz1[1][0].y=18;nxz1[1][1].x=2;nxz1[1][1].y=16;nxz1[1][2].x=2;nxz1[1][2].y=14;nxz1[1][3].x=2;nxz1[1][3].y=18;
     nxz1[2][0].x=1;nxz1[2][0].y=16;nxz1[2][1].x=3;nxz1[2][1].y=16;nxz1[2][2].x=1;nxz1[2][2].y=14;nxz1[2][3].x=2;nxz1[2][3].y=16;
     nxz1[3][0].x=1;nxz1[3][0].y=16;nxz1[3][1].x=2;nxz1[3][1].y=14;nxz1[3][2].x=1;nxz1[3][2].y=14;nxz1[3][3].x=1;nxz1[3][3].y=18;
}
void yzxz2()//2号
{
    nxz2[0][0].x=1;nxz2[0][0].y=16;nxz2[0][1].x=3;nxz2[0][1].y=16;nxz2[0][2].x=3;nxz2[0][2].y=14;nxz2[0][3].x=2;nxz2[0][3].y=16;
    nxz2[1][0].x=1;nxz2[1][0].y=16;nxz2[1][1].x=2;nxz2[1][1].y=18;nxz2[1][2].x=1;nxz2[1][2].y=14;nxz2[1][3].x=1;nxz2[1][3].y=18;
    nxz2[2][0].x=1;nxz2[2][0].y=16;nxz2[2][1].x=3;nxz2[2][1].y=16;nxz2[2][2].x=2;nxz2[2][2].y=16;nxz2[2][3].x=1;nxz2[2][3].y=18;
    nxz2[3][0].x=1;nxz2[3][0].y=14;nxz2[3][1].x=2;nxz2[3][1].y=16;nxz2[3][2].x=2;nxz2[3][2].y=14;nxz2[3][3].x=2;nxz2[3][3].y=18;
}
void yzxz4()//4号
{
    nxz4[0][0].x=1;nxz4[0][0].y=16;nxz4[0][1].x=2;nxz4[0][1].y=16;nxz4[0][2].x=2;nxz4[0][2].y=14;nxz4[0][3].x=2;nxz4[0][3].y=18;
    nxz4[1][0].x=1;nxz4[1][0].y=16;nxz4[1][1].x=3;nxz4[1][1].y=16;nxz4[1][2].x=2;nxz4[1][2].y=14;nxz4[1][3].x=2;nxz4[1][3].y=16;
    nxz4[2][0].x=1;nxz4[2][0].y=16;nxz4[2][1].x=2;nxz4[2][1].y=16;nxz4[2][2].x=1;nxz4[2][2].y=14;nxz4[2][3].x=1;nxz4[2][3].y=18;
    nxz4[3][0].x=1;nxz4[3][0].y=16;nxz4[3][1].x=3;nxz4[3][1].y=16;nxz4[3][2].x=2;nxz4[3][2].y=16;nxz4[3][3].x=2;nxz4[3][3].y=18;
}


你可能感兴趣的:(游戏,C++,俄罗斯方块)