天天看点

从零开始---控制台用c写俄罗斯方块游戏(1)

从零开始---控制台用c写俄罗斯方块游戏(1)

很少写博文,一来自身知识有限,二来自己知道,已经有很多这样的博文了,三就是因为懒,文笔也一般,四来刚出来工作,时间也不多

之所以写这篇博文,是因为应群里小伙伴学习c的激情,让他们跟我一样能使用c写出点东西出来,这样会非常有成就感,亦如当初的我

这篇博文适合的对象

1,学生或刚学完c,学会c语言基本语法,想要做出一点东西有成就感的,指针可以不知道,但至少要会用数组

2,因为这是我大一刚学c后写的,所以命名有些2,但里面有注释,代码也不是很长,所以不适合中大神级别的人学习

代码已经有了,我大一时写,因为我懒,本来是想直接用那个代码的,但我觉得直接贴出来讲作用,这样也不适合新手学习,所以我一步一步带大家来弄,

一步一步的给出想法,以及实现。之前弄的时候也有百度,也有源码什么的,但只有源码,有些编译错误,看不懂,网上根本没有c语言的俄罗斯游戏教学(或者我没找着= =)。

我这篇保证是最简单的,最容易懂,也是最容易实现的控制台俄罗斯方块游戏。有人看到控制台的游戏就嗤之以鼻,没意思,不好玩。好不好玩,我不知道,

但我那时给我宿友玩,都在那里玩的不亦乐乎,问题是很有成就感。不信,可以在下面下载先试试。我这里也只是给出简单的实现,想要更好玩,得自己弄弄。

这里也说一下,每次更新速度可能不快,我看情况。原因是重新一步一步按想法写代码,改代码,让学习的人知道之所以然。

游戏界面原理

对于刚学c的同学来说,只知道控制台一行一行输出,那怎么能让一个个方块让我们看到方块运动游戏的效果呢?

我们看到屏幕就是一个二维,所以把它看成一个二维数组来,要想做出动态效果,我们要先做出静态效果,为什么这样说?

我举个栗子,大家应该看过电影,小学的时候有时候有电影放来看,那种胶片电影,都是一张一张胶片通过一定速度切换来达到动态的效果

所以我们只要不段刷新这个静态输出控制台界面就可以达到方块移动的效果

我们先来看看这个代码里的俄罗斯方块静态输出代码(下面这个代码可以直接跳过,因为这是完整代码里的输出片段,先不要纠结,只是引出后面的内容,因为我重写了代码,这个代码也不一定用到)

void Disp()  /* 输出 */
 
{
    int i, j;
 
    for ( i = 2; i < N; i++ )
 
    {
        printf( "%c", 3 );
 
        for ( j = 0; j < M; j++ )
 
        {
            if ( s[i][j] == 0 )
 
            {
                printf( "  " );
            }else  {
                printf( "■" );
            }
        }
 
        printf( "%c", 3 );
 
        if ( i == 6 )
            printf( "            %s", leixing[jishu - 1] );
 
        if ( i == 8 )
            printf( "            %c%c%c", h[0][0], h[0][1], h[0][2] );
 
        if ( i == 9 )
            printf( "            %c%c%c", h[1][0], h[1][1], h[1][2] );
 
        if ( i == 10 )
            printf( "            %c%c%c", h[2][0], h[2][1], h[2][2] );
 
        if ( i == 12 )
            printf( "            得分:%2d", fenshu );
 
        printf( "\n" );
    }
 
    for ( i = 0; i < 2 * M + 2; i++ )
 
    {
        printf( "%c", 2 );
    }
 
    printf( "\n\n操作说明:4左移,6右移,5下移, 8变形,+加分数,7重来,9或Esc后退出\n" );
}      

结合我开始的图片,有些人可能会看懂,看不懂也没关系,因为下面我还会详细来说这个东西,怎么详细呢

其实我也不知道,哈哈,因为按照这个代码本身并不好,所以等我理清一下思路,是重新一步一步的实现,还是就拿已经有的代码就这样讲解呢?

希望看的博友,给个意见,这个先写到这里。根据收到意见,我会继续写。

哦,我发现我是写个群友的,哈哈,然后连忙修改了,那就先给个下移的步骤

下面代码都是vs2013出来的,其他编译器改一下就ok了

#define intX 10

#define intY 20


int _tmain(int argc, _TCHAR* argv[])
{
    //界面数组
    char Interface[intY][intX] = 
    { 
        { 0, 0, 0, 2, 2, 2 }, 
        { 0, 0, 0, 0, 2 }, 
        { 0 }, 
        { 0 }, 
        { 0 }, 
        { 0 }, { 0 }, { 0 }, { 0 }, { 0 },{ 0 }, { 0, 0, 0, 0 }, { 0 } 
    }; /*当前状态*/

    int i, j;
    
    for (i = 0; i < intY; i++)
    {
        printf("%c", 3);
        for (j = 0; j < intX; j++)
        {
            
            if (Interface[i][j] == 0)
            {
                printf("  ");
            }
            else  
            {
                printf("■");
            }
        }
        printf("%c", 3);
        printf("\n");
    }

    for (i = 0; i < 2 * intX + 2; i++)
    {
        printf("%c", 2);
    }
    printf("\n");
}      

上面是静态输出

把输出提取出来,弄成函数,要对代码不段改进,把特定功能提取出来做为调用函数

// c.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <string.h>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define intX 10

#define intY 20

void show(char Interface[intY][intX])
{
    int i, j;

    for (i = 0; i < intY; i++)
    {
        printf("%c", 3);
        for (j = 0; j < intX; j++)
        {

            if (Interface[i][j] == 0)
            {
                printf("  ");
            }
            else
            {
                printf("■");
            }
        }
        printf("%c", 3);
        printf("\n");
    }

    for (i = 0; i < 2 * intX + 2; i++)
    {
        printf("%c", 2);
    }
    printf("\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
    //界面数组
    char Interface[intY][intX] = 
    { 
        { 0, 0, 0, 2, 2, 2 }, 
        { 0, 0, 0, 0, 2 }, 
        { 0 }, 
        { 0 }, 
        { 0 }, 
        { 0 }, { 0 }, { 0 }, { 0 }, { 0 },{ 0 }, { 0, 0, 0, 0 }, { 0 } 
    }; /*当前状态*/

    show(Interface);
}      

让方块下移

// c.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <string.h>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define intX 10

#define intY 20

void show(char Interface[intY][intX])
{
    int i, j;

    for (i = 0; i < intY; i++)
    {
        printf("%c", 3);
        for (j = 0; j < intX; j++)
        {

            if (Interface[i][j] == 0)
            {
                printf("  ");
            }
            else
            {
                printf("■");
            }
        }
        printf("%c", 3);
        printf("\n");
    }

    for (i = 0; i < 2 * intX + 2; i++)
    {
        printf("%c", 2);
    }
    printf("\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
    //界面数组
    char Interface[intY][intX] = 
    { 
        { 0, 0, 0, 2, 2, 2 }, 
        { 0, 0, 0, 0, 2 }, 
        { 0 }, 
        { 0 }, 
        { 0 }, 
        { 0 }, { 0 }, { 0 }, { 0 }, { 0 },{ 0 }, { 0, 0, 0, 0 }, { 0 } 
    }; /*当前状态*/
    int i = 0;
    int j = 0;
    
    while (true)
    {
        for (i = intY - 1; i >= 0; i--)  /* 继续下落 */
        {
            for (j = 0; j < intX; j++)
            {
                if (Interface[i][j] == 2)
                {
                    Interface[i + 1][j] = Interface[i][j];

                    Interface[i][j] = 0; /*方块下移*/
                }
            }
        }

        show(Interface);
        getchar();
        /*getchar();*/
    }
}      

这篇先这样,之后会优化成不会换行,而直接刷新出游戏效果,欲知后文如何,请听下回分解

 有兴趣的可以先这样,给个提示:

system("CLS");/ *清屏,TC用clrscr();,VC用system("CLS");* / 

上面清屏并非最好的,还有更好的,期待

俄罗斯方块完整运行程序下载

http://pan.baidu.com/s/1kVu9SEV

密码:9mvj

作者:三小

声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!