STEPN 新手入门及进阶

Posted Web3践行者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STEPN 新手入门及进阶相关的知识,希望对你有一定的参考价值。

先上STEPN中文白皮书

STEPN中文白皮书-V2.3 截至2月19日 - 知乎大神的作品,官翻级别译本。 https://zhuanlan.zhihu.com/p/467799815

从0到第一次跑步

第一步 下载STEPN APP

苹果手机需要切到非大陆区的苹果商店,比如美区账号。具体账号可以直接去淘宝搜美区苹果购买,一般不到10块钱吧。

安卓手机如果有Google应用商店可以直接下载,如果没有,需要搞一个apk安装包,具体的可以在各种群里问大家要你手机对应品牌的安装包,听说华为的似乎和别的不一样。

第二步 注册登录

用邮箱注册登录,目前的状态是需要邀请码的。目前的邀请码并不难获得,大家可以直接在群聊,比如官方discord或各种微信群里面管别人要。填进去以后就OK了。

之后就进入到主界面了,这时候,你还没有任何鞋子,还不能开始跑步。

​点击右上角的钱包图标,进入后点击上方的“Wallet”,之后会提示让你创建新钱包 点“Create a new wallet”。

​然后输入两次你自己设定的密码,会收到一组12个助记词(在区块链中很常用的恢复方式),这组词非常重要,如果丢失可能会无法找回你的财产。建议不只是截图,更要手动抄写下来,防止丢失。之后还会要让你按照原顺序,点击词语,把他们复原位置。

助记词这里通过后,你就成功的创建了你自己的钱包,并且拿到了你的sol地址。点击这个地址就可以复制了。

第四步 获得你的第一双鞋

获得鞋子有三种方式:

  1. 由别人直接转鞋子给你

  2. 自己在内部商店购买鞋子

  3. 自己在内部商店购买鞋盒,开出鞋子

第一种方式,你可以直接提供自己的sol地址给对方,对方就可以往这个地址里面转一双鞋给你,你把它transfer到spending账户就可以使用了。注意:不仅对方要转给你鞋,还要转一点点sol作为转到spending账户的手续费。

第二种和第三种方式,你需要往自己的sol地址中转入sol,比如你要买一双灰鞋,去商店里面看好价格就可以转差不多价格的sol进来。然后自己去买对应的物品即可。

第五步 等待能量恢复

刚买到鞋子后,是 不能马上跑步的,你需要等待能量恢复,转进来的鞋子还有24小时冷却。下图的红色框是你的能量和总能量上限。当你有一定能量恢复之后就可以开始运动了。

能量决定了你能运动多久,每分钟消耗0.2能量,能量消耗完就不会获得gst收益了。

第六步 开始运动!

一定要确保自己在室外!!要保证自己上方尽量不要有遮挡物,信号良好,尽量把Wi-Fi关闭防止不慎连接到公共Wi-Fi。

点击主页面下方的START按钮,倒数3秒后就会开始运动了。第一次运动时,一定要注意运动界面的几个重要信息。

最上方的状态一定要保持是绿色的walking或者running,当变成moonwalking请马上停下来检查自己的信号,或者重启app。因为在moonwalking状态下是没有收益的,但是会白白消耗你的能量点!

GPS信号格尽量满格,否则也会影响收益。

最后关注你的实时速度,和你的鞋子要求的速度尽量匹配,在速度范围的中间最好。比如我的jogger速度范围是4-10km/h,我用6-7左右的速度收益最高。

大概在运动的每分钟的10或20秒时会结算上一分钟的收益,你可以看到金币数的增加。

当右上角的能量消耗完以后,你就可以停止运动了,先点击暂停,再长按停止,这次运动就结束了,你就可以在钱包看到自己本次运动的收益了!

能量系统

STEPN设计的能量系统是最容易让玩家产生疑问的。首先,用户的能量值,每6小时回复上限的25%,直到恢复满为止。下次的恢复时间在主界面清晰的写出来了,比如如图能量上限是10,现有能量2.5,下次(5h23min后)恢复总能量的25%,就是2.5点。

​具体能量上限的计算方法不是线性增长的,拥有一双灰鞋能量上限是2点,2双灰鞋也是2点,只有到3双鞋才会增加到4点。同理3-8双的上限都是4,到9双才增加到9点。每个能量点的运动收益时间是5分钟,具体见下图。

运动鞋类型

​最佳收益速度是走路鞋差不多是在3-4km/h左右,慢跑鞋是6-7km/h,快跑鞋是10-12km/h。

总结下来,如果希望获得最佳收益,走路鞋适合散步速度,慢跑鞋适合快走的速度,很搞笑的是我慢跑到8左右的速度,反而收益很低,只能快走。然后快跑鞋要跑到10以上,否则收益会掉。

同样效率属性的前提下,走路鞋<慢跑鞋<快跑鞋<全能鞋,但是差别也没有很大,大概每个差5%左右吧。各位还是选择适合自己使用场景的鞋子,如果速度不符合,收益会掉的很多。很多人反应runner跑不动,不常运动的朋友一定慎重,身体第一!

对自己运动能力没有概念的朋友,可以不带鞋直接跑,试试速度。

鞋子的属性

每双鞋都有四个属性:效率(efficiency)、运气(Luck)、舒适(Comfort)、弹性(Resilience)。对于新手或打金专用,建议升级后只加效率和弹性,效率:弹性比例大约4:1。

具体每项属性作用:

  • 效率:影响GST收入,效率越高,赚的GST越多

  • 运气:会影响宝箱掉落和开出宝石的概率,不过一般单次运动能量消耗大于5才会有掉落

  • 舒适:暂时还没用,以后GMT上线后会有用

  • 弹性:弹性越高,鞋子损耗越小,每次运动后维修的成本越低

可以直接用这个平台来计算预估收益和模拟打金加点,简洁好用:

STEPN GuideA powerful tool for determining strategy and many more in STEPNhttps://stepn.guide/

运动之后会产生鞋子损耗,所以需要进行修复,修复需要花费GST。如果到了弹性低到50,则效率下降到90%;弹性20时候,将下降到10%。鞋子等级越高,修鞋的成本会越高,所以建议每次修完再升级。

鞋子稀有度

鞋子NFT有五种稀有度:普通(Common,对应编号灰色,俗称灰鞋)、罕见(Uncommon,对应编号绿色,俗称绿鞋)、稀有(Rare,蓝鞋)、史诗(Epic,紫色)、传奇(Legendary、橙色)。后面两个在短时间内还不会开放。

​除了初始属性的差别,还有一个很重要的差别是,灰鞋每升一级有4个自由分配属性点,绿鞋是6点,蓝鞋是8点。对应到最高升级到30级,差别还是很大的。

对于挑鞋子的好坏可以参考这张图:

​一般来说如果是新手挑赚gst的打金鞋,只需要注意efficiency和resilience两个属性就可以了,挑这两个属性尽可能高的鞋子,价格也没必要比最低价(地板价)高太多。

一般我的选鞋方式是:灰鞋高于地板不超过1sol,绿鞋不超过5sol。因为对于快速回本的平民玩家,高出的一点基础属性在实际运动中并没有太大收益差别,但是实际价格要高很多,并不是很值。

鞋子升级(level up)

鞋子升级后可以获得加成属性点,然后获取更多奖励。灰鞋升一级+4自由分配属性点,绿鞋升一级+6自由分配属性点,蓝鞋升一级+8自由分配属性点。

鞋子升级需要时间,时间随等级升高而每次+1小时,虽然可以用gst加速升级,但是价格非常高,不建议。升级也需要gst,具体对应关系见图。

可以看出升10级和20级需要比普通一级要多很多的gst,所以也有很多玩家会考虑升到9级或19级停止升级。

​一个账号只需要一双主鞋,只用把这双鞋升到高级,然后用较高属性去运动,获得高收益。升级期间可以用来运动,但是不能加属性点,不能修理。一般升级时推荐定个闹钟,到时间后点一下开始下一次升级。同一时间只能有一双鞋在升级。

对于主鞋,可以选择自己购买初始鞋,花费时间和gst自己升级,也可以直接购买别人升级好的高级鞋。一般来说,升级好的鞋不止会贵出升级所需的gst,还会贵一部分时间成本来,毕竟买来以后玩家直接可以用最高效率赚币。

鞋子铸造(mint)

在鞋子升到5级以后,购买冷却结束后,就可以花费gst用两双鞋进行mint。mint后会得到鞋盒,父母鞋mint数+1, 打开鞋盒会得到一双鞋。

具体mint花费的如下表,注意,这里是一双鞋的mint价格,mint一次需要两双鞋,是表中对应的两个数加和。

​这是mint鞋对应产生的鞋盒质量,现在史诗和传奇鞋都没有出:

​用户打开鞋盒后可以获得一双鞋,鞋子质量概率只和鞋盒质量有关:

​新鞋的类型和父母鞋的类型有关:

​我们可以注意到,两双普通灰鞋(非全能鞋)mint得到的鞋盒,有3%的概率开出全能鞋,有3%的概率开出绿鞋。

因为全能鞋的价格和绿鞋价格要比普通灰鞋高出不少,所以这就算是抽奖中奖了~也正因为有这个中奖概率在里面,灰色鞋盒的价格一般比灰鞋价格高一些。

宝箱/宝石系统

这是一个整个游戏中最充满黑箱(玄学)的部分,官方没有给什么量化数据,所有看到的数据都是根据之前的经验总结。宝箱中能开出宝石,越高级的宝箱开出高级宝石的概率越大,开箱时间也相对长一些。

项目方有声明,获得宝箱的等级,和同等级宝箱开出宝石的好坏都和幸运值有关。

宝箱是否获得和宝箱等级和两个因素有关:单次连续运动消耗能量数和鞋子幸运值。

可以参考这张图了解获得宝箱的等级和所需要的幸运值,可以看到,单次消耗能量少于5很难获得宝箱。

​每个玩家有4个宝箱槽,会同时进行倒计时开箱。玩家可以使用gst加速完成宝箱倒计时,也可以等倒计时结束后,免费打开。(对于一二级宝箱,不值得花gst加速开箱,开出的东西一般不如加速的钱多)如果所有宝箱槽都是满的,玩家新获得的宝箱会自动被丢弃。

​一般一级宝箱大概率开出1个随机的1级宝石,二级宝石2-3个1级宝石,较少几率获得2级宝石。

这里介绍一个小技巧:尽可能的一次运动集中更多的能量有更大几率获得更高级的宝箱。

比如我能量上限是10,幸运35,如果一次只运动10点能量,就只能获得1级宝箱,但是如果我在10点能量满,下次能量恢复前半小时左右的时间开始运动,运动中另外得到2.5能量恢复,就可以一次消耗12.5能量,大概率能获得2级宝箱。 同理,用这种方法4能量上限的玩家,可以用5点能量混到1级宝箱。

商城系统

出售

玩家在自己的鞋子详情界面点击sell,可以将鞋子挂单出售。可以在售出前,任意免费下架或改价。交易成功后,平台会收取卖家总共6%的手续费作为交易费用。

关于出售鞋子,个人的一点经验,先看自己鞋子的属性和对应鞋型的地板价。挂单时,价格设定可以参考别人的挂单价,可以比自己的预期高一些,如果一段时间没有售出,可以再适当改低价格。因为单日内,有时候价格浮动较大,可能某个时候你的物品就会被买下。一般如果希望快速卖出,价格比地板价低一点点,就可以排在第一位,在流动性比较好的时间段,比如北京时间白天,一般能够快速成交。

再提醒一点的是,上架后的鞋子就不算在自己手里了,如果手里的数量不够会掉能量上限。比如如果9鞋上架了一双,到8鞋就剩4点能量了。如果你是满能量时上架,多出的5点能量就会直接消失,血亏哦~

购买

购买或查询价格可以点击商城的Filter,然后进行筛选,可以更快的帮你找到想要的物品。

反作弊系统

对于一款Gamefi,项目方可谓是下足了功夫做反作弊。首先强制户外运动,用GPS定位匹配步速和人工智能分析,来杜绝某些玩家张口就问的,能不能绑在狗身上,能不能骑车摇手机等等。

目前的规则:

  • 各种模拟器,绑狗身上,骑车摇都可以被查到,不发放gst或有封号风险

  • 一人多手机同时跑作弊,会不发放gst或直接封号

  • 多人同时跑,步速不完全一样是容易区分的

  • 单手机切不同账号跑,官方不建议,不知道之后会不会有惩罚

在玩了stepn和其他gamefi这么长时间,经历了价格的这么多次涨跌后,我只能明确一点:

只要每天入场的用户没有明显减少(现在甚至每天都在创新高,见每日Dune链上分析),没有过多打金工作室对项目的不断吸血,项目的经济模型健康的维持下去是相对容易的。如果真的有连续很长一段时间,新入场用户数持续维持在低值,那才是真的需要担心的时候。

总有人把这个项目和Axie做对比,在我写稿的时候gmt价格又一次创了新高到了0.86u,我不知道之后总市值能不能超过Axie,其实这在我看来也不重要。

一个游戏能让我每天风雨无阻出去运动一个小时,只作为一个快乐健身卡,已经很成功了。

一个应用内无任何社交成分的游戏,能够自发的让大家组建这么多social社群一起讨论游戏策略,又是一个很大的成功。

一个币圈内的游戏能够没太多阻力的被推销到圈外,让我的父母也愿意去尝试接触区块链,让我的一个圈外朋友拿我送的鞋,第一次运动后激动的把赚到的几个币swap到usdc再取出来(认识到币圈的钱都是大风刮来的?),这可以被当成是一个连接币圈内外的桥。

所以不管这个项目的经济模型能活多久,项目方之后social-fi的宏大愿景能不能做出来,STEPN已经在某种意义上开启了一个新的gamefi时代。

关于未来,让我们拭目以待。

以上内容不作任何投资建议,投资有风险!

python入门及进阶学习记 lesson1

python入门及进阶学习记 lesson1

python入门及进阶学习记 lesson1

官网 https://www.python.org/

下载:

cmd中查看版本及使用


Python 教程
Python是一种易于学习又功能强大的编程语言,它提供了高效的高级数据结构,还有简单有效的面向对象编程.
Python优雅的语法和动态类型, 以及解释型语言的本质, 使它成为多数平台上写脚本和快速开发应用的理想语言.

Python解释器及丰富的标准库以源码或机器码的形式提供, 可以到Python官网免费获取适用于各个主要系统平台的版本, 并可自由地分发. 这个网站还包含许多免费第三方Python模块,程序和工具以及附加文档的发布页面或链接.

Python解释器易于扩展, 可以使用C或C++ (或其它可以通过C调用的语言) 扩展新的功能和数据类型. Python也可用于可定制化软件中的扩展程序语言.

这个教程非正式地介绍Python语言和系统的基本概念和功能, 最好在阅读的时候备一个Python解释器进行练习, 不过所有的例子都是相互独立的, suo

有关标准的对象和模块,参阅 Python 标准库Python 语言参考 提供了更正式的语言参考。想要编写 C 或者 C++ 扩展可以参考 扩展和嵌入 Python 解释器Python/C API 参考手册。也有不少书籍深入讲解Python 。

对python的了解程度

Python是一个简洁和强大的面向对象的编程语言.可以与Perl,Ruby,Scheme,Java比较.

Python的一些特点:

  • 使用优雅的语法格式,让你的Python程序代码更加易读.

  • 是一种易于使用的语言,使您的程序工作起来很简单。这使得Python在不损害可维护性的情况下,成为原型开发和其他特殊编程任务的理想选择。

  • 附带一个大型标准库,支持许多常见的编程任务,如连接到web服务器、使用正则表达式搜索文本、读取和修改文件。

  • Python的交互模式使测试短代码段变得很容易。还有一个捆绑的开发环境称为IDLE。

  • 通过添加用编译语言(如C或c++)实现的新模块,可以很容易地进行扩展。

  • 也可以嵌入到应用程序中提供可编程接口。

  • 可以在任何地方运行,包括Mac OS X、Windows、Linux和Unix,Android和iOS也有非官方版本。

  • 从两个意义上说,它是自由软件。下载或使用Python,或将其包含在应用程序中,都不需要任何成本。Python还可以自由修改和重新分发,因为虽然该语言是受版权保护的,但它是在开放源码许可下可用的。

Python的一些编程语言特性包括:

  • 可以使用多种基本数据类型:数字(浮点数、复杂的和无限制长度的长整数)、字符串(ASCII和Unicode)、列表和字典。

  • Python支持使用类和多重继承进行面向对象编程。

  • 代码可以分为模块和包。

  • 该语言支持引发和捕获异常,从而实现更清晰的错误处理。

  • 数据类型是强类型和动态类型。混合不兼容的类型(例如试图添加字符串和数字)会引发异常,因此错误会更快被捕获。

  • Python包含高级编程特性,如生成器和列表理解。

  • Python的自动内存管理使您不必在代码中手动分配和释放内存。

查看Python程序示例代码:
请注意,这些示例是用python2编写的,可能需要一些调整才能在python3下运行。

1 line : Output 输出

print \'Hello, world!\'

2 lines : Input 输入, assignment 赋值

name = raw_input(\'What is your name?\\n\')
print \'Hi, %s.\' % name

↑详见2to3

术语对照表

交互式终端中默认的Python提示符. 往往会显示于能以交互方式在解释器里执行的样式代码之前.

交互式终端中输入特殊代码行时默认的Python提示符, 包括: 缩进的代码块, 成对的分隔符之内 (圆括号,方括号, 花括号或三重引号) , 或是指定一个装饰器之后.

2to3
一个将 Python 2.x 代码转换为 Python 3.x 代码的工具,能够处理大部分通过解析源码并遍历解析树可检测到的不兼容问题.

2to3 包含在标准库中, 模块名为 lib2to3; 并提供一个独立入口点 Tools/scripts/2to3 .
2to3 - 自动将 Python 2 代码转为 Python 3 代码

2to3 的使用

2to3 通常会作为脚本和Python解释器一起安装,你可以在Python根目录的Tools/scripts文件夹下找到它.
2to3 的基本调用参数是一个需要转换的文件或目录列表. 对于目录, 会递归地寻找其中的Python源码.
使用命令:

2to3 example.py

这个命令会打印出和源文件的区别, 通过传入-w参数, 2to3 也可以把需要的改写写回到原文件中 (除非传入了 -n 参数, 否则会为原始文件创建一个副本):

2to3 -w example.py

就拿示例代码中的来进行转换测试: https://wiki.python.org/moin/SimplePrograms
一般这个示例代码是Python2中的

name = raw_input(\'What is your name?\\n\')
print \'Hi, %s.\' % name

保存文件后执行2to3命令(需要将2to3的工具放入系统中才能快速使用)
例如 : F:\\python3.7\\Tools\\scripts
执行时添加 -w 参数

2to3 -w inputName.py

会产生一个原件副本,执行后原本名称的已经更改了:

name = input(\'What is your name?\\n\')
print(\'Hi, %s.\' % name)

执行输出:

3 lines : For loop (循环) , built-in enumerate function (内置枚举函数), new style formatting (新样式格式化)

friends = [\'join\',\'pat\',\'gary\',\'michael\']
for i,name in enumerate(friends):
print "iteration {iteration} is {name}".format(iteration=i,name=name)

2to3后:

friends = [\'jack\',\'kyo\',\'ukyo\',\'lucy\']
for i,name in enumerate(friends):
print("iteration {iteration} is {name}".format(iteration=i,name=name))

之后的一直使用Python 3的示例:
4 lines : Fibonacci (斐波那契数列), tuple assignment (元组赋值)

parents, babies = (1,1)
while babies < 100:
print(\'This generation has {0} babies\'.format(babies))
parents, babies = (babies, parents + babies)

5 lines : Functions (方法)

def greet(name):
print(\'Hello\',name)
greet(\'Jack\')
greet(\'Lucy\')
greet(\'alibaba\')

6 lines : Import(导入依赖), regular expressions(正则表达式)

import re
for test_string in [\'555-1212\',\'ILL-EGAL\']:
if re.match(r\'^\\d{3}-\\d{4}$\',test_string):
print(test_string, \'is a valid US local phone number\')
else:
print(test_string, \'rejected\')

7 lines: Dictionaries(字典), generator expressions (生成表达式)

prices = {\'apple\':0.40, \'banana\':0.50}
my_purchase = {
\'apple\':1,
\'banana\':6}
grocery_bill = sum(prices[fruit] * my_purchase[fruit]
for fruit in my_purchase)
print(\'I owe the grocer $%.2f\' % grocery_bill)

8 lines : Command line arguments(命令行参数) , exception handling(异常处理)

# This program adds up integers in the command line
import sys
try:
total = sum(int(arg) for arg in sys.argv[1:])
print(\'sum =\', total)
except ValueError:
print(\'Please supply integer arguments\')

9 lines : Opening files (打开文件)

# indent your Python code to put into an email
import glob
# glob supports Unix style pathname extensions
python_files = glob.glob(\'*.py\')
for file_name in sorted(python_files):
print(\' -------\' + file_name)
with open(file_name) as f:
for line in f:
print(\' \' + line.rstrip())
print()

10 lines : Time(时间), conditionals(条件表达式), from…import( from…import ), for…else( for…else )

from time import localtime
activities = {8: \'Sleeping\',
9: \'Commuting\',
17: \'Working\',
18: \'Commuting\',
20: \'Eating\',
22: \'Resting\'}
time_now = localtime()
hour = time_now.tm_hour
for activity_time in sorted(activities.keys()):
if hour < activity_time:
print(activities[activity_time])
break
else:
print(\'Unknown,AFK or sleeping!\')

11 lines : Triple-quoted strings (三引号字符串), while loop(while循环)

REFRAIN = \'\'\'
%d bottles of beer on the wall,
%d bottles of beer,
take one down, pass it around,
%d bottles of beer on the wall!
\'\'\'
bottles_of_beer = 99
while bottles_of_beer > 1:
print(REFRAIN % (bottles_of_beer, bottles_of_beer,
bottles_of_beer - 1))
bottles_of_beer -= 1

12 lines : Classes (类)

class BankAccount(object):
def __init__(self, initial_balance=0):
self.balance = initial_balance
def deposit(self, amount):
self.balance += amount
def withdraw(self, amount):
self.balance -= amount
def overdrawn(self):
return self.balance < 0
my_account = BankAccount(15)
my_account.withdraw(5)
print my_account.balance

13 lines : Unit testing with unittest (使用unittest模块进行单元测试)

import unittest
def median(pool):
copy = sorted(pool)
size = len(copy)
if size % 2 == 1:
return copy[(size - 1) / 2]
else:
return (copy[size/2 - 1] + copy[size/2]) / 2
class TestMedian(unittest.TestCase):
def testMedian(self):
self.assertEqual(median([2,9,9,7,9,2,4,5,8]),7)
if __name__ == \'__main__\':
unittest.main()

千万不要把py文件的名字命名为模块名
14 lines : Doctest-based testing(基础文档测试)

def median(pool):
\'\'\'Statistical median to demonstrate doctest.
>>> median([2, 9, 9, 7, 9, 2, 4, 5, 8])
7
\'\'\'
copy = sorted(pool)
size = len(copy)
if size % 2 == 1:
return copy[(size - 1) / 2]
else:
return (copy[size/2 - 1] + copy[size/2]) / 2
if __name__ == \'__main__\':
import doctest
doctest.testmod()

15 lines : itertools (迭代器)

from itertools import groupby
lines = \'\'\'
This is the
first paragraph.
This is the second.
\'\'\'.splitlines()
# Use itertools.groupby and bool to return groups of
# consecutive lines that either have content or don\'t.
for has_chars, frags in groupby(lines,bool):
if has_chars:
print(\' \'.join(frags))
# PRINTS:
# This is the first paragraph.
# This is the second.

16 lines : csv module (csv模块), tuple unpacking(元组分解) , cmp() built-in(cmp()内置)
应该从16开始了 https://wiki.python.org/moin/SimplePrograms
调试了下还是报错:希望之后能再次遇到并解决

import csv
# write stocks data as comma-separated values
from filecmp import cmp
writer = csv.writer(open(\'stocks.csv\',\'wb\',buffering=0))
writer.writerows([
(\'YHOO\'.encode(),\'YaHoo! Inc.\'.encode(),27.38,0.33,1.22),
])
# read stocks data, print status messages
stocks = csv.reader(open(\'stocks.csv\',\'rb\'))
status_labels = {-1:\'down\',0:\'unchanged\',1:\'up\'}
for ticker,name,price,change,pct in stocks:
status = status_labels[cmp(float(change),0.0)]
print(\'%s is %s (%s%%)\' % (name,status,pct))

错误日志:

Traceback (most recent call last):
File "E:/pyCharmFiles/csvtest.py", line 8, in <module>
(\'YHOO\'.encode(),\'YaHoo! Inc.\'.encode(),27.38,0.33,1.22),
TypeError: a bytes-like object is required, not \'str\'

18 lines : 8-Queens Problem (recursion) (8皇后递归问题)

BOARD_SIZE = 8
def under_attack(col,queens):
left = right = col
for r, c in reversed(queens):
left, right = left - 1, right + 1
if c in (left, col, right):
return True
return False
def solve(n):
if n == 0:
return [[]]
smaller_solutions = solve(n - 1)
return [solution+[(n,i+1)]
for i in range(BOARD_SIZE)
for solution in smaller_solutions
if not under_attack(i+1,solution)]
for answer in solve(BOARD_SIZE):
print(answer)

8皇后的问题要持续关注下
打印的输出比较有趣:

E:\\pyCharmFiles\\venv\\Scripts\\python.exe E:/pyCharmFiles/SimplePrograms/8Queens.py
[(1, 4), (2, 2), (3, 7), (4, 3), (5, 6), (6, 8), (7, 5), (8, 1)]
[(1, 5), (2, 2), (3, 4), (4, 7), (5, 3), (6, 8), (7, 6), (8, 1)]
[(1, 3), (2, 5), (3, 2), (4, 8), (5, 6), (6, 4), (7, 7), (8, 1)]
[(1, 3), (2, 6), (3, 4), (4, 2), (5, 8), (6, 5), (7, 7), (8, 1)]
[(1, 5), (2, 7), (3, 1), (4, 3), (5, 8), (6, 6), (7, 4), (8, 2)]
[(1, 4), (2, 6), (3, 8), (4, 3), (5, 1), (6, 7), (7, 5), (8, 2)]
[(1, 3), (2, 6), (3, 8), (4, 1), (5, 4), (6, 7), (7, 5), (8, 2)]
[(1, 5), (2, 3), (3, 8), (4, 4), (5, 7), (6, 1), (7, 6), (8, 2)]
[(1, 5), (2, 7), (3, 4), (4, 1), (5, 3), (6, 8), (7, 6), (8, 2)]
[(1, 4), (2, 1), (3, 5), (4, 8), (5, 6), (6, 3), (7, 7), (8, 2)]
[(1, 3), (2, 6), (3, 4), (4, 1), (5, 8), (6, 5), (7, 7), (8, 2)]
[(1, 4), (2, 7), (3, 5), (4, 3), (5, 1), (6, 6), (7, 8), (8, 2)]
[(1, 6), (2, 4), (3, 2), (4, 8), (5, 5), (6, 7), (7, 1), (8, 3)]
[(1, 6), (2, 4), (3, 7), (4, 1), (5, 8), (6, 2), (7, 5), (8, 3)]
[(1, 1), (2, 7), (3, 4), (4, 6), (5, 8), (6, 2), (7, 5), (8, 3)]
[(1, 6), (2, 8), (3, 2), (4, 4), (5, 1), (6, 7), (7, 5), (8, 3)]
[(1, 6), (2, 2), (3, 7), (4, 1), (5, 4), (6, 8), (7, 5), (8, 3)]
[(1, 4), (2, 7), (3, 1), (4, 8), (5, 5), (6, 2), (7, 6), (8, 3)]
[(1, 5), (2, 8), (3, 4), (4, 1), (5, 7), (6, 2), (7, 6), (8, 3)]
[(1, 4), (2, 8), (3, 1), (4, 5), (5, 7), (6, 2), (7, 6), (8, 3)]
[(1, 2), (2, 7), (3, 5), (4, 8), (5, 1), (6, 4), (7, 6), (8, 3)]
[(1, 1), (2, 7), (3, 5), (4, 8), (5, 2), (6, 4), (7, 6), (8, 3)]
[(1, 2), (2, 5), (3, 7), (4, 4), (5, 1), (6, 8), (7, 6), (8, 3)]
[(1, 4), (2, 2), (3, 7), (4, 5), (5, 1), (6, 8), (7, 6), (8, 3)]
[(1, 5), (2, 7), (3, 1), (4, 4), (5, 2), (6, 8), (7, 6), (8, 3)]
[(1, 6), (2, 4), (3, 1), (4, 5), (5, 8), (6, 2), (7, 7), (8, 3)]
[(1, 5), (2, 1), (3, 4), (4, 6), (5, 8), (6, 2), (7, 7), (8, 3)]
[(1, 5), (2, 2), (3, 6), (4, 1), (5, 7), (6, 4), (7, 8), (8, 3)]
[(1, 6), (2, 3), (3, 7), (4, 2), (5, 8), (6, 5), (7, 1), (8, 4)]
[(1, 2), (2, 7), (3, 3), (4, 6), (5, 8), (6, 5), (7, 1), (8, 4)]
[(1, 7), (2, 3), (3, 1), (4, 6), (5, 8), (6, 5), (7, 2), (8, 4)]
[(1, 5), (2, 1), (3, 8), (4, 6), (5, 3), (6, 7), (7, 2), (8, 4)]
[(1, 1), (2, 5), (3, 8), (4, 6), (5, 3), (6, 7), (7, 2), (8, 4)]
[(1, 3), (2, 6), (3, 8), (4, 1), (5, 5), (6, 7), (7, 2), (8, 4)]
[(1, 6), (2, 3), (3, 1), (4, 7), (5, 5), (6, 8), (7, 2), (8, 4)]
[(1, 7), (2, 5), (3, 3), (4, 1), (5, 6), (6, 8), (7, 2), (8, 4)]
[(1, 7), (2, 3), (3, 8), (4, 2), (5, 5), (6, 1), (7, 6), (8, 4)]
[(1, 5), (2, 3), (3, 1), (4, 7), (5, 2), (6, 8), (7, 6), (8, 4)]
[(1, 2), (2, 5), (3, 7), (4, 1), (5, 3), (6, 8), (7, 6), (8, 4)]
[(1, 3), (2, 6), (3, 2), (4, 5), (5, 8), (6, 1), (7, 7), (8, 4)]
[(1, 6), (2, 1), (3, 5), (4, 2), (5, 8), (6, 3), (7, 7), (8, 4)]
[(1, 8), (2, 3), (3, 1), (4, 6), (5, 2), (6, 5), (7, 7), (8, 4)]
[(1, 2), (2, 8), (3, 6), (4, 1), (5, 3), (6, 5), (7, 7), (8, 4)]
[(1, 5), (2, 7), (3, 2), (4, 6), (5, 3), (6, 1), (7, 8), (8, 4)]
[(1, 3), (2, 6), (3, 2), (4, 7), (5, 5), (6, 1), (7, 8), (8, 4)]
[(1, 6), (2, 2), (3, 7), (4, 1), (5, 3), (6, 5), (7, 8), (8, 4)]
[(1, 3), (2, 7), (3, 2), (4, 8), (5, 6), (6, 4), (7, 1), (8, 5)]
[(1, 6), (2, 3), (3, 7), (4, 2), (5, 4), (6, 8), (7, 1), (8, 5)]
[(1, 4), (2, 2), (3, 7), (4, 3), (5, 6), (6, 8), (7, 1), (8, 5)]
[(1, 7), (2, 1), (3, 3), (4, 8), (5, 6), (6, 4), (7, 2), (8, 5)]
[(1, 1), (2, 6), (3, 8), (4, 3), (5, 7), (6, 4), (7, 2), (8, 5)]
[(1, 3), (2, 8), (3, 4), (4, 7), (5, 1), (6, 6), (7, 2), (8, 5)]
[(1, 6), (2, 3), (3, 7), (4, 4), (5, 1), (6, 8), (7, 2), (8, 5)]
[(1, 7), (2, 4), (3, 2), (4, 8), (5, 6), (6, 1), (7, 3), (8, 5)]
[(1, 4), (2, 6), (3, 8), (4, 2), (5, 7), (6, 1), (7, 3), (8, 5)]