c语言实现简单俄罗斯方块

一、摘要
目的:做一个俄罗斯方块,能基本实现变换形态、方块颜色变化、行满消除。
二、过程
基于c语言写一个俄罗斯方块,由于本人比较菜,有借鉴别人的代码,下面是项目的一些代码和效果。
- 总体效果
c语言实现简单俄罗斯方块
- 代码注释
1. 主函数,开始是初始屏幕的设置,打印游戏界面的边框,游戏提示。BlockRand()函数随机产生一种形态的方块。

int main()
{
    DeawMap();//画地图打印边框函数
    code_y = rand() % 7 + 1;//在7种形态中产生1种形态赋值给code_y
    while (1)                     
    {
        Return = BlockRand(code_y);//随机主方块生成
        code_y = rand() % 7 + 1;
        Show(code_y);// 显示游戏信息,下一个方块得分情况.
        ShowBlock(&Return);//显示完整形态
    }
    system("pause>nul");
    return 0;
}

2. 初始化界面,画地图,上下左右打印方块形成边界,其他为空格。

void DeawMap()
{
    for (int i = 0; i < WIDTH; i++)PRINTF LINE  //上边框
        for (int i = 1; i < HEIGHT - 1; i++)          //打印左右边框
        {
            for (int j = 0; j < WIDTH; j++)
            {
                if (j == 0 || j == WIDTH - 1)
                {
                    PRINTF    //打印方块的宏定义
                        if (j == WIDTH - 1)LINE
                }
                else EMPTY    //打印空格的宏定义
            }
        }
    for (int i = 0; i < WIDTH; i++)PRINTF LINE  //下边框
        system("color 03");//屏幕显示颜色
}

c语言实现简单俄罗斯方块

3.俄罗斯方块要随机产生一种形态的方块,主要用到了srand()函数是随机数发生器的初始化函数,srand和rand()配合使用产生伪随机数序列。

Tetris* BlockRand(int code_y)
{
    srand((int)time(0));
    Tetris* Block = (Tetris*)malloc(sizeof(Tetris));    //用malloc动态分配空间赋值给新指针
    Block-&gt;x_1 = 8;
    Block-&gt;y_1 = 4; //规定初始中心方块的坐标为(8,4)
    Block-&gt;code = code_y;
    if (Phead == NULL)    Phead = Block;        //用链表储存数据
    else Pend-&gt;next = Block;
    Block-&gt;next = NULL;
    Pend = Block;
    return Block;
}


4.按键响应,调用GetAsyncKeystate()函数对按键操作进行响应,就是调用GetAsyncKeystate函数得到某个按键的状态,判断返回值的最高位是不是1,如果是表示处于按下状态。
 

void JudgeDirection(Tetris** Block)
{
    if (GetAsyncKeyState(VK_UP) &amp;&amp; 0x8000)
    {
        form += 1;//按向上键方块形态改变一次
        if (form == 4)
        {
            form = 0;//到第四次返回刚开始的形态
        }
        Form(&amp;Return);
    }
    if (GetAsyncKeyState(VK_DOWN) &amp;&amp; 0x8000)
    {
        //加速向下  时间加速
        UP = 1;
    }
    if (GetAsyncKeyState(VK_LEFT) &amp;&amp; 0x8000)
    {
        //向左移动
        if (JudgeWall(&amp;Return) != -1) Location_y(&amp;Return, -1, 0, -1, 0, -1, 0, -1, 0);
    }
    if (GetAsyncKeyState(VK_RIGHT) &amp;&amp; 0x8000)
    {
        //向右移动
        if (JudgeWall(&amp;Return) != -2) Location_y(&amp;Return, 1, 0, 1, 0, 1, 0, 1, 0);
    }
    if (GetAsyncKeyState(VK_ESCAPE) &amp;&amp; 0x0D)
    {
        MoveCursor(27, 15);
        printf("游戏暂停");
        //判断Esc
        while (1)
        {
            if (GetAsyncKeyState(VK_ESCAPE) &amp;&amp; 0x0D)
            {
                MoveCursor(27, 15);
                printf("       ");
                break;
            }
        }
    }
}

5.设置方块颜色

void SetColour(int c)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);//API函数可以改变控制台颜色
}


屏幕颜色的符号常数表
符号常数     数值      含义         符号常数                 数值           含义
BLACK           0        黑色          DARKGRAY             8             深灰
BLUE             1        兰色           LIGHTBLUE            9             深兰
GREEN          2        绿色           LIGHTGREEN       10            淡绿
CYAN             3        青色           LIGHTCYAN          11            淡青
RED               4        红色           LIGHTRED            12             淡红
MAGENTA     5        洋红           LIGHTMAGENTA   13            淡洋红
BROWN         6       棕色           YELLow                  14             黄色
LIGHTGRAY   7       淡灰           WHITE                   15             白色

c语言实现简单俄罗斯方块

本内容转载至:

http://blog.bools.cn/archives/581

上一篇:自己设计过App的数据库框架?还是只是停留在使用ormlite greenDao这类框架,一篇文章帮你解答


下一篇:回调函数(callback)是什么?