devc++ 做的俄罗斯方块

#include<iostream>
#include<math.h>
#include<Windows.h>
#include<conio.h>
#include<ctime>
using namespace std;

enum DIR//枚举四个方向 
{
    UP,
    RIGHT,
    DOWN,
    LEFT
};

time_t start = 0, finish = 0;

int _x = 6, _y = 1;//图形生成位置

int map[30][16] = { 0 };

int sharp[20][8] = {
    {0,0,0,0,0,0,0,0},
    //I形
    {0,0,0,1,0,2,0,3},
    {0,0,1,0,2,0,3,0},
    //■形
    {0,0,1,0,0,1,1,1},
    //L形
    {0,0,0,1,0,2,1,2},
    {0,0,0,1,1,0,2,0},
    {0,0,1,0,1,1,1,2},
    {0,1,1,1,2,0,2,1},
    //J形
    {0,2,1,0,1,1,1,2},
    {0,0,0,1,1,1,2,1},
    {0,0,0,1,0,2,1,0},
    {0,0,1,0,2,0,2,1},
    //Z形
    {0,0,1,0,1,1,2,1},
    {0,1,0,2,1,0,1,1},
    //S形
    {0,1,1,0,1,1,2,0},
    {0,0,0,1,1,1,1,2},
    //T形
    {0,1,1,0,1,1,2,1},
    {0,0,0,1,0,2,1,1},
    {0,0,1,0,1,1,2,0},
    {0,1,1,0,1,1,1,2}
};


class Game
{
public:
    int score;//游戏分数
    int _id;//图形编号
    int top;//最高点高度
    int speed;//下落速度

    Game();
    void showMenu();//显示菜单
    void showGround();//显示游戏界面
    void gameOver();//游戏结束界面
    void Run();//运行游戏
    void sharpDraw(int id, bool show = false);//绘制图形
    void keyControl();//键盘控制
    bool move(int dir, int id);//移动判断
    bool downSet(int id);//下落
    void Turn(int id);//旋转
    void clean();//消行
};

void SetPos(int i, int j)//控制光标位置, 列, 行
{
    COORD pos = { i,j };
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

int main()
{
    CONSOLE_CURSOR_INFO cursor;
    GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor);
    cursor.bVisible = 0;    //这四行用来设置光标不显示
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor);

    srand((unsigned)time(NULL));

    Game game;
    game.showMenu();
    return 0;
}

Game::Game()
{
    score = 0;
    _id = 0;
    top = 58;
    speed = 1000;
}

void Game::showMenu()
{
    for (int i = 0; i < 30; i++)
    {
        for (int j = 0; j < 26; j++)
        {
            if ((i == 0 || i == 29) || (j == 0 || j == 25))
            {
                cout << "* ";//边框图形 
            }
            else
            {
                cout << "  ";
            }
        }
        cout << endl;
    }

    SetPos(17, 8);
    cout << "俄 罗 斯 方 块" << endl;
    SetPos(13, 12);
    cout << "↑旋转方块  ↓加速下滑" << endl;
    SetPos(12, 14);
    cout << "← →左右移动  空格  暂停" << endl;
    SetPos(15, 20);
    cout << "0 退出  Enter 开始" << endl;
    SetPos(15, 25);
    cout << "联系qq:  258900816" << endl;
    while (1)
    {
        int select = _getch();
        if (select == 13)
        {
            system("cls");
            this->Run();
        }
        else if (select = 48)
        {
            system("cls");
            exit(0);
        }
    }
}

void Game::showGround()
{
    for (int i = 0; i < 30; i++)
    {
        for (int j = 0; j < 26; j++)
        {
            if ((i == 0 || i == 29) || (j == 0 || j == 25 || j == 15))
            {
                cout << "■";//开始后边框图形 
            }
            else if (i == 15 && j > 15)
            {
                cout << "■";
            }
            else
            {
                cout << "  ";
            }
        }
        cout << endl;
    }

    SetPos(31, 2);
    cout << "下 个图形" << endl;
    SetPos(31, 17);
    cout << "当 前得分" << endl;

    for (int i = 0; i < 30; i++)
    {
        for (int j = 0; j < 16; j++)
        {
            if ((i == 0 || i == 29) || (j == 0 || j == 15))
            {
                map[i][j] = 1;
            }
            else
            {
                map[i][j] = 0;
            }
        }
    }
}

void Game::gameOver()
{
    for (int i = 5; i < 15; i++)
    {
        SetPos(1, i);
        cout << "                            " << endl;
    }

    SetPos(8, 7);
    cout << "G a m e   O v e r" << endl;

    SetPos(3, 10);
    cout << "0 退出   Enter 重新开始" << endl;

    while (1)
    {
        int select = _getch();
        if (select == 13)
        {
            system("cls");
            this->Run();
        }
        else if (select == 48)
        {
            system("cls");
            exit(0);
        }
    }

}

void Game::Run()
{
    score = 0;
    _id = 0;
    top = 58;
    _x = 6;
    _y = 1;
    showGround();
    start = clock();
    int new_id = rand() % 19 + 1;

    while (1)
    {
        sharpDraw(_id);
        keyControl();

        if (downSet(_id))
        {
            sharpDraw(-new_id, 1);
            _id = new_id;
            new_id = rand() % 19 + 1;
            sharpDraw(new_id, 1);
            clean();
        }

        SetPos(34, 20);
        cout << score << endl;
    }
}

void Game::sharpDraw(int id, bool show)
{
    int x, y;

    if (show == true)
    {
        if (id > 0)
        {
            for (int i = 0; i < 4; i++)
            {
                x = 19 + sharp[id][2 * i];
                y = 6 + sharp[id][2 * i + 1];
                SetPos(2 * x, y);
                cout << "■";//下一个图形 
            }
        }
        else
        {
            for (int i = 0; i < 4; i++)
            {
                x = 19 + sharp[-id][2 * i];
                y = 6 + sharp[-id][2 * i + 1];
                SetPos(2 * x, y);
                cout << "  ";
            }
        }
        return;
    }


    if (id > 0)
    {
        for (int i = 0; i < 4; i++)
        {
            x = _x + sharp[id][2 * i];
            y = _y + sharp[id][2 * i + 1];
            SetPos(2 * x, y);
            cout << "■";//下落图形 
        }
    }
    else
    {
        for (int i = 0; i < 4; i++)
        {
            x = _x + sharp[-id][2 * i];
            y = _y + sharp[-id][2 * i + 1];
            SetPos(2 * x, y);
            cout << "  ";
        }
    }
    return;

}

bool Game::downSet(int id)
{
    if (id == 0)
        return true;

    finish = clock();

    if (finish - start < speed)
    {
        return false;
    }

    start = clock();

    if (!move(DOWN, _id))
    {
        int x, y;
        for (int i = 0; i < 4; i++)
        {
            x = _x + sharp[id][2 * i];
            y = _y + sharp[id][2 * i + 1];
            map[y][x] = 1;

            if (y < top)
            {
                top = y;
            }
            if (top <= 1)
            {
                gameOver();
            }
        }
        _x = 6;
        _y = 1;
        return true;
    }

    sharpDraw(-id);
    _y++;
    sharpDraw(id);
    return false;
}

bool Game::move(int dir, int id)
{
    int x, y;
    switch (dir)
    {
    case UP:
        for (int i = 0; i < 4; i++)
        {
            x = _x + sharp[id][2 * i];
            y = _y + sharp[id][2 * i + 1];
            if (map[y][x] == 1)
            {
                return false;
            }
        }
        break;
    case DOWN:
    {
        for (int i = 0; i < 4; i++)
        {
            x = _x + sharp[id][2 * i];
            y = _y + sharp[id][2 * i + 1];
            if (map[y + 1][x] == 1)
            {
                return false;
            }
        }
    }
    break;
    case RIGHT:
    {
        for (int i = 0; i < 4; i++)
        {
            x = _x + sharp[id][2 * i];
            y = _y + sharp[id][2 * i + 1];
            if (map[y][x + 1] == 1)
            {
                return false;
            }
        }
    }
    break;
    case LEFT:
    {
        for (int i = 0; i < 4; i++)
        {
            x = _x + sharp[id][2 * i];
            y = _y + sharp[id][2 * i + 1];
            if (map[y][x - 1] == 1)
            {
                return false;
            }
        }
    }
    break;
    default:
        break;
    }
    return true;
}

void Game::Turn(int id)
{
    switch (id)
    {
    case 1:id++; break;
    case 2:id--; break;

    case 3: break;

    case 4:id++; break;
    case 5:id++; break;
    case 6:id++; break;
    case 7:id -= 3; break;

    case 8:id++; break;
    case 9:id++; break;
    case 10:id++; break;
    case 11:id -= 3; break;

    case 12:id++; break;
    case 13:id--; break;

    case 14:id++; break;
    case 15:id--; break;

    case 16:id++; break;
    case 17:id++; break;
    case 18:id++; break;
    case 19:id -= 3; break;

    default:
        break;
    }

    if (!move(UP, id))
    {
        return;
    }

    sharpDraw(-_id);
    _id = id;
}

void Game::keyControl()
{
    if (!_kbhit())
        return;

    int key = _getch();

    switch (key)
    {
    case 72:
        Turn(_id);
        break;
    case 80:
        if (move(DOWN, _id))
        {
            sharpDraw(-_id);
            _y++;
        }
        break;
    case 75:
        if (move(LEFT, _id))
        {
            sharpDraw(-_id);
            _x--;
        }
        break;
    case 77:
        if (move(RIGHT, _id))
        {
            sharpDraw(-_id);
            _x++;
        }
        break;
    case 32:
    {
        for (int i = 5; i < 15; i++)
        {
            SetPos(1, i);
            cout << "                            " << endl;
        }

        SetPos(10, 7);
        cout << "游 戏 暂 停" << endl;

        SetPos(3, 10);
        cout << "0 返回菜单  回车 继续游戏" << endl;

        while (1)
        {
            int select = _getch();

            if (select == 13)
            {
                for (int i = 5; i < 15; i++)
                {
                    SetPos(1, i);
                    cout << "                            " << endl;
                }
                break;
            }
            else if (select == 48)
            {
                system("cls");
                showMenu();
            }
        }

    }
    default:
        break;
    }
}

void Game::clean()
{
    int n = -1;
    int line = -1;
    while (1)
    {
        for (int i = 28; i > 0; i--)
        {
            for (int j = 1; j < 15; j++)
            {
                line = i;
                if (map[i][j] == 0)
                {
                    line = -1;
                    break;
                }
            }
            if (line != -1)
                break;
        }

        if (line == -1)
            break;

        for (int i = line; i > 0; i--)
        {
            for (int j = 1; j < 15; j++)
            {
                if (i == 1)
                    map[i][j] = 0;
                else
                {
                    map[i][j] = map[i - 1][j];
                    SetPos(2 * j, i);
                    if (map[i][j] == 1)
                        cout << "$ ";
                    else
                        cout << "  ";
                }
            }
        }
        top++;
        n++;
    }

    if (n >= 0)
    {
        score += n * n * 100 + 100;
        if (speed > 100)
            speed = 1000 - score / 10;
    }
}
 

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
int CIBrick::shiftLeft (CBin*bin) { unsigned int posX; posX=getPosX(); posX=posX-1; setPosX(posX); if(checkCollision(bin)==0) { setPosX(posX+1); return 0; } return 1; } int CIBrick::shiftDown (CBin*bin) { unsigned int posY; posY=getPosY(); posY=posY+1; setPosY(posY); if (checkCollision(bin)==0) { setPosY(posY-1); return 0; } return 1; } int CIBrick::shiftRight (CBin*bin) { unsigned int posX; posX =getPosX(); posX=posX+1; setPosX(posX); if(checkCollision(bin)==0) { setPosX(posX-1); return 0; } return 1; } int CIBrick::rotateClockwise(CBin*bin) { unsigned int orientation,oldOrientation; orientation=getOrientation(); oldOrientation=orientation; if (orientation==3) orientation=0; else orientation=orientation+1; setOrientation(orientation); if(checkCollision(bin)==0) { setOrientation(oldOrientation); return 0; } return 1; } int CIBrick::checkCollision(CBin*bin) { unsigned int width; unsigned int height; unsigned char**image; unsigned int orientation; unsigned int posX; unsigned int posY; width=bin->getWidth(); height=bin->getHeight(); image=new unsigned char* [height]; for(unsigned int i=0;i<height;i++) { image[i]=new unsigned char[width]; } bin->getImage(image); orientation=getOrientation(); posX=getPosX(); posY=getPosY(); if (orientation==0) { if((posX+1<1)||(posX>width-1)||(posY<1)||(posY+2>height-1)) return 0; if((image[posY-1][posX]!=0)||(image[posY][posX]!=0)||(image[posY+1][posX]!=0)||(image[posY+2][posX]!=0)) return 0; } if(orientation==1) { if ((posX<2)||(posX+1>width-1)||(posY+1)<1||(posY>height-1)) return 0; if ((image[posY][posX-2]!=0)||(image[posY][posX-1]!=0)||(image[posY][posX]!=0)||(image[posY][posX+1]!=0)) return 0; } if (orientation==2) { if((posX+1<1)||(posX>width-1)||(posY<2)||(posY+1>height-1)) return 0; if ((image[posY-2][posX]!=0)||(image[posY-1][posX]!=0)||(image[posY][posX]!=0)||(image[posY+1][posX]!=0)) return 0; } if (orientation==3) { if ((posX<1)||(posX+2>width-1)||(posY+1<1)||(posY>height-1)) return 0; if ((image[posY][posX-1]!=0)||(image[posY][posX]!=0)||(image[posY][posX+1]!=0)||(image[posY][posX+2]!=0)) return 0; } return 1; } void CIBrick::operator>>(unsigned char** binImage) { unsigned int orientation ; unsigned int posX; unsigned int posY; unsigned char colour; posX=getPosX(); posY=getPosY(); orientation=getOrientation(); colour=getColour(); if(orientation==0) { binImage[posY-1][posX]=colour; binImage[posY][posX]=colour; binImage[posY+1][posX]=colour; binImage[posY+2][posX]=colour; } if(orientation==1) { binImage[posY][posX-2]=colour; binImage[posY][posX-1]=colour; binImage[posY][posX]=colour; binImage[posY][posX+1]=colour; } if (orientation==2) { binImage[posY-2][posX]=colour; binImage[posY-1][posX]=colour; binImage[posY][posX]=colour; binImage[posY+1][posX]=colour; } if (orientation==3) { binImage[posY][posX-1]=colour; binImage[posY][posX]=colour; binImage[posY][posX+1]=colour; binImage[posY][posX+2]=colour; } } void CIBrick::putAtTop(unsigned int newOrient,unsigned int newPosX) { setPosX(newPosX); setOrientation(newOrient); switch (newOrient) { case 0: setPosY(1);break; case 1: setPosY(0);break; case 2: setPosY(2);break; case 3: setPosY(0);break; } } int CLBrick::shiftLeft (CBin*bin) { unsigned int posX; posX=getPosX(); posX=posX-1; setPosX(posX);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值