Python Tkinter如何实现20×20网格内随机位置的三个相邻绿色方块
解决思路
原有代码每次循环独立生成随机坐标,无法保证三个方块相邻,我们通过「先随机生成起点,再基于前一个方块位置随机选择相邻方向生成后续方块」的逻辑,即可实现随机位置的相邻蛇形绿色方块效果。
完整可运行代码
import tkinter import random c=tkinter.Canvas() c.pack() c.config(width=600, height=600) gw=26 gs=2 go="white" gf="gray" rf='green' # 绘制20×20网格 for i in range(gs,600, 30): for j in range(gs,600, 30): c.create_rectangle(i,j,i+gw,j+gw, width=gs, outline=go, fill=gf) # 生成三个相邻蛇形绿色方块 dirs = [(-30, 0), (30, 0), (0, -30), (0, 30)] # 四个相邻方向偏移量 # 生成第一个方块的随机坐标 prev_rx = random.randrange(gs, 600, 30) prev_ry = random.randrange(gs, 600, 30) c.create_rectangle(prev_rx, prev_ry, prev_rx+gw, prev_ry+gw, width=gs, fill=rf, outline=go) last_dir = None for _ in range(2): # 排除与上一次移动相反的方向,避免走回头路 available_dirs = [d for d in dirs if last_dir is None or d != (-last_dir[0], -last_dir[1])] # 随机选择合法方向 while True: dx, dy = random.choice(available_dirs) new_rx = prev_rx + dx new_ry = prev_ry + dy if gs <= new_rx < 600 and gs <= new_ry < 600: break c.create_rectangle(new_rx, new_ry, new_rx+gw, new_ry+gw, width=gs, fill=rf, outline=go) prev_rx, prev_ry = new_rx, new_ry last_dir = (dx, dy) c.mainloop()
关键逻辑说明
- 方向列表
dirs存储了上下左右四个相邻网格的坐标偏移量,保证每次生成的下一个方块都和前一个相邻 - 生成后续方块时排除了和上一次移动相反的方向,避免出现方块重叠或走回头路的情况,保证蛇形排列的连贯性
- 增加了边界校验逻辑,确保生成的方块不会超出画布网格范围
内容的提问来源于stack exchange,提问作者Nejk
相关产品推荐
相关产品推荐

