------------------写在开头----------------------
2048黑窗口小游戏
主要涉及C语言 知识模块如下:
1.数组的应用
2.文件的交互
3.函数的定义与应用
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
int map_A[4][4] =
{
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
};
int map_B[4][4];
int High_score = 0;
int Score = 0;
int flag = 1;
char ch = 0;
// 读取用户输入字符
void Start();
// 游戏初始化
int Action();
// 行动
void Draw_Map();
// 绘制地图
void Auto_Create();
//自动生成卡片
int Up();
// 向上移
int Down();
// 向下移
int Right();
// 向左移
int Left();
// 向右移
void Help();
// 游戏帮助
void Check();
// 游戏终止
int HighScore_Input();
//从文件中 读取最高 分数
void HighScore_Output();
//刷新最高 分数
int main(void)
{
FILE *F;
int k = 1;
if (HighScore_Input() == 0)
{
F = fopen("Highscore.txt", "w+");
fprintf(F,"%d",k);
fclose(F);
}
//未找到该文件 自动创建新文件Highscore.txt
//从文件中 读取最高 分数
// 设置窗口标题
// SetConsoleTitleA("2048");
//system("color 79");
// 更换颜色 为 白底蓝字
Auto_Create();
while (flag)
{
// 清屏
system("cls");
// 在地图中 随机空位置写入数字
if (k == 1)
Auto_Create();
// 绘制地图
Draw_Map();
// 游戏帮助
Help();
// 读取用户输入
ch = _getch();
if (ch == 'q' || ch == 'Q')
break;
Check();
// 检查 游戏是否终止
k = Action();
//根据输入 行动
}
HighScore_Output();
return 0;
}
// 绘制地图
void Draw_Map()
{
int i, j;
int k = 30, x;
Score = 0;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
Score += map_A[i][j];
if (Score > High_score)
High_score = Score;
}
}
printf("\033[1;41m 2048.c \033[0m "
" 分数 \033[1;43;34m %-6d \033[0m "
"历史最佳 \033[1;33;46m %-6d \033[0m \n\n"
, Score, High_score);
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++, k = 30)
{
x = map_A[i][j];
if (x != 0)
while (x)
{
k++;
x /= 2;
}
printf("\033[1;%dm %-6d \033[0m", k, map_A[i][j]);
Score += map_A[i][j];
}
putchar('\n');
}
}
//人物运动
int Action()
{
switch (ch)
{
case 'W':
case 'w':
case 72:
case 50:
return (Up());
//向上移
break;
case 'S':
case 's':
case 80:
case 56:
return (Down());
//向下移
break;
case 'A':
case 'a':
case 75:
case 52:
return (Left());
//向左移
break;
case 'D':
case 'd':
case 77:
case 54:
return (Right());
//向右移
break;
default:
return 0;
break;
}
return 1;
}
//向上移
int Up()
{
int i, j;
int flag3 = 0;
for (j = 0; j < 4; j++)
{
for (i = 0; i < 4; i++)
{
if (map_A[i][j] == map_A[i + 1][j] && map_A[i][j] != 0 && i != 3)//相同相加
{
map_A[i][j] *= 2;
map_A[i + 1][j] = 0;
flag3 = 1;
}
if (map_A[i - 1][j] == 0 && i != 0 && map_A[i][j] != 0)// 移动
{
for (int n = i - 1; n >= 0; n--)
{
if (map_A[n][j] != 0)
{
if (map_A[n][j] == map_A[i][j])
{
map_A[n][j] *= 2;
map_A[i][j] = 0;
flag3 = 1;
}
else if (map_A[n + 1][j] == 0)
{
int x = map_A[i][j];
map_A[i][j] = 0;
map_A[n + 1][j] = x;
flag3 = 1;
}
}
else if (n == 0 && map_A[n + 1][j] == 0)
{
map_A[n][j] = map_A[i][j];
map_A[i][j] = 0;
flag3 = 1;
}
else if (n == 0 && n == i - 1)
{
map_A[n][j] = map_A[i][j];
map_A[i][j] = 0;
flag3 = 1;
}
}
}
}
}
return flag3;
}
//向下移
int Down()
{
int i, j;
int flag3 = 0;
for (j = 0; j < 4; j++)
{
for (i = 3; i >= 0; i--)
{
if (map_A[i][j] == map_A[i - 1][j] && map_A[i][j] != 0 && i != 0)//相同相加
{
map_A[i][j] *= 2;
map_A[i - 1][j] = 0;
flag3 = 1;
}
if (map_A[i + 1][j] == 0 && i != 3 && map_A[i][j] != 0)// 移动
{
for (int n = i + 1; n < 4; n++)
{
if (map_A[n][j] != 0)
{
if (map_A[n][j] == map_A[i][j])
{
map_A[n][j] *= 2;
map_A[i][j] = 0;
flag3 = 1;
}
else if (map_A[n - 1][j] == 0)
{
int x = map_A[i][j];
map_A[i][j] = 0;
map_A[n - 1][j] = x;
flag3 = 1;
}
}
else if (n == 3 && map_A[n - 1][j] == 0)
{
map_A[n][j] = map_A[i][j];
map_A[i][j] = 0;
flag3 = 1;
}
else if (n == 3 && n == i + 1)
{
map_A[n][j] = map_A[i][j];
map_A[i][j] = 0;
flag3 = 1;
}
}
}
}
}
return flag3;
}
//向左移
int Left()
{
int i, j;
int flag3 = 0;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
if (map_A[i][j] == map_A[i][j + 1] && map_A[i][j] != 0 && j != 3)//相同相加
{
map_A[i][j] *= 2;
map_A[i][j + 1] = 0;
flag3 = 1;
}
if (map_A[i][j - 1] == 0 && j != 0 && map_A[i][j] != 0)// 移动
{
for (int n = j - 1; n >= 0; n--)
{
if (map_A[i][n] != 0)
{
if (map_A[i][n] == map_A[i][j])
{
map_A[i][n] *= 2;
map_A[i][j] = 0;
flag3 = 1;
}
else if (map_A[i][n + 1] == 0)
{
int x = map_A[i][j];
map_A[i][j] = 0;
map_A[i][n + 1] = x;
flag3 = 1;
}
}
else if (n == 0 && map_A[i][n + 1] == 0)
{
map_A[i][n] = map_A[i][j];
map_A[i][j] = 0;
flag3 = 1;
}
else if (n == 0 && n == j - 1)
{
map_A[i][n] = map_A[i][j];
map_A[i][j] = 0;
flag3 = 1;
}
}
}
}
}
return flag3;
}
//向右移
int Right()
{
int i, j;
int flag3 = 0;
for (i = 0; i < 4; i++)
{
for (j = 3; j >= 0; j--)
{
if (map_A[i][j] == map_A[i][j - 1] && map_A[i][j] != 0 && j != 0)//相同相加
{
map_A[i][j] *= 2;
map_A[i][j - 1] = 0;
flag3 = 1;
}
if (map_A[i][j + 1] == 0 && j != 3 && map_A[i][j] != 0)// 移动
{
for (int n = j + 1; n < 4; n++)
{
if (map_A[i][n] != 0)
{
if (map_A[i][n] == map_A[i][j])
{
map_A[i][n] *= 2;
map_A[i][j] = 0;
flag3 = 1;
}
else if (map_A[i][n - 1] == 0)
{
int x = map_A[i][j];
map_A[i][j] = 0;
map_A[i][n - 1] = x;
flag3 = 1;
}
}
else if (n == 3 && map_A[i][n - 1] == 0)
{
map_A[i][n] = map_A[i][j];
map_A[i][j] = 0;
flag3 = 1;
}
else if (n == 3 && n == j + 1)
{
map_A[i][n] = map_A[i][j];
map_A[i][j] = 0;
flag3 = 1;
}
}
}
}
}
return flag3;
}
//自动生成卡片
void Auto_Create()
{
int n = 0;
int i, j;
int number, value, _rand;
int x[16], y[16];
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
if (map_A[i][j] == 0)
{
x[n] = i;
y[n] = j;
n++;
}
}
}
srand(time(0));
if (n != 0)
{
if ((rand() % 9) >= 7)
number = 2;
else
number = 1;
srand(time(0));
if ((rand() % 9) >= 7)
value = 4;
else
value = 2;
_rand = rand() % n;
map_A[x[_rand]][y[_rand]] = value;
}
}
// 游戏终止
void Check()
{
int flag2 = 0;
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
if (map_A[i][j] == 0)
{
flag2 = 1;
break;
}
}
}
//如果 没有空白卡片
//则 找寻 是否存在相邻相同卡片
if (flag2 != 1)
{
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
if (j != 3)//列数没到最后一列
{
if (i != 3)//行数没到最后一行
{
if (map_A[i][j] == map_A[i][j + 1] || map_A[i + 1][j] == map_A[i][j])
{
flag2 = 1;
break;
}
}
else
if (map_A[i + 1][j] == map_A[i][j])
{
flag2 = 1;
break;
}
}
else
{
if (j != 3)//如果列数没到最后一列
{
if (map_A[i][j] == map_A[i][j + 1])
{
flag2 = 1;
break;
}
}
}
}
}//内层for循环
}//外层for循环
flag = flag2;
}
// 游戏帮助
void Help()
{
printf("\nW ↑ S ↓ A ← D → \n");
printf("Q : 保存退出♂ \n");
}
//从文件中 读取最高 分数
int HighScore_Input()
{
FILE* fp;
fp = fopen("Highscore.txt", "r+");
if (fp == NULL)
{
perror("fopen");
return 0;
}
fscanf(fp, "%d", &High_score);
fclose(fp);
return 1;
}
//刷新最高分数
void HighScore_Output()
{
FILE* fp;
fp = fopen("Highscore.txt", "w+");
if (fp == NULL)
{
perror("fopen");
exit(0);
}
fprintf(fp, "%d", High_score);
fclose(fp);
}