首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当你点击所有的单元格时,如何对它们进行遮荫?

当你点击所有的单元格时,如何对它们进行遮荫?
EN

Stack Overflow用户
提问于 2020-10-31 19:08:36
回答 1查看 95关注 0票数 0

我做了一个小游戏(令人费解的StackExchange助手)。

下面是一个关于它是如何工作的演示:

如果您无法判断,该程序允许用户选择两个相邻的单元格,然后两个单元格中的数字在两个单元格之间均匀分布。如果这两个数字的和是奇数,则第一位数最大的单元格将是一个数大于另一个数。

当用户第一次选择单元时,将只突出显示与该小区至少相差2的相邻小区。

我想知道如何让所有没有的细胞都有任何相邻的细胞,至少与那个细胞有2的差别,一个灰色的阴影。

换句话说,如何对单元格进行阴影,当您单击这些单元格时,将没有相邻的单元格可单击以更改其编号。

我的代码(向下滚动查看注释,以及我试图使其工作但失败的方式):

代码语言:javascript
复制
import pygame

# You can change the grid & size to whatever you like
grid = [[7, 24, 12, 8, 11],
        [13, 21, 3, 20, 19],
        [10, 22, 15, 2, 9],
        [23, 1, 6, 16, 17],
        [5, 25, 14, 4, 18]]

size = 60

pygame.init()
pygame.font.init()

font = pygame.font.SysFont("Arial", size-10)
wn = pygame.display.set_mode((600, 600))

class Square():
    def __init__(self, pos, num):
        self.x = pos[0] * size
        self.y = pos[1] * size
        self.num = num
        self.color = (255, 255, 255)
        self.rect = pygame.Rect(self.x, self.y, size-5, size-5)

    def clear(self):
        self.color = (255, 255, 255)
    
    def draw(self):
        pygame.draw.rect(wn, self.color, self.rect)
        text = font.render(str(self.num), True, (0, 0, 0))
        if len(str(self.num)) == 1:
            wn.blit(text, (self.x+size*.25, self.y*.98))
        else:
            wn.blit(text, (self.x+size*.055, self.y*.98))
        


class Box():

    def __init__(self, grid, square=None):
        self.square = square
        self.grid = grid
        self.clicked = []

    def box(self): # Returns a list of all adjancent squares that can change the number of the selected square
        x, y = self.square.x//size, self.square.y//size
        y1 = x-1 if x else 0
        y2 = len(self.grid)+2 if x > len(self.grid)+2 else x+2
        x1 = y-1 if y else 0
        x2 = len(self.grid[0])+2 if y > len(self.grid[0])+2 else y+2
        b = []
        for r in self.grid[y1:y2]:
            for c in r[x1:x2]:
                if abs(c.num - self.grid[x][y].num) > 1:
                    b.append(c)
                elif c != self.square:
                    c.clear()
        return b

    def color(self, color):
        for square in self.box():
            square.color = color

    def clear(self):
        for c in self.clicked:
            c.clear()
        self.clicked.clear()

def avg(n1, n2):
    n = n1 + n2
    if n % 2:
        if n1 > n2:
            return n // 2 + 1, n // 2
        return n // 2, n // 2 + 1
    return n // 2, n // 2


squares = [[Square((i, j), col) for j, col in enumerate(row)] for i, row in enumerate(grid)]
box = Box(squares)
box2 = Box(squares)
total = 0

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            for row in squares:
                for square in row:
                    if square.rect.collidepoint(pygame.mouse.get_pos()):
                        if not box.clicked:
                            box.clicked.append(square)
                            square.color = (140, 255, 255)
                            box.square = square
                            box.color((255, 255, 140))
                        else:
                            if square in box.box():
                                box.clicked.append(square)
                            if square == box.clicked[0]:
                                box.color((255, 255, 255))
                                box.clear()
                        if len(box.clicked) == 2:
                            total += 1
                            print(total)
                            box.clicked[0].num, box.clicked[1].num = avg(box.clicked[0].num, box.clicked[1].num)
                            box.color((255, 255, 255))
                            box.clear()

    for row in squares:
        for square in row:
#            temp = Box(squares, square)
#            if not temp.box():
#                square.color = (140, 140, 140)
#            del(temp)
            square.draw()

    pygame.display.update()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-31 20:24:42

使用嵌套循环和索引(i,j)迭代网格的所有单元格:

代码语言:javascript
复制
for i in range(len(squares)):
    for j in range(len(squares[i])):
        # [...]

查找单元格(i,j)的所有相邻索引元组(l,k):

代码语言:javascript
复制
adjacent = []
for k in range(max(0,i-1), min(len(squares), i+2)):
    for l in range(max(0,j-1), min(len(squares[k]), j+2)):
        if i != k or j != l:
            adjacent.append((k, l))

如果单元格(i,j)没有邻居(not any()) (l,k),则更改单元格的颜色,其中差异至少为2:

代码语言:javascript
复制
if not any((k, l) for (k, l) in adjacent if abs(squares[i][j].num - squares[k][l].num) > 1):
    squares[i][j].color = (140, 140, 140)

完全嵌套循环

代码语言:javascript
复制
while True:
    # [...]

    for i in range(len(squares)):
        for j in range(len(squares[i])):

            adjacent = []
            for k in range(max(0,i-1), min(len(squares), i+2)):
                for l in range(max(0,j-1), min(len(squares[k]), j+2)):
                    if i != k or j != l:
                        adjacent.append((k, l))

            if not any((k, l) for (k, l) in adjacent if abs(squares[i][j].num - squares[k][l].num) > 1):
                 squares[i][j].color = (140, 140, 140)
            elif squares[i][j].color == (140, 140, 140):
                square.clear()

    for row in squares:
        for square in row:
            square.draw()

    # [...]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64625472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档