我是一名初学者因此无法解释这一点。我正在尝试创建条件语句以检查鼠标单击的位置。例如,我允许用户点击屏幕上的任意位置,这些点(x坐标,y坐标)被放入list
。但是,我的列表将包含(x,y)元组,其中x和y的范围在0到8之间。
我正在尝试编写一个条件语句,其中对于相同的y坐标存在至少四个连续的x坐标。每次单击添加到列表后,它都会重新检查它。
代码需要能够检查元组中的所有x,并查找连续的数字,即使它们的顺序错误。
示例:List = [(1,2), (3,7), (4,2), (3,1), (5,2), (2,2), (3,2)]
在此示例中,连续5次鼠标单击,其中x = n + 1,y = 2,因此我的条件语句应将此标识为True。
我尝试了很多不同的东西,比如字典和单独的列表,但我真的不知道该怎么做。我目前试过这个:
# python
list2=[point[0] for point in List]
for n in list2:
for column in range(0,8):
if (List[n][column] and List[n+1][column] and List[n+2][column] and List[n+3][column])in List:
self.__win= True
else:
self.__win=False
self.update()
List是用其他方法制作的,所以我试图获取每个子列表中的第一个点,将其放入list2,将其用作我的if语句的n,然后使用第二个for语句检查列。但是,它说索引超出范围,因为我第一次运行程序时,我的列表中没有任何内容,因为没有点击!
由于您在连续流中添加点击次数,因此最好只跟踪最后一次点击和好连续的集合,直到条件匹配为止。
您可以使用函数静态变量通过装饰器附加到函数中,该函数估计您是否有4次正确的连续点击。
详细示例如下:
clicks = [(1,2), (3,7), (4,2), (3,1), (5,2), (2,2), (3,2)]
good_clicks = [(1,2), (2,2), (3,2), (4,2)]
good_not_first_clicks = [(3,4), (5,5), (1,2), (2,2), (3,2), (4,2), (7,8)]
def static_var(varname, value):
def decorate(func):
setattr(func, varname, value)
return func
return decorate
@static_var("consecutives", [])
@static_var("pre_click", None)
def add_click(click):
if add_click.pre_click is None:
add_click.pre_click = click
add_click.consecutives.append(click)
return False
if add_click.pre_click[0] < click[0] and add_click.pre_click[1] == click[1]:
add_click.consecutives.append(click)
if len(add_click.consecutives) == 4:
add_click.consecutives = [click]
return True
elif len(add_click.consecutives) > 4:
add_click.consecutives = [click]
return False
else:
add_click.consecutives = [click]
add_click.pre_click = click
return False
print("FIRST ATTEMPT")
for click in clicks:
print(add_click.consecutives, add_click(click))
print("\nSECOND ATTEMPT")
for click in good_clicks:
print(add_click.consecutives, add_click(click))
print("\nTHIRD ATTEMPT")
for click in good_not_first_clicks:
print(add_click.consecutives, add_click(click))
哪个执行将产生:
FIRST ATTEMPT
[(1, 2)] False
[(1, 2)] False
[(3, 7)] False
[(4, 2)] False
[(3, 1)] False
[(5, 2)] False
[(2, 2), (3, 2)] False
SECOND ATTEMPT
[(2, 2), (3, 2)] False
[(1, 2), (2, 2)] False
[(1, 2), (2, 2), (3, 2)] False
[(1, 2), (2, 2), (3, 2), (4, 2)] True
THIRD ATTEMPT
[(4, 2)] False
[(3, 4)] False
[(5, 5)] False
[(1, 2), (2, 2)] False
[(1, 2), (2, 2), (3, 2)] False
[(1, 2), (2, 2), (3, 2), (4, 2)] True
[(4, 2)] False