[C入门 - 游戏编程系列] 序言篇

  记得学习C语言的时候,看着别人能写各种各样的小游戏和小软件,甚是羡慕。而自己,虽然说语法都会,但是真正上手写个几百行的代码,就显得力不从心。曾经一度很是郁闷,看过一些书,大都处于教语法的层面,有些涉及到软件设计,但是对于几百行代码都驾驭不了的我,看了也是等于白看,完全领悟不到设计中蕴含的哲学和精髓。

  所以,本来盘算着第一个月学完语法,第二个月写出自己所谓的“软件”的这个美好愿望,被无情的打破了。现实是,语法确实在一个月学完了,但是坑爹的是,除了在群里或者论坛中增加了一点谈论或者说冒充“大神”的资本,其它的一无所获。写不出好玩的贪吃蛇,也写不出经典的五子棋,更写不出装逼的小病毒。我只不过是个读过C语言程序设计这本经典著作的读者罢了。

  于是,一直几个月,沉浸在群里给比我更新的新手解答什么是数组,什么是指针,什么是结构体。想想那段日子,真的不堪回首。几个月的美好时间,如果用来写写代码,说不定都撸出几万行来了。而这期间,我却什么都没做,坦白的说,也做不出来,唯一的好处是,在群里讨论让我对C语言还保持着记忆犹新。

  后来的后来,虽然说不怎么写代码了,但是还是怀有着对编程的一股子激情,每天上上网站,看看新技术,上上论坛,看看别人发布的新代码 ,然后默默的评论“膜拜大神”。有时候看到简单一些的代码,就会燃起一种想要自己实现的冲动,于是像打了几斤鸡血一般,重拾C语言,彻夜写代码,写的天晕地暗。当然,最后还是没有实现出来。于是在某个寂寞的夜晚,我默默打开百度,搜索"如何动手写自己的小项目",“如何精通C语言”,“为什么会代码却写不出项目”等这类问题,看到了不少答案,总结起来就是一句话:代码写的少了!答案中很多人推荐看看开源项目,几千行的那种,于是我下载了几个,看了几天,发现还是看不懂。最后也只能作罢。

  既然看不懂别人的,又想提高C语言水平,我只好开始硬着头皮自己写了。这艰辛,这酸爽,想想就后怕。从哪里开始是个大问题,继续做题目,深入算法?这主意行的通,但是还是不足以让自己具有完整的软件开发体验。写软件?也行,不过功能弱的没有成就感,功能强大的就只有献上膝盖的份了,没有做那个的能力。于是,只能写写游戏,从这方面入手了。

  得益于小霸王,让我们体验了许多经典游戏。所以写起代码来对整体过程也能有个清晰的思路,这再好不过了。

  所以,我打算记录下整个编码过程。一则给自己留个纪念,二则,我相信很多人都和我一样,初学编程的时候,迷茫,不知道如何动手写东西。我记录下这些,如果有朝一日有和我一样迷茫的小伙伴看到了这一系列的学习笔记,能对你有所帮助,那就足够了。

  我不知道是否大多数人依然熟悉C语言,可能很多人现在都以学习当前的流行语言如Java、Python、PHP入门的,虽然这一系列笔记都使用C语言,但是对其它语言也能起到作用,毕竟重要的是编码思路和实现流程,而不是语言。

  另外,由于水平有限,所有的笔记都是以实现目的为目标,而不是关注性能、架构等这些听过没见过的事物。毕竟,不以实现目的的学习是很难让人记住的。

时间: 2024-11-05 17:23:28

[C入门 - 游戏编程系列] 序言篇的相关文章

[C入门 - 游戏编程系列] 环境篇

这一系列笔记的代码都是在Ubuntu 14.04下编码并测试的,原因无他,因为我笔记本电脑只装了一个Ubuntu系统,其中唯一使用的第三方库SDL也是开源并且跨平台的.所以即使你用的是Windows或Mac,也能运行所有的代码. 1. 安装SDL库及其扩展 Ubuntu: sudo apt-get install libsdl2-dev sudo apt-get install libsdl2-gfx-dev sudo apt-get install libsdl2-image-dev sudo

[C入门 - 游戏编程系列] 贪吃蛇篇(六) - 蛇实现

这一篇是关于设置蛇的属性的,接上一篇(五). 设置蛇的速度,很简单,只要不是负数就行了. void SNK_SetSnakeSpeed(Snake *snake, int speed) { if (snake != 0) snake->speed = SDL_abs(speed); } 设置蛇的方向有些复杂,玩过贪吃蛇的都知道,蛇向前移动时,它无法向后转弯:向左移动时,它无法向右转弯.所以,我也要做些这样的判断. void SNK_SetSnakeDirection(Snake *snake,

[C入门 - 游戏编程系列] 贪吃蛇篇(五) - 蛇实现

因为已经写了食物的实现,所以我不知道到底是该先写世界的实现还是蛇的实现.因为世界就是一个窗口,可以立刻在世界中看到食物的样子,对于大多数人来说,如果写完代码立刻就能看到效果,那就再好不过了.可是,我最后还是选择了先写蛇的实现这篇笔记.如果先写世界的实现,我就无法按照现在的思路完完整整的写下去,因为没有蛇,世界部分的代码就不完整,看完食物的效果后,我还是得写蛇的实现,然后又得修改世界部分的代码,来查看蛇的效果.反反复复,实在折腾不起.所以我打算把食物和蛇的实现都写完,最后统一看运行效果. 蛇和食物

[C入门 - 游戏编程系列] 贪吃蛇篇(三) - 蛇定义

蛇是这个游戏的主角,要实现的功能也是最复杂的一个.因为蛇不止有属性,还有行为.它会动,还会吃东西,还会长大!而且还会死!这是很要命的.我一向看不懂复杂的代码,也写不出复杂的代码.所以对于蛇,我很纠结,如何才能简单的实现它. 毫无质疑的一点是,食物具有的属性,蛇也具有.蛇必须存在于世界中,有大小和位置以及颜色.这样最起码可以推测出一个蛇的简单定义.但是这还远远不够,蛇是活的,它能动,就必须有速度和方向,它能吃,就必须能长大.所以,抛开其它的一切,它最简单的形式起码也得这样: typedef str

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

由于食物是贪吃蛇游戏中最简单的一部分,而且和其他部分关联性不强,基本上是一个独立的部分,所以我打算先实现它. 我的想法是食物必须在世界中才能被创造出来,也就是说,先有世界再有食物,所以我得先判断世界是否存在,存在的话才可以创建食物. Food * SNK_CreateFood(World *world, int size) { Food *food; if (world == 0) return 0; if ((food = (Food *)SDL_malloc(sizeof(Food))) =

[C入门 - 游戏编程系列] 贪吃蛇篇(二) - 食物定义

游戏中的食物没有那么多复杂属性,特别是贪吃蛇游戏中,我把食物看待的很简单: 1. 它必须属于世界,才能出现在世界.不可能一个不属于世界的食物,出现在世界中:但是可能存在着一个食物,它属于世界,但是却没有出现在世界中(即食物的颜色和世界的颜色相同,因此看不见食物).这就像鬼一样,它可能存在于这个世界上,但我们看不到它. 2. 一个属于世界的食物,具有在这个世界中的位置. 3. 它有颜色和大小. 因此,食物的结构体定义就显而易见了! typedef struct Food { World *worl

[高并发]Java高并发编程系列开山篇--线程实现

ava是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相同的内存空间进行并发读写操作.这可能是在单线程程序中从来不会遇到的问题.其中的一些错误也未必会在单CPU机器上出现,因为两个线程从来不会得到真正的并行执行.然而,更现代的计算机伴随着多核CPU的出现,也就意味着不同的线程能被不同的CPU核得到真正意义的并行执行. 那么,要开始Java并发之路,就要开始

游戏编程系列[1]--游戏编程中RPC协议的使用

RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据.在OSI网络通信模型中,RPC跨越了传输层和应用层.RPC使得开发包括网络分布式多程序在内的应用程序更加容易.RPC采用客户机/服务器模式.请求程序就是一个客户机,而服务提供程序就是一个服务器. 首先,客户机调用进程发送一个有进程参数的调用信息到服务进

PC游戏编程(入门篇)(前言写的很不错)

PC游戏编程(入门篇) 第一章 基石 1. 1 BOSS登场--GAF简介 第二章 2D图形程式初体验 2.l 饮水思源--第一个"游戏"程式 2.2 知其所以然一一2D图形学基础 2.3 进入图形世界的钥匙--GAFDDraw 2.4 2D图像的本质--图层表面 2.5 场景的秘密--背景卷动 2.6 诱惑--来自"精灵"的问候 2.7 餐后甜点--GAFApp/GAFDDraw的其他法宝 第三章 塞壬的歌声魔力和第三类接触 3.1 1,2,3--计算机音乐概述