#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[12];
int imageIndex[12];
int map[4][4] = { 2 };
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[4][4]);
void ChangeOnKeyDown(direction Direction);int main()
{
SetImageIndex();
loadResource();
initgraph(60*4,60*4+120);//游戏界面大小
drawMap();
keyDownAndDraw();
system("pause");//防止闪屏
//closegraph();
//system("pause");
return 0;
}
void SetImageIndex()
{
imageIndex[0] = 0;
for (int i = 1; i < 12; i++)
{
imageIndex[i] = int(pow(2, i));
}
}
void loadResource()//加载图片
{
for (int i = 0; i < 12; i++)
{
char fileName[20] = "";
sprintf(fileName, "%d.bmp", imageIndex[i]);//拼接
loadimage(image + i, fileName,60,60);
}
}//画地图
void drawMap()
{
string out;
int HistryHighlyScore = 0;
ifstream IScore("Score.txt");//创建文件读取历史最高分
if (!IScore)
{
ofstream OScore("Score.txt");
IScore.open("Score.txt");
}
getline(IScore, out);
char Score[10];
char HighlyScore[100];
int Sum=0;
setbkcolor(RGB(244, 215, 215));
cleardevice();
settextcolor(WHITE);//设置文字颜色
settextstyle(35, 0, "楷体");//设置文字格式
outtextxy(50, 10, "2048游戏");
settextcolor(YELLOW);//设置文字颜色
settextstyle(25, 0, "楷体");//设置文字格式
for (int i = 0; i < 4; i++)//计算分数
{
for (int j = 0; j < 4; j++)
{
if (map[i][j]>4)
{
Sum += map[i][j] * sqrt(map[i][j]);
}
}
}
sprintf(Score, "分数:%d", Sum);
outtextxy(10, 300,Score);
for (int i = 0; i < out.length(); i++)
{
HighlyScore[i] = out[i];
}
stringstream mid;
mid << out;
mid >> HistryHighlyScore;
if (HistryHighlyScore>Sum)
{
HighlyScore[out.length()] = '\0';
settextcolor(RED);//设置文字颜色
settextstyle(25, 0, "楷体");//设置文字格式
outtextxy(10, 330, "历史最高:");
outtextxy(130, 330, HighlyScore);
}
else
{
char Score1[20];
settextcolor(RED);//设置文字颜色
settextstyle(25, 0, "楷体");//设置文字格式
sprintf(Score1, "历史最高:%d", Sum);
outtextxy(10, 330,Score1);
ofstream OScore1;
OScore1.open("Score.txt");
OScore1<<Sum;
OScore1.close();
}
IScore.close();
//根据二维数组去画图
int x, y, k;
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
x = 60 * j;
y = 60 * i + 55;
for ( k = 0; k < 12; 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 = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if (map[i][j] == 0)
{
haszero = true;
map[i][j] = (rand() % 3) * 2;
if (map[i][j] == 0)
{
continue;
}
isOk = true;
break;
}
}
if (isOk)
{
break;
}
}
if (!isOk)
{
isOk = false;
if (haszero)
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if (map[i][j] == 0)
{
map[i][j] = 2;
isOk = true;
break;
}
}
if (isOk)
{
break;
}
}
}
}
for (int i = 0; i < 4; i++)//检测最后一步是否留有空位,若全满游戏结束
{
for (int j = 0; j < 4; j++)
{
if (map[i][j] == 0)
{
drawMap();
return;
}
}
}
for (int i = 0; i < 4; i++)//游戏失败则重置
{
for (int j = 0; j < 4; j++)
{
if (i==0&&j==0)
{
map[i][j] = 2;
continue;
}
map[i][j] = 0;
}
}
drawMap();
}//按键响应
void keyDownAndDraw()
{
while (true)
{
char key = _getch();//接收用户按键
if (isOver)
{
isOver = false;
switch (key)
{
case 'W':
case'w':
case 72:
ChangeOnKeyDown(Up);
break;
case 'S':
case's':
case 80:
ChangeOnKeyDown(Down);
break;
case 'a':
case'A':
case 75:
ChangeOnKeyDown(Left);
break;
case 'D':
case'd':
case 77:
ChangeOnKeyDown(Right);
break;
default:
isOver = true;
break;
}
}
}
}
void ChangeOnKeyDown(direction Direction)
{
int Map[4][4] = { 0 };
bool CanMove;
switch (Direction)//将所有方向改为向左方向,并利用向左算法计算各个方向
{
case Up:
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
Map[j][i] = map[i][j];
}
}
break;
case Down:
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
Map[j][3-i] = map[i][j];
}
}
break;
case Left:
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
Map[i][j] = map[i][j];
}
}
break;
case Right:
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
Map[i][3-j] = map[i][j];
}
}
break;
default:
break;
}
//向左算法
CanMove=TurnLeft(Map);
//将向左改回各自方向
switch (Direction)
{
case Up:
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
map[j][i] =Map[i][j];
}
}
break;
case Down:
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
map[3-j][i] = Map[i][j];
}
}
break;
case Left:
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
map[i][j] = Map[i][j];
}
}
break;
case Right:
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
map[i][3-j] = Map[i][j];
}
}
break;
default:
break;
}
if (CanMove)
{
randIntNum();
drawMap();
}
else
{
isOver = true;
}
};
//算法
bool TurnLeft(int Map[4][4])//按向左键进行合并
{
int k;
int len;
int Save[4];
int Move[4][4];
bool CanMove = false;for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
Move[i][j] = Map[i][j];
}
}
for (int i = 0; i < 4; i++)
{
k = 0;
len = 0;
for (int j = 0; j < 4; j++)
{
if (Map[i][j]==0)
{
continue;
}
for (k = j+1; k < 4; k++)
{
if (Map[i][k] != 0 )
{
if (Map[i][j] == Map[i][k])
{
Map[i][j] *= 2;
Map[i][k] = 0;
}
break;
}
}
}
for (int j = 0; j < 4; j++)
{
if (Map[i][j]!=0)
{
Save[len]=Map[i][j];
len++;
}
}
for (int j = 0; j < 4; j++)
{
if (j<len)
{
Map[i][j] = Save[j];
}
else
{
Map[i][j] = 0;
}
}
}
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if (Move[i][j] != Map[i][j])
{
CanMove = true;
};
}
}
return CanMove;
}

用c++做2048小游戏相关推荐

  1. 我的名片能运行Linux和Python,还能玩2048小游戏,成本只要20元

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 猜猜它是什么?印着姓名.职位和邮箱,看起来是个名片.可是右下角有芯片,看起来又像是个PCB电路板. 其实它是一台超迷你的ARM计算机,不仅 ...

  2. python里graphics的使用_使用graphics.py实现2048小游戏

    1.过年的时候在手机上下载了2048玩了几天,心血来潮决定用py写一个,刚开始的时候想用QT实现,发现依赖有点大.正好看到graphics.py是基于tkinter做的封装就拿来练手,并借用了CSDN ...

  3. html css js实现快递单打印_JS与HTML、CSS实现2048小游戏(六)

    在前面的五篇文章中,小编带大家完成了网页版2048小游戏的基本游戏逻辑.但是在游戏结束的gameover()方法中咱们只是简单的通过alert来弹出一些信息,这样的话只能出现下图的效果.这样的游戏,不 ...

  4. ​.NET手撸2048小游戏

    前言 2048是一款益智小游戏,得益于其规则简单,又和 2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎" FlysEngine,从空白窗口 ...

  5. C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训

    C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训 实现的全部功能: 功能演示: 版本介绍 简易版--大佬选这个 完整版--想保研.想得高分.想要装逼的同学选这个 至尊版--零基础的.想要装 ...

  6. 2048小游戏编写思路

    有点难 关键知识点 下面请各位读者先学习一下该游戏中涉及到的几个关键知识点,有了这些必备条件,我们才好讲解 2048 游戏的设计思路. 1) 改变文本颜色 2048 游戏设置的格子边框颜色为湖蓝色,其 ...

  7. 用App Designer 制作2048小游戏

    用App Designer 制作2048小游戏 用App Designer制作的2048,MATLAB版本是2020b.记录下创作思路,以免日后忘记. APP界面设计 APP界面如下,为了好玩,还加入 ...

  8. java2048ai,2048小游戏ai设计

    感谢我的朋友许博瑀,他一定要赞助我个域名,于是网站改为以下地址: >>>>>>>>>>>>>>>>> ...

  9. 从全球最大同性交友网站抄了一份不一样的2048小游戏

    大家好,我是"前端点线面",一位新生代农民工,欢迎关注我获取最新前端知识和<前端百题斩>pdf版(包括JS基础篇.浏览器篇.网络篇共计50个章节,5万多字),此外有喜欢 ...

最新文章

  1. Oracle通用分页包
  2. Cisco路由器的口令恢復
  3. JAVA单向/双向链表的实现
  4. python中path语句什么意思_python中jsonpath模块有何用法?
  5. MX130+python3.7.6+CUDA 10.0+CUDNN 7.4.2+TensorFlow-gpu安装
  6. Kali 远程登陆SSH
  7. flutter能开发游戏吗_Steam上架游戏开发软件,不用代码也能制作游戏,而且还是免费的...
  8. SharePoint Desiger编辑模板时提示“服务器错误,拒绝访问”的解决之道
  9. json Date对象在js中的处理办法
  10. Spring Boot 实现微信小程序订阅模板消息
  11. zabbix邮件报警功能的验证
  12. 紫书 习题 8-2 UVa 1610 (暴力出奇迹)
  13. OPIE(火狐扩展)-导入导出firefox扩展的所有设置
  14. esp8266教程:GPIO输入输出模式
  15. html太极旋转css,前端CSS技巧之太极旋转图详解
  16. git仓库服务器SSH认证示例
  17. linux 汇编 `.eabi_attribute',交叉编译arm-none-eabi-gcc编译汇编文件(startup_stm32f10x_hd.S)遇到的有关问题(2)...
  18. android水波纹动画制作,Framer之事件 | 如何制作安卓点击水波纹效果?
  19. DO、DTO、BO、VO、POJO等各种O浅学(总结)
  20. java conversion_java.util.UnknownFormatConversionException: Conversion = ''';

热门文章

  1. 电子元器件基础知识之二极管
  2. Linux 下的usb无线网卡使用(arrch64和x64的同时踩坑)
  3. 转换成大写日期(中文)
  4. S6700系列万兆交换机功能规格
  5. 《基于stm32的直流有刷电机的控制》:驱动和制动原理
  6. java mp3,audio - 在Java中播放.mp3和.wav?
  7. 课设-机器学习课设-实现新闻分类
  8. 用C语言输出1000到2000年之间的闰年
  9. 计算机更新的文件可以全部删掉吗,c盘快满了哪些文件可以删除
  10. 计算机定时关机教程,电脑定时关机怎么设置