学习C/C++一个多月了,我们已经学习了c语言数据的基本类型、变量的输入输出、进制转换、运算符和分支结构、循环结构、数组、指针、函数和字符串结构体等等,在老师带着我们作出了一个贪吃蛇的过程中让我深刻的体会到了字符界面做游戏的快感,原来c语言如此强大,利用所学的基础居然可以实现这样精巧的功能。然后老师又介绍了一个2048的游戏,说这个游戏的实现比较有挑战,本来就对c语言憧憬的我对2048这个游戏充满了好奇,然后自己下载了一个2048的游戏玩了一下就开始实现自己的代码了,挑战了一下自己。

下面我会把实现这个游戏的思路以及相应的解决办法进行了总结,并提供自己的代码和详细注释。

1.设计目标

(1)界面显示

/  2   2   2  8/

/              /

/      2       /

/              /

/

(2)游戏操作

r   --->      开始游戏

q   --->      结束游戏

2   ---->     下移

4   ---->     左移

6   ---->     右移

8   ---->     上移

任意键 ->        重新开始

(3)游戏规则

按r键开始游戏,然后进行游戏,可以输入任意方向键进行操作;进行相应的平移操作,当两个相同的数字"相撞"则将它们两个数字合成一个是它们和的数字,当两个数字不同"相撞"则不进行合成;当所有格子满了并且无法进行移动的时则判断为输,当数字有一个出现2048的字样则判断为赢。

2.创新点

(1)可以改变游戏的胜利值(2048可以修改为1024等等)

(2)任何时刻都可以按住r重新开始游戏

(3)代码用一维数组代替二维数组,减少了遍历数组的时间复杂度

(4)操作方向的时候不需要输入回车,使用户得到更舒适的体验

(5)界面的刷新流畅

(6)屏蔽其他按键

3.对未来的展望

(1)修改成为图形界面并增加一些动画特效

(2)优化代码

4.重难点剖析

(1)如何利用2 4 6 8进行方向控制?

答:可以利用switch...case语句,当输入字符为2时调用下移函数,当输入字符为4时则调用左移函数等

(2)如何不输入回车就可以输入字符?

答:可以通过getch(),输入字符并且不用输入回车即可达到效果

(3)为什么地图数组用一维数组代替二维数组

答:由于每一帧画面都会要遍历该数组,使用一维数组可以方便的用一个循环就可以遍历数组

(4)怎么判断输

答:当数组中全部都被占用,并且每个数字的上下左右都没有与它相同的数字即为输

(5)怎么判断赢

答:遍历数组出现2048即为赢

(6)移动时内部数据怎么变化

答:由于上下左右比较类似,我就以左移做详细介绍,其他的可以类推。

分析左移代码

void MoveLeft()

{

int i = 0;

int tempmap[GAMERANGE ] = {0};

memcpy(tempmap,g_map,GAMERANGE *sizeof(int)); //拷贝移动的之前的数组

for (i; i < GAMERANGE ; ++i)

{

if (g_map[i])

{

MoveMostLeft(i);    //移动单个元素0~15

}

}

HandleState(tempmap,g_map,GAMERANGE );//处理游戏对应的状态,判断输赢并做处理

}

HandleState函数我就不多解释了, 主要是判断输赢并做处理的函数

下面主要看一下MoveMostLeft函数, 这个函数是将数组中的pos位置的元素移动

/*游戏地图单个坐标左移*/

void MoveMostLeft(int pos)

{

int i = pos - 1;  //i为pos左边的元素

while (i >= pos - pos % 4 && !g_map[i]) //i不出界 && i是空格

{

--i;

}

//此时的i指向的是刚刚出左边的界或者是pos左边的第一个数字

if (i < 0) //说明pos左边全为0              //i<0 说明左边全部是空格

{

g_map[i+1] = g_map[pos];          //将pos位置的数字赋值给最左边的数字

if (i+1 != pos) //排除i+1和pos位置一样,使得i+1的数值赋值为0

{

g_map[pos] = 0;

}

}

else        //说明pos左边有非0数字, 左边坐标为i  i指向的是左边第一个数字

{

if (g_map[i] == g_map[pos])         //判断pos位置的数字和左边第一个数字是不是相等的,如果是相等的话,i的位置的数字乘2,pos位置的值赋值为空格

{

g_map [i] = g_map[i] << 1;//如果i和pos数字相同,则将位置i的数值乘以2 <

g_map[pos] = 0;

}

else                   //如果pos位置的值不等于左边第一个数字的值则吧左边第一个数字的右边的一个空格修改为pos位置的值,然后修改pos位置的值为空格

{

g_map[i+1] = g_map[pos];

if (i+1 != pos)

{

g_map[pos] = 0;

}

}

}

}

上面主要是左移部分的代码已经详细解释, 右移,上移,下移都类似

5.总结

在刚刚写代码的时候感觉方向不明确,不知道如何下手,便写了一个左移函数后来发现其他方向类似,其他方向的代码基本上都是复制的左移代码,然后400多行的代码就出来了, 写出来之后感觉自己很有成就感,通过自己所学的东西完成了一个小小的项目,也算是对前面所学知识的一个综合性的运用。自己对项目的编写有了一定的体会, 先将整个项目分成一些小模块,然后在分开写代码,最后将代码整合出来一个项目,整个游戏就是这样出来了,当然一个项目的完成还会碰到一些问题,还了解了一些常见问题的解决办法。

2048界面优化c语言,好玩的2048小游戏,C语言的代码分享给你,快来练习吧!相关推荐

  1. C语言可以敲哪些小游戏,C语言可以写哪些小游戏?

    C语言可以写哪些小游戏? C语言可以编手机游戏.你叫他去死不过我这有贪吃蛇的代码,你倒可以看看(用TC编译一定过( #包括 #包括 #包括 #包括 #包括 #定义输入7181 #定义ESC 283 # ...

  2. 打砖块c语言编程,打砖块小游戏 C语言编写.txt.txt

    #include #include #include #include #include #define ESC 0x011b #define LEFT 0x4b00 #define RIGHT 0x ...

  3. 控制台推箱子小游戏C语言

    自己开发的C语言控制台推箱子小游戏,基于二维数组实现,功能不多但是游戏整体较为完整,因为技术有限,所以代码暂未优化且整体显得较为臃肿,整体架构简单,代码全自主设计编写,仅作交流学习,还望大佬多多指点. ...

  4. R语言入门——猜数小游戏

    R语言入门--猜数小游戏 题目介绍 使用代码(2种方法) 运行结果 题目介绍 设计一个猜数字的游戏:计算机随机生成一个1~100 之间的整数,然后由用户猜测所产生的随机数.根据用户猜测的情况给出不同提 ...

  5. 用C语言做一个迷宫小游戏

    用C语言做一个迷宫小游戏,以下是代码段 这个迷宫游戏使用了递归回溯算法来寻找通往出口的路径.迷宫中的墙用'#'表示,路径用空格表示,入口和出口分别用'S'和'E'表示,已走过的路径用'*'表示.在生成 ...

  6. 安卓c语言自动补全软件吾爱,C语言实现贪吃蛇小游戏

    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 一.程序实现的原理: 1.构造蛇身:定义一个坐标数组,存放的是蛇的每一节蛇身所在的坐标位置.这样就将移动蛇身的操作转换为 ...

  7. c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  8. C语言开发打气球小游戏

    C语言开发打气球小游戏 首先我们写一下项目所需要的头文件 #include<stdio.h>//标准输入输出头文件 #include<math.h>//数学库头文件 #incl ...

  9. 用C语言实现推箱子小游戏基础程序plus

    目录 设计一个简单的推箱子游戏 功能设计要求: 代码实现 数据定义头文件data_def.h 窗口设置头文件WindowsSet.h WindowsSet.cpp 上移函数 矩阵旋转函数 游戏帧 菜单 ...

  10. 【笔记】用vs2017 c语言写 贪吃蛇 小游戏

    目录 文章目录 前言 一.贪吃蛇游戏 设计逻辑 二.详细介绍 1.设置界面(界面大小,背景颜色) 2.设置贪吃蛇的身体并显示 3.使之能够移动并能够穿墙 4.添加食物并让蛇吃掉 5.设置背景音乐 完整 ...

最新文章

  1. 小学计算机课总目标,小学信息技术课堂教学目标的确定与实现
  2. python:argparse命令行解析模块详解
  3. POJ 1269 Intersecting Lines(求直线交点)
  4. MySql数据库中的子查询使用
  5. 计算机数据库管理基本知识,2015年计算机四级考试《数据库技术》基础知识:概念篇...
  6. java阅读题_java 练习题
  7. 根据经纬度算出两个位置之间的距离
  8. [2019杭电多校第五场][hdu6628]permutation 1
  9. 文本处理三剑客之gawk
  10. linux so替换,linux 热替换so文件
  11. 【JAVA】java获取项目地址或tomcat绝对地址
  12. PCB设计中如何进行统一批量检测并生成错误报告
  13. 花花世界花家姐 舒淇:花花世界花我不会倒追
  14. AR增强现实技术解读
  15. PHP 不同地图坐标系经纬度转换 GCj02 WGS84 BD-09
  16. 【Markdown笔记】数学公式 三角函数
  17. 华云数据董事长许广彬接受中央电视台采访:推动职业教育发展
  18. 《招聘一个靠谱的iOS》面试题参考答案
  19. 考研高数学习篇之从复习试卷03-07
  20. 计算机苏教版初一教案,苏教版七年级下册信息技术教案

热门文章

  1. python post json数据_Python POST Json数据到Http
  2. td不显示边框_FANUC Series 0i Mate-TD系统上电显示SP1241 (S)D/A变换器异常维修,FANUC主板SP1_维修中心...
  3. oftp-2协议服务器,科普:Oasis自研通信协议与互联网分层架构
  4. git stage 暂存_Git撤销暂存区stage中的内容
  5. c++ 重载 重写_Java | 深入理解方法调用的本质(含重载与重写区别)
  6. C语言入门经典读书笔记 ----第六章 字符串和文本的应用
  7. NGINX由入门到精通:Nginx介绍
  8. 书评与访谈:the Scrumban [R]Evolution
  9. Oracle控制文件的重建
  10. Winform分页控件之纯分页显示处理