(2)标识选中的图片
在判断出玩家选中的是哪一张图片之后,接下来就可以标识选中的图片了,即在该选中的图片外围画矩形。代码如下所示。
FIRSTCLICK = True #FIRSTCLICK是全局变量
if(click_col>=0 and click_row>=0) and \
(not pics_map[click_row][click_col] == MAP_EMPTY):
global FIRSTCLICK
if FIRSTCLICK:
drawRect(click_row, click_col)
FIRSTCLICK = False
其中,第1行中if语句的作用是保证玩家的鼠标是否点在图片上,并且选中的该图片不是MAP_EMPTY。在“3.2 显示图片”中提到,游戏进行中,如果图片被玩家消除掉,则该图片在图片地图中对应位置的值就设置为MAP_EMPTY,如果该图片已经被消除,则无需将其标识出来。
因为要修改全局变量FIRSTCLICK,因此第3行代码对该变量进行说明,第4行的if语句确定玩家是第一次点击图片,之后调用自定义函数drawRect()在指定的图片外围画矩形,最后将FIRSTCLICK 设置为False。
(3)实现图片标识
通过自定函数drawRect()实现图片标识,代码如下所示。
def drawRect(row, col):
lu_posX = col*MAP_WIDTH + MAP_XDELTA
lu_posY = row*MAP_HEIGHT + MAP_YDELTA
rd_posX = (col+1)*MAP_WIDTH + MAP_XDELTA
rd_posY = (row+1)*MAP_HEIGHT + MAP_YDELTA
canvas.create_rectangle( lu_posX
,lu_posY
,rd_posX
, rd_posY
, outline='red'
, width=3
, tags="rectRedOne"
)
其中,drawRect()的两个参数分别标识要标识图片所在的行数和列数,第2-3行代码通过图片所在的行数和列数,得到该图片左上角的坐标;第4-5行代码得到图片右下角的坐标;第6行代码通过canvas调用create_rectangle()方法画矩形,该方法的前四个参数分别标识所画矩形左上角和右下角的横纵坐标,outline参数指定了矩形的颜色,width参数指定了画线的粗细程度,tags参数指定了该矩形的标签,此标签在消除用户选中的图片时会用到。
通过以上代码,当玩家点击游戏中的某张图片时,就会标记该图片,如图10所示。
图10 标记选中图片
(4)完整代码
GAMESTART = False
FIRSTCLICK = True
def clickCanvas(event):
if GAMESTART:
click_col, click_row = getClickedMap(event.x, event.y)
if(click_col>=0 and click_row>=0) \
and (not pics_map[click_row][click_col] == MAP_EMPTY):
global FIRSTCLICK
if FIRSTCLICK:
drawRect(click_row, click_col)
FIRSTCLICK = False
def drawRect(row, col):
lu_posX = col*MAP_WIDTH + MAP_XDELTA
lu_posY = row*MAP_HEIGHT + MAP_YDELTA
rd_posX = (col+1)*MAP_WIDTH + MAP_XDELTA
rd_posY = (row+1)*MAP_HEIGHT + MAP_YDELTA
canvas.create_rectangle( lu_posX
,lu_posY
,rd_posX
, rd_posY
, outline='red'
, width=3
, tags="rectRedOne"
)
def getClickedMap(xpos, ypos):
x = -1
y = -1
for i in range(0, ROW_PIC):
x1 = i*MAP_WIDTH + MAP_XDELTA
x2 = (i+1)*MAP_WIDTH + MAP_XDELTA
if xpos>=x1 and xpos<=x2:
x = i
for j in range(0, COL_PIC):
y1 = j*MAP_HEIGHT + MAP_YDELTA
y2 = (j+1)*MAP_HEIGHT + MAP_YDELTA
if ypos>=y1 and ypos<=y2:
y = j
return x, y
def file_new():
getPic()
initMap()
drawMap()
global GAMESTART
GAMESTART = True
root.configure(menu=menubar)
canvas.bind('<Button-1>', clickCanvas) #本行代码为新添加代码
canvas.pack()
root.mainloop()