2016-05-24 4 views
0

Ich versuche, pygame und python zu lernen, indem ich einige einfache Klickspiele mache und das folgende Programm, das ich gemacht habe, zeichnet ein Gitter und wenn ich auf irgendein Feld im Gitter klicke, ändert es seine Farbe. Aber das ist auf eine Box pro Klick beschränkt.Wie kann ich eine Liste von min() -Methode in Python bekommen?

Was ich versuche zu tun, um Farbfeld geklickt und alle anderen Box mit ähnlichen x-Koordinaten oder y-Koordinaten, x und y-Koordinaten Bedeutung <rect(x, y, 70, 90)> xy in einem pygame.Rect

mit allen meinen Code hier die relevanten Funktionen in Frage.

import pygame as pg 
import sys 

window_width = 720 
window_height = 360 
window_res = window_width, window_height 

cover_width = 70 
cover_height = 90 

gap_x = 70 
gap_y = 90 

red = (225, 25, 30) 
bkg_colour = (30, 30, 30) 
off_white = (180, 180, 180) 
magenta = (225, 25, 25) 


def get_rekt(): 
    init_x = int((window_width % gap_x)/2) 
    init_y = 20 

    rect_list = [] 
    for x in range(init_x, window_width - gap_x, gap_x): 
     for y in range(init_y, window_height - gap_y, gap_y): 
      rect = pg.Rect(x, y, cover_width, cover_height) 
      rect_list.append(rect) 

    return rect_list 


def draw_grid(rect_list): 
    for rect in rect_list: 
     pg.draw.rect(display, red, rect, 3) 


def get_grid(): 
    return draw_grid(get_rekt()) 


def get_closest_rect(rect_list, click_pos): 
    closest_rect = min(rect_list, key=lambda x: abs(x.centerx - click_pos[0]) + abs(x.centery - click_pos[1])) 
    return closest_rect 


def main(): 
    pg.init() 

    global display, fps_clock 

    display = pg.display.set_mode(window_res) 
    display.fill(bkg_colour) 
    draw_grid(get_rekt()) 
    pg.display.flip() 

    while True: 

     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       pg.quit() 
       sys.exit() 

      if pg.mouse.get_pressed()[0]: 
       click_pos = pg.mouse.get_pos() 
       rect_list = get_rekt() 
       closest_rect = get_closest_rect(rect_list, click_pos) 
       pg.draw.rect(display, off_white, closest_rect, 3) 
       pg.display.flip() 
       print(closest_rect) 


if __name__ == '__main__': 
    main() 

Dies ist die Funktion, die am nächsten zu mir zurückkehrt, wo ich geklickt habe. Ich verwende min() Methode mit Lambda-Taste.

def get_closest_rect(rect_list, click_pos): 
    closest_rect = min(rect_list, key=lambda x: abs(x.centerx - click_pos[0]) + abs(x.centery - click_pos[1])) 
    return closest_rect 

Dies ist, wie es aussieht, wenn ich

enter image description here

in einer Box klicken Und was ich suche ist

enter image description here

Was ich dachte, ist wenn diese Funktion

ist

könnte eine Liste von rect mit ähnlichen x oder y Koordinaten zurückgeben, könnte ich diese Liste in einer for-Schleife mit pg.draw ausführen und tun, was Sie im zweiten Bild sehen können.

Antwort

0

Diese Funktion sollte den Zweck erfüllen.

def get_closest_rects(rect_list, click_pos): 
    return filter(lambda r: r.left <= click_pos[0] <= r.right or r.top <= click_pos[1] <= r.bottom, rect_list) 

filter(function, iterable) gibt eine Liste von Elementen aus iterable, für die Funktion kehrt True.

Um die Rechtecke über und unter dem Cursor zu erhalten, müssen wir nur überprüfen, ob der Cursor zwischen den linken und rechten Grenzen jedes Rechtecks ​​liegt. Für die links und rechts, müssen wir die oberen und unteren Grenzen überprüfen.

Wenn Sie die boolesche Operation or durch eine and ersetzen, erhalten Sie nur das eine Rechteck, auf das Sie geklickt haben.

+0

, die perfekt funktioniert! Vielen Dank. –

0

Verwenden Sie es:

  if pg.mouse.get_pressed()[0]: 
      click_pos = pg.mouse.get_pos() 
      rect_list = get_rekt() 
      closest_rect = get_closest_rect(rect_list, click_pos) 
      linex = 10 
      liney = 20 
      for i in range(0,10):#x axis 
       newRect=pg.Rect(linex, closest_rect.y, cover_width, cover_height) 
       pg.draw.rect(display, off_white, newRect, 3) 
       linex = linex + 70 

      for j in range(0,3): 
       newRect = pg.Rect(closest_rect.x, liney, cover_width, cover_height) 
       pg.draw.rect(display, off_white, newRect, 3) 
       liney = liney + 90 

      pg.display.flip()