> # ♻️ 资源
> **大小:** 22.8MB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100010531**](https://www.yuque.com/sxbn/ks/100010531)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/87400359**](https://download.csdn.net/download/s1t16/87400359)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
> ![qrcode_for_gh_d52056803b9a_344.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/2469055/1692147256036-49ec7e0c-5434-4963-b805-47e7295c9cbc.jpeg#averageHue=%23a3a3a3&clientId=u8fb96484-770e-4&from=paste&height=140&id=u237e511a&originHeight=344&originWidth=344&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8270&status=done&style=none&taskId=ud96bf5f7-fe85-4848-b9c2-82251181297&title=&width=140.1999969482422)
# 2048[C语言版]
## 1.编译环境
**_*Win10专业版x64 VS2015*_**
## **2.项目运行效果**
![](https://img-blog.csdn.net/20180809174008569?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzMTU0MzQz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70#height=411&id=p5Rjt&originHeight=411&originWidth=640&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=&width=640)
![](https://img-blog.csdn.net/20180203205627057?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzMxNTQzNDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast#height=719&id=Fi53S&originHeight=719&originWidth=1043&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=&width=1043)
## **3.思路简介:**
### **1.游戏规则**
游戏的规则很简单,你需要控制所有方块向同一个方向运动,两个相同数字的方块撞在一起之后合并成为他们的和,每次操作之后会在空白的方格处随机生成一个2或者4(生成2的概率要大一些),最终得到一个“2048”的方块就算胜利了。
### **2.核心算法**
1、方块移动和合并算法。
**主要思想**:把游戏数字面板抽象成4行4列的二维数组a[4][4],值为0的位置表示空方块,其他表示对应数字方块。把每一行同等对待,只研究一行的移动和合并算法,然后可以通过遍历行来实现所有行的移动合并算法。在一行中,用b[4]表示一行的一位数组,使用两个下标变量来遍历列项,这里使用j和k,其中j总在k的后面,用来寻找k项后面第一个不为0的数字,而k项用于表示当前待比较的项,总是和j项之间隔着若干个数字0,或者干脆紧挨着。不失一般性,考虑往左滑动时,初始事情况下j等于1,而k等于0,接着判断j项数字是否大于0,若是,则判断j项和k项数字的关系,分成3种情况处理,分别是P1: ,P2: b[k]==0和P3: b[k]!=0且b[k]!=b[j];若否,则j自加1,然后继续寻找k项后面第一个不为0的数字。其中P1,P2和P3分别对应如下:
- P1:b[k]==b[j],则b[k] = 2 * b[k](说明两数合并了),且b[j] = 0(合并之后要将残留的j项值清零),接着k自加1,然后进行下一次循环。
- P2:b[k]==0,则表示b[j]之前全是空格子,此时直接移动b[j]到k的位置,也就是b[k] = b[j],然后b[j] = 0(移动后将残留的j项值清零),接着k值不变,然后进行下一次循环。
- P3:b[k]!=0且b[k]!=b[j],则表示两数不相等且都不为0,此时将两数靠在一起,也就是b[k+1] = b[j]。接着分两种小情况,若j!=k+1,则b[j] = 0(移动后将残留的j项值清零);若否,则表示两数原先就靠在一起,则不进行特殊处理(相当于未移动)。接着k自加1,然后进行下一次循环。
举一个P1的例子,流程表示如下:
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2kvNjMzMjAzLzIwMTQwNi8wMTE3NTM0OTcxMzI5MTQucG5n?x-oss-process=image/format,png#id=g3VqH&originHeight=189&originWidth=1332&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
一行内移动合并算法描述如下(此例为左移情况,其他方向与之类似,区别仅仅是遍历二维数组的行项和列项的方式)。
## 4.主要源码:
```c
#include "stdafx.h"
#include <time.h>
#include <conio.h>
#define FRAMERWHIDTH 20 //一个小的格子的宽度
#define FRAMERHIGHT 20 //一个小的格子的高度
int Bound[4][4]; //抽象为地图
int RandNum_nFalge; //是否添加一个新的随机数标志 1--->产生新的随机数 0--->不必产生新的随机数
int Gameover_nFlage; //是否游戏结束 1--->游戏失败结束 2---->游戏胜利结束 0--->继续正常(游戏未结束)
int Score; //游戏分数
//数组的移动 下标 k,j; 其中j为k后面的第一个不为0的数字
//左移动
void MoveLeft()
{
for (int i = 0; i < 4; i++) //一共有4行
{
for (int k = 0, j = 1; j < 4; j++) //每一行都是有4列(个数字)
{
if (Bound[i][j] > 0) //在一行中,只判k只有遇到的第一个非0的个数字 (j>0)
{
if(Bound[i][k] == Bound[i][j]) //情况一:k == j && j >0
{
Score += Bound[i][k++] *= 2;
Bound[i][j] = 0;
RandNum_nFalge = 1;
}
else if (Bound[i][k] == 0) //情况二:k == 0 && j>0
{
Bound[i][k] = Bound[i][j];
Bound[i][j] = 0;
RandNum_nFalge = 1;
}
else //情况三:k != j &&j >0
{
Bound[i][++k] = Bound[i][j];
if (k != j)
{
Bound[i][j] = 0;
RandNum_nFalge = 1;
}
}
}
}
}
}
//右移动
void MoveRight()
{
for (int i = 0; i < 4; i++) //一共有4行
{
for (int k = 3, j = 2; j >= 0; j--) //每一行都是有4列(个数字)
{
if (Bound[i][j] > 0) //在一行中,只判k只有遇到的第一个非0的个数字 (j>0)
{
if (Bound[i][k] == Bound[i][j]) //情况一:k == j && j >0
{
Score += Bound[i][k--] *= 2;
Bound[i][j] = 0;
RandNum_nFalge = 1;
}
else if (Bound[i][k] == 0) //情况二:k == 0 && j>0
{
Bound[i][k] = Bound[i][j];
Bound[i][j] = 0;
RandNum_nFalge = 1;
}
else //情况三:k != j &&j >0
{
Bound[i][--k] = Bound[i][j];
if (k != j)
{
Bound[i][j] = 0;
RandNum_nFalge = 1;
}
}
}
}
}
}
//上移动
void MoveUp()
{
for (int i = 0; i < 4; i++) //一共有4列
{
for (int k = 0, j = 1; j < 4; j++) //每一列都是有4个数
{
if (Bound[j][i] > 0) //这个里面j为时刻变化的 数组行, i为每一轮变化一次的数组的列(这里面注意体会s数组的i和j的循环和数组里面的区别)
{
if (Bound[j][i] == Bound[k][i]) //情况一:k == j && j >0
{
Score += Bound[k++][i] *= 2;
Bound[j][i] = 0;
RandNum_nFalge = 1;
}
else if (Bound[k][i] == 0) //情况二:k == 0 && j>0
{
Bound[k][i] = Bound[j][i];
Bound[j][i] = 0;
RandNum_nFalge = 1;
}
else //情况三:k != j &&j >0
{
Bound[++k][i] = Bound[j][i];
if (k != j)
{
Bound[j][i] = 0;
RandNum_nFalge = 1;
}
}
}
}
}
}
//下移动
void MoveDown()
{
for (int i = 0; i < 4; i++) //一共有4列
{
for (int k = 3, j = 2; j >= 0; j--) //每一列都是有4个数
{
if (Bound[j][i] > 0) //这个里面j为时刻变化的 数组行, i为每一轮变化一次的数组的列(这里面注意体会s数组的i和j的循环和数组里面的区别)
{
if (Bound[j][i] == Bound[k][i]) //情况一:k == j && j >0
{
Score += Bound[k--][i] *= 2;
Bound[j][i] = 0;
RandNum_nFalge = 1;
}
else if (Bound[k][i] == 0) //情况二:k == 0 && j>0
{
Bound[k][i] = Bound[j][i];
Bound[j][i] = 0;
RandNum_nFalge = 1;
}
else
没有合适的资源?快使用搜索试试~ 我知道了~
基于C语言实现2048小游戏【100010531】
共71个文件
tlog:18个
obj:7个
h:7个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 147 浏览量
2023-01-28
10:43:46
上传
评论
收藏 22.8MB ZIP 举报
温馨提示
详情介绍:https://www.yuque.com/sxbn/ks/100010531 游戏的规则很简单,你需要控制所有方块向同一个方向运动,两个相同数字的方块撞在一起之后合并成为他们的和,每次操作之后会在空白的方格处随机生成一个2或者4(生成2的概率要大一些),最终得到一个“2048”的方块就算胜利了。
资源推荐
资源详情
资源评论
收起资源包目录
100010531-基于C语言实现2048小游戏.zip (71个子文件)
2048
2048
stdafx.h 314B
fun.cpp 8KB
2048.vcxproj.filters 1KB
ReadMe.txt 1KB
2048.vcxproj 8KB
fun.h 562B
Debug
2048.tlog
CL.write.1.tlog 2KB
2048.lastbuildstate 214B
CL.command.1.tlog 2KB
link.command.1.tlog 2KB
link.read.1.tlog 3KB
link.write.1.tlog 824B
CL.read.1.tlog 34KB
2048.log 474B
fun.obj 26KB
stdafx.obj 58KB
vc140.idb 787KB
2048.obj 20KB
vc140.pdb 596KB
2048.pch 16.25MB
stdafx.cpp 274B
targetver.h 291B
2048.cpp 170B
FlappyBird
stdafx.h 269B
FlappyBird.cpp 5KB
FlappyBird.vcxproj 8KB
ReadMe.txt 1KB
FlappyBird.vcxproj.filters 1KB
Debug
FlappyBird.pch 3.25MB
FlappyBird.tlog
CL.write.1.tlog 1KB
FlappyBird.lastbuildstate 214B
CL.command.1.tlog 2KB
link.command.1.tlog 1KB
link.read.1.tlog 3KB
link.write.1.tlog 758B
CL.read.1.tlog 23KB
FlappyBird.log 204B
stdafx.obj 12KB
vc140.idb 555KB
FlappyBird.obj 40KB
vc140.pdb 228KB
stdafx.cpp 271B
targetver.h 288B
LICENSE 1KB
Young Game Project.VC.db 28.36MB
.vs
Young Game Project
v14
.suo 45KB
ipch
2048-85fb9e4b
2048-14fd285a.ipch 25.75MB
YOUNG GAME PROJECT-33404315
YOUNG GAME PROJECT-46bd800f.ipch 3.38MB
FLAPPYBIRD-285bcc69
FLAPPYBIRD-5b5a8e59.ipch 3.38MB
Young Game Project.sln 3KB
Young Game Project
stdafx.h 219B
Young Game Project.cpp 113B
Young Game Project.vcxproj.filters 1KB
ReadMe.txt 2KB
Young Game Project.vcxproj 8KB
Debug
Young Game Project.pch 3.25MB
Young Game Project.obj 3KB
stdafx.obj 12KB
vc140.idb 123KB
Young Ga.5F33D54F.tlog
CL.write.1.tlog 2KB
Young Game Project.lastbuildstate 214B
CL.command.1.tlog 2KB
link.command.1.tlog 2KB
link.read.1.tlog 3KB
link.write.1.tlog 854B
CL.read.1.tlog 5KB
vc140.pdb 140KB
Young Game Project.log 274B
stdafx.cpp 214B
targetver.h 232B
README.md 12KB
共 71 条
- 1
资源评论
神仙别闹
- 粉丝: 2687
- 资源: 7649
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功