这个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/