更多课程 选择中心

C/C++培训
达内IT学院

400-111-8989

教你如何用C语言编写2048小游戏

  • 发布:C++培训
  • 来源:C语言编程学习
  • 时间:2019-08-13 10:56

2048风靡的时候,随时随地都会玩,而且这是一个很神奇的游戏,一玩就停不下来,非要玩到2048为止!小编今天介绍的这个项目课程就是教你用C语言自己开发一款2048小游戏。

项目名称:

C语言开发2048小游戏

C语言开发2048小游戏

知识点

这个项目用到了一点数据结构的知识,还涉及到了 linux 的一些系统调用,有助于我们加深对 linux 下的程序设计的深入理解。此外,还用了一个文本界面的屏幕绘图库 ncurses,编译时需要加上 -lcurses 选项。

源码:

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

#include<conio.h>

#include<windows.h>

#define SIZE 4

static int score=0;

void putn(int n[][SIZE]);

void getn(int n[][SIZE]);

int isempty(int n[][SIZE]);

int isfull(int n[][SIZE]);

void math(int n[][SIZE],char c);

void tow(int n[][SIZE]);

void toa(int n[][SIZE]);

void tos(int n[][SIZE]);

void tod(int n[][SIZE]);

//主函数

int main()

{

    int i,j;

    int n[SIZE][SIZE];

    char c=' ';

    for(i=0;i<SIZE;i++)

    {

        for(j=0;j<SIZE;j++)

        {

            n[i][j]=0;

        }

    }

    printf( "***********************\n"

            "      2048(%dX%d)      \n"

            "   control:W/A/S/D    \n"

            "press any key to begin \n"

            "***********************\n",SIZE,SIZE);

            getch();

            system("cls");

            //n[0][1]=2048;

            //n[0][3]=2048;

    while(1)

    {

        if(isempty(n))

            getn(n);

        putn(n);

        if(!isempty(n)&&isfull(n))

            break;

        Sleep(200);

        c=getch();

        while(c!='w'&&c!='a'&&c!='s'&&c!='d')

            c=getch();

        math(n,c);

        system("cls");

    }

    printf("      Game Over!\n",score);

    return 0;

}

//函数

void putn(int n[][SIZE])

{

    int i,j;

    for(i=0;i<SIZE;i++)

    {

        for(j=0;j<SIZE;j++)

            printf("|     ");

        printf("|\n");

        for(j=0;j<SIZE;j++)

        {

            if(n[i][j]==0)

                printf("|     ");

            else

                printf("|%4d ",n[i][j]);

        }

        printf("|\n");

        for(j=0;j<SIZE;j++)

            printf("|_____");

        printf("|\n");

    }

    printf("score: %d",score);

}

void getn(int n[][SIZE])

{

    int a,b;

    a=rand()%SIZE;

    b=rand()%SIZE;

    while(n[a][b]!=0)

    {

        a=rand()%SIZE;

        b=rand()%SIZE;

    }

    n[a][b]=2;

}

int isempty(int n[][SIZE])

{

    int i,j,count=0;

    for(i=0;i<SIZE;i++)

        for(j=0;j<SIZE;j++)

            if(n[i][j]==0)

                count++;

    return count;

}

int isfull(int n[][SIZE])

{

    int i,j,count=0;

    for(i=0;i<SIZE;i++)

    {

        for(j=1;j<SIZE-1;j++)

        {

            if(n[i][j]==n[i][j+1]||n[i][j]==n[i][j-1])

                count++;

        }

    }

    for(j=0;j<SIZE;j++)

    {

        for(i=1;i<SIZE-1;i++)

        {

            if(n[i][j]==n[i+1][j]||n[i][j]==n[i-1][j])

                count++;

        }

    }

    return count>0?0:1;

}

void math(int n[][SIZE],char c)

{

    switch(c)

    {

        case 'w':tow(n);break;

        case 'a':toa(n);break;

        case 's':tos(n);break;

        case 'd':tod(n);break;

        default :;

    }

}

void tow(int n[][SIZE])

{

    int i,j,a;

    int m[SIZE];

    for(a=0;a<SIZE;a++)

        m[a]=0;

    for(j=0;j<SIZE;j++)

    {

        for(a=0;a<SIZE;a++)

        {

            for(i=0;i<SIZE-1;i++)

            {

                if(n[i][j]==0)

                {

                    n[i][j]=n[i+1][j];

                    n[i+1][j]=0;

                }

            }

        }

    }

    for(j=0;j<SIZE;j++)

    {

        for(a=0,i=0;i<SIZE;i++)

        {

            if(n[i][j]!=n[i+1][j]&&n[i][j]!=0||n[i][j]==2048)

            {

                m[a++]=n[i][j];

                n[i][j]=0;

            }

            else if(n[i][j]==n[i+1][j])

            {

                m[a++]=n[i][j]+n[i+1][j];

                score+=m[a-1];

                n[i][j]=0,n[i+1][j]=0;

            }

        }

        for(i=0;i<SIZE;i++)

        {

            n[i][j]=m[i];

            m[i]=0;

        }

    }

}

void toa(int n[][SIZE])

{

    int i,j,a;

    int m[SIZE];

    for(a=0;a<SIZE;a++)

        m[a]=0;

    for(i=0;i<SIZE;i++)

    {

        for(a=0;a<SIZE;a++)

        {

            for(j=0;j<SIZE-1;j++)

            {

                if(n[i][j]==0)

                {

                    n[i][j]=n[i][j+1];

                    n[i][j+1]=0;

                }

            }

        }

    }

    for(i=0;i<SIZE;i++)

    {

        for(a=0,j=0;j<SIZE;j++)

        {

            if(n[i][j]!=n[i][j+1]&&n[i][j]!=0||n[i][j]==2048)

            {

                m[a++]=n[i][j];

                n[i][j]=0;

            }

            else if(n[i][j]==n[i][j+1])

            {

                m[a++]=n[i][j]+n[i][j+1];

                score+=m[a-1];

                n[i][j]=0,n[i][j+1]=0;

           }

        }

        for(j=0;j<SIZE;j++)

        {

            n[i][j]=m[j];

            m[j]=0;

        }

    }

}

void tos(int n[][SIZE])

{

    int i,j,a;

    int m[SIZE];

    for(a=0;a<SIZE;a++)

        m[a]=0;

    for(j=SIZE-1;j>=0;j--)

    {

        for(a=SIZE-1;a>=0;a--)

        {

           for(i=SIZE-1;i>0;i--)

            {

                if(n[i][j]==0)

                {

                    n[i][j]=n[i-1][j];

                    n[i-1][j]=0;

                }

            }

        }

    }

    for(j=SIZE-1;j>=0;j--)

    {

        for(a=SIZE-1,i=SIZE-1;i>=0;i--)

        {

            if(n[i][j]!=n[i-1][j]&&n[i][j]!=0||n[i][j]==2048)

            {

                m[a--]=n[i][j];

                n[i][j]=0;

            }

            else if(n[i][j]==n[i-1][j])

            {

                m[a--]=n[i][j]+n[i-1][j];

                score+=m[a+1];

                n[i][j]=0,n[i-1][j]=0;

            }

        }

        for(i=SIZE-1;i>=0;i--)

        {

            n[i][j]=m[i];

            m[i]=0;

        }

    }

}

void tod(int n[][SIZE])

{

    int i,j,a;

    int m[SIZE];

    for(a=0;a<SIZE;a++)

        m[a]=0;

    for(i=SIZE-1;i>=0;i--)

    {

        for(a=SIZE-1;a>=0;a--)

        {

            for(j=SIZE-1;j>0;j--)

            {

                if(n[i][j]==0)

                {

                    n[i][j]=n[i][j-1];

                    n[i][j-1]=0;

                }

            }

        }

    }

    for(i=SIZE-1;i>=0;i--)

    {

        for(a=SIZE-1,j=SIZE-1;j>=0;j--)

        {

            if(n[i][j]!=n[i][j-1]&&n[i][j]!=0||n[i][j]==2048)

            {

                m[a--]=n[i][j];

                n[i][j]=0;

            }

            else if(n[i][j]==n[i][j-1])

            {

                m[a--]=n[i][j]+n[i][j-1];

                score+=m[a+1];

                n[i][j]=0,n[i][j-1]=0;

            }

        }

        for(j=SIZE-1;j>=0;j--)

        {

            n[i][j]=m[j];

            m[j]=0;

        }

    }

}

这个小游戏在培训时会贯穿第一阶段的学习,老师会详细讲解项目的知识点和开发步骤,非常适合练手,有不会的可以按照上面的,代码自己敲一敲哦!

当你敲着自己用C语言开发的游戏,那感觉一定很爽!

免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:C++类的默认函数
下一篇:教你如何用C语言编写扫雷小游戏

C语言创建windows窗口实例

C++回调函数是什么?

C++ shared_ptr和动态数组

C语言有哪些关键词,C语言44个关键词大全

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

  • 搜索抖音号

    搜索抖音号:1821685962

    免费领取达内课程视频学习资料

Copyright © 2021 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省