图形窗口创建一个64个方格的棋盘,python

时间:2013-09-30 20:31:15

标签: python

from graphics import GraphicsWindow

win=GraphicsWindow(400,400)
canvas=win.canvas()
canvas.setFill("black")
#first line 
canvas.drawRect(10,10,10,10)
canvas.drawRect(30,10,10,10)
canvas.drawRect(50,10,10,10)
canvas.drawRect(70,10,10,10)
#second line
canvas.drawRect(20,20,10,10)
canvas.drawRect(40,20,10,10)
canvas.drawRect(60,20,10,10)
canvas.drawRect(80,20,10,10)
#third line 
canvas.drawRect(10,30,10,10)
canvas.drawRect(30,30,10,10)
canvas.drawRect(50,30,10,10)
canvas.drawRect(70,30,10,10)
#fourth line
canvas.drawRect(20,40,10,10)
canvas.drawRect(40,40,10,10)
canvas.drawRect(60,40,10,10)
canvas.drawRect(80,40,10,10)
#fifth line
canvas.drawRect(10,50,10,10)
canvas.drawRect(30,50,10,10)
canvas.drawRect(50,50,10,10)
canvas.drawRect(70,50,10,10)
#sixth line
canvas.drawRect(20,60,10,10)
canvas.drawRect(40,60,10,10)
canvas.drawRect(60,60,10,10)
canvas.drawRect(80,60,10,10)
#seventh line
canvas.drawRect(10,70,10,10)
canvas.drawRect(30,70,10,10)
canvas.drawRect(50,70,10,10)
canvas.drawRect(70,70,10,10)
#eighth line
canvas.drawRect(20,80,10,10)
canvas.drawRect(40,80,10,10)
canvas.drawRect(60,80,10,10)
canvas.drawRect(80,80,10,10)
win.wait()

所以这将创建一个带有64个黑色方块的棋盘,但我觉得这是更多的代码然后是必要的。如何更改它,以便只通过增加y坐标(x,y,高度,宽度)并且没有这个疯狂的数量来打印第1,3,5,7行和第2,4,6,8行代码?

这样的东西?

canvas.drawRect(10,,10,10).formatrange(y,10,30,50,70)
canvas.drawRect(30,,10,10)
canvas.drawRect(50,,10,10)
canvas.drawRect(70,,10,10)

请记住,我的代码确实有效,我只是想让它看起来更好看,而不是那么混乱。

2 个答案:

答案 0 :(得分:0)

使用简单的循环:

for y in range(1, 9):
    for x in range(4):
        base = 20 if y % 2 == 0 else 10
        canvas.drawRect(base + (x * 20), y * 10, 10, 10)

此处y的范围为1到8(包括1和8),将其乘以10可得到10,20,30,40等。对于每yx范围从0到3包含,乘以20得到0,20,40和60.添加10或20可以得到10 - 70或20 - 80的范围。

使用itertools.product()可以消除一个循环:

from itertools import product

for y, x in product(range(1, 9), range(4)):
    base = 20 if y % 2 == 0 else 10
    canvas.drawRect(base + (x * 20), y * 10, 10, 10)

快速演示只打印使用的坐标:

>>> from itertools import product
>>> for y, x in product(range(1, 9), range(4)):
...     base = 20 if y % 2 == 0 else 10
...     print (base + (x * 20), y * 10)
... 
(10, 10)
(30, 10)
(50, 10)
(70, 10)
(20, 20)
(40, 20)
(60, 20)
(80, 20)
(10, 30)
(30, 30)
(50, 30)
(70, 30)
(20, 40)
(40, 40)
(60, 40)
(80, 40)
(10, 50)
(30, 50)
(50, 50)
(70, 50)
(20, 60)
(40, 60)
(60, 60)
(80, 60)
(10, 70)
(30, 70)
(50, 70)
(70, 70)
(20, 80)
(40, 80)
(60, 80)
(80, 80)

答案 1 :(得分:0)

  

但我觉得这是更多的代码然后必要

你当然对它有正确的感觉;)

for j in range(10, 90, 10):
    for j in range(10, 90, 20):
    if j % 2 == 1:
        for i in 10, 30, 50, 70:
            canvas.drawRect(i, j, 10, 10)
    else:
        for i in 20, 40, 60, 80:
            canvas.drawRect(i, j, 10, 10)

或者如果你在第二个循环中移动if

for j in range(10, 90, 10):
    for i in 10, 30, 50, 70:
        if j % 2 == 1:
            canvas.drawRect(i + 10, j, 10, 10)
        else:
            canvas.drawRect(i, j, 10, 10)

或者有点不同但更短:

for j in range(10, 90, 10):
    start = 10 if j % 2 == 1 else 20
    for i in range(start, 90, 20):
        canvas.drawRect(i, j, 10, 10)