You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:15:07