#include <conio.h>
#include <bits/stdc++.h>
using namespace std;
const int N = 5; //地图为4*4
int Map[N][N]; //存图
inline void Generate_rand() //在随机位置产生2或4
{
int x = rand() % (N - 1) + 1;
int y = rand() % (N - 1) + 1;
while (Map[x][y])
{
x = rand() % (N - 1) + 1;
y = rand() % (N - 1) + 1;
}
Map[x][y] = rand() % 2 ? 2 : 4;
}
inline void build_start() //开始游戏的准备工作
{
memset(Map, 0, sizeof(Map));
Generate_rand();
Generate_rand();
}
inline bool Game_Over() //判断游戏是否结束,即无处可走
{
for (int i = 1; i < N; ++i)
{
for (int j = 1; j < N; ++j)
{
if (!Map[i][j]) return false; //有空位,显然未结束
if (Map[i][j] == Map[i][j - 1]) return false; //分为上下左右4个方向,有相同的数字说明还能走
if (Map[i][j] == Map[i - 1][j]) return false;
if (j < N - 1 && Map[i][j] == Map[i][j + 1]) return false;
if (i < N - 1 && Map[i][j] == Map[i + 1][j]) return false;
}
}
return true; //走不了,游戏结束
}
inline void display_Map() //显示地图
{
printf("CopyRight@ YZL---2019.12.10\n");
for (int i = 1; i < N; ++i)
{
for (int j = 1; j < N; ++j)
{
if (Map[i][j])
printf("%3d |", Map[i][j]);
else
printf(" |");
}
printf("\n--------------------\n");
}
printf("Please use the arrow key to move.\n");
}
inline bool move(int op) //上下左右移动
{
bool if_move = false; //标记地图是否改变
switch (op)
{
case 72: //向上移动,向下,向左,向右均类似
for (int i = 2; i < N; ++i)
{
for (int j = 1; j < N; ++j)
{
if (!Map[i][j]) continue;
int k = i;
while (k > 0 && !Map[k - 1][j]) --k; //向上找到不为空的格子
if (k > 1 && Map[k - 1][j] == Map[i][j]) //如果两个格子相同将他们合并且k>1
{
if_move = true; //地图改变
Map[k - 1][j] *= 2; //合并
Map[i][j] = 0; //原格子清零
}
else if (k > 0 && k != i) //否则将最上面的空格子标记为当前格子的数,并清空当前格子
{
if_move = true;
Map[k][j] = Map[i][j];
Map[i][j] = 0;
}
else if (k != i) //这里还有一种情况就是k=0,说明第一行为空,那么就让第一行标记为Map[i][j]
{
if_move = true;
Map[1][j] = Map[i][j];
Map[i][j] = 0;
}
}
}
break;
case 80: //向下移动
for (int i = N - 2; i >= 1; --i)
{
for (int j = 1; j < N; ++j)
{
if (!Map[i][j]) continue;
int k = i;
while (k < N && !Map[k + 1][j])
{
++k;
if (k == N) break;
}
if (k < N - 1 && Map[k + 1][j] == Map[i][j])
{
if_move = true;
Map[k + 1][j] *= 2;
Map[i][j] = 0;
}
else if (k < N && k != i)
{
if_move = true;
Map[k][j] = Map[i][j];
Map[i][j] = 0;
}
else if(k != i)
{
if_move = true;
Map[N - 1][j] = Map[i][j];
Map[i][j] = 0;
}
}
}
break;
case 75: //向左移动
for (int i = 2; i < N; ++i)
{
for (int j = 1; j < N; ++j)
{
if (!Map[j][i]) continue;
int k = i;
while (k > 0 && !Map[j][k - 1]) --k;
if (k > 1 && Map[j][k - 1] == Map[j][i])
{
if_move = true;
Map[j][k - 1] *= 2;
Map[j][i] = 0;
}
else if (k > 0 && k != i)
{
if_move = true;
Map[j][k] = Map[j][i];
Map[j][i] = 0;
}
else if(k != i)
{
if_move = true;
Map[j][1] = Map[j][i];
Map[j][i] = 0;
}
}
}
break;
case 77: //向右移动
for (int i = N - 2; i >= 1; --i)
{
for (int j = 1; j < N; ++j)
{
if (!Map[j][i]) continue;
int k = i;
while (k < N && !Map[j][k + 1])
{
++k;
if (k == N) break;
}
if (k < N - 1 && Map[j][k + 1] == Map[j][i])
{
if_move = true;
Map[j][k + 1] *= 2;
Map[j][i] = 0;
}
else if (k < N && k != i)
{
if_move = true;
Map[j][k] = Map[j][i];
Map[j][i] = 0;
}
else if(k != i)
{
if_move = true;
Map[j][N - 1] = Map[j][i];
Map[j][i] = 0;
}
}
}
break;
default:break;
}
return if_move;
}
int main()
{
srand((unsigned)time(NULL));
build_start();
while (true)
{
display_Map();
char c = _getch(); //方向键要_getch两次
c = _getch();
int op = c;
if (move(op)) Generate_rand(); //如果移动了,就产生随机数
if (Game_Over()) //游戏是否结束
{
system("cls");
display_Map();
printf("Game Over!\n");
system("pause");
exit(0);
}
system("cls");
}
return 0;
}
C++自实现2048小游戏
最新推荐文章于 2024-02-15 08:31:58 发布