C语言实现的2048小游戏

#define _CRT_SECURE_NO_WARNINGS
#include"stdio.h"
#include"stdlib.h"
#include"time.h"

#define SIZE 4

void paintWindows(int a[SIZE][SIZE]);
void paintOne(int a[SIZE][SIZE]);
void paintRandom(int a[SIZE][SIZE]);
void move(char ch);


int a[SIZE][SIZE] = { 0 };
//int flag = 1;

int main()
{
    char ch;
    paintOne(a);
    paintWindows(a);
    while (1)
    {
        scanf("%c", &ch);
        getchar();
        move(ch);
        paintRandom(a);
        paintWindows(a);
    }
    printf("游戏结束");
    return 0;
}


void paintWindows(int a[SIZE][SIZE])
{
    for (int i = 0; i < SIZE; i++)
    {
        printf("*");
        for (int j = 0; j < SIZE; j++)
        {
            printf("-----*");
        }
        printf("\n");
        char ch = '|';
        printf("%c", ch);
        for (int j = 0; j < SIZE; j++)
        {
            printf("%3d%3c", a[i][j], ch);
        }

        printf("\n");
    }
    printf("*");
    for (int j = 0; j < SIZE; j++)
    {
        printf("-----*");
    }
    printf("\n");
}

void paintOne(int a[SIZE][SIZE])
{
    srand((int)time(NULL));
    int orignx;
    int origny;
    for (int i = 0; i < 4; i++)
    {
        orignx = rand() % 4;
        origny = rand() % 4;
        if (a[orignx][origny] == 0)
            a[orignx][origny] = 2;
        else
            i--;

    }
}

void paintRandom(int a[SIZE][SIZE])
{
    srand((int)time(NULL));
    int newx;
    int newy;
    int i = 0;
    do 
    {
        newx = rand() % 4;
        newy = rand() % 4;

        i++;
    } while (a[newx][newy] != 0);

    a[newx][newy] = 2;
}

void move(char ch)
{
    int i, j;
    switch (ch)
    {
    case 'a':

        for (i = 0; i < SIZE; i++)
        {
            for (j = 0; j < SIZE; j++)
            {
                int cell = a[i][j];
                if (cell != 0)
                {
                    int k = j + 1;
                    while (k < SIZE)
                    {
                        int nextcell = a[i][k];
                        if (nextcell != 0)
                        {
                            if (cell == nextcell)
                            {
                                a[i][j] += a[i][k];
                                a[i][k] = 0;
                            }
                            k = SIZE;
                            break;
                        }
                        k++;
                    }
                }
            }
        }

        //修改部分:for循环中的i或者j的循环条件

        for (i = 0; i < SIZE; i++)
        {
            for (j = 0; j < SIZE - 1; j++)
            {
                int cell = a[i][j];
                if (cell == 0)
                {
                    int k = j + 1;
                    while (k < SIZE)
                    {
                        int nextcell = a[i][k];
                        if (nextcell != 0)
                        {
                            a[i][j] = nextcell;
                            a[i][k] = 0;
                            k = SIZE;
                        }
                        k++;
                    }
                }
            }
        }
    break;
    case 'w':

        for (i = 0; i < SIZE; i++)
        {
            for (j = 0; j < SIZE; j++)
            {
                int cell = a[i][j];
                if (cell != 0)
                {
                    int k = i + 1;
                    while (k < SIZE)
                    {
                        int nextcell = a[k][j];
                        if (nextcell != 0)
                        {
                            if (cell == nextcell)
                            {
                                a[i][j] += a[k][j];
                                a[k][j] = 0;
                            }
                            k = SIZE;
                            break;
                        }
                        k++;
                    }
                }
            }
        }

        //修改部分:for循环中的i或者j的循环条件

        for (i = 0; i < SIZE; i++)
        {
            for (j = 0; j < SIZE - 1; j++)
            {
                int cell = a[i][j];
                if (cell == 0)
                {
                    int k = i + 1;
                    while (k < SIZE)
                    {
                        int nextcell = a[k][j];
                        if (nextcell != 0)
                        {
                            a[i][j] = nextcell;
                            a[k][j] = 0;
                            k = SIZE;
                        }
                        k++;
                    }
                }
            }
        }
        break;
    case 's':

        for (i = SIZE - 1; i >= 0; i--)
        {
            for (j = 0; j <SIZE; j++)
            {
                int cell = a[i][j];
                if (cell != 0)
                {
                    int k = i - 1;
                    while (k >= 0)
                    {
                        int nextcell = a[k][j];
                        if (nextcell != 0)
                        {
                            if (cell == nextcell)
                            {
                                a[i][j] += a[k][j];
                                a[k][j] = 0;
                            }
                            k = -1;
                            break;
                        }
                        k--;
                    }
                }
            }
        }

        //修改部分:for循环中的i或者j的循环条件

        for (i = SIZE - 1; i >= 0; i--)
        {
            for (j = 0; j < SIZE; j++)
            {
                int cell = a[i][j];
                if (cell == 0)
                {
                    int k = i - 1;
                    while (k >= 0)
                    {
                        int nextcell = a[k][j];
                        if (nextcell != 0)
                        {
                            a[i][j] = nextcell;
                            a[k][j] = 0;
                            k = -1;
                        }
                        k--;
                    }
                }
            }
        }
        break;
    case 'd':
        for (i = 0; i < SIZE; i++)
        {
            for (j = SIZE -1; j >= 0; j--)
            {
                int cell = a[i][j];
                if (cell != 0)
                {
                    int k = j - 1;
                    while (k >= 0)
                    {
                        int nextcell = a[i][k];
                        if (nextcell != 0)
                        {
                            if (cell == nextcell)
                            {
                                a[i][j] += a[i][k];
                                a[i][k] = 0;
                            }
                            k = -1;
                            break;
                        }
                        k--;
                    }
                }
            }
        }

        for (i = 0; i < SIZE; i++)
        {
            for (j = SIZE - 1; j > 0; j--)
            {
                int cell = a[i][j];
                if (cell == 0)
                {
                    int k = j - 1;
                    while (k >= 0)
                    {
                        int nextcell = a[i][k];
                        if (nextcell != 0)
                        {
                            a[i][j] = nextcell;
                            a[i][k] = 0;
                            k = -1;
                        }
                        k--;
                    }
                }
            }
        }
        break;
    default:
        break;
    }
}

 

 

 

  目前只能实现最基本的玩法,游戏的退出还没有写好,以及数字多了以后会造成随机数生成时间长。

还有一个很关键的,就是数字占满了整个二维数组后,paintRandom()方法还会继续随机造成死循环。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值