一个数字矩形,从左上角开始向下逆时针不断取数,一直到取完所有数叫回形取数。网上有很多现成的方法,下面这种方法用的是“海龟”法。在程序中,创建了一个”虚拟”的海龟,让它沿着矩阵的边不断向左旋转即可。
以下是部分源代码。
"""
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即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

