[C入门 - 游戏编程系列] 贪吃蛇篇(一) - 世界定义
每个游戏都有一个很明确的目的或者说游戏主题,贪吃蛇的目的很明确:蛇找到并吃掉食物。只有目的是很无聊的,算不上一个好游戏。所以设计者增加了创意:1. 吃掉食物后蛇会增长;2. 吃掉食物后分数会增加。有些还可以增加速度,增加障碍物等,不过我不打算实现这些,我的目的也很明确,实现创意1和2。
仔细分析一下,贪吃蛇游戏其实只涉及三个元素:蛇,食物,界面。这里,便记录下和界面有关的想法和代码。
一. 世界定义
我把游戏中和界面相关的部分统称为世界,蛇和食物都可以属于世界,但是世界却不一定有蛇和食物。就像生活中,学校里可以有学生,也可以没有学生,因为放假了嘛!但是学生既然被称作学生,他就一定属于某个学校。所以世界只含有世界特有的事物,有没有蛇,有没有食物,它都在那里。
因此,我得出世界的定义:
typedef struct World {
int w, h;
SDL_Window *window;
SDL_Renderer *render;
} World;
w、h用于描述世界的大小。
render用于绘制世界中的任何事物。
window用于表示一个具体的世界,即眼睛可以看到的真实存在的世界,而单纯的World是抽象的。
二. 世界方法
作为游戏的设计者,由我们决定着如何创建、改变以及销毁世界,我要让它有光,它就得有光,让它毁灭,它就得毁灭。因此如果描述我们的想法作为函数, 那么贪吃蛇游戏的世界就必须有以下三个函数:
extern World * SNK_CreateWorld(const char *name, int w, int h);
extern void SNK_DestroyWorld(World *world); extern void SNK_ShowWorld(World *world);
有了这些,我们就能操控世界了。至于世界中有什么,管它呢!毁灭了世界,一切都得消失!
下面给出完整的头文件snk-world.h中的内容:
#ifndef SNK_WORLD_H_HEADER
#define SNK_WORLD_H_HEADER #include <SDL2/SDL.h> typedef struct World {
int w, h;
SDL_Window *window;
SDL_Renderer *render;
} World; extern World * SNK_CreateWorld(const char *name, int w, int h);
extern void SNK_DestroyWorld(World *world); extern void SNK_ShowWorld(World *world); #endif
[C入门 - 游戏编程系列] 贪吃蛇篇(一) - 世界定义的更多相关文章
- [C入门 - 游戏编程系列] 贪吃蛇篇(二) - 食物定义
游戏中的食物没有那么多复杂属性,特别是贪吃蛇游戏中,我把食物看待的很简单: 1. 它必须属于世界,才能出现在世界.不可能一个不属于世界的食物,出现在世界中:但是可能存在着一个食物,它属于世界,但是却没 ...
- [C入门 - 游戏编程系列] 贪吃蛇篇(六) - 蛇实现
这一篇是关于设置蛇的属性的,接上一篇(五). 设置蛇的速度,很简单,只要不是负数就行了. void SNK_SetSnakeSpeed(Snake *snake, int speed) { ) sna ...
- [C入门 - 游戏编程系列] 贪吃蛇篇(四) - 食物实现
由于食物是贪吃蛇游戏中最简单的一部分,而且和其他部分关联性不强,基本上是一个独立的部分,所以我打算先实现它. 我的想法是食物必须在世界中才能被创造出来,也就是说,先有世界再有食物,所以我得先判断世界是 ...
- [C入门 - 游戏编程系列] 贪吃蛇篇(三) - 蛇定义
蛇是这个游戏的主角,要实现的功能也是最复杂的一个.因为蛇不止有属性,还有行为.它会动,还会吃东西,还会长大!而且还会死!这是很要命的.我一向看不懂复杂的代码,也写不出复杂的代码.所以对于蛇,我很纠结, ...
- [C入门 - 游戏编程系列] 贪吃蛇篇(五) - 蛇实现
因为已经写了食物的实现,所以我不知道到底是该先写世界的实现还是蛇的实现.因为世界就是一个窗口,可以立刻在世界中看到食物的样子,对于大多数人来说,如果写完代码立刻就能看到效果,那就再好不过了.可是,我最 ...
- [C入门 - 游戏编程系列] 序言篇
记得学习C语言的时候,看着别人能写各种各样的小游戏和小软件,甚是羡慕.而自己,虽然说语法都会,但是真正上手写个几百行的代码,就显得力不从心.曾经一度很是郁闷,看过一些书,大都处于教语法的层面,有些涉及 ...
- [C入门 - 游戏编程系列] 环境篇
这一系列笔记的代码都是在Ubuntu 14.04下编码并测试的,原因无他,因为我笔记本电脑只装了一个Ubuntu系统,其中唯一使用的第三方库SDL也是开源并且跨平台的.所以即使你用的是Windows或 ...
- Love2D游戏引擎制作贪吃蛇游戏
代码地址如下:http://www.demodashi.com/demo/15051.html Love2D游戏引擎制作贪吃蛇游戏 内附有linux下的makefile,windows下的生成方法请查 ...
- 控制台游戏引擎CGE——贪吃蛇
今天我也来发一个控制台游戏.先看图: 缘起 LZ是一个有严重拖延症的人,表现的形式就是隔一段时间就要刷一刷博客园. 这不前几天,看到了魏大师<使用Lua脚本语言开发出高扩展性的系统...> ...
随机推荐
- Labeling Balls--poj3687
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12273 Accepted: 3516 D ...
- js 非IE火狐插件检测
js检测代码Html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// ...
- 配置Kestrel 网址Urls
配置Kestrel 网址Urls ASP.NET Core中如何配置Kestrel Urls呢,大家可能都知道使用UseUrls() 方法来配置. 今天给介绍全面的ASP.NET Core 配置 Ur ...
- Jasper_chart_create a new stacked chart
How to make a stacked chart 1, prepare data Source here we will create a csv file. 2, import/configu ...
- 《Programming WPF》翻译 第6章 3.二进制资源
原文:<Programming WPF>翻译 第6章 3.二进制资源 尽管ResourceDictionary和系统级别的资源适合于作为数据存在于对象中,然而,并不是所有的资源都能很好的满 ...
- 在CentOS上安装FFMPEG和Gstream-ffmpeg
当我们用CentOS7自带的源时,是yum search不到标题上述的两个相关的包的,而opencv需要用到FFmpeg读取视频文件.这就必须安装了. 可以参考FFMPEG官方给出的文档: http: ...
- 地址重写--Java中urlrewriter的使用
最近公司以前的一个项目需要升级改版,其中的一个模块是使用Struts2做的不需要改动,但是需要将其从之前的项目里面剥离出来,看了看官网,发现所有的链接访问的静态地址,以为是FreeMarker实现的, ...
- mysql导入到elasticsearch
JDBC importer for Elasticsearch Java Database 连接(JDBC) 导入运行获取数据从JDBC 源 安装: 1.在下面的步骤 替换<version> ...
- C++模板 静态成员 定义(实例化)
问一个问题: 考虑一个模板: template <typename T> class Test{ public: static std::string info; }; 对于下面若干种定义 ...
- java编程排错技巧
一.Eclipse提示错误The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from re ...