由于食物是贪吃蛇游戏中最简单的一部分,而且和其他部分关联性不强,基本上是一个独立的部分,所以我打算先实现它。

我的想法是食物必须在世界中才能被创造出来,也就是说,先有世界再有食物,所以我得先判断世界是否存在,存在的话才可以创建食物。

Food * SNK_CreateFood(World *world, int size)
{Food *food;if (world == 0) return 0;if ((food = (Food *)SDL_malloc(sizeof(Food))) == 0) return 0;INIT_FOOD(world, size);return food;
}

对于指针变量,我总是显式地将它和数值比较,这有助于避免某些隐藏的错误。宏INIT_FOOD用来初始化Food结构体,在最后的完整源码中可以看到定义。

由于food是用SDL_malloc函数分配的,所以销毁食物只要释放内存就可以了。在C语言中,释放后的指针并不为零, 一个好的习惯是:每次释放指针后,显式的将指针置为零。我总是会遵循这个习惯,除非释放指针后程序也立刻退出,否则我总是将释放后的指针置为零。

void SNK_DestroyFood(Food *food)
{SDL_free(food);food = 0;
}

我对食物的美或丑没有任何概念,所以我这里所谓的食物仅仅只是一个矩形。在画食物这里可以有很多创意,画一个奇葩的食物可以令人耳目一新。不过我只力求简洁,意思到了就可以了。

void SNK_DrawFood(Food *food)
{SDL_Rect rect;if (food != 0){rect.x = food->x;rect.y = food->y;rect.w = rect.h = food->size;if (((food->world != 0) ? (food->world->render != 0) : 0)){SDL_SetRenderDrawColor(food->world->render,food->color.r, food->color.g,food->color.b, food->color.a);SDL_RenderDrawRect(food->world->render, &rect);}}
}

设置食物位置的函数定义的很简单,给一个食物和坐标就可以了。但是内部实现起来我还是做了一点判断和处理,为了保证两方面的可行性:1. 确保坐标是正数且在世界范围内。2. 食物坐标要为食物大小的整数倍。尽管不是整数倍也能行,不过我是打算将食物和蛇设置为相同大小的,如果不是整数倍,就会发生蛇还没吃完食物,食物就消失了的情况。

void SNK_SetFoodPosition(Food *food, int x, int y)
{if (((food != 0) ? (food->world != 0) : 0)){if (SDL_abs(x) > food->world->w)x = food->world->w;if (SDL_abs(y) > food->world->h)y = food->world->h;if (food->size != 0){food->x = (SDL_abs(x) / food->size) * food->size;food->y = (SDL_abs(y) / food->size) * food->size;}}
}

最后就是设置食物颜色了,这个很简单,依次赋值就行了。

void SNK_SetFoodColor(Food *food, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
{if (food != 0){food->color.r = r;food->color.g = g;food->color.b = b;food->color.a = a;}
}

以下是snk-food.c文件的完整内容:

#include "snk-food.h"#define INIT_FOOD(world, size)                                          \food->world = (world);                                              \food->x = food->y = 0;                                              \food->size = (size) ? SDL_abs(size) : 0;                            \food->color.r = food->color.g = food->color.b = food->color.a = 0;Food * SNK_CreateFood(World *world, int size)
{Food *food;if (world == 0) return 0;if ((food = (Food *)SDL_malloc(sizeof(Food))) == 0) return 0;INIT_FOOD(world, size);return food;
}void SNK_DestroyFood(Food *food)
{SDL_free(food);food = 0;
}void SNK_DrawFood(Food *food)
{SDL_Rect rect;if (food != 0){rect.x = food->x;rect.y = food->y;rect.w = rect.h = food->size;if (((food->world != 0) ? (food->world->render != 0) : 0)){SDL_SetRenderDrawColor(food->world->render,food->color.r, food->color.g,food->color.b, food->color.a);SDL_RenderDrawRect(food->world->render, &rect);}}
}void SNK_SetFoodPosition(Food *food, int x, int y)
{if (((food != 0) ? (food->world != 0) : 0)){if (SDL_abs(x) > food->world->w)x = food->world->w;if (SDL_abs(y) > food->world->h)y = food->world->h;if (food->size != 0){food->x = (SDL_abs(x) / food->size) * food->size;food->y = (SDL_abs(y) / food->size) * food->size;}}
}void SNK_SetFoodColor(Food *food, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
{if (food != 0){food->color.r = r;food->color.g = g;food->color.b = b;food->color.a = a;}
}

转载于:https://www.cnblogs.com/git-pizcai/p/4262533.html

[C入门 - 游戏编程系列] 贪吃蛇篇(四) - 食物实现相关推荐

  1. 用python自带的tkinter做游戏(一)—— 贪吃蛇 篇

    用python自带的tkinter做游戏(一)-- 贪吃蛇 篇 本人新手,刚自学python满半年,现分享下心得,希望各位老手能指点一二,也希望和我一样的新手能共勉,谢谢~ 大家都知道用python做 ...

  2. 学生学python编程---实现贪吃蛇小游戏+源码

    学生学python编程---实现贪吃蛇小游戏+源码 前言 主要设计 1.蛇的表示 2.蛇怎么移动? 3.玩家控制小蛇移动功能的实现 4.如何判定游戏结束? 应用知识点 1.python知识点 1.1 ...

  3. java gui怎么做游戏_Java GUI编程之贪吃蛇游戏简单实现方法【附demo源码下载】

    本文实例讲述了Java GUI编程之贪吃蛇游戏简单实现方法.分享给大家供大家参考,具体如下: 例子简单,界面简陋 请见谅 项目结构如下 Constant.jvava 代码如下: package sna ...

  4. c语言制作贪吃小白入门,小白入门——easyx界面版“贪吃蛇”的C语言实现(详细)...

    小白入门--easyx界面版"贪吃蛇"的C语言实现(详细) 作者:顽石 前言:C语言初学者都是在控制台上开发一些小游戏什么,由于没有界面(比如图片.音乐,不能做出拥有自己风格的程序 ...

  5. C语言贪吃蛇游戏代码,贪吃蛇C语言代码实现大全

    一.C语言贪吃蛇代码实现前言 设计贪吃蛇游戏的主要目的是让大家夯实C语言基础,训练编程思维,培养解决问题的思路,领略多姿多彩的C语言. 贪吃蛇是非常经典的一款游戏,本次我们模拟在控制台实现贪吃蛇游戏, ...

  6. laya游戏开发之贪吃蛇大作战(一)

    laya游戏开发之贪吃蛇大作战 一.背景 二.引擎选择 三.整体架构 3.1 玩法分析 3.2 游戏架构 3.3 技术选型 一.背景 需要快速实现一个贪吃蛇的 demo 以验证功能,非传统贪吃蛇玩法, ...

  7. laya游戏开发之贪吃蛇大作战(二)—— 贪吃蛇客户端

    文章目录 一 功能分析 二 实现方案 1. 代码结构 2. 关键函数实现 2.1 游戏主循环(GameLoop) 2.2 数据层(Model) 2.3 画面绘制层(View) 帧同步的困难与解决方法 ...

  8. 《Cocos Creator游戏实战》贪吃蛇平滑移动

    贪吃蛇平滑移动 贪吃蛇平滑移动 初始化蛇头和蛇身 调整蛇头方向 贪吃蛇移动 蛇头和蛇身的节点顺序 添加食物 添加碰撞逻辑代码 从pointsArray中剔除无用的坐标点(更新) 在本教程中我们重点来学 ...

  9. Win32 游戏开发:贪吃蛇 下篇

    因为个人原因更新来晚了,向各位关注的读者道个歉... 前排提示: 文章非常的长!!!(如有不懂的请在文章下方评论) 6)开始码代码啦 经过上面的前期工作,我们应该更清楚我们要做怎么做了(至少有一个方向 ...

最新文章

  1. Android 多语言
  2. POJ-2948 Martian Mining 动态规划
  3. 局部变量java6_java字节码-几种字符串局部变量用法的区别
  4. Node.js-中文分词【1】-node-segment
  5. 计算机词汇查询,计算机辅助英语词汇查询系统的设计.doc
  6. android播放html5视频,仅仅有声音没有图像视频
  7. 《南溪的目标检测学习笔记》——特征归一化(meadstd)
  8. python ** 运算符_Python语法基础(2)运算符
  9. Android dalvik GC相关的属性详解
  10. python抽荣耀水晶_大神代抽荣耀水晶,只需要49元,网友亲自体验,结果5分钟完成...
  11. php中字符串与数组的相互转化explode(separator,$str)与implode(separator,$arr)
  12. 和尚感谢你,要避开,这样才能求到福
  13. Atitit 通过调用gui接口杀掉360杀毒 360卫士  qq保镖等难以结束的进程(javac# php )
  14. 模二运算,模二加减乘除
  15. H5自适应简约浪漫婚礼邀请函HTML源码
  16. Linq的where语句中如果有两个条件以上的写法
  17. 计算机学win7画图,详解使用画图工具的win7中的操作步骤
  18. 208计算机领域,中医药大学-计算机基础208版-1-7次作业.doc
  19. stm32专题二十一:LCD显示原理
  20. 制药实验室信息管理系统(LIMS)

热门文章

  1. java 具有绘图能力的类,《Java程序设计》复习题_绘图
  2. python ddt mysql_Python数据驱动DDT的应用
  3. android 相机路径,android – 如何获取刚从相机捕获的图像路径
  4. django安装mysql驱动_django安装mysql驱动
  5. 更灵活的边缘云原生运维:OpenYurt 单元化部署新增 Patch 特性
  6. Kubernetes 稳定性保障手册 -- 极简版
  7. 深度解读 OpenYurt :边缘自治能力设计解析
  8. 加载顺序_JAVA类代码块和属性的加载顺序问题,不要以为静态块始终最先执行了!...
  9. 简书markdown支持html,简书上使用Markdown(超详细)
  10. session对象不创建会有吗_相亲对象木讷无聊,想找个不无趣的男人这么难吗?...