C语言项目实战:《2048》零基础项目!208 行源代码示例
bigegpt 2024-10-31 12:18 4 浏览
这篇文章主要为大家详细介绍了C语言实现——《2048项目》文中示例代码介绍得非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!
游戏介绍:
《2048》一款益智小游戏,游戏的规则十分简单,是一款简单易上手的数字小游戏。游戏的规则很简单,你需要控制所有方块向同一个方向运动,两个相同数字方块撞在一起之后合并成为他们的和,每次操作之后会随机生成一个2或者4,最终得到一个“2048”的方块就算胜利了!
玩法简单,容易上手!所以这也成为了我们编程学习者C语言练习的一个非常好的小项目,如果你没有玩过的话那么可以先去玩一下的,会玩的话对于项目逻辑的理解也是非常有帮助的!接下来就让我们一起来看看吧!
插件:图形库插件easyX,涉及图片素材可以自行百度找也可以关注文末领取;
效果图展示:
配套讲解教程:2048游戏教程——哔哩哔哩
源代码示例:
#include<stdio.h>
#include<time.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>//需要安装之后,才有这个头文件
#define MAX_GRID 4 //每行格子数
#define GRID_WIDTH 100 //格子宽度
#define INTERVAL 15 //间隔
#define WIN_SIZE (5*INTERVAL+MAX_GRID*GRID_WIDTH)//窗口大小
enum Color //枚举格子颜色
{
zero = RGB(205, 193, 180), //0的颜色
twoTo1 = RGB(238, 228, 218), //2的颜色
twoTo2 = RGB(237, 224, 200), //4的颜色
twoTo3 = RGB(242, 177, 121), //8的颜色
twoTo4 = RGB(245, 149, 99), //16的颜色
twoTo5 = RGB(246, 124, 95), //32的颜色
twoTo6 = RGB(246, 94, 59), //64的颜色
twoTo7 = RGB(242, 177, 121), //128的颜色
twoTo8 = RGB(237, 204, 97), //256的颜色
twoTo9 = RGB(255, 0, 128), //512的颜色
twoTo10 = RGB(145, 0, 72), //1024的颜色
twoTo11 = RGB(242, 17, 158), //2048的颜色
back = RGB(187, 173, 160), //背景颜色
};
Color arr[13] = { zero, twoTo1, twoTo2, twoTo3, twoTo4, twoTo5, twoTo6, twoTo7, twoTo8, twoTo9, twoTo10, twoTo11, back };
//数据 二维数组
int map[MAX_GRID][MAX_GRID];
int createNum()
{
int num = 0;
if (rand() % 10 == 0)
{
num = 4;
}
else
{
num = 2;
}
return num;
}
void gameInit()
{
srand((unsigned)time(NULL));
//随机在空白的位置产生两个整数
for (int i = 0; i < 5; )
{
//随机数 rand() 随机获得一个整数 0~上万
int r = rand() % MAX_GRID; //0~3
int c = rand() % MAX_GRID; //0~3
if (map[r][c] == 0)
{
map[r][c] = createNum();
i++;
}
}
}
void gameDraw()
{
//绘制界面,设置背景颜色 187,173,160 三原色 set background color
setbkcolor(RGB(187, 173, 160));
//设置颜色之后需要,清屏(原本的颜色是黑色的,设置的颜色,被覆盖了)
cleardevice();//清楚绘图设备
for (int i = 0; i < MAX_GRID; i++)//->y
{
for (int k = 0; k < MAX_GRID; k++)//->x
{
//00 01 02 03
//10 11 12 13
//求出每一个格子的x,y
int x = k*GRID_WIDTH + INTERVAL*(k + 1);
int y = i*GRID_WIDTH + INTERVAL*(i + 1);
//4->2
//32->5
//2^n=map[i][k]; ->log2map[i][k]=n;
int index = (int)log2((float)map[i][k]);
setfillcolor(arr[index]);
//画矩形:空心矩形,填充矩形,实心矩形,圆角矩形
//solidrectangle(x, y, x + GRID_WIDTH, y + GRID_WIDTH);
solidroundrect(x, y, x + GRID_WIDTH, y + GRID_WIDTH, 15, 15);
if (map[i][k] != 0)
{
//绘制数字
//printf("%d", map[i][k]);//输出到控制台窗口
//设置文字大小
settextstyle(50, 0, "黑体");
settextcolor(RGB(163, 73, 164));
setbkmode(TRANSPARENT);//设置文字背景为透明
//把数字转成字符串 格式化字符串
char str[10] = "";
sprintf(str, "%d", map[i][k]);
//为了文字居中在格子中间
int textx = textwidth(str) / 2;
int texty = textheight(str) / 2;
int win = GRID_WIDTH / 2; //格子宽度一半
outtextxy(x + win - textx, y + win - texty, str);
}
}
}
}
void moveup()
{
for (int i = 0; i < MAX_GRID; i++)
{
int temp = 0;
for (int begin = 1; begin < MAX_GRID; begin++)
{
if (map[begin][0] != 0)
{
if (map[temp][i] == 0)
{
map[temp][i] = map[begin][i];
map[begin][i] = 0;
}
else if (map[temp][i] == map[begin][i])
{
map[temp][i] += map[begin][i];
map[begin][i] = 0;
temp++;
}
else
{
map[temp+1][i] = map[begin][i];
if (temp + 1 != begin)
{
map[begin][i] = 0;
}
temp++;
}
}
}
}
}
void moveDown()
{
for (int i = 0; i < MAX_GRID; i++)
{
int temp = MAX_GRID-1;
for (int begin = MAX_GRID-2; begin >=0; begin--)
{
if (map[begin][0] != 0)
{
if (map[temp][i] == 0)
{
map[temp][i] = map[begin][i];
map[begin][i] = 0;
}
else if (map[temp][i] == map[begin][i])
{
map[temp][i] += map[begin][i];
map[begin][i] = 0;
temp--;
}
else
{
map[temp - 1][i] = map[begin][i];
if (temp - 1 != begin)
{
map[begin][i] = 0;
}
temp--;
}
}
}
}
}
//获取键盘按键 _getch(),它不需要按回车确认输入
void keyControl()
{
switch (_getch())
{
case 'w':
case 'W':
case 72:
moveup();
break;
case 's':
case 'S':
case 80:
moveDown();
break;
case 'a':
case 'A':
case 75:
break;
case 'd':
case 'D':
case 77:
break;
}
printf("key\n");
}
int main()
{
//不要控制台窗口,我要图形窗口 easyx
initgraph(WIN_SIZE,WIN_SIZE,SHOWCONSOLE);//第一个参数是宽度,二个高度
gameInit();
while (1)
{
gameDraw();
keyControl();
}
return 0;
}
未完成的数字部分代码,大家也可以自己先去想想试试,每一次的思考就是你进步的过程!
如果学习的过程中有什么问题,以及本项目有什么不懂的地方,都可以来找我交流,我来帮你!
那么今天的分享就到这里了,后续会更新更多精彩项目或者知识内容的,大家要好好学C语言C++哟~
写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好地提升你的编程核心能力(内功)不妨从现在开始!
编程学习书籍分享:
编程学习视频分享:
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!
相关推荐
- 悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)
-
新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...
- 高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源
-
凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...
- 微服务架构实战:商家管理后台与sso设计,SSO客户端设计
-
SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...
- 还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑
-
在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...
- Seata源码—6.Seata AT模式的数据源代理二
-
大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...
- 30分钟了解K8S(30分钟了解微积分)
-
微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...
- SpringBoot条件化配置(@Conditional)全面解析与实战指南
-
一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...
- 一招解决所有依赖冲突(克服依赖)
-
背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...
- 你读过Mybatis的源码?说说它用到了几种设计模式
-
学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...
- golang对接阿里云私有Bucket上传图片、授权访问图片
-
1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...
- spring中的资源的加载(spring加载原理)
-
最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...
- Android资源使用(android资源文件)
-
Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...
- 如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)
-
深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...
- @Autowired与@Resource原理知识点详解
-
springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...
- java的redis连接工具篇(java redis client)
-
在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)