Python实现连连看9

(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()

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值