代码如下:

 #define _CRT_SECURE_NO_WARNINGS//去掉编译器内部扩增问题
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<graphics.h>//需要下载图形库
#include<conio.h>
#include<time.h>
#include<string>
#include<fstream>
#include<iostream>
#include<sstream>
using namespace std; namespace
{
IMAGE image[];
int imageIndex[];
int map[][] = { };
bool isOver = true;
bool gameOver = false;
enum direction
{
Up, Down, Left, Right
};
}; void SetImageIndex();//设置图片编号
void loadResource();
void drawMap();
void randIntNum();
void keyDownAndDraw();
bool TurnLeft(int s[][]);
void ChangeOnKeyDown(direction Direction); int main()
{
SetImageIndex();
loadResource();
initgraph(*,*+);//游戏界面大小
drawMap();
keyDownAndDraw();
system("pause");//防止闪屏
//closegraph();
//system("pause");
return ;
}
void SetImageIndex()
{
imageIndex[] = ;
for (int i = ; i < ; i++)
{
imageIndex[i] = int(pow(, i));
}
}
void loadResource()//加载图片
{
for (int i = ; i < ; i++)
{
char fileName[] = "";
sprintf(fileName, "%d.bmp", imageIndex[i]);//拼接
loadimage(image + i, fileName,,);
}
} //画地图
void drawMap()
{
string out;
int HistryHighlyScore = ;
ifstream IScore("Score.txt");//创建文件读取历史最高分
if (!IScore)
{
ofstream OScore("Score.txt");
IScore.open("Score.txt");
}
getline(IScore, out);
char Score[];
char HighlyScore[];
int Sum=;
setbkcolor(RGB(, , ));
cleardevice();
settextcolor(WHITE);//设置文字颜色
settextstyle(, , "楷体");//设置文字格式
outtextxy(, , "2048游戏");
settextcolor(YELLOW);//设置文字颜色
settextstyle(, , "楷体");//设置文字格式
for (int i = ; i < ; i++)//计算分数
{
for (int j = ; j < ; j++)
{
if (map[i][j]>)
{
Sum += map[i][j] * sqrt(map[i][j]);
}
}
}
sprintf(Score, "分数:%d", Sum);
outtextxy(, ,Score);
for (int i = ; i < out.length(); i++)
{
HighlyScore[i] = out[i];
}
stringstream mid;
mid << out;
mid >> HistryHighlyScore;
if (HistryHighlyScore>Sum)
{
HighlyScore[out.length()] = '\0';
settextcolor(RED);//设置文字颜色
settextstyle(, , "楷体");//设置文字格式
outtextxy(, , "历史最高:");
outtextxy(, , HighlyScore);
}
else
{
char Score1[];
settextcolor(RED);//设置文字颜色
settextstyle(, , "楷体");//设置文字格式
sprintf(Score1, "历史最高:%d", Sum);
outtextxy(, ,Score1);
ofstream OScore1;
OScore1.open("Score.txt");
OScore1<<Sum;
OScore1.close();
}
IScore.close();
//根据二维数组去画图
int x, y, k;
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
x = * j;
y = * i + ;
for ( k = ; k < ; k++)
{
if (imageIndex[k] == map[i][j])
{
break;
}
}
putimage(x,y,image+k);
}
}
isOver = true;
} //随机产生2或者4;
void randIntNum()
{
bool haszero = false;
bool isOk=false;
srand((unsigned)time(NULL)); //随机函数种子
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
if (map[i][j] == )
{
haszero = true;
map[i][j] = (rand() % ) * ;
if (map[i][j] == )
{
continue;
}
isOk = true;
break;
}
}
if (isOk)
{
break;
}
}
if (!isOk)
{
isOk = false;
if (haszero)
{
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
if (map[i][j] == )
{
map[i][j] = ;
isOk = true;
break;
}
}
if (isOk)
{
break;
}
}
}
}
for (int i = ; i < ; i++)//检测最后一步是否留有空位,若全满游戏结束
{
for (int j = ; j < ; j++)
{
if (map[i][j] == )
{
drawMap();
return;
}
}
}
for (int i = ; i < ; i++)//游戏失败则重置
{
for (int j = ; j < ; j++)
{
if (i==&&j==)
{
map[i][j] = ;
continue;
}
map[i][j] = ;
}
}
drawMap();
} //按键响应
void keyDownAndDraw()
{
while (true)
{
char key = _getch();//接收用户按键
if (isOver)
{
isOver = false;
switch (key)
{
case 'W':
case'w':
case :
ChangeOnKeyDown(Up);
break;
case 'S':
case's':
case :
ChangeOnKeyDown(Down);
break;
case 'a':
case'A':
case :
ChangeOnKeyDown(Left);
break;
case 'D':
case'd':
case :
ChangeOnKeyDown(Right);
break;
default:
isOver = true;
break;
}
}
}
}
void ChangeOnKeyDown(direction Direction)
{
int Map[][] = { };
bool CanMove;
switch (Direction)//将所有方向改为向左方向,并利用向左算法计算各个方向
{
case Up:
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
Map[j][i] = map[i][j];
}
}
break;
case Down:
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
Map[j][-i] = map[i][j];
}
}
break;
case Left:
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
Map[i][j] = map[i][j];
}
}
break;
case Right:
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
Map[i][-j] = map[i][j];
}
}
break;
default:
break;
}
//向左算法
CanMove=TurnLeft(Map);
//将向左改回各自方向
switch (Direction)
{
case Up:
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
map[j][i] =Map[i][j];
}
}
break;
case Down:
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
map[-j][i] = Map[i][j];
}
}
break;
case Left:
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
map[i][j] = Map[i][j];
}
}
break;
case Right:
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
map[i][-j] = Map[i][j];
}
}
break;
default:
break;
}
if (CanMove)
{
randIntNum();
drawMap();
}
else
{
isOver = true;
}
};
//算法
bool TurnLeft(int Map[][])//按向左键进行合并
{
int k;
int len;
int Save[];
int Move[][];
bool CanMove = false; for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
Move[i][j] = Map[i][j];
}
}
for (int i = ; i < ; i++)
{
k = ;
len = ;
for (int j = ; j < ; j++)
{
if (Map[i][j]==)
{
continue;
}
for (k = j+; k < ; k++)
{
if (Map[i][k] != )
{
if (Map[i][j] == Map[i][k])
{
Map[i][j] *= ;
Map[i][k] = ;
}
break;
}
}
}
for (int j = ; j < ; j++)
{
if (Map[i][j]!=)
{
Save[len]=Map[i][j];
len++;
}
}
for (int j = ; j < ; j++)
{
if (j<len)
{
Map[i][j] = Save[j];
}
else
{
Map[i][j] = ;
}
}
}
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
if (Move[i][j] != Map[i][j])
{
CanMove = true;
};
}
}
return CanMove;
}

图形库地址:

https://easyx.cn/downloads/

最新文章

  1. Javascript中substr和substring的区别
  2. Nginx 开启PATHINFO支持ThinkPHP框架实例
  3. BestCoder10 1002 Revenge of GCD(hdu 5019) 解题报告
  4. 配置jetty 远程调试
  5. mysql索引之四(索引使用注意规则:索引失效--存在索引但不使用索引)
  6. ThinkPHP运算符与PHP运算符对照表
  7. 算法总结—深度优先搜索DFS
  8. codeforce 604B More Cowbell
  9. 2017 google Round D APAC Test 题解
  10. AVR GCC对端口的操作指南
  11. 远程访问TeamTalk的Mysql数据库被拒解决方法
  12. WebView缓存
  13. 纯CSS3之五子棋(黑白棋)画法
  14. postman使用—chrome版
  15. 在阿里云服务器中用IP连接SQLserver2014提示40,53错误
  16. Getting started with Processing 第十三章——延伸(2)
  17. python oracle使用心得
  18. UVA - 10815 - Andy's First Dictionary STL
  19. JavaScript 面向对象编程之一
  20. php读取sqlite数据库入门实例

热门文章

  1. 纯JavaScript开发飞机大战项目
  2. mui openWindow方法详细说明
  3. pypy
  4. [教程] Packt - Create a Game Environment with Blender and Unity by Darrin Lile
  5. ActiveMQ参数异常 “Invalid broker URI”
  6. 项目启动时警告 Establishing SSL connection without server&#39;s identity verification is not recommended
  7. iftop -i eth0 -B -F
  8. Tensorflow 2 Cifar10离线数据集手动下载、离线安装、本地加载、快速读取
  9. debian9 ps 命令不能用
  10. Python高级笔记(七)魔法属性