第一次写Python就拿了活动二等奖,来看看这个少年的代码心得
off999 2024-12-11 16:26 23 浏览 0 评论
前一段时间 Gitee 举行的「贪吃蛇魔改大赛」中诞生了很多优秀的小游戏作品,下面提到的作品就来自一位刚高考完的少年,这是他的第一个 Python 作品(甚至都没有写 Hello World)。
最终他的作品获得了本次比赛的二等奖,下面的内容就是他本次活动的经验分享。
原文标题:【参赛经验分享】Python 贪吃蛇魔改作品:Snague——方案及总结
原文地址:https://blog.csdn.net/weixin_42465278/article/details/108006274
活动简介
高考完闲来无事, 发现Gitee官方举办了一个活动 —— Gitee星球的小活动 / Python 贪吃蛇魔改大赛。 正好我对编程和游戏感兴趣, 于是二话不说马上报名参赛了。
活动要求是参赛者修改经典游戏《贪吃蛇》, 发挥想象力, 添加有趣的内容, 制作一款全新的独特的贪吃蛇游戏。
在了解了活动规则后, 我于7月16号正式着手。
鄙人不才, 承蒙各位评委老师抬举, 忝列二等奖。 在这里和大家分享一下我的心得体会。
作品介绍
不过首先还是要安利一下我的游戏啦!
Snague 是一款 Roguelike 类型的贪吃蛇小游戏。在保留贪吃蛇核心机制的基础上进丰富了游戏内容。
游戏中您不但可以挑战不同关卡, 还能够获得不同增强, 过五关斩六将, 打破高分记录, 成为最强贪吃蛇!
游戏截图:
游戏玩法还请各位访问我的仓库看详细的图文介绍: Snague:一款Roguelike贪吃蛇游戏!
思路介绍
报名后的几天一直在想有没有什么好的idea。 没看创意征集箱,因为怕限制了自己的想象。 最后还是决定把贪吃蛇做成Roguelike游戏。
本人很喜欢玩Roguelike, 尤其喜欢《以撒的结合》系列, 所以一开始整体大方向的设计参考《以撒》。
不过,这么短的时间内要做成《以撒》那样是不可能的,而且主角是一条蛇,并不是一个"点", 这就让关卡设计必须脱离《以撒》。 而且由于本人能力有限,每层出现很多房间的这种地图我没有想到应该如何实现,于是不得不做得简单一点。
到这里几乎已经完全脱离《以撒》的框架了,最后仅仅是保留了Roguelike最基本的一些东西, 如血量、金币、商店、奖励、Buff 等。
一个重要的问题:血量
我们都知道, 贪吃蛇是没有血量一说的,但作为一款Roguelike游戏,肯定不能稍微操作失误就直接结束游戏,这样碰到边界或障碍物或自身就游戏结束,体验感太差了。 于是我这样设想:蛇吃食物会变长,那么可不可以以长度代表"血量"? 沿着这个思路下去,那么碰到障碍物或自身并不直接结束游戏, 而是减少身体的长度, 直到某一最小值才结束游戏。 我自己觉得这个想法不错, 也问了一下朋友们的意见, 暂时敲定了这个方案。
蛇已经有了, 现在该设计关卡了
最初想法是吃到一定数量的食物就可以过关, 而每一个关卡又要有难度变化, 同时考虑到蛇不是一个点, 不好设计怪物来打蛇(蛇不好躲), 最后想了一个老鹰随机飞到一个点去抓蛇…感觉不是很好, 就先放了一下。 之后往不是怪物的方向去想。 首先很容易想到的就是直接放障碍物了, 于是写了石头阵。 之后又采取了各位亲朋好友的意见, 写了炸弹关卡(和老鹰有点像)和鬼关卡(鬼一开始是移动的障碍物, 后来改成了鬼)。 然后就思维枯竭, 连一点点idea都没有了… 考虑到石头可以放多放少、 炸弹可以放多放少, 威力可大可小、鬼可快可慢, 可多可少, 就这样吧, 每个关卡设置不一样的难度就有了一堆不同关卡了。
Buff和Debuff
Buff主要根据关卡特性来写, 使得过关的难度稍微降低一点点, 比如石头阵就想到了头盔, 炸弹就想到了防护服, 鬼就想到了勇敢和捉鬼工具等等等等。 Debuff的话比较难想, 自己只想到了速度加快。 在朋友的建议下又加了一个"眩晕", 即按键调换。 之后就没什么思路了。 Buff和Debuff的获得方式依然在思考中…
然后写了很久, 调了很久, 同时也在边玩边测试, 发现一个问题, 蛇的血量好像太多了…
在我设计的炸弹关卡中, 有部分关卡是看炸弹波数过关的, 即炸弹炸完就过关了, 和吃食物的量无关。 如果蛇现在已经挺长了, 又遇到这样的炸弹关卡, 那么直接被炸就可以过关了, 根本不需要花费心思躲炸弹吃食物, 毫无游戏操作感。 而且从另一个角度来说, 蛇的长度可以自主控制, 变得较短, 过关也容易了很多, 这样游戏难度也很低, 玩家体验感也大大折扣。 综合以上事实, 最终还是设计了血量这个概念, 也就是目前游戏左上角的那些心。 同时保留受伤会缩短的机制, 加入受伤会减少血量的机制。
一开始决定初始血量是5颗心, 玩起来感觉太容易受伤了, 尤其是鬼关卡, 所以添加了食物有几率是恢复血量的效果。 又加了一个Buff:过关恢复一滴血量。 玩了一会, 由于恢复食物概率比较低, 还是很容易游戏结束, 于是把初始血量提高到了10, 又试玩了几把, 感觉差不多了。
商店和奖励
血量的概念有了, 那么商店和奖励也都有了一个共同idea, 加血或者血量上限。 考虑到奖励可以视为不用钱就可以买的商品, 于是先写了商店, 奖励继承一下商店就好了。
商店除了和蛇的基本属性有关的东西, 就是买Buff了, 正好同时解决了Buff获得方式的问题。 奖励关也是这些东西
接下来Debuff的获得方式也是想了很久, 思来想去最后决定每关开始一定几率出现随机药丸, 拾取药丸将获得Buff或者Debuff或者其他的一些东西。
操作性
在接下来的试玩过程中, 我又发现一个问题:操作性太差
比如炸弹关卡, 一个炸弹出现在身边, 玩家无可奈何, 只有被炸的份; 鬼关卡, 由于走位不当或者蛇过长, 鬼马上就要碰到蛇的时候, 玩家也无可奈何。 为了解决这个问题, 我想到了"冲刺"操作, 即按蛇的方向的按键可以立马移动。 这样操作性就大大增强, 遇到炸弹或者鬼的时候也可以及时避开, 同时在较为简单的关卡也可以使用"冲刺"达到一种加速的效果, 避免移动缓慢导致在路上浪费玩家时间。 又考虑到如果可以一直冲刺的话游戏也会变得简单许多, 于是引入了"体力"的概念, 冲刺需要消耗体力, 在有体力的情况下才可以冲刺, 体力固定时间恢复。 哈, 这样就完美了。 自认为"冲刺"操作是最好的idea。
到这里游戏就基本定型了, 后续没有什么太大的改动。 Demo发给了朋友们, 大家也没什么特别的建议。
经验总结
这次参赛收获颇多。 我是第一次写Python, 谈不上是经验, 就和大家分享一下心得吧。 首先是我学会了Python。 以前没有学过Python, 对Python的了解仅限于知道它是解释性语言, 自带高精度, 最近几年特别火。 通过这次机会我深入了解了Python, 切身体会到了Python的强大, 也算稍微学了一下Python。
学习 Python
先系统学一下Python时间是不够的, 于是我边看大佬们的开源代码边猜语法, 然后再搜索相关资料验证一下我的猜想。 基本上猜得八九不离十, 于是我很快就可以自己动手写Python了。
这是我学习Python的以方法, 虽然不系统, 有很多东西都不清楚, 但是我自认为这样的学习效率很高, 因为语法是自己动脑琢磨出来的, 不是老师或书本强行灌输给你的, 记忆效果可能更好, 学习过程中的成就感也更强, 学习也更加有动力。
如果有一些编程基础想速成Python或其他语言的朋友可以参考一下我的拙见。
然而我也有猜错的时候, 印象最深的是类继承关于函数调用的部分。 (因为我之前学的是c, 后来虽然学了java但没系统学, 关于类和继承相关的知识几乎为0) 如果您不太清楚这方面, 那么我的经历可能对您有所帮助。
遇到的问题
在我写代码的过程中, 出现了这样的情况(以关卡部分为例):
我先写了一个简单的关卡类Class Scene, 里面写了一堆基础的东西, 比如贪吃蛇的运动, 食物的投放, 等等。
然后通过继承写了石头阵Class SceneStone(Scene), 里面添加石头等。
在食物投放的函数中, 由于食物不能投放在蛇的身上, 于是在Scene里写了一个函数。get_food_cant_in(), 当然普通的关卡就是食物不能出现在蛇身体里。 而石头阵的关卡还增加了不能出现在石头里等条件。
由于Scene里写好了关于吃食物投放食物的一切东西, SceneStone里并不用直接调用get_food_cant_in(), 而是直接super()父类的函数。
这时候, 我理所当然的认为, super()调用了父类的函数, 那么父类函数中调用的函数应该也是父类的函数。 然后一顿乱搞, 发现很难把石头也加到get_food_cant_in()中。 纠结了半天, 我又想会不会调用的是子类的函数? 然后写过了一个程序print所有函数调用的过程, 发现原来真的猜错了…
正确的写法应该是这样的: 子类直接重写get_food_cant_in()就完事儿了…
代码大概长这样:
Class Scene(Object):
...
def progress(self):
...
self.get_food_cant_in()
...
def get_food_cant_in(self):
... # 返回蛇身
...
Class SceneStone(Scene):
...
def get_food_cant_in(self):
...
super().get_food_cant_in()
# 加上石头
...调用过程是这样的: 游戏过程中调用了
SceneStone.progress()(子类并无重写) -->
Scene.progress() -->
Scene.progress()函数下的get_food_cant_in() -->
SceneStone.get_food_cant_in()
说白了就是一点, 只要子类重写了父类的函数, 那么调用的函数就是子类的, 除非super()
因为我之前的错误猜想写了很多不必要的东西, 然后又重新修改了好久, 绕了很大的弯, 吃了亏。 所以, 不惜笔墨分享一下这次有趣的经历, 既提醒和我一样正在学Python的朋友, 也提醒自己。 毕竟跌倒过一次, 记忆更加深刻。
Python的代码规范
还有就是关于Python代码规范的问题。 一开始我是用自己的风格写的代码, 和标准要求出入很大。 等写得差不多的时候, 想起来评分里有代码规范得分, 于是查了Python的代码规范, 接着就是一顿爆改…
pylint很好用, 我通过它的分析不断修改, 最终使得评分从3左右上升到了7左右。
所以, 在动手写代码之前, 看看代码规范很有必要…
Pygame的体会
最后是关于用Pygame写游戏的体会。 这个项目接触到的都是一些基本的东西, 我也是作为一个初学者学习到了很多。 安利一本书 —— 《Beginning Game Development with Python and Pygame》, 作者McGugan, 内容丰富, 言简意赅, 看这本书我很快就上手了pygame。
总的来说, 这次活动很有趣, 对于我个人来说也很有意义。 这既是我的第一个Python程序(没写Hello World), 也是我第一次开发较为复杂的游戏(以前写过两个Android的简单游戏)。 因为我还是个小白, 本来就没抱着获奖的希望, 看到自己拿了二等奖特别激动。 感谢Gitee! 感谢支持我的朋友们!
展望未来
不管是在游戏设计上, 还是代码实现上, 我都做得不够。 这个项目不出意外会一直维护下去。 评委老师给的建议很专业, 一语点醒梦中人。 之后会先完成评委老师的建议, 再添加一些东西, 比如关卡, Buff等等。 有兴趣的朋友可以一起参与。 或者您有任何idea都可以提出, 一起将地牢贪吃蛇打造得更有趣!
项目链接
点击下方了解原文。
欢迎各位大佬Star, Fork!
相关推荐
- vivo系统升级最新版本(vivo系统升级到什么版本了)
-
您可以按照以下步骤来更新vivoY5s的操作系统:1.进入设置-系统更新。2.点击“检查更新”,确保您的手机已经连接上WiFi并检测到有可用的更新。3.如果有可用的更新,请按照提示下载并安...
- 电脑做系统软件排行榜(做电脑系统的软件)
-
1、360安全卫士是一款由奇虎360公司推出的功能强、效果好、受用户欢迎的安全杀毒软件。360安全卫士拥有查杀木马、清理插件、修复漏洞、电脑体检、电脑救援、保护隐私,电脑专家,清理垃圾,清理痕迹多种功...
- win7热点(win7热点无ip分配)
-
1、点击桌面左下角的开始按钮,在搜索栏输入cmd,右击上方出现的cmd.exe,在弹出菜单中选择以管理员身份运行。2、然后在“命令提示符”里输入“netshwlansethostednetwor...
- centos下载安装(centos安装软件教程)
-
首先要知道您需要下载linux哪个发行版,目前比较流行的是ubuntu,所以以ubuntu为例说明:1、访问ubuntu官方网站www.ubuntu.com2、点击右上角的DownLoad(下载),...
- 360老版本卫士2014版(360卫士8.7.0)
-
先打开360官网,下载360软件管家,再从360软件管家里下载360卫士这是明显的中毒表现:1、关闭系统还原;2、重启,按F8,进入安全模式。3、在安全模式里,打开360杀毒。4、全盘查杀。要耐心等待...
- iso文件是什么格式(iso是啥格式)
-
pic是一种图片格式的文件,不过以pic为后缀的图片文件并不多见,所以有很多人都不知道pic是什么以及pic文件应该用什么打开。可以将pic文件修改为jpg文件格式,打开方式如下:1、第一步,首先在电...
- 8t硬盘安装win7系统(8t硬盘用什么分区)
-
7-8吨。t就是吨的英文缩写。吨是音译专用字,用于重量单位或船只容积单位。繁体字“吨”由“口”和“顿”字构成,“口”字表示它是音译外来语用字,“顿”字近似地表示其读音。◎质量单位,公制一吨等于100...
- cdr格式怎么转换成psd(cdr格式怎么转换成ezd)
-
CDR文件是CorelDRAW的原始文件格式,而PSD文件是AdobePhotoshop的原始文件格式。因此,要将CDR文件转换为PSD格式,您可以使用以下两种方法:1.打开CorelDRAW并打...
-
- 免费p图软件(电脑免费p图软件)
-
分享几款免费看vip电影电视剧的app,只要在各大播放器上映的电影,在这几款app都可以看到。1、火星影视2、新电影天堂3、呲哩呲哩4、鲨鱼影视这些软件直接可以百度下载,爱奇艺,腾讯视频电脑上有哪些画画的软件好用,要免费的,windows自...
-
2025-12-25 01:03 off999
- 英特尔i5处理器性能排行榜(英特尔i5处理器性能介绍)
-
性能从高到低:i5-11600k(f),i5-11600(f),i5-11500,i5-10600k(f),i5-11400(f),i5-11600t,i5-10600(f),i5-11500t,i5...
-
- 视频修复软件免费版(高清视频修复软件免费版)
-
视频修复软件众多,电脑端用会声会影,可以进行编辑,特效,完善音视频你所构建大多部分内容。另外如果是视频损坏的话也可以用另外一款软件也是比较适合,比如AllMediaFixer是多媒体文件修复工具,如果你有一些多媒体文件无法播放时,可能这...
-
2025-12-24 23:51 off999
- 电脑黑屏只能看见鼠标(联想电脑黑屏只有鼠标箭头怎么办)
-
1、按电脑上面的重启按钮,然后按住键盘上面的F8。 2、按键盘上面的方向键选择,安全模式里面的第一个选项。 3、进入桌面后点击控制面板,选择卸载。 4、然后右键卸载最近安装的软件,接着点击左下角...
- 2012年win7系统32位(电脑系统win732位)
-
你好朋友;没有;微软自从windowsserver2008r2操作系统开始;只会发布64位的windows服务器操作系统了;朋友换句话也就是说;凡是win2008之后的服务器操作系统;...
- 台式电脑线路安装步骤图(台式电脑怎么安装线路图)
-
安装电脑线路需要以下步骤:首先,确定电脑所需的线路类型,如电源线、网线等。然后,将线路插头与相应的接口连接,确保插头与接口对应正确。接下来,将线路沿着合适的路径布置,避免过度弯曲或拉扯。在布置线路时,...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
