编辑代码

#include <graphics.h>
#include<conio.h>
#include<time.h>

#define WIDTH  10     //游戏区宽度
#define HEIGHT 22     //游戏区高度
#define UNIT   30     //每个游戏区单位的实际像素
//定义操作类型
enum CMD
{
    CMD_ROTATE,                  //方块旋转
    CMD_LEFT,CMD_RIGHT,CMD_DOWN, //方块左 右 下移动
    CMD_SINK,                    //方块沉底
    CMD_QUIT                     //退出游戏
};
//定义绘制方块的方法
enum DRAW
{
    SHOW,      //显示方块
    CLEAR,     //擦除方块
    FIX,       //固定方块
};
//定义七种俄罗斯方块
struct BLOCK
{
    WORD dir[4];    //方块的四个旋转状态
    OLORREF color;  //方块的颜色
};
BIOCK g_Blocks[7]={{0x0F00,0x4444,0x0F00,0x4444,RED},
     			  {0x0660,0x0660,0x0660,0x0660,BLUE},
                  {0x4460,0x02E0,0x0622,0x0740,MAGENTA},  
                  {0x2260,0x0E20,0x0644,0x0470,YELLOW},
                  {0x0C60,0x2640,0x0C60,0x2640,CYAN},
                  {0x0360,0x4620,0x0360,0x4620,GREEN},
                  {0x4E00,0x4C40,0x0E40,0x4640,BROWN}};

//定义当前方块 下一个方块的信息
struct BLOCKINFO
{
    byte id;     //方块ID
    char x,y;    //方块在游戏区的坐标
    byte dir:2;  //方向
    g_CurBlock,g_NextBlock;

    //定义游戏区
    BYTE g_World[WIDTH][HEIGHT]={0};

    void Init();
    void Quit();
    void NewGame();
    void GameOver();
    CMD GetCmd();
    void DispatchCmd(CMD_cmd);
    void NewBlock();
    bool CheckBlock(BLOCKINFO_block);
    void DrawUnit(int x,int y,COLORREF c,DRAW_draw);
    void DrawBlock(BLOCKINFO_block,DRAW_draw=SHOW);
    void OnRotate();        //旋转方块
    void OnLeft();          //左移方块
    void OnRight();         //右移方块
    void OnDown();          //下移方块
    void OnSink();          //沉底方块

    //主函数
    void main()
    {
        Init();

        CMD c;
        while (true)
        {
            c=GetCmd();
            DispatchCmd(c);

            //按退出时,显示对话框咨询用户是否退出
            if(c==CMD_QUIT)
            {
                HWND wnd=GetHWnd();
                if(MessageBox(wnd,_T("您要退出游戏吗?"),_T("提醒"),
                MB_OKCANCEL|MB_ICONQUESTION)==IDOK)
                Quit();
            }
        }
    }
    //初始化游戏
    void Init()
    {
        initgraph(640,480);
        srand((unsigned)time(NULL));
        setbkmode(TRANSPARENT);                //设置图案填充的背景色为透明

        //显示操作说明
        settextstyle(14,0,_T("宋体"));
        outtextxy(20,330,_T("操作说明"));
        outtextxy(20,350,_T("上:旋转"));
        outtextxy(20,370,_T("左:左移"));
        outtextxy(20,390,_T("右:右移"));
        outtextxy(20,410,_T("下:下移"));
        outtextxy(20,430,_T("空格:沉底"));
        outtextxy(20,450,_T("ESC:退出"));

        //设置坐标原点