2048作为一个经典的小游戏,对于C语言的逻辑练习是一个比较好的案例了,看似很复杂,但是如果掌握了设计思路,那么就不会觉得难了,而且会了这个之后对今后编程的也会有很大的帮助。

先分析游戏逻辑,游戏其实很简单,一共16个格子,开局两个有数字的方块,2或者4,然后通过控制方向来使得原有的方块移动并且产生新的方块,

三种逻辑:

一种是方块移动的方向没有其他方块

一种是方块移动的方向已经有了方块,但是数字不一样

还有一种就是方块移动的方向已经有了方块,数字一样。

我认为代码其实就分为两个部分,一个是初始化,一个是移动过程。

初始化部分

初始化部分的话先建一个二维数组,存储16个方块的值,接下来分为两个步骤,生成第一个方块和生成第二个方块

生成第一个方块的话其实就很简单,0-15随机生成一个值,生成的值就代表第几个方块的值为2,其余值都为0

void set_value1()
{unsigned int i, j; int n,a;srand((unsigned int)time(0));//加入time,使得每次随机值都不一样    n = rand()%16;for(i = 0; i < 4; i++){for(j = 0; j < 4; j++){nub[i][j] = n == 0 ? 2 : 0;//如果n的值等于0,那么就给nub[i][j]值赋2,否则0n--;}}
}

那么第一个方块的值便给好了,但是问题来了,第二块方块的值你不能再用这种方法,因为如果生成的值一样,那么方块就重合了。而且不止是第二个方块的值不能这样生成,后续所有方块的值都不能这样生成。这个时候就必须使用另一种方法。

先获取16个格子空格的个数,也就是二维数组里面值为0的个数

int get_null_count()
{unsigned int i, j;unsigned int n = 0;for(i = 0; i < 4; i++){for(j = 0; j < 4; j++){if(nub[i][j] == 0)n++;}}return n;
}

获取了空格的个数就可以确定循环的次数,并且判断nub[i][j]的值,如果不等于0就说明有方块了,跳过,这里使用的是逻辑与,如果nub[i][j] == 0不成立的话便不会执行n--了,这样确保遍历每一个空格,需要注意的是根据游戏机制,2和4的生成概率是不一样的,所以通过生成随机值的方式来判断是生成2还是4,在0-10之间,如果随机值为0便生成2,否则生成4,这样生成2和4的概率便为10:1。

void set_value2()
{unsigned int i, j , n = 0;;srand((unsigned int)time(0));  n = rand()%get_null_count();for(i = 0; i < 4; i++){for(j = 0; j < 4; j++){if(nub[i][j] == 0 && n-- == 0){nub[i][j] = rand()%10 == 0 ? 4 : 2;}}}
}

至此,第一部分便完成了。

移动过程部分

移动过程其实就是通过输入方向来控制方块的移动,并产生新的方块。

先获取输入状态

void move()
{switch(key_in){case 1:move_left();break;case 2:move_up();break;case 3:move_right();break;case 4:move_down();break;default :break;}
}

接着具体来看移动的控制的逻辑,拿向左移动为例,首先还是遍历二维数组,找到每一个方块,由于我这里是向左移动,由于最左边的方块是不需要移动的,所以从每一行的第二个方块开始,先移动第二个方块,再第三个,第四个,依次移动,如果此方块左边没有方块,那么交换值,并且原来位置值清0,如果此方块左边的方块和此方块值相同,那么左边的值变为原来的2倍,原来位置值清0。如果左边的值和原来值不同,那么便不做处理,不移动。

void move_left()
{int i, j , k, n = 0;for(i = 0; i < 4; i++){for(j = 1; j < 4; j++){if(nub[i][j] > 0)//找到方块{for(k = j - 1; k > -1; k--)//根据位置判断最大移动次数,决定循环次数{if(nub[i][k] == 0)//如果左边没有方块{nub[i][k] = nub[i][k+1];nub[i][k+1] = 0;}else if(nub[i][k] == nub[i][k+1])//如果左边的方块等于这个方块的值{nub[i][k] = nub[i][k+1]*2;nub[i][k+1] = 0;}}           }}}
}

明白向左移动的逻辑后,其他的方向也是这个道理

void move_left()
{int i, j , k, n = 0;for(i = 0; i < 4; i++){for(j = 1; j < 4; j++){if(nub[i][j] > 0){for(k = j - 1; k > -1; k--){if(nub[i][k] == 0){nub[i][k] = nub[i][k+1];nub[i][k+1] = 0;}else if(nub[i][k] == nub[i][k+1]){nub[i][k] = nub[i][k+1]*2;nub[i][k+1] = 0;}}            }}}
}
void move_up()
{int i, j , k, n = 0;for(i = 1; i < 4; i++){for(j = 0; j < 4; j++){if(nub[i][j] > 0){for(k = i - 1; k > -1; k--){if(nub[k][j] == 0){nub[k][j] = nub[k+1][j];nub[k+1][j] = 0;}else if(nub[k][j] == nub[k+1][j]){nub[k][j] = nub[k+1][j] * 2;nub[k+1][j] = 0;}}          }}}
}
void move_right()
{int i, j , k, n = 0;for(i = 0; i < 4; i++){for(j = 2; j > -1; j--){if(nub[i][j] > 0){for(k = j + 1; k < 4; k++){if(nub[i][k] == 0){nub[i][k] = nub[i][k-1];nub[i][k-1] = 0;}else if(nub[i][k] == nub[i][k-1]){nub[i][k] = nub[i][k-1]*2;nub[i][k-1] = 0;}}            }}}
}
void move_down()
{int i, j , k, n = 0;for(i = 2; i > -1; i--){for(j = 0; j < 4; j++){if(nub[i][j] > 0){for(k = i + 1; k < 4; k++){if(nub[k][j] == 0){nub[k][j] = nub[k-1][j];nub[k-1][j] = 0;}else if(nub[k][j] == nub[k-1][j]){nub[k][j] = nub[k-1][j] * 2;nub[k-1][j] = 0;}}          }}}
}

最后在每次移动过后再生成一个新的方块,至此,移动过程部分也完成了,整个游戏大致框架便完成了。

由于开发平台不一致,剩下的细节可能不太一样,但是只要能明白这个思路,那么便能很快的完成这个游戏,希望这篇文章能对大家有所帮助。

小游戏2048设计思路超简单相关推荐

  1. 扫雷小游戏的设计思路以及实现的细致讲解

    大家好,今天博主来介绍扫雷小游戏的设计思路以及实现,会很细致的呦,喜欢的话还请给个三连吧! 目录 设计思路 一,基础框架 二,基础框架的填充和完善 代码实现 一,初始化函数 二,埋雷函数 三,展示雷区 ...

  2. 【三子棋小游戏的设计思路以及代码实现】

    目录 一,设计思路 二, 代码实现 首先,欢迎各位点进我的文章.话不多说,正如标题一样,接下来,我来给大家讲解三子棋小游戏的设计思路以及代码实现.            一,设计思路 一. 大家应该都 ...

  3. 微信小程序(游戏)----拼图游戏(设计思路)

    微信小程序(游戏)----拼图游戏(设计思路) 设计思路 1.将一张海报等分成 N*N 的矩阵 方法一:利用两个组件循环完成,view组件和image组件,view组件作为盒子规定大小--超出部分不显 ...

  4. [原创]雷电小游戏app设计

    [原创]雷电小游戏app设计 相信雷电是很多人的童年回忆,本文就尝试用android studio做一个简单的雷电小游戏. 游戏界面如下: 项目结构如下: 设计思路: 游戏机制设计 游戏目前的场景比较 ...

  5. C++/QT 贪吃蛇小游戏 界面设计

    C++/QT 贪吃蛇小游戏 界面设计 前言:本文所写的贪吃蛇是笔者初学QT练手的小项目,做出来的界面较为粗糙.由于很久没有接触C++,程序中类封装的不是很规范.写这篇文章,权当是记录生活了,手动狗头. ...

  6. 用C语言实现扫雷小游戏(附上思路+项目展示+源代码)

    文章目录 前言 一.扫雷小游戏整体思路讲解. 二.game.c各游戏功能函数的讲解 1.InitBoard 初始化数组函数讲解 2.DisplayBoard 打印格子函数讲解 3.Setmine 电脑 ...

  7. html+css+javascript实现小游戏2048(详解,附源代码)

    html+css+javascript实现小游戏2048(详解,附源代码) 1.上下左右的移动原理相同,这里只详细说明向上移动的方法 2.这里的上下左右由wasd四个键控制 3-小方块空的意思就是没数 ...

  8. c语言课时设计猜坐标游戏,c语言小游戏课程设计报告.docx

    c语言小游戏课程设计报告 中国地质大学 本科生课程论文封面 课程名称c语言课程设计 教师姓名陈喆老师 本科生姓名周宜诺 本科生学号XX 本科生专业土地资源管理 所在院系公共管理学院 类别: 日期: 课 ...

  9. 微信小游戏的设计和开发

    微信平台不但承载了聊天相关的基础属性,同时也有公众号的媒体属性.小程序的工具属性和支付的金融属性,是一个大而全的平台.因此越来越多的开发者基于小程序进行游戏开发,简单易用,支付方便,也是游戏开发者一个 ...

最新文章

  1. ONNX MLIR方法
  2. redis del清除缓存java_删除redis缓存报错
  3. IntentService详解
  4. 排序算法-07归并排序(python实现)
  5. hdu5692 Snacks dfs序+线段树
  6. java 观察者模式_重学 Java 设计模式:实战观察者模式「模拟类似小客车指标摇号过程,监听消息通知用户中签场景」...
  7. String字符串工具类 StringUtils.java
  8. Hessian学习总结(二)——使用hessian上传文件
  9. python 局域网通信_python实现局域网内实时通信代码
  10. Jmeter高阶学习,运用NotePad++编写工程,随意复制多个工程到同一个工程
  11. 好用的Windows屏幕取色器 ColorWanted
  12. 去除暴风影音2009广告的方法!
  13. 数理统计 —— 总体、样本、统计量及其分布
  14. python 实现dcmtk关联pacs功能 推送下拉影像
  15. Recorder.js HTML5+JS实现网页录音
  16. 向flume发送消息出现Client sent event exceeding the maximum length
  17. python使用www.ip138.com作为解析对象 获取公网ip及ip所属地区
  18. go html桌面,用 Go 开发桌面应用程序(GUI):Webview、Lorca 与 Electron
  19. 26、流程引擎API
  20. js两种拼接字符串方法

热门文章

  1. Scrapy中间件的使用-爬取豆瓣top250/PM2.5历史数据
  2. 用四个元件,轻松做一个升压电路
  3. FOC中电流环调试的宝贵经验总结
  4. IP地理地址库geoip2用法
  5. JavaScript unescape() 函数
  6. 介绍一种新的群智能算法---黏菌算法
  7. 新书推荐——华为·无线局域网应用技术(微课版丨第2版)
  8. PDM编码的软件实现
  9. 用 20 行 python 代码实现人脸识别!
  10. idea打开文件关联目录