Python 列表中的唯一值

Python 列表中的唯一值,python,list,pygame,Python,List,Pygame,现在我正在pygame中创建一个类似扫雷舰的游戏。我试图使炸弹计数的创建者,但不幸的是,我有列表索引超出范围的错误。我的想法是生成所有1个数字,然后当我在列表中放置的坐标相同时,将图片更改为2,以此类推 导入系统,操作系统 导入pygame 随机输入 导入时间 从pygame导入混合器 黑色=(0,0,0) 白色=(255,255,255) W、 H=400400 pygame.init() screen=pygame.display.set_模式((W,H)) pygame.display.s

现在我正在pygame中创建一个类似扫雷舰的游戏。我试图使炸弹计数的创建者,但不幸的是,我有列表索引超出范围的错误。我的想法是生成所有1个数字,然后当我在列表中放置的坐标相同时,将图片更改为2,以此类推

导入系统,操作系统 导入pygame 随机输入 导入时间 从pygame导入混合器 黑色=(0,0,0) 白色=(255,255,255) W、 H=400400 pygame.init() screen=pygame.display.set_模式((W,H)) pygame.display.set_标题(“我的”) emp\u place\u img=pygame.image.load('emp.png')。convert\u alpha() emp\u place\u mask=pygame.mask.from\u surface(emp\u place\u img) bomb\u img=pygame.image.load('bomb.png')。convert\u alpha() bomb\u mask=pygame.mask.from\u surface(bomb\u img) mark1_img=pygame.image.load('mark1.png')。convert_alpha() mark2_img=pygame.image.load('mark2.png')。convert_alpha() mark3_img=pygame.image.load('mark3.png')。convert_alpha() kursor=pygame.image.load('coursor.png')。convert_alpha() kursor_mask=pygame.mask.from_surface(kursor) emp_place_x=[] emp_place_y=[] emp_地点_图像=[] emp_地点_掩蔽=[] placex=0 placey=0 炸弹图片=[] 炸弹\u掩蔽=[] 炸弹x=[] 炸弹_y=[] 标记_图像=[] 标记屏蔽=[] mark_x=[] mark_y=[] mark_x_pos=[-25,-25,-25,0,0,0,25,25,25] mark_y_pos=[-25,0,25,-25,0,25,-25,0,25] 标记号=0 boom=错误 CLOCK=pygame.time.CLOCK() def emp_place_blit(x,y,i): blit(emp_place_image[i],(x,y)) def炸弹(x,y,i): blit(炸弹图像[i],(x,y)) 定义标记(x,y,i): blit(mark_图像[i],(x,y)) def main(): 全球繁荣,emp_place_图像,emp_place_图像,emp_place_x,emp_place_y,placex,placey,标记编号 运行=真 运行时: pygame.mouse.set_可见(True) 对于pygame.event.get()中的事件: 如果event.type==pygame.QUIT: 运行=错误 playerx1,playery1=pygame.mouse.get_pos() 对于范围内的i(256): emp\u place\u image.append(emp\u place\u img) emp_place_masking.append(pygame.mask.from_surface(emp_place_image[i])) emp_place_x.append(placex*25) emp_place_y.append(placey) placex+=1 如果placex==16: placex=0 placey+=25 对于范围内的i(256): 距离=(playerx1-int(emp_place_x[i]),((player1-int(emp_place_y[i])) 结果=电磁脉冲位置屏蔽[i]。重叠(kursor屏蔽,距离) 如果结果和pygame.mouse.get_按下()[0]: emp_place_image[i]=pygame.image.load(“fill.png”) 如果动臂==真: sys.exit() 对于范围(20)内的i: bomb\u image.append(bomb\u img) randomposx=(random.choice(emp_place_x)) 炸弹附加(随机POSX) randomposy=(random.choice(emp_place_y)) 炸弹附加(随机位置) 对于范围(9)内的x: 标记x.append(randomposx+标记x位置[x]) 标记y.append(随机位置+标记y位置[x]) mark\u x\u add=mark\u x mark_y_add=mark_y mark_x_add_value=mark_x[i] mark_y_add_value=mark_y[i] mark_x_添加.删除(mark_x[i]) mark_y_add.remove(mark_y[i]) 如果在mark_x_add中添加mark_值,在mark_y_add中添加mark_值: mark_image.append(mark2_img) 其他: mark_image.append(mark1_img) 对于范围(20)内的i: 距离炸弹1,距离炸弹2=(playerx1-int(炸弹x[i]),((playery1-int(炸弹y[i]))
如果0
mark\u x\u add=mark\u x
未创建列表的副本
mark
。要创建列表的浅表副本,可以使用do
mark\u x\u add=mark\u x[:]
。看

此外,内环中的控制变量是
x
,而不是
i

mark\u x\u add=mark\u x[:]
mark_y_add=mark_y[:]
mark_x_add_value=mark_x[x]
mark_y_add_value=mark_y[x]
标记x添加.删除(标记x[x])
标记y添加.删除(标记y[x])

总之,你把事情搞得太复杂了。在主应用循环之前,必须计算炸弹的随机位置。因此,标记的位置也可以在循环之前计算。使用a存储炸弹和标记的位置。e、 g:

grid_size=(16,16)
字段大小=(25,25)
炸弹的数量=20
炸弹={}
markpos=[(x,y)表示范围内的x(-1,2)表示范围内的y(-1,2),如果x!=0或y!=0]
标记={}
def main():
全球炸弹、标记
#制造随机炸弹
而len(炸弹)<炸弹数量:
bx,by=random.randint(0,网格大小[0]-1),random.randint(0,网格大小[1]-1)
如果(bx,by)不在炸弹中:
炸弹[(bx,by)]=炸弹
#找到标记
对于炸弹中的pos:
对于markpos中的p,mposlist=[(p[0]+pos[0],p[1]+pos[1])

如果0,这是大量的代码,而您甚至还没有告诉我们错误是在哪里抛出的。请帮助我们创建一个最小的、可复制的示例,其中包含明确定义的输入以及所需和实际的输出。哇,伙计,这是您方的大量工作。感谢您扩展我的知识。那么,在您的代码中,我如何为4,5 e添加更多标记tc炸弹?@witolo看到了答案的最后一部分,我现在已经添加了。