python来画画第二弹!

thbcm阅读(192)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

分享一波最近Get的一种python画画的方法。

让我们愉快地开始吧!

相关文件

百度网盘下载链接: https://pan.baidu.com/s/1ZBs4-DpVxXvoisAllwHV5Q

密码: 9nei

开发工具

Python版本:3.6.4

相关模块:

cv2模块;

numpy模块;

pywin32模块;

bs4模块;

以及一些Python自带的模块。

其他:

potrace

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

参考资料

1.http://www.html-js.com/article/1628

2.https://zh.wikipedia.org/wiki/%E5%8F%AF%E7%B8%AE%E6%94%BE%E5%90%91%E9%87%8F%E5%9C%96%E5%BD%A2

3.https://www.cnblogs.com/hnfxs/p/3148483.html

先睹为快

修改所需绘制的图片路径:

在cmd窗口运行main.py文件即可。

效果如下:

原理简介

一. 实现步骤

首先读入原图:

其次将原图像的颜色数量通过K均值聚类降低到指定的数量,K值越大,运行速度越慢,但效果越佳:

每次取出聚类结果中的一种颜色并利用potrace将其转为SVG格式的图形,再解析该格式并用Python自带的turtle库画出来:

二. SVG格式

SVG,即可缩放矢量图形,是一种基于可扩展标记语言(XML),用于描述二维矢量图形的图形格式。SVG主要支持以下几种显示对象:

1.矢量显示对象,基本矢量显示对象包括矩形、圆、椭圆、多边形、直线、任意曲线等;

2.嵌入式外部图像,包括PNG、JPEG、SVG等;

3.文字对象。

更多关于SVG的技术细节请参考:

http://www.w3school.com.cn/svg/svg_intro.asp

三. Turtle库

这里推荐一份turtle库的文档:

https://www.rddoc.com/doc/Python/3.6.0/zh/library/turtle/

四. 贝塞尔曲线

画图时用到了贝塞尔曲线,这里简单介绍一下。

贝塞尔曲线的数学基础是伯恩斯坦多项式,其得名于法国工程师Pierre Bézier。

贝塞尔曲线控制简便却具有极强的描述能力,因此在工业设计领域应用广泛;同时,贝塞尔曲线在矢量图形学领域也占有重要的地位。今天我们最常见的一些矢量绘图软件(例如Flash,CorelDraw,PS等等)均提供了绘制贝塞尔曲线的功能。

线性公式:

给定点P0、P1,线性贝塞尔曲线是一条两点之间的直线,确定方式如下:

其实就是线性插值。

二次方公式:

给定点P0、P1和P2,二阶贝塞尔曲线的路径确定方式如下:

n次方公式:

给定点P0到Pn,n阶贝塞尔曲线的路径确定方式如下:

贝塞尔曲线的绘制方式(以二阶为例):

假设平面内不共线的三个点如下图所示:

在AB上选一点D,BC上选一点E,使得:

AD:AB=BE:BC。

连接DE:

在DE上选一点F,使得:

AD:AB=BE:BC=DF:DE

保证AD,AB,BE,BC,DF,DE之间的比例关系不变,让D点从A点运动到B点,则所有的点F构成的曲线即为二阶贝塞尔曲线:

n阶贝塞尔曲线的绘制方式类似,例如三阶和四阶:


That’s all~

相关文件中提供了完整源代码和所需的工具,请自行下载使用。

更多

代码截止2018-07-31测试无误。

还是挺有趣的,原图最好不要太大,否则生成的速度很慢很慢很慢。

python制作小游戏(一)

thbcm阅读(200)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

这又将是一个不定期更新的系列~~~

本系列主要将使用到python的pygame模块来教大家制作一些小游戏,每期制作一个。最后都会打包成.exe文件分享给大家~~~

So,对于只想玩小游戏的小伙伴来说,只需要下载相关文件就好啦~~~

至于pygame的开发文档,暂时没有归入整理计划,来日方长,英文不好的同学只能先看网上中文的资料将就下了~~~

相关文件

百度网盘下载链接: https://pan.baidu.com/s/1gDLSHDF48xV4Z7z25UjOxw

密码: q4ib

本期参考文献

链接:

https://www.raywenderlich.com/24252/beginning-game-programming-for-teens-with-python

作者:

Julian Meyer

说明

python版本:3.5.4

pygame版本:1.9.3(pip安装即可)

愉快地开始

Step1:你好,兔子

效果:

Step2:添加背景

首先载入所需的图片;其次依次通过x和y进行循环,并且根据循环里x和y的值来画上草的效果;接下来的几行就是在屏幕上画出城堡。

效果:

Step3:让兔子能够移动

接下来你需要加上一些真正的游戏的元素了,比如让兔子能够随着按键移动。


效果(可以移动兔子)

Step4:让兔子转向

好的,现在你的兔子在你按键的时候可以移动了,但是如果你能用鼠标让兔子朝向你选择的方向不是更酷吗?这样它就不会总是朝向一个方向了。

效果:

Step5:射击吧!兔子

让兔子用箭头射向它们的敌人,这一步会有一点复杂,因为你需要跟踪所有的箭头,更新它们,旋转它们,在它们跑出屏幕的时候删除它们。



效果:

Step6:獾,拿上武器!

好吧,现在有了城堡,并且你有一个英雄可以移动和射出箭头。还差什么呢?当然是攻击城堡的敌人啦~

在这一步,你将会随机创建出一些獾冲向城堡。在游戏的进程中会有越来越多的獾冒出来。



效果:

Step7:獾与箭头的碰撞

獾们冲向你的城堡,但是你的箭头对它们完全没有作用!这让兔子怎么防守它的家园呢?

是时候来让箭头能够杀死獾让兔子能保护自己的城堡并且赢得这场游戏了~~~

效果:

Step8:添加健康值和时间的显示

游戏运行起来相当不错了,有攻击者、防守者。现在,你需要的就是通过一个方法来显示兔子的得分。

最简单的方法就是添加一个HUD来显示当前城堡的生命值。你也可以加一个计时来记录城堡存活下来的时间。


效果:

Step9:赢或输

如果你玩的时间够长,即使你的生命值已经变成0了,游戏仍然是继续的!不仅如此,你仍然可以用箭头射向这些獾。这肯定不太对。你需要加上一些赢或者输的情况来让你的游戏值得玩。

那么我们来加上胜利或者失败的条件。你可以通过终止主循环,进入胜利/失败的循环来实现它。你需要指出玩家是否胜利,并将其显示在屏幕上。



效果:

Step10:免费的音乐和声音效果

这个游戏现在相当不错了,但是没有声音。有点太安静了。加上一点声音效果,能让你更好地感受这个游戏。



效果:

当然是会各种音效啦~~~图片大概是表达不了了emm。

OK,大功告成,你完美地制作了一款小游戏!

在这基础上,你可以根据你自己的创意来扩展游戏!比如,你可以试着重置里面的各种图片,加上不同的枪或者是不同的怪物!

python制作小游戏(二)

thbcm阅读(243)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

T_T突然发现N久以前我还做过一个系列???

利用Python制作小游戏???

好吧,既然做了,就有头有尾吧~~~

本期我们将制作一个类似八音符的小游戏。

让我们愉快地开始吧~~~

相关文件

百度网盘下载链接: https://pan.baidu.com/s/1JKS3_bTToinfyGREcdqduw

密码: ufaw

参考文献

cocos2d文档:

http://python.cocos2d.org/doc/

开发工具

Python版本:3.6.4

相关模块:

cocos2d模块;

pyaudio模块;

以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

原理介绍

相信很多人对八音符这款游戏并不陌生吧,其核心玩法是利用声音控制一个带辫子的小黑球不断前进,大概是长这样子的吧:

今天我们就来做一个低配版本的T_T,其功能为利用声音控制皮卡丘不断前进。

游戏主要使用了cocos2d模块和pyaudio模块,前者用于搭建游戏框架,后者用于获得麦克风的声音。

Step1 定义皮卡丘类:

既然游戏的主角是皮卡丘,那我们总得单独定义一个类来体现一下主角吧?

利用cocos2d模块来定义主角类是一件非常轻松的事情。你只需要继承sprites类,然后告诉sprites类需要执行什么操作即可。

根据八音符的游戏规则,我们赋予皮卡丘跳跃、下降和静止的能力,同时,我们规定皮卡丘在空中时无法进行跳跃。具体代码如下:

Step2 定义block类:

显然,主角需要有站的地方吧T_T,到处都是万丈深渊怕是一万只皮卡丘也拯救不了地球人吧T_T。

对于地面,刚开始的时候先得有一段长点的平地缓冲一下,让玩家先试试自己的嗓音,然后再随机生成跳跃块,让玩家展示自己的歌喉。具体代码如下:

Step3 实现游戏主循环:

有了上面的铺垫,就可以开始实现我们的小游戏了。

此时我们需要继承ColorLayer类来实现游戏主循环。首先,我们定义声控条类来“暗中观察”我们的嗓音,代码如下:

然后就是实例化皮卡丘类和block类,其中,block类将被放置进容器以方便整体处理。代码如下:

啊,千万别忘了只有输入了声音才能控制我们的皮卡丘不停地运动,代码如下:

最后,我们需要告诉程序游戏规则,那就是根据麦克风接收到的声音的音量来控制声控条的长短以及皮卡丘的动作。这里,我们通过block块的整体后移来实现皮卡丘的前进效果。

当然,我们也需要加入必要的碰撞检测程序,不然皮卡丘一登场就陷入沼泽一样的地面中了。并且我们规定当皮卡丘掉入“沟壑”后游戏重置。

代码如下:

OK,大功告成!!!

游戏效果

在cmd窗口运行Game2.py文件即可。

效果如下:

更多

关于cocos模块的教程,推荐阅读:

http://python.cocos2d.org/doc/

代码截止2018-06-14测试无误。

有兴趣的小伙伴可以在此基础上进行改进优化,例如加上音效和分值统计、开始和结束界面等等~~~

总之可改进的空间还是比较大的~

用Python抓取某东购买记录并统计MM的bra大小(附代码)

thbcm阅读(187)

本文转载至微信公众号「大数据前沿」,已获取授权

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导言

二胖最近在逛京东的时候偶然发现:MM们购买bra的记录上竟然留下了尺寸和颜色等信息,我当时就想,要不要抓点数据下来看看啊

然后就有了这篇文章~~~

Let’s go!

科普一下

在抓数据前,先给各位男性朋友科普一下,这个size信息到底怎么看(ps:我也是在网上查的(⊙o⊙)…)

70B,80C…到底啥意思?

数字的意思是下胸围,是水平围绕胸部底部一周的长度,即胸部下围尺寸,单位是厘米。

如果下胸围在68cm~72cm之间,那么就可以选择70码。

然后ABCDEFGH就是size了,请自行体会~~~

所以一个尺码是由两个参数组成~

分类

二胖发现,一款产品并不是所有的尺寸都有,比如下面的两张图,第一款产品的尺寸只有ABC,而第二款产品的尺寸是B-F。

很少有一款产品所有尺寸都有。


所以,很难仅从一款产品推测出所有人的购买趋势。

这里,二胖选择了把小号(ABC)和大号(B-F)分开讨论,并且每种型号各抓取三个不同的品牌来进行统计。

在这种情况下,数据不一定准确,但是至少能体现出大家的购买趋势。

参数选择

这里我们就选择三个参数来分析,分别是产品的尺寸(你懂的,就是大小),产品的颜色以及用户购买产品的平台

小号(A-C)

小号指的是仅有ABC尺码的产品,这里统计了3款不同的产品,合计3000条交易记录。

1.尺码

从统计结果来看,小号产品中,75B80B卖的最好。

2.颜色

在小号产品中,黑色最受用户青睐,也许是相对比较性感?

3.购物平台

总的来说,还是从京东App购买的用户最多,但也可以看到,有8%的用户是在微信平台上进行交易,这已经是一个不小的数字了。

大号(B-F)

1.尺码

大号指的是尺码在B-F之间的产品,和小号一样,也是统计了3款不同的产品,合计3000条交易记录。

大号产品的尺寸稍微多一些,从B-F都有,不过从大家的购买记录来看,还是B占据了大头,B和C加起来已经超过了三分之二。

2.颜色

可能是由于具体产品的影响,大号和小号的颜色差别还挺大,大号最受欢迎的颜色是酒红色,其次是紫色,不明觉厉~~

3.购物平台

从购买来源上来说,两种型号的产品差别不大,大多数用户都是通过京东App购买的,不过也有细微的差别。

购买小号产品的用户比购买大号产品的用户更喜欢用iphone(大约高了4%)。

文件下载

代码github地址:https://github.com/yangxuanxc/jingdong_crawler
视频地址:https://v.qq.com/x/page/g0732q8orka.html

如对GitHub不熟悉,可前往下面的百度网盘进行下载

百度网盘下载链接: https://pan.baidu.com/s/1KUaYDn4_Vnfl1yaUR-DwrQ

密码: gez5

技术分解

看完了上面的分析,我们来看看是如何将数据抓取下来的。

代码和视频讲解的链接放在了留言区,需要的同学自取~

上次给大家介绍了使用Java抓取微博数据,而这次爬虫使用的是Python的爬虫框架Scrapy。

主要流程代码如下:

# -*- coding: utf-8 -*-
import scrapy
from scrapy import Request
import json
import math
import time
import re

class BraSpider(scrapy.Spider):
    name = 'bra'

    headers = {
        ":authority": "sclub.jd.com",
        ":method": "GET",
        ":scheme": "https",
        "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "accept-encoding": "gzip, deflate, br",
        "accept-language:": "zh-CN,zh;q=0.9,en;q=0.8",
        "cache-control": "max-age=0",
        "upgrade-insecure-requests": "1",
        "cookie":"t=8444fb486c0aa650928d929717a48022; _tb_token_=e66e31035631e; cookie2=104997325c258947c404278febd993f7",
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
    }

    base_url = "https://sclub.jd.com/comment/productPageComments.action?productId=17209509645&score=0&sortType=5&pageSize=10&page=%d"

    def start_requests(self):
        for page in range(1,100):
            url = self.base_url%page
            print(url)
            self.headers[':path'] = url
            yield Request(url, self.parse,headers = self.headers)
            #time.sleep(2)

    def parse(self, response):
        content = json.loads(response.text)
        comments = content['comments']
        for comment in comments:
            item = {}
            item['content'] = comment['content']#评论正文
            item['guid'] = comment['guid']#用户id
            item['id'] = comment['id']#评论id
            item['time'] = comment['referenceTime']#评论时间
            item['color'] = self.parse_kuohao(comment['productColor'])#商品颜色
            item['size'] = self.parse_kuohao(comment['productSize'])#商品尺码
            item['userClientShow'] = comment['userClientShow']#购物渠道
            print(item)
            yield item

    #干掉括号
    def parse_kuohao(self,text):
        new_text = text
        searchObj1 = re.search( r'(.+)', text, re.M|re.I)
        searchObj2 = re.search( r'\(.+\)', text, re.M|re.I)
        if searchObj1:
            text = searchObj1.group().strip()
            new_text = text.replace(text,'').strip()

        if searchObj2:
            text = searchObj2.group().strip()
            new_text = text.replace(text,'').strip()

        return new_text

除了代码,二胖也录制了一个小视频教大家如何运行上面那段代码。

附上视频:

python制作小游戏(三)

thbcm阅读(180)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

本期我们将制作一个拼图小游戏。

好吧也许有些幼稚。

不过无论如何,让我们愉快地开始吧~~~

相关文件

百度网盘下载链接: https://pan.baidu.com/s/1q9VPkOYvI12LjqfQVRCF1Q

密码: 7wfg

开发工具

Python版本:3.6.4

相关模块:

pygame模块;

以及一些Python自带的模块

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

原理介绍

游戏简介:

将图像分为m×n个矩形块,并将图像右下角的矩形块替换为空白块后,将这些矩形块随机摆放成原图像的形状。游戏目标为通过移动非空白块将随机摆放获得的图像恢复成原图像的模样,且规定移动操作仅存在于非空白块移动到空白块。

例如下图所示:

逐步实现:

Step1:游戏初始界面

既然是游戏,总得有个初始界面吧?

OK,我们先写一个游戏初始界面:

效果是这样子的:

根据玩家自身水平,可以选择不同难度的拼图游戏。

Step2:定义移动操作

定义移动操作的目的是为了移动拼图(好像是废话T_T),具体实现起来十分简单:

Step3:游戏主界面

OK,有了前面的铺垫,我们可以开始实现我们的游戏主界面了。

首先,我们需要打乱拼图,但是随机打乱很可能导致拼图无解,因此我们通过随机移动拼图来实现打乱拼图的效果,这也是我们先定义拼图的移动操作的主要原因:

游戏主界面初始化:

最后实现主界面的显示刷新以及事件响应等功能:

Step4:游戏结束界面

当玩家完成拼图后,需要显示游戏结束界面,和游戏初始界面类似,实现起来都比较简单:

OK,大功告成!!!

游戏效果

在cmd窗口运行Game3.py文件即可。

效果如下:

更多

代码截止2018-06-26测试无误。

同样,有兴趣的小伙伴可以在此基础上进行优化,比如增加计时功能,积分功能等等。

Python制作小游戏(四)

thbcm阅读(181)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

本期我们将制作一个简单的滑雪游戏。

废话不多说,让我们愉快地开始吧~

相关文件

百度网盘下载链接: https://pan.baidu.com/s/1F74v1qGVk2NEWMEv-5E25w

密码: 2fcv

图片素材源于网络,侵歉删。

开发工具

Python版本:3.6.4

相关模块:

pygame模块;

以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

先睹为快

原理介绍

游戏规则:

玩家通过“AD”键或者“←→”操控前进中的滑雪者,努力避开路上的树,尽量捡到路上的小旗。

如果碰到树,则得分减50,如果捡到小旗子,则得分加10。

逐步实现:

Step1:定义精灵类

由于游戏涉及到碰撞检测(滑雪者与树和小旗之间的碰撞),因此我们定义两个精灵类,分别用于代表滑雪者和障碍物(即树和小旗):

其中,滑雪者在前进过程中应当拥有向左,向右偏移的能力,并且在偏移时滑雪者向前的速度应当减慢才更加合乎常理,这样才能供玩家操作。同时,滑雪者应当拥有不同的姿态来表现自己滑行时的状态:

直线:

左偏一点:

左偏很多:

右偏一点:

右偏很多:

另外,尽管滑雪者的左右移动通过移动滑雪者本身实现,但是滑雪者的向前移动是通过移动障碍物实现的。

Step2:随机创建障碍物

现在我们需要定义一个随机创建障碍物的函数,以便在游戏主循环中调用:

Step3:游戏主循环

首先我们初始化一些参数:

其中障碍物创建两次的目的是便于画面衔接。

然后我们就可以定义主循环了:

主循环的内容包括:

事件监听、障碍物的更新、碰撞检测以及分数的展示等内容,总之还是很容易实现的。

Step4:其他

开始、结束界面这些,就靠大家自己发挥了,我就写了一个简单的开始界面:

效果:

All Done!

更多

代码截止2018-07-12测试无误。

欢迎到GitHub上Star:

https://github.com/CharlesPikachu/Games

Python制作小游戏(五)

thbcm阅读(181)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

本期我们将制作一个仿“经典90坦克大战”的小游戏。啊,想起来上一次玩这个游戏的时候才小学呢。T_T真是一款暴露年龄的游戏。

算了废话不多说,让我们愉快地开始吧~

相关文件

百度网盘下载链接: https://pan.baidu.com/s/1Rl6gvHTGfWxuU3KjWYWbBw

密码: eksw

图片素材源于网络,侵歉删。

开发工具

Python版本:3.6.4

相关模块:

pygame模块;

以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

先睹为快

原理介绍

T_T感觉自己的代码整体上逻辑还是很清晰的,也做了很多必要的注释,所以这里我只讲主要的思路,一些实现细节请阅读我的源代码。

游戏规则:

游戏有单人和双人两种模式,己方大本营被破或者己方坦克被歼灭则游戏失败,成功通过所有关卡则游戏胜利。另外,玩家可以通过射击特定的坦克使地图上随机出现一个道具,若己方坦克捡到该道具,则触发一个事件,例如坦克能力的增强。

玩家操作方式如下:

玩家一:

wsad键:上下左右;

空格键:射击。

玩家二:

↑↓←→键:上下左右;

小键盘0键:射击。

逐步实现:

Step1:定义精灵类

因为游戏肯定涉及到碰撞检测,所以我们需要定义一些精灵类。

首先,既然是坦克大战,总得有坦克吧?

己方坦克:

上面的代码定义了坦克的一些属性,例如速度、等级、是否处于受保护状态等等。

当然这里也实例化了一个子弹类,这个我们之后再定义,先假装有这个子弹类,这样主逻辑才是完整的,不然坦克没有子弹类怎么射击呢?

当然,有属性还是不够的,我们还要赋予坦克一些能力,例如上面所说的射击:

当然还有上下左右的移动,因为都是类似的,这里只给出向上移动的源码:

啊,还有坦克的等级提升与下降:

最后当然是坦克死后重置啦:

敌方坦克:

敌方坦克和己方坦克定义的源代码很相似,只不过移动是随机的,死后是不可复生的,就不截图了T_T。

现在,我们可以来定义子弹类了!

子弹类:

子弹类应当具有例如速度、强度等属性,以及选择方向和移动的能力:

最后,我们来定义其他涉及到碰撞检测的物体类。

大本营:

有正常和被摧毁两种状态:

地图障碍物:

包括砖墙、钢墙、森林、河流和冰:

食物道具:

一共有7种道具,不同的道具对应不同的效果:

Step2:设计游戏地图

Emmmm,游戏的大背景是黑色的,然后在上面堆上一些步骤一中定义的障碍物就可以完成地图设计了。其中,钢墙不能被一般的子弹击破,砖墙可被任意子弹击破,除墙外,坦克可以穿过任意障碍物,不过没有任何附加效果(有兴趣的小伙伴可以自己扩展一下~比如冰上的坦克速度加快等等):

我偷懒只设计了一个地图和两个关卡,有兴趣的小伙伴同样可以在此基础上设计更多的地图和关卡。

Step3:实现游戏主循环

主循环的代码比较长,不过逻辑很清晰。首先展示游戏开始界面,玩家在此界面选择游戏模式后进入游戏;在游戏中,需要进行一系列的碰撞检测以及触发碰撞产生的一系列事件,并绘制当前存在的所有物体;最后,若游戏失败,则显示游戏失败界面,若通关,则显示游戏成功界面(我比较偷懒,界面设计的都比较简陋,有兴趣的小伙伴又可以扩展啦~)。

这里的代码截图就算啦(截长图比较麻烦T_T)~

All Done!

完整源代码和游戏素材以及打包好的游戏文件都在相关文件里有,自行下载查看即可~

更多

代码截止2018-07-19测试无误(T_T其实我没有测试完所有功能,所以有bug的话可以私信告诉我,我想办法修复一下)。

也欢迎有兴趣的小伙伴进一步拓展游戏。

Python制作小游戏(六)

thbcm阅读(189)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

本期我们将制作一个仿“FlappyBird”的小游戏。

让我们愉快地开始吧~

相关文件

百度网盘下载链接: https://pan.baidu.com/s/1AIL9_POn9xbXQ4stvQfhKw

密码: zhm6

图片与音频素材源于网络,侵歉删。

开发工具

Python版本:3.6.4

相关模块:

pygame模块;

以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

先睹为快

原理介绍

FlappyBird游戏简介:

玩家通过空格键控制一只小鸟,使其跨越由各种不同长度水管所组成的障碍物,当小鸟碰撞到障碍物或跌至屏幕最底端时,游戏结束。

逐步实现:

Step1:定义精灵类

为了方便实现小鸟和水管之间碰撞的检测,我们先定义一些精灵类,包括:

① 小鸟类

随着游戏时间的推移,小鸟应当具有更新自身位置的能力,即当玩家按下空格键时,小鸟向上跳跃,否则小鸟向下坠落。另外,为了使游戏场景更加真实,小鸟在向上跳跃或者向下坠落之前,应当先调整身体角度。具体代码实现如下:

② 管道类

管道分为管道体和管道头。管道头:

管道体:

可先简单定义如下:

显然,一个管道头和若干个管道体组成了一个管道障碍物,管道障碍物两两同列,两者之间留有一定的空间供小鸟穿过,就像这样:

因此,我们定义一个大的管道类,以便构建一个完整的管道障碍物,代码实现如下:

其中,更新管道的作用为通过管道的左移来实现小鸟不断右移的效果。

 Step2:实现游戏主循环

先初始化,载入图片、音乐、字体等文件,并定义一些必要的常量:

现在就可以开始定义游戏主循环了!游戏主循环的逻辑十分简单,先显示游戏背景,然后根据玩家的操作更新小鸟位置,自动更新管道位置,并通过碰撞检测以及小鸟的纵坐标来判断游戏是否结束,若游戏结束,则显示游戏结束画面。当然你也需要根据玩家通过的管道数量来实时更新玩家当前的分数,这一步需写在最后,否则分数会被管道所遮盖,这显然是不合理的,具体实现如下:

All Done!

更多

代码截止2018-08-05测试无误。

本系列文章相关文件中均提供了打包好的版本,无需环境搭建即可运行玩耍~

Python处理手写笔记

thbcm阅读(188)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

利用Python实现手写笔记的压缩与增强。

至于起因大概是:

这个内容很有趣。。。

——>

说了等于没说。T_T

相关文件

百度网盘下载链接: https://pan.baidu.com/s/1oagM2fbKUJXSiZ93S_Mszg

密码: 47ws

参考文献

链接:

https://mzucker.github.io/2016/09/20/noteshrink.html

作者:

Matt Zucker

主要思路

Step1:确定背景色

假定纸张颜色是扫描图像中最常出现的那一种颜色。

同时将8比特每通道消减至6比特每通道来增加背景色获取的可靠性。

Step2:分离前景色

将色彩从RGB空间映射到HSV空间来实现分离前景色的功能。

规则默认为:

(1)明亮度V比背景色大0.3以上;

(2)饱和度S比背景色大0.2以上。

满足其中一条即为前景色。

Step3:选择呈现色

相当于使用簇分析法解决一个色彩量化问题。

将原始24位每像素的图像转换成一个具有小数量代表色的图像。

主要使用K均值算法实现。

其他说明:

(1)默认情况下,程序会通过重新设置颜色的最大最小强度值为0到255,来增加最后调色板各色的艳丽度和对比度;

(2)程序默认情况下自动地根据输入文件名排序,关键字为数字。

开发工具

Python版本:3.5.4

相关模块:

Scipy模块、numpy模块、PIL模块以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

使用演示

全部功能选项:

基本功能使用:

py -3.5 Note_Processor.py + 待处理的笔记图片名

例如下图:

结果展示

笔记1:

结果图:

笔记2:

结果图:

更多

若对结果不满意,请自行在命令行窗口设置相应的参数,即不要使用默认值;

例如:

Python实现AI版贪吃蛇

thbcm阅读(227)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

利用Python简单地实现AI版的贪吃蛇。。。

just for fun…

没有用深度学习。。。

算法是由一个叫Hawstein的人在好多好多年以前提出,感觉很有趣,就花了点时间复现了一下他的想法。。。

至于效果。。。

看脸。。。

真的只是觉得他的想法很有趣,仅此而已,因为如果你想让蛇机械地充满整个空间,只需要让蛇一直走S就好了,但是这就变得很无趣了。。。

相关文件

百度网盘下载链接: https://pan.baidu.com/s/1KPAV6FKLUFj11myoVjzQ2Q

密码: gb7k

主要思路

(1)蛇每走一步,就使用BFS计算游戏界面中每个位置(蛇身除外)到达食物的最短路径长;

(2)将蛇的安全定义为蛇是否可以跟着蛇尾运动,即蛇头和蛇尾间是否存在路径;

(3)蛇每次行动前先利用虚拟的蛇进行探路,若虚拟的蛇吃完食物后是安全的,真蛇才行动;

(4)若蛇和食物之间不存在路径或者吃完食物后并不安全,就跟着蛇尾走;

(5)若蛇和食物之间、蛇和蛇尾之间均不存在路径,就随便挑一步可行的来走;

(6)保证目标是食物时蛇走最短路径,目标是蛇尾时蛇走最长路径。

不足之处

由于食物是随机出现的,若虚拟的蛇跑一遍发现去吃食物是不安全的,真蛇就不会去吃食物,而是选择追着蛇尾跑,若一直如此,就陷入了死循环,蛇一直追着蛇尾跑跑跑。。。

直到你终止游戏为止。。。

开发工具

Python版本:3.5.4

相关模块:

pygame模块以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

运行方式

在cmd窗口运行AI_snake.py文件即可。

结果展示

动图一直上传失败。。。

所以随便截几个图吧~~~



更多

(1)为了保证代码简单易懂,所提供的代码冗余度较高(比如进行了不必要的重复计算),有兴趣者可对代码进行优化;

(2)相关文件中也提供了普通版本的贪吃蛇游戏(Normal_snake.py)。

联系我们