神操作!一行Python代码搞定一款游戏?给力
来源:pypl编程榜
一直以来Python长期霸占编程语言排行榜前三位,其简洁,功能强大的特性使越来越多的小伙伴开始学习Python 。甚至K12的同学都开始学习Python 编程。新手入门的时候趣味性其实最重要的。那么一行Python 代码到底能玩出什么花样,有什么趣味的游戏用一行代码就能搞定了,快来跟着小编一起大开眼界。
一行代码能干啥?这一款的迷宫游戏厉害了
迷宫游戏,不知道大家有没有玩过,以前非常风靡,各种大小的迷宫设计,尤其是Web版的迷宫早些年的时候非常流行,但是Python一行代码就能搞定,真的是酷毙了!
来看一下效果:
(盯住看5秒)
代码非常非常的简洁,用短单线创建无限迷宫,虽然跟真正的迷宫比还差一些,但是也算是有点感觉了。算法其实很好理解,用一个while来无限循环,整个程序设计的亮点就在虽然 import 语句在循环内移动,但是Python 并不需要每次重新导入它。代码从迷宫绘图字符之一中选取一个随机字符并进行刷屏打印。
所以Python的火不无道理,不仅简单易学,节约工作效率,重点程序员就业状况也非常可观,下面用一张图来一窥究竟:
此时此刻
Python的内心:
Python爆红的原因是?
在GitHub 2018年度报告中,Python超越Java成第一受欢迎语言。所有这些“刷榜”,都离不开最近人工智能尤其是机器学习的火热。Python被誉为最好人工智能的语言,因为:
-
在数据科学和AI中占据主导地位;
-
拥有优质的文档和丰富的库,对于科学用途的广泛编程任务都很有用;
-
设计非常好,快速,坚固,可移植,可扩展;
-
开源,而且拥有一个健康、活跃、支持度高的社区。
-
有一些很棒的公司赞助商,YouTube、谷歌、Yahoo!NASA都在内部大量地使用Python,尤其是谷歌;Facebook开源PyTorch后也更有利于Python的推广
现在,Python 的这把火已经烧到了程序员的圈子外。所以,你想学了Python了?准备好如何学习 了吗?这里推荐大家来了解一下CSDN开设的《Python闯关特训营》,这是一个能够带你玩转Python全栈的学习路径~
划重点:送你Python试学课,这些内容足够你自测难易度,同时能与Python老师实时沟通,他将解答你疑问!
领取Python试学课+课程咨询CSDN学院推出「Python闯关特训营」,就是为了让更多转型的学习者可以学习到Python的全栈内容,从容应对职场考验,在工作中实际应用。本套课程Python+人工智能分为六大模块,分别是Python基础、Python全栈、Python爬虫、数据分析、机器学习与机器学习项目实战模块。
采用录播课与直播课结合的方式,并配合助教答 疑、进度追踪、作业辅导等服务,激发学员的学习热情,并为学员的学习进度保驾护航。 以市场就业为导向,通过企业真实项目驱动,无缝对接就业出口,帮助学员在短时间学习有价值 的知识、快速提升技能。
CSDN实训营更注重培养扎实的基础理论和项目实战,学成之时,更有知名企业推荐就业机会。
领取Python试学课+课程咨询
为什么选择CSDN学院?
相比于其他学习班,CSDN学院有着自己的服务体系和课程质量管理,因为学习任何一种编程语言,都需要专业的导师、科学的课程、实战演练项目和学习辅导,这不仅能节省大量时间,还能保证不会半途而废:
游戏编程入门指南
游戏代码也写了几年, 有时候在想如果现在给刚入行的自己一点建议也许能有一点帮助。
所以这篇日志主要是分享一下自己对于游戏编程入门的一些想法。
这篇文章由爱发电支持写作, 如果你喜欢我做的事情,可以考虑在那里支持我。
语言的选择
在一开始更多是推荐从高级语言入门,比如 Java、C#、lua、python,javascript。在这个时期可以配合一些游戏引擎来学习,如果你是因为喜欢游戏才学习编程的可能不喜欢老是 print 一些文字,可能更喜欢输出图片。
可以直接从对应语言的游戏引擎开始做几个小 Demo 了解一下游戏构造,但是游戏引擎有个弊端就是 API 太多入门有点难……
游戏引擎的优点是做游戏会比较快,但是引擎整体还是略庞大,不适合学习代码之用。
之后可以使用 pico-8、love2d、pygame、SDL 或者直接 javascript 操作 canvas 画布来制作尝试制作游戏挑战自己编程能力。
而 C 语言(包含 C++)可以放在后续研究,研究 C 语言可以对语言底层点的东西理解。像指针可以让你直接访问内存,这在其他语言中是很少见。可能一般感受不出来它的力量,但当你面对资源紧张的系统(需要手动内存管理),比如 GBA 和 NDS 上面的编程时候就绕不开 C 语言甚至汇编语言了。
一定要多动手
我在没学习编程之前是个爱看书的小青年。所以在我刚开始学习写代码时候常常就一直看书没有实践,有些东西看似懂了,实际还是要上手操作才能掌握透彻。
在着手写代码时候最好是带着问题去学习,编程其实就是把复杂问题分解。比如在制作一个小 Demo 时候可以考虑这几个问题:
-
如何显示一个图片/精灵
-
如何播放帧动画
-
如何控制两个物体碰撞
-
两个物体碰撞时候销毁其中一个同时生成一个物体播放帧动画特效然后播放完成之后销毁
-
如何播放音乐音效
-
背景层滚动效果怎么做
-
如何处理存档(数据持久化)
而之后可以考虑的问题可能有:
-
精灵的显示如何分清楚哪个先渲染哪个后渲染(渲染层次)
-
每次播放特效都生成一个物体然后销毁是不是有点浪费内存,可不可以一次生成多个重复利用(引入了对象池)
-
存档时候如果 A 写入存档还没结束时候 B 又写入存档会不会出问题(引入了文件系统使用单例)
不要执着于 Opengl
游戏行业比较流行图形学,可能感觉起来高达上,但是对于初学者(非初学者其实也一样)来说更多还是应该专注于 GamePlay。
我在刚开始写代码没多久就跑去拿本 opengl 红宝书在啃,写了一堆代码到头来也没学到什么。
一开始不要考虑3D 方面东西,从简单的2d 开始比较不错。这个时候我更多推荐看下代码本色和游戏人工智能来锻炼一下代码能力。
甚至如果要学图形学 Shader 的,我更多建议是先直接用 Unity 上面先学习如何写一些 Shader(推荐Unity 着色器和屏幕特效开发秘笈),能写一些比较特效之后然后再回头去写那些渲染管线 Opengl 那些会比较有感触。
不要禁锢在游戏引擎中
现在游戏引擎非常方便,写软件的目的就是为了使其越来越容易使用。
但一直使用游戏引擎对于初学编程的人来说会比较难以提高编程水平。个人建议是可以从先从游戏引擎入门,然后尝试不使用引擎使用上面提到一些底层点的框架或者工具来制作游戏。
造点小轮子有助于提高
很多人都说不要重复造轮子,但有时候别人的轮子比较重量级不够轻。自己写点适合自己的轻量级的轮子也对自己编程能力有一定提高,也可以更多享受编程的乐趣。
比如用上文提到的比较底层的框架(比如 SDL)来制作游戏然后自己写个简单的地图编辑器、粒子系统、存档文件保存读取系统或者菜单系统。虽然你做的这个跟专业引擎制作的没法比,但有一天你回到引擎里再来看待一些问题会有不一样的解决思路。
注意数据结构的应用
数据结构刚学习时候会陷入这东西在游戏开发中能干什么的疑惑之中。除了比较常见寻路用到图和网络编程的消息队列,其他的在我一开始学习数据结构时候都一无所知。
堆栈的应用:在处理菜单时候比如进入设置菜单时候把新菜单压栈操作,返回时候出栈销毁即可。在游戏场景进入到一个房间时候可以把当前游戏场景暂停然后把新的房间场景压栈。
队列的应用:在一些需要缓冲输入时候(比如格斗游戏)可以使用队列来控制输入操作。在一些技能系统比如一回合有8个体力槽玩家来组合攻击。在制作回放系统时候也可以使用队列来制作。
树的应用:基本是当你需要面对分支而且每个分支都有分支时候需要考虑。典型的比如剧情或者对话树,在节点下有很多子物体,子物体又可以有很多子物体时候也是它的应用场景。
图的应用:在可视化流程控制,有限状态机和导航系统都可以找到它的影子。
游戏开发设计模式应用
这个其实有专门书籍进行阐述, 我也只是班门弄斧而已 ,我只谈论几个对于我初学时候比较有收获的。
单例模式:在很多人刚开始接触游戏引擎时候都会面临一个问题是场景切换不销毁数据,不推荐的做法也是一些初学者会犯的是把数据保存到本地,然后下个场景再读取。这种直接进行读写操作是不可取而且当你要保存的是一个游戏对象(GameObject)时候就没办法了(当然其实也可以序列化对象保存到本地但仍然不可取)。这个时候比较可取的就是保存到一个全局的静态对象/变量上,这就引入了单例模式。还有比如一些系统只能有一个入口不允许随便使用不然会出错,比如典型的文件 IO 和控制器输入控制。
数据驱动:在 Unity 的 ScriptObject 中明显就是数据驱动,其核心思想就是改动数据而不必改动代码。而当你要使用数据驱动时候一定要分清楚什么可以硬编码什么可以数据驱动,配置太多的话是很影响开发效率和可阅读性。
降低指针跳转消耗:我觉得这个也是 ECS 提出的原因之一,在大型游戏中面对的是巨量的游戏物体,这个时候游戏物体中又有各种指针跳转的话造成的性能消耗就不能忽视了。所以在写代码时候要注意降低指针跳转,尽量让内存连续分布,比如使用结构体和数组。当然内存连续分布也可以减少内存碎片。
原型模式:这个一开始好像是在 Cocos2d-x 里面看到过,一个接口来实现克隆当前对象。在实际游戏中其实也挺常见,比如 GBA 的木叶战记中,鸣人使用影分身可以生成一个新的人物但是攻击力和血量减半。在 Unity 中 Prefab 从 Project 窗口拖动到 Scene 中时候也是使用类似思路(应该吧)。
注意代码整洁
这个更多是经验性的东西,我也难说做得很好。保持代码可读性是为了日后你或者别人回来看代码能看得懂。保持函数的单一职责很有必要,当你发现有些代码重复写了几次就应该思考这是否应该放到一个函数中。你必须明白的是 Bug 总是会有的,总有一天你或者别人会重新看这些代码,如果在写的时候稍加注意,后期的维护和复用就会相对简单轻松。
具体可以看下代码大全、代码整洁之道和这个视频。
最后,制作游戏很有趣,写游戏代码也很开心,希望你也能享受游戏编程的快乐!
2019/12/23
Codinggamer
推荐书籍
-
游戏设计、原型与开发
-
Data Structures for Game Programmers
-
游戏编程模式
-
代码大全
-
代码整洁之道
-
游戏人工智能编程案例精粹
-
代码本色:用编程模拟自然系统
-
Game Coding Complete
-
Game Programming Algorithms and Techniques
-
Shaders for Game Programmers and Artists
-
Unity 着色器和屏幕特效开发秘笈
用Java开发简单又好玩的——雷霆战机小游戏,几行代码就搞定
- 资源加载
- 音乐播放
- 创建类
- 创建爆炸和珍宝类
- 创建导弹和飞机类
- 鼠标键盘控制
新建项目:Java Project -> planewar
将图片文件资源和音乐文件资源拷贝到项目中
然后我们导入第三方的jar
我们将jar包存放的目录拷贝到项目中,防止找不到jar
选择项目属性
选择java build path,找到图示中jar的位置
我们创建如下包结构
然后我们开始编写代码:
我们创建一个类constant
我们再创建一个图片读取的工具类
我们创建一个窗体类,编写一个绘制图形的方法线程
构造方法
创建主窗体系
补充一部分代码
主方法
此时可以加载出图片
我们创建一个播放音乐的类
在主窗体中添加属性
我们读取对应的音乐文件
此时音乐可以正常播放
此时画面图片刷新有明显的闪动,我们再加一段代码
此时界面正常,没有闪烁现象
我们需要创建飞机、珍宝、导弹、爆炸、等实体
我们先创建一个方向类
我们先创建类Bullet
继续补充属性
初始化的图片
初始化的代码
构造方法
赋值属性
条件语句中的代码 表示是不是\”友好\”的
Else中包括一个if else 表示如果是敌方的,那么是不是Boss发出来的
不是boss的敌方
创建两个方法,的移动和绘制,需要控制是不是出界
击中飞机的方法
创建一个矩形
多个飞机击中判断
在主窗体中创建对应的属性就可以了
我们需要创建飞机、珍宝、导弹、爆炸、等实体
我们创建爆炸类
我们在主窗体中创建集合类
设置属性和对应的资源
设置构造方法和属性方法
我们绘制爆炸效果
我们继续创建珍宝类
在主窗体中创建集合类
创建对应的属性类
创建对应的构造方法和属性方法
创建绘制和移动方法
我们继续创建导弹类
我们创建集合类
我们编写对应的属性
两个构造方法和矩形绘制
编写绘制图形的代码
我们需要创建飞机、珍宝、导弹、爆炸、等实体
我们创建导弹类(其中会用到飞机类,我们先简单创建一个飞机类)
增加主窗体的集合类
我们继续创建导弹类
我们创建集合类
我们编写对应的属性
两个构造方法和矩形绘制
编写绘制图形的代码
我们创建移动方法
我们继续编写创建击中的方法
多个击中的方法
我们创建使用于boss敌机的导弹
对应的属性和构造方法
绘制方法和简单计算
移动方法(这个比较长注意看)
移动方法(这个比较长注意看)
创建击中方法
我们继续补充飞机类的内容
图片资源加载(代码较长注意)
构造方法
绘制方法和其它一些属性方法
控制按下的代码
释放的代码
开火的代码
BOSS
开火的代码
方向控制
移动方法
暴走方法
控制键盘和鼠标,我们现在主窗体添加一些属性
我们再创建一个线程类
对应的构造方法和属性
线程运行类
主窗体中我们添加新的内容
我们添加两个事件监听的方法
键盘监听
主方法执行
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。