树莓派整蛊之”突然出现的蜘蛛”

上次发了一个制作整蛊坐垫的文章,貌似有些朋友还不过瘾,那咱们这次就来个升级版 —— “突然出现的蜘蛛”。

我们将制作一个吓人的蜘蛛盒子,让里面的蜘蛛突然出现在人们面前,并发出恐怖的声音。

在启动项目之前,你得先知道:

1、如何用激光切割机制作符合规格的箱子(放蜘蛛和其他道具用)

2、如何控制gpio输入和输出设备

4、如何为了特定目的用函数将命令组合在一起

5、如何使用pygame播放声音

6、如何利用脉宽调制(PWM)信号来控制伺服电机

所需电子硬件:

1、圆按钮

2、伺服电机

3、扬声器

4、LED灯

5、330欧姆电阻器

6、电池组或充电宝

7、树莓派

制作盒子:

要制作这个盒子,我们建议用3毫米厚的胶合板进行激光切割。最简单的方法是找一个本地的创客/黑客空间,问他们是否可以帮助。

许多学校现在也有小型激光切割机,所以你可以问问相关的设计和技术部门是否可以提供帮助。

如果找不到激光切割机,也可以用硬纸板做这个盒子。

盒子的设计图:

https://github.com/IoToutpost/grandpa-scarer/tree/master/en/resources

盒子图形的切割设置:

红色:描边即可

黑色:直接切割

所需切割面积为450 x 400毫米。如果你的激光切割机床比较小,那么用Inkscape或Adobe Illustrator编辑一下,把它分成两张。

由于激光切割机型号较多,且操作起来有一定危险性。不建议新手去摸,最好把该工作交给熟练工。

激光切割出盒子

把盒子粘合:

用热胶枪把盒子的边粘在一起。如果胶水到处都是,不要担心。没有人看到盒子里面。

附上铰链:

用两个铰链把盖子的一侧固定住,在盒盖附近形成活动连接,螺丝一定要拧紧。

用好伺服电机:

接下来我们要用到伺服电机,其内置控制电路,最大可调到180度。

系统会通过非常快的速度打开和关闭一个GPIO管脚来控制伺服电机。脉冲的长度(也称为脉冲宽度)控制着电机指向哪个方向。

这些信号被称为脉宽调制(PWM),允许你做各种各样的事情,从LED调明暗到驱动电机。

树莓派不支持以标准方式生成这些PWM信号,因为它没有专用的时钟系统。

不过在这个项目中,我们依然使用软件生成PWM信号。这种方法的缺点是信号并不完美,因此伺服电机可能会来回抖动。

伺服电机接线

该电机有三个引线。通常,棕色/黑色的是地线,红色的是5v(微型电机供电),黄色/橙色是信号。我们将使用公对母跳线连接电机的母引脚和树莓派的GPIO引脚。

首先将电机的棕色/黑色线连接到树莓派的引脚9。然后将伺服电机的红线连接到树莓派的引脚2。最后,将电机的控制线(黄色/橙色)连接到Pi上的引脚11。

这是接线示意图:

接线按钮

为了控制蜘蛛出现的时机,你需要一个物理按钮。

首先,你要将两根导线的一端分别接到按钮的两个管脚上。这两根导线尽量长一点,如果你不想站在盒子边上操作的话。

两根导线的另一端,要分别接到树莓派的GPIO引脚上。一根线从按钮连接到Pi的第6引脚,另外一根线从按钮连接到Pi的第18引脚。

记得用胶带之类的固定好,然后试一下是否能通。

然后开始敲代码:

import RPi.GPIO as GPIO
import time
import pygame
import random

GPIO.setmode(GPIO.BOARD)

GPIO.setup(11, GPIO.OUT)
GPIO.setup(16, GPIO.OUT)  
GPIO.setup(18, GPIO.IN, GPIO.PUD_UP)
p = GPIO.PWM(11, 50)
p.start(0)

def waitButton():
    GPIO.wait_for_edge(18, GPIO.RISING)

def sound():
    sounds = [
        "Female_Scream_Horror-NeoPhyTe-138499973.mp3",
        "Monster_Gigante-Doberman-1334685792.mp3",
        "Scary Scream-SoundBible.com-1115384336.mp3",
        "Sick_Villain-Peter_De_Lang-1465872262.mp3",
    ]

    choice = random.choice(sounds)
    
    pygame.mixer.init()
    pygame.mixer.music.load(choice)
    pygame.mixer.music.play()

    # Wait for the sound to finish
    while pygame.mixer.music.get_busy():
        continue
    time.sleep(0.3)

# Main program section
while True:  # Forever loop (until you hit ctrl+c)
    try:
        waitButton()           # Wait until the button is pushed
        p.ChangeDutyCycle(3)   
        time.sleep(0.1)        # Allow the servo to move
        sound()                # Play a sound file
        time.sleep(2)          
        waitButton()           # Wait until the button is pushed
        p.ChangeDutyCycle(12)  
        time.sleep(1)          
    except(KeyboardInterrupt):  
        p.stop()               # Stop the PWM
        GPIO.cleanup()         # Resets the GPIO pins

播放声音:

当你按下按钮时,你的蜘蛛就会跳出来,然后发出很大的声音。

可是树莓派没有任何内置扬声器,所以你要使用一个小型便携式扬声器,把插头塞到到Pi的3.5毫米音频插孔即可。

完整装箱:

现在你需要把所有的电子设备都装进盒子里。因为树莓派是整个项目的大脑,所以你要先把它装上去。

如果你是按上面设计图纸制作的盒子,你应该可以看到一个激光雕刻的侧边区域,那里有四个螺丝固定孔。用3D打印垫片和M2.5螺丝将树莓派固定在这个区域。

蜘蛛要选好,与盒子的大小要匹配。

将蜘蛛绑好线后,反着放进盒子,把伺服电机固定在盒子的开盖处,等会要用它扣住盖子。

合上盖子,把按钮到树莓派的两根线绑到一起。

最后,把盒子安全的固定到房檐或门框上。别挂在不受力的地方。千万别按钮一按,蜘蛛没出来,盒子掉下来砸到人。

祝大家玩的开心~

PS:如果要加入预警提示可以在电路中加LED灯,再串接一个330欧的电阻,以便在蜘蛛出现前先闪一下。

相关代码和设计:

https://github.com/IoToutpost/grandpa-scarer/

素材:Raspberrypi.org

编译:IoT前哨站

十行代码就能写个整蛊玩具

有时候看国外的街头搞笑节目,经常会看到一种会出声的坐垫。

当不知情的人坐上去时候,椅子上的坐垫便会发出各种奇怪的声音。让人还误以为是自己造成的。

其实做这个并不难,如果用我们这套方法,可能只要十行代码就搞定了,而且还可以指定任意的音乐。

所需工具:

1、树莓派

2、小音箱

3、鳄鱼线和公母跳线各两条

4、几个夹子

5、铝箔

6、硬纸板

7、铜带和海绵若干

开始制作:

从硬纸板上剪两个圆圈,然后把铝箔纸粘在圆圈上。

用一些铜带把铝箔纸和圆纸板的边缘连接起来,做成两个盘子。

把海绵切成长方体,把它们粘在其中一个盘子的箔纸上,这样箔纸就不会互相接触,除非有人坐在盘子上。

它应该是这样的:

把两个盘子叠在一起,铝箔片相对而置。铜带部分不要接触。

你现在有一个“垫子”了。你可以把两个盘子粘在一起,或者用夹子或回形针,这样你就可以测试你的坐垫是否工作正常,并且很容易调试相关硬件。

接下来是树莓派插线位置:

将鳄鱼夹一头接在纸板的铜带部分,然后将另一头夹在所连接的跳线的外销上。两条线同样操作。最后的样子是这样。

硬件部分完成后,先连到树莓派上测试一下声音播放。

接好小音箱,然后在命令行播放你事先准备的wav格式音乐。比如:

aplay burp.wav

确定可以听见音乐之后,开始编码。用Python比较简单,十行就搞定了。

import os,random
from time import sleep
from gpiozero import Button
button = Button(2)

trumps = ['ben-fart.wav','ca-fart.wav','marc-fart.wav']

while True:
    button.wait_for_press()
    parp = random.choice(trumps)
    os.system("aplay {0}".format(parp))
    sleep(2)

三个音乐文件都要提前准备好,最后运行一下看看是否能跑起来。

小心地把“坐垫”放在沙发或椅子上。接好电源(最好用电池组),让程序保持在运行状态。然后……

如果整蛊成功,别忘记回来点个赞。

来源:Raspberrypi.org

编译:IoT前哨站

WebThings Gateway附加组件:扩展网关的功能

除了常规功能以外,WebThings Gateway还有一个附加组件系统。你可以用它来扩展网关的功能。

默认情况下已安装Web Thing、Zigbee和Z-Wave等组件,足以支持大量的商业设备。但是,如果有其他不同类型的设备要加进来。你会需要附加组件来增强对它们的支持。

根据需要找到并安装更多附加组件:

从“设置”菜单中选择“附加组件”。

如果首屏没看到你想要的组件,请单击右下角的“(+)”按钮浏览附加组件列表,然后选择“+ Add”以启用任何附加组件。

例如,你家里有TP-Link或HomeKit兼容的设备,你可以安装它们的附加组件,然后发现这些设备,并且配对。以便它们由你的IoT网关管理。

有些附加组件需要配置才能正常工作(例如Pulse、Weather、ONVIF)。另一些则在添加后立即工作(例如Virtual Things)。

适配器

适配器页面显示当前安装并激活了哪些插件。转到“附加组件”页面,你可以添加或删除系统中适配器。

新的组件将继续被开发,以便能管控更多新的设备。因此请定期检查以扫描列表中的附加组件。你可以在网关开发站点的issues选项卡中提交对额外设备支持的请求。

实验中的功能

你可以在“experiments”选项中启用智能助手和日志记录等实验中的功能。

从“设置”菜单中选择“实验”,然后勾选“启用智能助手”和“日志”。

使用智能助手

一旦启用,智能助手页面就会在主菜单中出现。它允许你用语音和消息命令来控制家里的设备。无论你是使用语音还是输入文本,都可以达到同样的效果。

Web页面会显示你最近发出的打字和语音命令,以及命令的结果。如果你所说的命令被误解或者没说全,请再试一次。记得对麦克风大声清晰地说话。

你可以给它一些指令,比如“打开厨房的灯”。它会回应你,并确认你的动作。到目前为止,它能够理解一组基本的命令来打开和关闭设备、设置级别,设置颜色和色温。

当你第一次点击麦克风图标时,你的浏览器将请求允许使用麦克风。在弹出对话框中,点击“记住这个决定”复选框,然后选择“允许”。

注意,在0.8网关版本中,基于浏览器的语音命令调用的是谷歌语音API,因此音频是在云端处理的。如果你在智能助手的文本框中输入一个命令,那将直接在本地处理,不需要连接到谷歌。

使用日志

一旦启用,日志页面将在主菜单中可见。单击右下角的加号图标,选择要记录的设备、属性以及要存储(日志数据)的持续时间。任何已连接的智能设备都能被记录,并在配置屏幕上可见。

好了,Webthings Gateway的高级功能差不多就到这里。其他的功能大家可以自行探索。

素材:iot.mozilla.org

编译:王文文

WebThings Gateway平面图:让智能家居的位置一目了然

在使用 WebThings Gateway 管控家里的智能设备以后,大家是不是觉得生活比以前方便一些了?

如果你设备少,或者房间不多。那倒是能记得各个设备的不同位置。

但要部署的智能设备和房间很多,怎么直观的区分它们在哪些房间呢?

我们来看一下 WebThings Gateway 的“Floorplan”,平面图功能。

该功能可以让你家中的所有智能设备位置,完全反映到 WebThings Gateway 页面上,你可以看到你家智能家居的整体布局,以及各区域设备的开关状态。你仍然可以单击图标来操作它们,或者查看该对象的详细视图。

创建一个平面布置图

首先你要先绘制屋子的平面图,并保存为数字图像。你可以用手画一个,然后给它拍照,或者使用illustrator工具(如果你用智能手机拍摄平面图,你可以直接从手机的浏览器把图片上传到你的网关上) 。

提示:使用 Inkscape 或 Sketch 之类的工具可将数字绘图保存为带有白线和透明背景的svg文件,以获得极简外观。

点击“平面图”页面右下角的铅笔图标进入编辑模式。将会出现一个“上载文件”按钮,选择要上载的平面图。

在平面图上传完成后,确保你仍然处于编辑模式,然后将插座和灯泡等图标从页面顶部拖到平面图上。单击右下角的勾号,搞定。

这下房间再多也不用担心了。设备在什么位置,是否在工作,一目了然。

素材:iot.mozilla.org

编译:王文文

怎样用WebThings Gateway管控你的智能家居

普通计算机联网要普通网关,物联网设备联网要用物联网网关。

物联网网关,作为一个新的名词,在物联网时代将会扮演非常重要的角色,它将成为连接感知网络与传统通信网络的纽带。作为网关设备,它可以感知网络与通信网络,以及不同类型感知网络之间的协议转换.既可以实现广域互联.也可以实现局域互联。

我们这次就在树莓派上搭一个物联网网关。

WebThings Gateway是一款面向智能家居的物联网网关,来自国际知名的Web浏览器厂商Mozilla。

安装所需要的核心零件:

1、 树莓派

2、SD卡

3、支持ZigBee或Z-Wave协议的USB适配器

WebThings Gateway 镜像地址:

https://github.com/mozilla-iot/gateway/releases/download/0.8.1/gateway-0.8.1.img.zip

安装步骤:

1、刷卡

2、插入USB适配器

3、通电

注:第一次启动可能要等2-3分钟,后面会快一些。

启动系统后,你会在Wi-Fi连接中看到一个名为 “WebThings Gateway XXXX” 的SSID,连上去。

此时会自动跳转到网关的Web管理页面,如果没有自动跳转,就在浏览器里输入“http://192.168.2.1”

然后你必须再次设置Wi-Fi连接,以便物联网网关能接到你家无线路由器上。

将Webthings联网后,系统会问你要不要创建个子域名。

下一步就是添加设备的环节了。

你可以把家里的智能灯泡、插座、门锁……都加进去。

一般的添加过程:

选择要添加的设备,并为其配对。这方面Zigbee和Z-Wave的都差不多。

灯泡拧入(配对时应点亮灯泡),插头插好。

电池驱动的设备,如门/窗传感器、运动探测器、按钮、调光开关、检漏器、温度传感器等等,也都要先通电。

远程控制和规则设置:

添加完相关智能设备后,你可以在手机或平板电脑上直接控制它们。在浏览器中输入WebThings的域名或IP,然后用你设置的用户名密码登录即可。

也可以在“规则”栏里面做设置,比如你想让卧室灯在晚上10点后自动熄灭。

当然,你也可以随时删除它们。

好了,开始享受物联网时代的智能家居生活吧!下一篇文章我再给大家讲WebThings的高级用法。

作者:王文文

在文本冒险游戏中加入道具

上次发了一篇“Python写文本冒险游戏的要点”之后,有的朋友说形式太简单了,能不能在游戏中加入道具?

既然如此,我们这次就来给它升一级。

很多人都玩过“刺激战场”类的游戏,进一个房子就拼命捡枪捡子弹什么的。这些都是游戏人物的重要道具。

下面我们就继续以《回村》为例子,在其中加入道具拾取和过关判定。

先把游戏环境概念图画出来。

1、森林里有牛肉

2、小山里有红酒

3、湖泊边有强盗

获胜判定:

带着牛肉和红酒,避开强盗,回到村庄即获胜。否则游戏继续。

好了,现在就在代码中更新道具和强盗。

代码地址:

https://github.com/IoToutpost/Python_game

Gohome.py是之前的版本,Gohome_v0.2.py是我们加了道具的版本。

需要注意的是,我们现在用字典来存储地点、方向和道具了。这样对于数据读写来说会更方便。

Python中的字典是啥?

字典是Python中唯一内建的映射类型。字典中的值并没有特殊的顺序,但是都存储在一个特定的键(Key)里。键可以是数字、字符串甚至是元组。

字典由多个键及与其对应的值构成的对组成。每个键和它的值之间用冒号(:)隔开,项之间用逗号(,)隔开,而整个字典由一对大括号括起来。字典中的键是唯一的,而值并不唯一。

好了,跑一下试试。

到此,一个简单的RPG游戏算是做好了。

如果想让游戏更好玩,要加的东西还很多。比如战斗元素,生命值,时间……探索无止境。

注:这个系列的文章是写给新手的,高手就不用看了哈。当然,欢迎指导,欢迎分享更有意思的版本。

用LAKKA和树莓派做复古游戏机

树莓派可以做复古游戏机和街机,想必大家都已经听说过了。

包括RetroPie、Recalbox和Lakka在内的几个游戏机系统,在业内都是小有名气。

我们这次就用 树莓派3b+ 和 Lakka 来做一台。

Lakka在树莓派3b+上的安装

在树莓派3b+上安装 Lakka 非常简单。安装过程与以前的 Lakka 版本完全相同。只需前往官方的 Lakka 网站,下载合适的镜像,并将其安装到 microSD 卡。然后用安装好的 microSD 卡插入树莓派3b+。

Lakka for 树莓派2/3版本下载地址:

http://le.builds.lakka.tv/RPi2.arm/Lakka-RPi2.arm-2.2.2.img.gz

Lakka启动后的界面:

如果你们在屏幕上看到如下画面,基本就算装成功了。第一件事,先进“设置区”把 Wi-Fi 连上。看到自己 SSID 边上有个“Online”就是连成功了。

注:如果想查看 IP 什么的可以进“System Information”菜单。

添加游戏

首先要进“Services”菜单把 Samba 启用,不然你没法往里面拷游戏。

生效之后就可以往里面拷游戏了,在 Windows 网上邻居里找到它的共享目录。

找到 ROMs 目录,然后把你能找到的游戏镜像拷贝进去。接着,你要回到游戏机操作界面,选择“Scan This Directory”。让 Lakka 知道你的游戏镜像对应的是哪些模拟器。屏幕底部会提示你扫描的进度。

然后你就可以“load content”加载游戏了,系统会自己调用相关模拟器解析。完成后,您将在菜单的右端看到一个新选项卡。

开始玩吧

转到刚刚创建的选项卡,你会在列表中看到装好的游戏。

选择并运行,看到画面出来的一刻。也就意味着你的游戏机已经做好了。

目前测下来是 红白机镜像 的识别和运行还不错,FB Alpha 类的稍差。

关于 Lakka 背景颜色和语言环境都可以自己调,比如我自己用的是一个蓝色背景的中文环境。

关于一般操作,键盘就够了。但如果想玩的开心,还是去买两个手柄吧, Xbox 和 PS 的都可以。

附注:

虽然树莓派3b+的速度比树莓派3快,但性能并没有特别大的增长,主要改进集中在网络方面。

有些游戏系统可能还没支持树莓派3b+,但 Lakka 很早就兼容了。也就是说,上面那个镜像同时支持树莓派2、3、3b+,大家可以放心刷。IoT前哨站已经帮你们挨个试过了。

相关视频讲解(英语):

http://v.qq.com/x/page/n0864t98yof.html

编译:IoT前哨站

素材:Lakka.tv

只要有想象力,打印机都能做游戏

不知道为什么,文本冒险游戏最近频频被人提及。这不,现在又出来一个基于实时打印的文本冒险游戏 —— Quest Smith。

这位脑洞较大的创客名叫 Bekir Dağ ,他用微型打印机和树莓派做出了这个手持游戏设备。

关于文本冒险游戏的背景知识:

1975年左右,程序员兼业余洞穴探险者 威尔·克劳瑟(Will Crowther)编写了第一个文本冒险游戏 —— Adventure。最初名为 ADVENT,因为在他使用的操作系统中,文件名不能超过六个字符,后来被命名为《巨大的洞穴冒险》 —— Giant Cave adventure。

玩家需要阅读周围环境的描述并从一组选项中进行选择,或者输入下一步并希望游戏能够理解玩家提及的内容。

Bekir Dağ 的创新之处是他把一个文本冒险游戏做成实时打印剧情了。玩家用 Yes 和No 两个按钮来决定游戏的走向 。

Quest Smith是个啥?

在柏林的一家游戏博物馆里,Bekir Dağ 看到了一个手持式游戏设备,于是他决定用树莓派 Zero W自己做一个。

他设计了Quest Smith 的躯壳,用3d绘图软件输出了 STL 文件并在
Thingiverse 网站上免费分享。

下载地址:

https://www.thingiverse.com/thing:3471217

树莓派 Zero W 与热敏打印机、电池和各种按钮紧密贴合在一起。由安装在外壳上的太阳能电池板供电,所有组件都连接到 TP4056 板,该板允许电池为树莓派供电。

硬件材料:

1、Raspberry Pi Zero Wireless 一个

2、GOOJPRT 热敏打印机一个

3、五伏电压升压模块 一个

4、 TP4056 板 一个

5、 18650电池 一个

6、瞬时触碰式开关

7、 Micro usb 转大口接头

8、螺钉 3.5 x 20毫米 四个

9、 滑动开关 一个

10、太阳能电池板60 x 60毫米 5.5V

另外要准备热熔枪、电烙铁和3D打印机。

相关的代码:

https://github.com/IoToutpost/quest_smith

1、系统需要安装的组件

sudo apt-get install libpython3-dev libpython3-stdlib libqt5printsupport5 php7.0-mbstring python3-rpi.gpio python-rpi.gpio python-setuptools python-dev build-essential

2、安装composer

步骤在此: https://getcomposer.org/download/

3、安装两个python库

pip install setuptools
pip install locustio

4、拉取代码

mkdir quest_smith
cd quest_smith
git clone git@github.com:bekirdag/quest_smith.git .
composer install

5、 在重新启动时,通过在crontab上添加一行来运行 Quest Smith 脚本

crontab -e
@reboot sudo /usr/bin/screen -dmS story-game /usr/bin/python3 /home/pi/thermal/push3.py

6、 再次向 crontab 添加另一行代码,以便在每次重启时更新软件,这样你的故事就会是最新的。

@reboot sudo cd /home/pi/quest_smith && sudo git pull origin master

Quest Smith 目前仍在开发中。虽然用户现在可以构建并开始玩这个游戏,但作者呼吁社区用户提交他们自己的故事(有好的分支剧情就发过去)。

Bekir Dağ 说:“每个关卡都需要两个版本的故事,这使得可能性呈指数级增长。所以一个人完成整个故事线对我来说是非常困难的。比如为了让玩家达到9级,我们需要编写1023个故事部分。如果你能帮我,那就太好了! ”

如果想看这个设备是怎么玩的点这里:

http://v.qq.com/x/page/y0846fbymnz.html

相关阅读:

Python写文本冒险游戏的要点

https://mp.weixin.qq.com/s/jtxOqDlYLt3VjdsnLXfdAg

新手可以在研究这篇文章的同时学会面向对象编程。

来自:Raspberrypi.org

编译:王文文

让相机根据GPS定位自动拍照

你是否厌倦了那种每到一个地方就要停下来摆pose的自拍?

但是在参观名胜古迹或知名景点的时候,还是希望能留下一些自己的照片做留念?

来看看一个名叫 Estefannie 的妹子发明了什么 —— 根据 GPS 定位来判断是否要拍照的GoPro相机。

具体是什么意思呢?有些妹子喜欢抓拍和自然拍摄,但要么走着走着错过关键景点,要么拍来拍去抓不到什么重点。让路人拍?人家也不一定愿意帮忙。

如果能有一个发现自己进入知名景点(指定地点)就自动拍照的装置,那就太省心了。旅途中的美好一个都不落下。

Estefannie 用Raspberry Pi 3、GPS模块、充电宝和带杆子的 GoPro,创建了PAGCPPT,可以在系统里预置伦敦各个景点的GPS坐标,到地方就自动触发拍摄。无需人工干预。

依靠尼龙搭扣和热胶,她把这个装置固定在背包上,然后又做了一些编程和设置,让她在城里晃悠的时候可以拍点照片。

白金汉宫到了,来一张

具体材料:

1、Raspberry Pi 3 Model B

2、GPS 模块 U-blox NEO-6M with 3m Active Antenna (STM32 51 )

3、PNY 7800 充电宝

4、 GoPro HERO 系列摄像头

5、GOPRO 3-way 三向摄像机手柄相机支架

硬件配置:

把 GPS 模块连接到树莓派上,树莓派通过 WiFi 向 GoPro 发送信号。

GPS:不用焊接,把GPS模块插到Raspberry Pi 的 USB 口上即可。

WiFi:打开 GoPro 的 WiFi ,让树莓派和它连接起来。WiFi SSD 由 GoPro App 配置。

树莓派:用那个充电宝供电。

都准备好了!你可以把 GoPro 手臂加到任何你想要的地方,比如旅行背包。

软件配置:

Estefannie 整理了一张她想去的伦敦景点(对应坐标)清单。然后用Python3写了一个脚本来计算她当前坐标和预置景点坐标之间的距离。

程序中比较关键的是 GoPro API库,基于这个库稍微做些开发,GoPro相机就可以在GPS预置地标(如塔桥、哈利波特魔法站台)半径10米以内的任何地方自动拍照。

你可以在树莓派上执行如下命令来安装它:

pip install goprocam

GPS的启动命令比较简单:

gpsd /dev/ttyACM0 -F /var/run/gpsd.sock

最后一步执行代码:

python3 /home/pi/LondonGPS.py 

代码地址:

https://github.com/IoToutpost/GoPro/

只要她打开电源(充电宝),她的树莓派就会在启动时运行脚本,并检查她的坐标。在预置景点内就自动拍照,从而满足 Estefannie 在游览名胜古迹时无需求人,也无需刻意摆造型就能拍到合适的照片。

当然,是妹子终究会有停下来认真拍照的时刻……比如这张。

项目作者 Estefannie 在纽约公立图书馆

相关视频链接:

http://v.qq.com/x/page/p0845yexsaw.html

素材:Raspberrypi.org
编译:王文文

Python写文本冒险游戏的要点

2019年伊始,游戏开发者Andrew Gillett在《Wireframe》杂志上介绍了如何用Python开发文本冒险游戏,以及在此过程中应该避免哪些陷阱。

最后他还给了一段示例代码,让人看完之后忍不住跃跃欲试。

文本游戏的形态

用BASIC语言编写游戏的经历

Andrew Gillett 写的第一款游戏叫做“Pooh”。

1982年9月,他4岁,ZX Spectrum 家用电脑刚刚发布,可以接到电视上玩游戏,这已经够不可思议的了,但它还内置了一种叫做 BASIC 的语言,以及一本讲解如何编程的手册。于是这便开启了他的创作生涯。

这个 BASIC 写成的游戏非常简单,玩家的任务是带一个婴儿去上厕所,没有障碍,也没有敌人,如果你试图走出屏幕(边界),该游戏进程将停止并弹出一条错误消息。婴儿和厕所都是用文本符号表示的。Andrew Gillett 当时不知道如何创建一个比 Pooh 更复杂的图形游戏。他甚至不知道如何在屏幕上显示有图形的角色。

文本冒险游戏

于是,Andrew Gillett 开始专注于编写文本冒险,即游戏用文字向玩家描述场景。

比如“你在一个舒适的隧道般的大厅中,你可以看到一扇门。”(这里在用1982年的《霍比特人》举例)

1982年的游戏《霍比特人》

玩家输入诸如“穿过门”或“用剑杀死妖精”等命令来推进游戏。

“虽然这款游戏相对来说比较容易编写,但我却以最糟糕的方式实现了它。这个游戏的代码本质上是一个巨大的IF语句列表。每个房间都有自己专门的一组代码,它们会打印出房间的描述,然后检查玩家输入了什么。这种‘硬编码’导致代码比实际需要的长得多,并且难于维护。” Andrew Gillett 说道。

正确的方法应该是将代码和数据分开。

每个房间有几组与之相关的数据,比如一个ID号码,空间的描述(你是在一个小山洞),一组可以在空间中找到的对象,以及一组空间的号码,这些号码表明如果玩家试图朝某个特定方向移动,他们将会到达哪里。

例如,如果玩家进入“北面” ,第一个号码可以显示玩家去具体哪个地方了。然后主程序会跟踪玩家当前所在的空间,并查找该空间对应的数据。有了这些数据,主程序就可以根据玩家输入的命令采取适当的行动。

来练个手

下面链接中的代码展示了如何在 Python 中实现文本冒险(入门)。

https://github.com/IoToutpost/Python_game

(注:以下内容基于上述链接的“text-adventure_original.py”)

用来演示的 Demo 中没使用数字 ID 和数组,而是使用了字符串 ID和字典数据结构。其中每一段数据都与一个ID或“键”相关联。

这是一个在 Spectrum BASIC 中没有提供的方便选项。

我们首先创建一个玩家可能移动的方向列表。然后创建指定每个位置的属性类 Location。我们存储名称、描述和字典数据结构,该结构存储当前位置,并链接到的其他位置。例如,如果你从树林向北走,你就会到达湖边。

该类包含一个名为 addLink 的方法,该方法在检查指定的方向和目的地存在后将条目添加到链接位置字典中。 

在类定义之后,我们创建一个名为 locations 的字典。它有两个条目,键是 woods 和 lake,值是 Location 类的实例。

接下来,我们在刚刚创建的每个位置上调用 addLink 方法,这样玩家就可以在它们之间行走。设置阶段的最后一步是创建变量 currentLocation,指定玩家从哪里开始游戏。

然后我们到达主游戏循环,它将无限重复。我们首先显示当前位置的描述,以及玩家移动的可用方向。然后我们等待玩家输入命令。

在这个版本的代码中,唯一有效的命令是方向。例如,在开始的位置键入“north”就可以来到湖边。当输入一个方向时,我们检查以确保它是当前位置的有效方向,然后将 currentLocation 更新到新位置。当主循环重新开始时,将显示新位置的描述。

写在最后

由于 Andrew Gillett 的原始版本比较抽象,为了帮助大家理解,IoT前哨站的 Medivh 和 Winter 在这个基础上写了中文版的 《回村》,大家可以拿回去自行拓展。

《回村》0.1版本

两个版本都放在 Github 上了,欢迎提建议。如果 Fork 了更有意思的版本,记得通知我们。

原文:Building a text adventure

来自:Wireframe 第6期

编译:王文文

转载请注明出处。