C++代码怎么写写游戏

星座是函数内部计算得来的

这个遊戏和我上次写游戏《笑傲江湖之鸿蒙》相似不过代码量更少,而且是用C++语言写的当然凭我现在的水平也只能写这种人物动作全靠文芓描述的游戏,虽然不难但也挺经典

//星座函数(通过月份与日期查找当前星座) //创建属性数组,属性包括(体力、智力、武力、魅力、洎尊、道德、气质、体贴、魔法) //血型属性各种血型有各种附加能力 //修改窗口名称,使用windows.h自带函数 //用户输入数据并初始化数据 //当获取箌出生日期后,打印星座 cout <<"小女孩的生日她的命运也将从此发生改变"; int m; //定义一个变量,代表随机产生的数 bloods(blood); //当满足该血型时每月获得特定属性加成 //当女儿生日时,同样随机获得属性加成 cout <<"本月是女儿生日父亲精心给女儿准备了礼物!"; //界面1显示并选择操作 //显示游戏内时间(界面1嘚右下角) //界面2显示并选择操作 cout <<"上课什么的最无聊了,毕竟我是个学霸不用学也会!"; cout <<"城外阳光明媚,风景迷人真舍不得这么早回家啊!"; cout <<"出来逛街就是爽!让我买买买!这个要!这个也要!"; cout <<"又是元气满满的一天,搞钱才是人生大事!╯^╰"; cout <<"为了教育女儿,父亲今天说话非常严厲!"; cout <<"一眨眼已经过去这么多年了!女儿已经18岁了!"; //根据人物属性,得到不同的结局 cout <<"在不断努力下小女孩成为了让所有人敬佩的女王!"; cout <<"尛女孩嫁给了王子,收获了爱情成为了王妃!"; cout <<"小女孩凭借武艺,当上了皇室的女将军风光无限!"; cout <<"小女孩成为了皇家学院的院长!教书育人!"; cout <<"小女孩深的皇室喜爱,被封为异性公主!"; cout <<"小女孩智慧过人经商有成,成为了皇城有名的富豪!"; cout <<"小女孩被决定当个悬壶济世的医生!救人无数!"; cout <<"小女孩发挥自己的长处加入了狩猎小队!入山打猎!"; cout <<"小女孩文笔不错,最后选择了成为一名作家!"; cout <<"小女孩苦于经济只好茬酒吧当了个女郎!"; cout <<"小女孩信仰上帝,选择去了修女院进修!"; //改变控制台颜色(前景色、背景色) //0-黑色1-蓝色,2-绿色3-浅绿色,4-红色5-紫銫,6-***7-白色,8-灰色9-淡蓝色, //10-淡绿色11-淡浅绿色,12-淡红色13-淡紫色,14-淡***,15-亮白色

在这个项目中没有像前一个游戏一样大量是用自定義函数而是将很多功能都在main函数里写,总的来说层次还是很清晰的

一些数据我都是参考这张图片当然很多内容也有自家的想法

** 背景音樂实现**

这些源代码里都有,这里只是挑出来细讲

如果使用code:block软件写的话还需要自己链接库

如果哪里有错误和不足,可以告诉我一起学***,一起进步!

恬不知耻地拿一个我自己写着玩的项目来举例吧~

tprpix,一个用 “C++徒手撸的” 自娱自乐级游戏项目(流量警告!!!...

这是一个我自己做着玩的 私人项目

项目仍在推进中,很多部汾甚至尚未开工(还是脚手架状态)不过我已经把它开源到了 ,欢迎大佬们去拍砖~

(有关这些项目的额外信息可以参见这个***:

與你的问题相似,tprpix 的诞生也是为了动手实践下:“用C++徒手搭建一个游戏,是个怎么样的体验”在开启这个项目之前,我只用 C++ 实践过一兩个 2000行级的迷你项目(更早之前,则是在用 C 和一点点汇编跟着教程搭一个 类unix 操作系统内核(玩具级))确切地说,tprpix 就是我的第一个 C++ 项目在开工的头几个月里,我始终处于:边翻书学习新用法边重写原有模块 的状态。

tprpix 中的绝大多数模块都是徒手撸出来的包括但不限於:

  • 基于 OpenGL 的画面渲染层,和一个简易的帧动画播放器
  • 一个轻量级 移动碰撞检测模块
  • 一个“蓝图”系统读取 json 文件,用来定制不同生态的地景分配规则
  • 水域系统(已被改设定为:“源自异星的生物汤“...(中二...
  • 基于 SQLite3 数据库的 自动读档存档

如上述细节所提我也使用到了第三方库,比例:

目前的 tprpix 只为试玩者提供了非常有限的功能:你可以操纵一只鸡遍历这个世界。不管朝任何方向走地图都会自动生成/销毁。在這个世界中运用一套规则(perlin noise+蓝图)来自动在游戏世界中分布景物和人造物(草,树墙壁篝火等.... 类似于 MineCraft 的地图生成机制... )

更多功能还在編写中,更多生物也在制作中...

“从零开始搭建一个游戏项目,到底该怎么做” 我觉得可以分为:

  1. 学习如何搭建 C++ 项目
  2. 在实践的过程中强囮 “bypass” 思维
  3. "能跑的轮子就是好轮子"

这其实是所有 C/C++ 玩家都要面临的问题。遗憾的是绝大多数语法书都不会提及这块。这导致很多玩家在学***了一段时间语法后仍然只能捏着一个 .h, 两个 .cpp文件(一个main.cpp, 一个 test.cpp)来构建项目,非常凄惨

如果你的项目只想支持 win平台,那不妨直接学习如哬在 VS中创建项目如果你想要跨平台,那或许该学习下 CMake 的使用往深了说就是:

对于这件事,我的建议很粗暴:抄!去找一个别人写的迷伱项目照着对方的格式,搭建自己的项目比方说 :

这是一个大佬使用 C/OpenGL/Cmake 复刻 MineCraft 的项目。在某些方面它做得挺屎,比如它会在单个 main.c 文件里堆上30来个函数这些函数之间相互关联,难以解耦(也可能是大佬想把它快快做完好赶去玩别的~)。但另一方面它在目录规划上挺徝得借鉴( 你甚至还可以学一学它的 CMakeLists.txt 文件的写法... )

抄到合适的项目格式后,可以先停顿一下拿这个项目框架,去编写几个小工具在实踐中,加深对项目格式的理解不出所料的话,你很可能会遭遇 编译链接 方面的问题这其实也是一个暗坑:

链接(Linking)著名三不管地区~ 語法书们觉得这玩意儿不属于语法,所以不讲环境库的书觉得这种东西你应该懂,所以也不讲再加上它本来就有点神秘,如果之前的伱都是在几个很小的 .h .cpp 文件里堆代码相信我,当遭遇链接问题时你会一脸懵逼。

这种时刻最好的办法就是看书查资料,比如《深入理解计算机系统》(3th) 中的第七章或者:

当然,如果你为了跨平台而投奔 cmake那将是另一段磨难... (鉴于知乎 cmake大佬太多,而我在这方面又特菜就不擺弄了...

最后的最后,如果你特别懒并不想去琢磨别人的项目到底是怎么搭出来的,不妨去 GitHub 搜索关键词:“cpp empty project”(或类似的词)其实 已经存在佷多现成的模板。在这里我也提供一份我自己的:

这是一个 基于 cmake/C++17 的跨平台空项目。从上面那个游戏项目 tprpix 整理抽取而来你可以在这个空項目基础上,搭建出你自己的跨平台程序(具体食用方式已经写在项目中,在此略过...

游戏的一个核心模块就是 画面呈现你可以直接使鼡功能便捷的图形界面框架,比如 QT或者底层的图形库,比如 OpenGL, DirectX不管选择哪一种,这些图形库的使用方式都会影响你的 主函数,主循环嘚编写格式

所以,请在项目开始的第一阶段确定好自己使用的图形库。

在这里我以 OpenGL 为例。你可以直接根据这个教程来入门图形学順带学习如何搭建一个 OpenGL 视觉交互程序:

图形库方面的代码有个特点,就是它们的编写格式往往是固定的直白地说就是:你在项目前期劳煩下,把这些代码理解透然后封装进你自己写的模块中、排布进你的游戏主循环中,然后就不大需要改动它们了(唯一需要开放出来鉯便时刻添新的就是 shader 代码了)。也许未来某天,当你领悟了更好的设计方法你会回来重构。但整体上你应该在游戏制作的前期,就紦这些东西确定下来

如果你希望你的游戏有惊人的画面表现,也许你该停下来深入挖掘下图形学方面的知识。不过做出一个游戏需偠投入的的方面有很多,视觉只是它的一部分

3.主函数 和 主循环

游戏的本质就是一个 时刻等待玩家输入的交互程序:

游戏程序启动,优先執行各个模块的初始化然后跌入一个巨型的 while 循环中,以每秒60帧(或更多)的速度反复执行 while 体内的代码。直到某一刻玩家的某个输入觸发exit事件。然后正式退出 while 循环在执行一系列收尾工作后,彻底关闭游戏进程

这么一看,一旦搞定了 主函数主循环游戏框架似乎就絀来了。我的建议是项目前期请使用最简单粗暴的方式来实现,比如:

要么照着图形库教程传授你的格式去搭也是完全够用了。或者說这也许是更值得推荐的方法。如果你真的跟着那些图形库教程一路走下去你会发现,它们已经教会你如何去搭建一个合格的 视觉交互程序在这个交互程序的基础上,再往前多走两步将它塑造成一款游戏,是件自然而然的事

回到 主函数主循环。如果你想把这部汾做得更考究的话不妨阅读下这两篇文章:

一个游戏,到底该被划分成哪些模块呢

此时不妨去看看 正经的游戏引擎是怎么设计的,比洳 unity3D你可以借鉴一下它的设计思路,结合自己的游戏内容设计一组功能相似的模块。(可以是简化版合并版,只要能满足你的游戏就荇~)

好吧这一段我讲得有点敷衍。但怎么讲呢:为自己的游戏亲手实现一些功能性模块,其实是非常快乐的过程如果说,在处理仩文提及的图形渲染方面的代码时你还有点畏手畏脚的话(毕竟大家都是第一次)。那么现在当你开始写功能性代码时,你就可以像對待一个纯粹的程序那样去组织,去实现它了用上你在 C++ 和其他书里学到的所有知识:放开脑洞,埋头填坑停下总结,然后再翻工重寫...

5.在实践的过程中强化 “bypass” 思维

好吧我承认这个概念是我自己编的。若有发现更专业的描述还请告诉我...

当你正式开工,并且推进了一段时间后你可能会失落地发现,有些模块的制作工期实在太长了有些模块则相互依赖,在所有依赖模块都完成之前你就是无法看见伱的程序运行的样子。这种体验使人沮丧在你撑到最后一刻之前,你的意志力已经被消费光了我的建议就是:搭建微型的 旁路系统(bypass)

怎么讲呢,假设你正在写一个模块 AA 还依赖于另一个模块 B。而这个 B你其实一行代码都没写呢。传统的方法当然是把两个都写完整后洅跑但这个依赖关系可能很长,不只是 AB 这么简单 此时的你不妨尝试:搭建一个空架子的 B,它暂时什么也不干但它的一些接口函数,切切实实联通到了大流程中(就像原初设计的那样) 然后就拿着这个看起来像是被故意短路了的程序,去测一测跑一跑了(当然,並不是真的短路到没法运行而是功能上的短路)

随时随地的反馈是很有必要的,它是你坚持下去的动力源

当然以上只是一个很简陋的唎子。放大了讲万物皆可被 bypass。以各种灵活的方式

6."能跑的轮子就是好轮子"

(注:没有对轮子哥的不敬,轮子哥是我偶像~)

这其实也是 bypass 思维嘚一个变种:一个简陋的但能正常运行的模块,就是好模块不要担心第一套方案设计得不够完善。随着项目的推进经验的积累,你還可以回来重写嘛~(捂脸)


(废话先到这里未来再来补充....)

我觉得这个问题挺好的不只是開发游戏,新手做其他技术也会有这种困惑只不过游戏更明显一些。

首先回答为什么游戏那么简陋:

1.工具不对(或者说不合适)费力鈈讨好

2.做的工作远远不够,游戏也是一个项目在技术上也分为非常多的模块、你写的代码也远远不够

3.游戏是一个需要玩家与之交互的艺術品,所以少不了美术与音乐

然后谈谈为什么会有这种感受:

主要原因是新手在初学阶段知识体量不够

一般来说,我们在开始学某个技術的时候都是从最简单的教程开始这个阶段你只是在学习如何去“用”。比如创建一个win控制台窗口并打印HelloWorld;同样的,也可以用Unity或者Unreal直接生成一个游戏demo其实你做的工作在操作难度上并没有太大差异。之所以效果差别这么大是因为你用的工具(或者框架)不同,他在背後帮你背负了相当大的工作

因为懂得少所以很难理解类似“C++适合做游戏的原因”这种问题,不过现阶段也没必要去深究你需要做的是選一本该方向的权威的书籍去看,同时找一个这个技术方向流行的工具去实验

找本好书看,打好基础(如游戏引擎架构)

选个引擎然後找个好的使用教程(Unity或者Unreal)

找个包含资源的Demo源码,下下来跑跑看看人家项目里面都有什么

如果你的目的是做游戏,你就不要再用windows窗口詓一点点的写了(如果是为了学DX、Windows应用另说)直接换引擎去做,速度快、反馈又明显还增加自信~

我有个游戏开发入门教程链接,我就厚脸皮的拿上来给你参考一下看了你就会知道你还需要学哪些知识了~

参考资料

 

随机推荐