c - 如何提升我用C语言制作的2048游戏的速度?

标签 c

这个2048的程序可以,但是经常卡顿(运行很慢,需要等几秒才能启动),希望大家多多指教,如何提高程序的速度。 我是C语言初学者,这个2048游戏是我的第一个程序。 如果你能给我一些帮助,我将不胜感激。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#include<conio.h>

int a[4][4] = { 0 };
int a[4][4] = { 0 };
int* p = &a[0][0];
int gameover = 0;

void input(int a[4][4], int* score);
void init(int a[4][4]);
void game_over(void);
void operate(int a[4][4], int* empty, int* score);

int main(void) {
    int empty = 2;
    int score = 0;

    init(a);
    input(a, &score);

    while (gameover != 1) {
        operate(a, &empty, &score);
        input(a, &score);
    }

    fflush(stdin);
    getchar();
    return 0;
}


void input(int a[4][4], int* score)
{
    int i = 0, j = 0;
    for (j = 3; j >= 0; j--) {
        printf("-------------------------\n");
        printf("|");
        fflush(stdout);
        fflush(stdin);
        for (i = 0; i < 4; i++) {
            if (a[j][i] == 0)
                printf("     |");
            else
                printf("  %d  |", a[j][i]);
            fflush(stdout);
        }
        putchar('\n');
    }

    printf("-------------------------\n");
    printf("up↑  down↓  left←  right→\n");
    fflush(stdout);
    fflush(stdin);
    printf("-----score:%d -----\n", *score);
}



void init(int a[4][4]) {
    int x, y;

    srand((unsigned)time(NULL));
    x = rand() % 4;
    y = rand() % 4;

    a[y][x] = 2;
    while (a[y][x] != 0) {
        x = rand() % 4;
        y = rand() % 4;
    }
    a[y][x] = 2;

}

void operate(int a[4][4], int* empty, int* score) {
    int in = 0;
    int x = 0, y = 0, check = 0;

    getch();
    in = getch();
    fflush(stdin);
    switch (in)
    {
    case 72:
        for (x = 0;x < 4; x++)
        {
            for (y = 3; y >= 0; y--)
            {
                if (a[y][x] != 0 && y != 3)
                {
                    check = y + 1;

                    for (; check < 4; check++)
                    {
                        if (a[check][x] != 0)
                        {
                            if (a[y][x] == a[check][x])
                            {
                                a[check][x] = 2 * a[check][x];
                                a[y][x] = 0;
                                *empty -= 1;
                                *score += a[check][x];
                                break;
                            }
                            else
                            {
                                if (check - 1 != y)
                                {
                                    a[check - 1][x] = a[y][x];
                                    a[y][x] = 0;
                                }
                                break;
                            }
                        }
                        if (check == 3 && a[check][x] == 0)
                        {
                            a[3][x] = a[y][x];
                            a[y][x] = 0;
                            break;
                        }

                    }

                }

            }
        }
        break;

    case 80:
        for (x = 0;x < 4; x++)
        {
            for (y = 0; y < 4; y++)
            {
                if (a[y][x] != 0 && y != 0)
                {
                    check = y - 1;

                    for (; check >= 0; check--)
                    {
                        if (a[check][x] != 0)
                        {
                            if (a[y][x] == a[check][x])
                            {
                                a[check][x] = 2 * a[check][x];
                                a[y][x] = 0;
                                *empty -= 1;
                                *score += a[check][x];
                                break;
                            }
                            else
                            {
                                if (check + 1 != y)
                                {
                                    a[check + 1][x] = a[y][x];
                                    a[y][x] = 0;
                                }
                                break;
                            }
                        }
                        if (check == 0 && a[check][x] == 0)
                        {
                            a[0][x] = a[y][x];
                            a[y][x] = 0;
                            break;
                        }

                    }

                }

            }
        }
        break;

    case 75:
        for (y = 0;y < 4; y++)
        {
            for (x = 0; x < 4; x++)
            {
                if (a[y][x] != 0 && x != 0)
                {
                    check = x - 1;

                    for (; check >= 0; check--)
                    {
                        if (a[y][check] != 0)
                        {
                            if (a[y][x] == a[y][check])
                            {
                                a[y][check] = 2 * a[y][check];
                                a[y][x] = 0;
                                *empty -= 1;
                                *score += a[y][check];
                                break;
                            }
                            else
                            {
                                if (check + 1 != x)
                                {
                                    a[y][check + 1] = a[y][x];
                                    a[y][x] = 0;
                                }
                                break;
                            }
                        }
                        if (check == 0 && a[y][check] == 0)
                        {
                            a[y][0] = a[y][x];
                            a[y][x] = 0;
                            break;
                        }

                    }

                }

            }
        }
        break;

    case 77:
        for (y = 0;y < 4; y++)
        {
            for (x = 3; x >= 0; x--)
            {
                if (a[y][x] != 0 && x != 3)
                {
                    check = x + 1;

                    for (; check < 4; check++)
                    {
                        if (a[y][check] != 0)
                        {
                            if (a[y][x] == a[y][check])
                            {
                                a[y][check] = 2 * a[y][check];
                                a[y][x] = 0;
                                *empty -= 1;
                                *score += a[y][check];
                                break;
                            }
                            else
                            {
                                if (check - 1 != x)
                                {
                                    a[y][check - 1] = a[y][x];
                                    a[y][x] = 0;
                                }
                                break;
                            }
                        }
                        if (check == 3 && a[y][check] == 0)
                        {
                            a[y][3] = a[y][x];
                            a[y][x] = 0;
                            break;
                        }

                    }

                }

            }
        }
        break;
    }
    *empty += 1;
    if (*empty <= 16)
    {
        do
        {
            srand((unsigned)time(NULL));
            x = rand() % 4;
            y = rand() % 4;
        } while (a[y][x] != 0);
        a[y][x] = 2;
        system("cls");
        fflush(stdout);
        fflush(stdin);
    }
    else
    {
        game_over();
    }


}

希望没有卡顿或者更少。 抱歉有这么多代码。 因为卡顿太多,我加了很多fflush()希望情况能好转,但是完全无效。

最佳答案

我注意到一些微妙的事情,比如可能称为预递减、预递增而不是后递减。仅种子 srand((unsigned)time(NULL)) 一次(可能在 main() 中)或其他地方而不是在循环中。但这些可能不会产生重大影响。

引用一段话:

“程序优化的第一条规则:不要做。程序优化的第二条规则(仅限专家!):先不要做。” — 迈克尔· jackson

如果有一个部分明显很慢,那就去做吧。第一步是分析代码,看看哪个部分慢,然后集中精力优化它。因为即使是我提到的微观事物也可能不会产生重大影响。

关于c - 如何提升我用C语言制作的2048游戏的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58284717/

相关文章:

c++ - 预处理后解析 C++ 源文件

c - 在程序运行时读取 fprintf

c - 为什么 getchar() 在二维数组中存储重复值?

C、如何将fgets和fscanf一起使用

c - 纹理映射位置不精确

c - 为什么在 C11 中没有对齐的 calloc

c - 如何编写提供频率信息的 iTunes 插件

c - 将整数数组加载到 AVX 寄存器中

c - 将C中的字符串拆分为单独的部分

c - 在gdb 下调试汇编代码|平台linux