gpt4 book ai didi

python - 如何将一维数组的索引传输到二维数组?

转载 作者:太空宇宙 更新时间:2023-11-03 21:35:12 25 4
gpt4 key购买 nike

我在从鼠标单击的位置为二维数组创建索引时遇到问题。该程序应该通过检查数组(方 block )中每个方格(仅为 1d)的鼠标单击位置来工作。 Squares 是一个名为 square 的类的对象数组,它绘制在屏幕上。二维数组是一个由 1 和 0 组成的数组,根据用户输入的大小随机生成。

如果鼠标单击位置位于正方形内,它应该仅创建新索引,并且仅生成该正方形的索引。

for n in range(len(squares)):
for square in squares:
if square.x < x < (square.x+17) and square.y < y < (square.y+17):
j = int(n/width)
i = n - j*width
print(j,i)

但是,程序正在为 1d 数组中的每个方 block 生成 2d 数组索引,而不仅仅是鼠标单击所在的方 block 。

那么我怎样才能让这段代码按预期工作呢?

最佳答案

看起来你只需要删除嵌套循环并使用索引n来访问当前方 block :

for n in range(len(squares)):
square = squares[n]
if square.x < x < (square.x+17) and square.y < y < (square.y+17):
j = int(n/width)
i = n - j*width
print(j,i)

同时迭代索引和项目的惯用方法是 enumerate列表:

for n, square in enumerate(squares):
if square.x < x < (square.x+17) and square.y < y < (square.y+17):
<小时/>

如果您正在处理网格,您也可以将鼠标坐标除以图 block 大小来获取索引。然后只需按以下方式将 2D 索引转换为 1D 索引:i = x + width*y。这意味着您不必再遍历方 block 来检查碰撞。

下面是一个包含 pygame.Rect 列表和颜色的示例,您可以通过单击单元格来更改它们:

import pygame as pg


pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
BG_COLOR = pg.Color('gray12')
ORANGE = pg.Color(200, 100, 0)
BLUE = pg.Color('dodgerblue1')

tilesize = 27
width = 16
height = 10
# A list of pygame.Rects + colors.
squares = [[pg.Rect(x*tilesize, y*tilesize, tilesize-1, tilesize-1), ORANGE]
for y in range(height) for x in range(width)]

done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
elif event.type == pg.MOUSEBUTTONDOWN:
# Floor division by the tilesize to get the x and y indices.
x, y = event.pos[0]//tilesize, event.pos[1]//tilesize
if 0 <= x < width and 0 <= y < height: # Inside of the grid area.
i = x + width*y # Index of the 1D list.
print(x, y, i)
# I just toggle the color here.
squares[i][1] = BLUE if squares[i][1] == ORANGE else ORANGE

screen.fill(BG_COLOR)
for square, color in squares:
pg.draw.rect(screen, color, square)
pg.display.flip()
clock.tick(60)

pg.quit()

关于python - 如何将一维数组的索引传输到二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53283225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com