代码如下:

 #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/

C++实现2048小游戏的更多相关文章

  1. jQuery实践-网页版2048小游戏

    ▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...

  2. C# 开发2048小游戏

    这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的 ...

  3. Swift实战之2048小游戏

    上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...

  4. 如何在CentOS上安装一个2048小游戏

    如何在centos上安装一个2048小游戏 最近在学习CentOS系统,就琢磨着玩点什么,然后我看到有人在玩2048小游戏,所有我就在想,为啥不装一个2048小游戏搞一下嘞,于是乎,我就开始工作啦 由 ...

  5. js、jQuery实现2048小游戏

    2048小游戏 一.游戏简介:  2048是一款休闲益智类的数字叠加小游戏 二. 游戏玩法: 在4*4的16宫格中,您可以选择上.下.左.右四个方向进行操作,数字会按方向移动,相邻的两个数字相同就会合 ...

  6. 用js实现2048小游戏

    用js实现2048小游戏 笔记仓库:https://github.com/nnngu/LearningNotes 1.游戏简介 2048是一款休闲益智类的数字叠加小游戏.(文末给出源代码和演示地址) ...

  7. 2048小游戏代码解析 C语言版

    2048小游戏,也算是风靡一时的益智游戏.其背后实现的逻辑比较简单,代码量不算多,而且趣味性强,适合作为有语言基础的童鞋来加强编程训练.本篇分析2048小游戏的C语言实现代码. 前言 游戏截图:  游 ...

  8. Docker从0开始之部署一套2048小游戏

    本文记录一下在docker部署一套2048小游戏的过程,在娱乐中熟悉docker的应用部署.docker 安装不在本文讲述之中,参考我的其它博客. 1.获取image镜像. 方法一:daocloud. ...

  9. 使用JS实现2048小游戏

    JS实现2048小游戏源码 效果图: 代码如下,复制即可使用: (适用浏览器:360.FireFox.Chrome.Opera.傲游.搜狗.世界之窗. 不支持Safari.IE8及以下浏览器.) &l ...

  10. 2048小游戏4X4C语言

    */ #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<time.h> v ...

随机推荐

  1. Java中判断数组是否为空

    一维数组// 一维数组: int[] arrayif(array == null || array.length == 0)    return true; 二维数组//二维数组: int[][] a ...

  2. 蛋疼的springboot web项目使用jetty容器运行

    出现的问题: 今天自己新建了一个maven webapp项目,准备自己看看springboot的东西,搭好的项目是这样的 一切都很正常啊,用run App的方式直接启动 成功啦,本应该到此结束,喝茶吃 ...

  3. ciscn2019华北赛区半决赛day1web5CyberPunk

    刚比赛完的一段时间期末考试云集,没有时间复现题目.趁着假期,争取多复现几道题. 复现平台 buuoj.cn 解题过程 首先进入题目页面 看起来没有什么特别的,就是一个可以提交信息的页面.查看响应报文也 ...

  4. Barman 安装

    Barman需要用到psql客户端,所以需要在Barman服务器安装psql数据库 1 linux操作系统环境准备: python版本:2.6或2.7 yum -y install epel-rele ...

  5. * resolve_conffiles: Existing conffile /etc/config/dhcp is different from the conffile in the new package. The new conffile will be placed at /etc/config/dhcp-opkg.

    * resolve_conffiles: Existing conffile /etc/config/dhcp is different from the conffile in the new pa ...

  6. 胶囊网络 -- Capsule Networks

    胶囊网络是 vector in vector out的结构,最后对每个不同的类别,输出不一个向量,向量的模长表示属于该类别的概率. 例如,在数字识别中,两个数字虽然重叠在一起,Capsule中的两个向 ...

  7. 固定权重 关于Mxnet的一些基础知识理解(1)

    https://blog.csdn.net/pandav5/article/details/53993684 (1)Mxnet的数据格式为NDArray,当需要读取可观看的数据,就要调用: numpy ...

  8. 001 centos7下安装kibana

    Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索.查看交互存储在Elasticsearch索引中的数据. 所以,在安装完ES之后,这里再安装一下kibana.方便后面学 ...

  9. return语句——学习笔记

    return,可以提前结束其所在函数. 函数内不写,会自动加上return. 非引用返回: 引用返回:a=3,b=3 注意事项: 两种修改字符串某一位置值的方式:

  10. FrameLayout--霓虹灯

    主函数里面,新建一个线程,控制改变背景色 package com.example.framelayout import android.support.v7.app.AppCompatActivity ...