python vector_50行Python代码实现经典游戏,不仅是划水神器,更是学习利器!

Free Python Games非常适合学生,它不仅具有高度的组织性和灵活性,而且能够激发人们探索和理解能力。--Terri Furton

Free Python Games在轻松的环境中把游戏和学习结合在一起,从而减轻了编程过程中的压力。--Brett Bymaster

...

贪吃蛇、迷宫、吃豆人、扫雷、Flappy Bird...这些游戏可以是非常经典,甚至伴随着很多人的童年回忆。那么,你是否想过自己开发一款专属游戏?是否思考过开发这样一款游戏需要多少工作量?

a6b462c9a23d928192e851d51036aa1f.gif

游戏开发在互联网行业算是一个门槛较高的方向,因此,对于非专业的游戏开发者来说,开发一款游戏一直是一件让人望而却步的事情,遥不可及

那么,今天要介绍的这款Python项目就可以轻松实现你成为游戏开发者的想法,实现前面提到的这些经典游戏只需要50-100代码即可完成。

free-python-games

两年前,我姐就曾表达了希望我能够抽空教外甥学习编程的想法。对于这份嘱托,我一直放在心上,但是却迟迟找不到合适的方向。

  • 该从哪个方向着手教一个孩子学习编程?
  • 怎么提升一个小孩子对编程的兴趣?

即便是从事几年互联网行业的我来说都对编程都觉得枯燥乏味,何况一个一无所知的孩子呢?

但是,free-python-games这个项目让我眼前一亮,终于找到了一个合适的Python学习项目。当年,它对于成年人同样适用、有价值。

我之所以介绍这款项目,不单单是它实现了让人回到童年的经典游戏。更重要的原因是它能够作为一个Python学习、锻炼探索和理解能力的一款好工具。

free-python-games和我们接触的大多数Python库那样让人如同垒积木一样去实现一项功能不同,你需要去静下心来死锁一款游戏的主题,同时需要去实现游戏中的每一个策略。

9f2b91aa6b4d35dc3b23d16f4692213b.gif

我觉得这样比拿来即用的搬运工作要有趣很多,且更加具有挑战。

以我们熟知的贪吃蛇为例,当然我们目前对于这款游戏的主题和玩法已经非常清楚了,通过方向键控制蛇的移动,每当吃到一颗食物蛇就会变长,如果撞到墙则游戏结束...

5c6c852f0582b9665b2d20470c5f9770.gif

那么,对这款游戏进行拆解,就需要思考几个问题:

  • 如何使蛇加速和减速?
  • 如何使蛇绕过边缘?
  • 如何分配新产生食物的位置?
  • 游戏中的蛇如何根据键盘操作做出相应的反应?

看到这里你就会发现,它并不像我们大多数情况下使用Python那样,np.linespaceplt.plottf.Session,它更像是LeetCode上面的算法题,需要你从零开始去实现一款游戏,用心去思考游戏实现过程中的每个细节。而在这个过程中对人的提升会非常迅速。

下面就以贪吃蛇这个游戏为例,介绍它的源码和实现过程,来回答上述4个问题。

首先,导入需要的模块,

from turtle import *
from random import randrange
from freegames import square, vector

其中turtle是一款绘图工具,主要为了实现游戏的前端和用户交互功能,freegames包含了一些开发游戏会用到的基本元素,random是Python中用于生成随机数的库,在生产新食物的过程中会遇到(回忆一下,当蛇吃了一颗食物后,会在窗口内随机产生一颗食物)。

然后,就初始化一些变量,分别用于存储食物、蛇的状态,

food = vector(0, 0)
snake = [vector(10, 0)]
aim = vector(0, -10)

下面就是初始化蛇的位置,已经定义蛇对于键盘方向键的响应,朝着指定的方向移动,

def change(x, y):
    "Change snake direction."
    aim.x = x
    aim.y = y

setup(420, 420, 370, 0)
hideturtle()
tracer(False)
listen()
onkey(lambda: change(10, 0), 'Right')
onkey(lambda: change(-10, 0), 'Left')
onkey(lambda: change(0, 10), 'Up')
onkey(lambda: change(0, -10), 'Down')

接下来,我们需要判断蛇是否在边界框以内,如果在,则继续移动,否则终止,

def inside(head):
    "Return True if head inside boundaries."
    return -200 190 and -200 190

最后,就是整个游戏的串联逻辑,不断移动蛇、不断判断当前状态,然后选择是否继续移动,

def move():
    "Move snake forward one segment."
    head = snake[-1].copy()
    head.move(aim)

    if not inside(head) or head in snake:
        square(head.x, head.y, 9, 'red')
        update()
        return

    snake.append(head)

    if head == food:
        print('Snake:', len(snake))
        food.x = randrange(-15, 15) * 10
        food.y = randrange(-15, 15) * 10
    else:
        snake.pop(0)

    clear()

    for body in snake:
        square(body.x, body.y, 9, 'black')

    square(food.x, food.y, 9, 'green')
    update()
    ontimer(move, 100)

到此为了,经典的贪吃蛇游戏就完成了。整款游戏的纯代码行数不足50行。但是,却内藏锦绣,有很多需要开发者去思考和琢磨的点,对Python学习者也是一个很大的提升。

除了贪吃蛇,这个项目中还有迷宫、吃豆人、扫雷、Flappy Bird等20+款经典游戏。

当然,如果你觉得这些游戏还不够,或者对游戏开发充满兴趣,或者有很好的游戏设计idea但开发能力受限,那么,不妨学习一下free-python-games这个项目,能够把精力专注于游戏本身,而不需要在编程语言方面耗费太多时间。

另外,如果你仅仅希望用来划水,这个项目同样可以满足你,只需要简单的安装之后就可以在电脑上玩这些经典游戏。

安装

$ python3 -m pip install freegames

游戏列表

$ python3 -m freegames list

打开游戏

$ python3 -m freegames.snake

另外,你还可以拷贝一份游戏源码到本地路径,用于编辑,

$ python3 -m freegames copy snake
$ python3 snake.py

推荐阅读

  • 干货 | 2019年共享免费资源整理(上):学习资源篇
  • 干货 | 2019年共享免费资源整理(下):实用工具篇
  • 10款VS Code插件神器,第7款超级实用!

个人微信

欢迎各位同学添加我的个人微信,互相交流、互相学习,第一时间获得更多冷门好用的小工具!

fcf469bf72ac6dd939938784ffc4f429.png

我整理了10T+资源进行共享,其中包括实用工具、Python电子书、Spring视频教程、机器学习资源,扫码关注我的公众号“平凡而诗意”,后台回复相应关键字即可获得。除此之外,原创技术文章会第一时间推送,如果喜欢,麻烦点一下“在看”~

649cec885e93373a69fc2495ebee44b3.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

r roc函数_画ROC曲线的R包总结

原标题:画ROC曲线的R包总结作者: Joseph Rickert原文链接:https://rviews.rstudio.com/2019/03/01/some-r-packages-for-roc-curves/在这篇文章中,我将描述如何在CRAN中搜索绘制ROC曲线的包,并强调六个有用的包。虽然一…

c语言出圈游戏课设报告,c语言作业 出圈游戏

#include//头函数#include#include#define SIZE 100struct SeqList{int num;char name[10];};int menu_select();//函数声明部分void Joseph1();void Joseph2();void Joseph3();void Joseph4();void Joseph(struct SeqList *p,int length);void main() //主要程序段{printf(&qu…

laravel框架中文手册_node.js 后端框架star 排名 2020年11月更新,fastify 超 egg

发布时间以首个版本发布(0.x)为准。第一名: express 50.8k (2010年1月发布) 目前star 和下载量最高的老牌框架。https://github.com/expressjs/express​github.com第二名:meteor 42.1k (2012年…

c语言~991|4等于多少,复习C语言9-helloworld3000-ChinaUnix博客

关于位操作1. 不使用中间变量,交换a、b的值。如使用:a a b; b a - b; a a - b;则当a、b都比较大时,ab的值可能会溢出。而采用下述方法则没有溢出越界的问题:a a ^ b;b a ^ b;a a ^ b;证明其实很简单,只要熟悉二…

python音乐下载器交互界面_基于Python实现下载网易音乐代码实例

代码如下 # 爬取网易音乐 import requests from bs4 import BeautifulSoup import urllib.request headers {"origin": "https://music.163.com", "referer": "https://music.163.com/", "user-agent": "Mozilla/5.0 …

2020年度工作计划_2020最新年度个人工作计划(精选3篇)

时间稍纵即逝,前方等待着我们的是新的机遇和挑战,不妨坐下来好好写写工作计划吧。工作计划怎么写才能发挥它最大的作用呢?下面是小编为大家整理的2020最新年度个人工作计划(精选3篇),希望能够帮助到大家。年度个人工作计划1转眼间…

c语言中把各位上为奇数的数取出,下列给定程序中函数fun()的功能是:将长整型数中每一位上为奇数的数依次取出,构成一个新数放在冲。 - 赏学吧...

下列给定程序中函数fun()的功能是:将长整型数中每一位上为奇数的数依次取出,构成一个新数放在冲。高位仍在高位,低位仍在低位。例如当s中的数为87653142时,t中的数为7531。请改正函数fun()中的错误,使它能得出正确的结…

java 格式化字符串_Java入门 - 语言基础 - 14.String类

1.概述字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。2.创建字符串创建字符串最简单的方式如下:String greeting "光束云";在代码中遇到字符串常量时,这里的值是 "光束…

c语言按照姓名查询员工信息,输入10个职工信息,按号码大小排序,再使用查找函数找职工的姓…...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include //主函数int main(){int sort(int num[10],char name[10][10],int n);int survey(int num[10]);int num[10];int n10;char name[10][10];int i;for(i0;i<9;i){printf("请输入第%d个职工的工号\n",i1…

decimal是什么类型_SQLMysql数据类型

一 前言每个数据库的数据类型从来都不是一个简单的数据结构&#xff0c;特别是使用不同的数据库&#xff0c;不同的引擎&#xff0c;其支持的数据类型也不一样&#xff0c;选择那种数据类型作为字段类型对数据库的性能也是天差地别&#xff0c;故对数据类型有个全面的认知&…

python 栈和队列_python 栈和队列的基本实现

python中的列表结构可以用来实现栈和队列。 【栈】&#xff1a; 栈是一种数据结构&#xff0c;具有先入后出的特点&#xff0c;并且栈的所有操作只能在某一端进行&#xff0c;能进行操作的一端的第一个元素称为栈顶&#xff0c;另一端的第一个元素称为栈底 栈的五种基本方法&am…

e480win7显卡驱动_e480安装了windows7显卡驱动装不上

展开全部一、显卡驱动程序启用驱动程序签名功能启用驱动程序签名功能是成功安装显卡驱动的第e68a84e8a2ad3231313335323631343130323136353331333433663031一步&#xff0c;因为只有启动了驱动程序签名&#xff0c;才能阻止系统的自动安装驱动程序功能&#xff0c;才可以抢在系…

android oat如何提取dex文件字节码,Android: 使用oatdump反编译oat文件

网上经常看到有通过apktool将apk中的dex反编译成smali格式的文件&#xff0c;以便分析功能实现与破—解&#xff0c;确没怎么看到oat文件反通过oatdump反编译的&#xff0c;所以就写了一篇这样的文档。声明一下oat文件也是可以反编译的。本来想着通过oatdump处理之后&#xff0…

mybatis依赖_Spring Boot2 系列教程(二十一)整合 MyBatis

前面两篇文章和读者聊了 Spring Boot 中最简单的数据持久化方案 JdbcTemplate&#xff0c;JdbcTemplate 虽然简单&#xff0c;但是用的并不多&#xff0c;因为它没有 MyBatis 方便&#xff0c;在 SpringSpringMVC 中整合 MyBatis 步骤还是有点复杂的&#xff0c;要配置多个 Bea…

android获取图片格式,Android得到图片的真实格式——从本地文件或者网络文件流...

ImageFormatFeatures支持从InputStream或者File解析四种格式&#xff1a;jpg 、 png 、 webp 、 gif从文件本身解析格式&#xff0c;而不是从扩展名获取FormatHelper.getFormat(InputStream inputStream)FormatHelper.getFormat(File file)UsageStep 1Step 2解析格式String For…

python中setup函数的用法_python学习之setUp函数和tearDown函数

1,setUp():就是在一个类中最先被调用的函数,每次执行一个函数都要先执行这个函数,有几个函数就被调用几次,与放的位置无关,随便放到哪里都会先执行这个函数 2,tearDown():就是在一个类中最后被调用的函数,每个函数执行之后都会执行一次,与放的位置无关,随便放到哪里…

pagehelper的使用_SpringBoot项目中,如何更规范的使用PageHelper分页?

SpringBoot项目中&#xff0c;如何更规范的使用PageHelper分页&#xff0c;拉勾IT课小编为大家分解一. 开发准备1. 开发工具• IntelliJ IDEA 2020.2.32. 开发环境• Red Hat Open JDK 8u256• Apache Maven 3.6.33. 开发依赖SpringBoot<dependency><groupId>org.s…

2-路插入排序c语言算法,浅谈2路插入排序算法及其简单实现

2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组&#xff0c;其目的是减少排序过程中的移动次数&#xff0c;需要增加n个记录的辅助空间。难点可能在于对取余的考虑吧&#xff0c;可以把辅助数组看成一个环状空间&#xff0c;这样就能更好的理解辅助空间中最大…

mysql安装被打断_Mysql的安装/性能优化/安全加固

aa安装&#xff1a;增加一个登录用户和群组#groupaddmysql#useradd -r -g mysql mysql解压缩Mysql数据包#tar-zxvf mysql-5.6.13.tar.gz进入Mysql解压缩目录#cd mysql-5.6.13配置安装mysql#cmake.#make &&make install建立配置文件#cp./support-files/my-medium.cnf/et…

python自动输入账号密码_Python如何基于selenium实现自动登录博客园

这篇文章主要介绍了Python如何基于selenium实现自动登录博客园,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需要做的准备&#xff1a; 本文章是使用Chrome&#xff0c;所以需要Chormedriver.exe&#xff0c;…