一个数字矩形,从左上角开始向下逆时针不断取数,一直到取完所有数叫回形取数。网上有很多现成的方法,下面这种方法用的是“海龟”法。在程序中,创建了一个”虚拟”的海龟,让它沿着矩阵的边不断向左旋转即可。
以下是部分源代码。
""" gameturtle.py 本程序纯粹定义一个抽象的海龟类 坐标系为左上角为原点,y方向下为正,方向0为向右,90度为向下! 这个tkinter画布坐标系及pygame坐标与计算机屏幕分辨率坐标系都是一致的! 测试程序为回形取数算法。主要方法是先在最大矩阵左上角,逆时针旋转一周, 再前进一个单位,这个时候到达了内层矩阵的左上角。 由于内层矩阵比外层矩阵的行列数分别小2,所以下面的m和n都要减2! 这个程序也是gameturtle的最原始版本。 """ __author__ = '李兴球' __date__ = '2020/10/31' __blog__ = 'www.lixingqiu.com' __version__ = 0.01 import time import math class GameTurtle: def __init__(self): self._heading = 0 # 初始朝向 self._pos = (0,0) # 初始坐标 pass Sprite = GameTurtle # 定义类的别名 if __name__ == "__main__": t = GameTurtle() m = 3 # 行数 n = 4 # 列数 data_list = [] x = 1 for r in range(m): nest = [] for c in range(n): nest.append(x) x = x + 1 data_list.append(nest) print(data_list) t.setheading(90) # 注意这里是向下! points = [t.pos()] # 第一个坐标点 def forappend(): t.fd(1) if t.pos() not in points: points.append(t.pos()) while True: # points中没有这个坐标点就加进去 # 发现已经有点在points中,那么for循环可以提前结束,下面的并没有提前结束 [forappend() for r in range(m-1)] t.left(90) [forappend() for c in range(n-1)] t.left(90) [forappend() for r in range(m-1,0,-1)] t.left(90) if m==1:break [forappend() for c in range(n-2,0,-1)] t.left(90) # 继续向前移动一格到达内圈左上角,准备内层遍历。 forappend() # m = m - 2 n = n - 2 if m<1 or n <1: print('终止条件到达') break datas = [ data_list[y][x] for x ,y in points] print(datas)
需要完整代码,请扫码付款。
本站所有作品,教程等皆为原创,版权所有。只供个人及单位内部研究使用,对外展示或传播必需经本站同意,且注明来自本站。培训机构等用本站资源培训学生,需经本站授权。一旦付款,表示同意本站知识付费原则:数字商品,不支持退款。亦可直接向微信号scratch8付款购买。入住QQ群:225792826 和爱好者共同交流,并且能下载免费提供的Python资源(需提供真实姓名才可入群)
李兴球的博客_Python创意编程技术前沿_pygame » 矩阵取回形数海龟旋转法
李兴球的博客_Python创意编程技术前沿_pygame » 矩阵取回形数海龟旋转法