Seite 1 von 1

For schleifen wahnsinn suche lösungsansatz

Verfasst: Donnerstag 29. Oktober 2009, 16:59
von sea-live
Servus hier das grafiche muster
Bild

nun es gibt 6Blöcke die so ausschauen
ich fang nur einen ab den rest schaff ich alleine
DER EINFACHHEIT HALBER SIND DIE positionen nur untereinander zu zeigen nicht in deer kurve BOHEJ aber doch versetzt!

es wird dann in der innersten schleife an die Position ein Bild Objekt gesetzt dies erhält einfach die position x,Y und die Farbe
Bedingungen
a.Durchlauf alle plaetze=312 (besetzt oder leer)anzeigen
b. beginne zum auffüllen mit Reihe 1 den block können wir vergessen da es unik behandelt wird und jeder block in einer Datenbank seine eigenen werte herholt!
c versatz von reihe zu reihe um je die hälfte des platzes 15x15pixel 2pix trennung!
topleft von 1 =(162,235)
wenn die anzahl der plätze verkauft 0-100 rot
wenn die anzahl der plätze verkauft 100-200 gelb
wenn die anzahl der plätze verkauft >200 grün objekt
wenn platz nicht verkauft dann weis

Hat jemand eine Idee wie ich da durchlaufe von innen nach außen oder von außen nach innen
Danke

Re: For schleifen wahnsinn suche lösungsansatz

Verfasst: Donnerstag 29. Oktober 2009, 17:03
von numerix
sea-live, du bist wirklich etwas ganz Besonderes!

Verfasst: Donnerstag 29. Oktober 2009, 17:26
von jerch
Ich würd die Kringel einfach mit Buntstiften ausmalen. 8)

Verfasst: Donnerstag 29. Oktober 2009, 17:30
von snafu
@sea-live:

Mal ganz im Ernst. Wenn jemand sowas schreibt:
DER EINFACHHEIT HALBER SIND DIE positionen nur untereinander zu zeigen nicht in deer kurve BOHEJ aber doch versetzt!
Würdest du da verstehen, was er sagen will? Formuliere dein Problem doch nochmal ganz in Ruhe und idealerweise auch unter Beachtung von deutscher Grammatik und Zeichensetzung. ;)

Was ist z.B. die innerste (sic!) Schleife? Soll das die untere Reihe sein, also ganz rechts auf der Skizze?

Warum wird da was verkauft? Was bedeutet die Zahl bei "Topleft 1"? Ich nehme ja mal an, dass damit der Platz 1 ganz oben links gemeint ist.

Mal ganz generell: Worum geht es überhaupt? ^^

Verfasst: Donnerstag 29. Oktober 2009, 17:51
von yipyip
Die Fragestellung zu verstehen, ist natuerlich die groesste Raetselaufgabe. Wenn es aber nur darum geht, die Sitzreihen zu durchlaufen:

Code: Alles auswählen

LAST_SEATS = [12, 12, 15, 15, 18, 18, 21, 21, 24]

rows = map(xrange, LAST_SEATS)

for i, row in enumerate(rows):
  print "row %s> " % i, 
  for k in row:
    print k,
  print
:wink:
yipyip

Verfasst: Donnerstag 29. Oktober 2009, 19:19
von sea-live
Gehen wir von dem Beispiel von yipyip aus !

Mir geht es ja um die Position des Objektes also die X,Y Koordinate zum erzeugen !
Die Reihen laufen wie auf dem Foto gezeigt von oben nach unten vertikal.

Das Startobjekt ist row0,0 (162,235) row0,1 erhält y+18 dito. row Ende
row1,0 = row0,0 X-18 Y -18 / row 1,0 =row1,0 y+18 dito. row Ende
row2,0 =row1,0 X-18 Y-18 ........

so funtzt das !

Code: Alles auswählen

LAST_SEATS = [12, 12, 15, 15, 18, 18, 21, 21, 24]

rows = map(xrange, LAST_SEATS)
x= 162
y= 235
yback=235
for i, row in enumerate(rows):
  print "row %s> " % i,
  y = yback - 18
  yback = y
  x -= 18
  for k in row:
    print "(X%s,Y%s)" %(x,y),
    y += 18
  print 
jetzt fehlt nur noch der Colorwert

Re: For schleifen wahnsinn suche lösungsansatz

Verfasst: Donnerstag 29. Oktober 2009, 19:51
von cofi
numerix hat geschrieben:sea-live, du bist wirklich etwas ganz Besonderes!
YMMD :twisted:

Verfasst: Donnerstag 29. Oktober 2009, 19:59
von sea-live
so da hätten wir die Antwort auf obige frage war doch gar nicht so schwer !
geht es mal wieder kürzer?
Ihr wisst doch das ich nur basic stamps progge BZW atmel Risk in Bascom.

Code: Alles auswählen

LAST_SEATS = [12, 12, 15, 15, 18, 18, 21, 21, 24]
rows = map(xrange, LAST_SEATS)
x= 162
y= 235
yback=235
plaezebelegt = 142 # von einer datenbank übergeben
count = 1
for i, row in enumerate(rows):
  print "row %s> " % i,
  y = yback - 18
  yback = y
  x -= 18
  for k in row:
    if (count < 50 and count < plaezebelegt):color = 1 
    if (count > 49 and count < 126 and count < plaezebelegt):color = 2 
    if (count > 125 and count < plaezebelegt):color = 3 
    if (count > plaezebelegt):color = 4 
    print "(X%s,Y%s,C%s)" %(x,y,color),
    y += 18
    count +=1
  print 

Verfasst: Donnerstag 29. Oktober 2009, 20:10
von numerix
sea-live hat geschrieben:so da hätten wir die Antwort auf obige frage war doch gar nicht so schwer !
Nee, echt nich. Danke, dass du uns daran teilhaben lässt!

Verfasst: Donnerstag 29. Oktober 2009, 20:20
von yipyip
Ist doch immer ein Quell' der Freude hier. :D
Aber Sitzreihen zu programmieren macht Spass:

Code: Alles auswählen

#!/usr/bin/env python

try:
  import Tkinter as tk
except ImportError:
  import tkinter as tk

####

class Gui(object):


  def __init__(self, radius=20):
   
    self.last_seats = [24, 21, 21, 18, 18, 15, 15, 12, 12]
    self.rows = map(xrange, self.last_seats)
    self.root = tk.Tk()
    self.canvas = tk.Canvas(self.root, bg='white')

    self.draw_seats(radius)
    
    self.canvas.pack()
    self.root.update_idletasks()
    x, y, w, h = self.canvas.bbox('all')
    self.canvas.config(width=w, height=h)


  def circle(self, x, y, radius, color='red'):

    self.canvas.create_oval((x, y, x+radius, y+radius), fill=color)

    
  def draw_seats(self, radius, x=4, y=4):
    
    rad2 = radius // 2 
    
    for i, row in enumerate(self.rows):
      ystart = y
      for k in row:
        self.circle(x, y, radius)
        y += radius
      y = ystart + rad2  
      x += radius

        
  def run(self):

    self.root.mainloop()

####

if __name__ == '__main__':

  Gui().run()
Eine geschicktere Anordnung sei erstmal Dir ueberlassen.

:wink:
yipyip

Verfasst: Freitag 30. Oktober 2009, 09:41
von sea-live
das hier ist meine Lösung und Ergebnis:
Bild

danke für eure Hilfe

Code: Alles auswählen

# -*- coding: cp1252 -*-
from Tkinter import *

master = Tk()
w = Canvas(master, width=200, height=450)
w.pack()
w.create_rectangle(0,0, 200, 450, fill="blue")

LAST_SEATS = [12, 12, 15, 15, 18, 18, 21, 21, 24]
colors =["red","yellow","green","white"]
rows = map(xrange, LAST_SEATS)
x= 180
y= 90
yback=y
plaezebelegt = 142 # von einer datenbank übergeben
count = 1
for i, row in enumerate(rows):
  #print "row %s> " % i,
  y = yback - 9
  yback = y
  x -= 18
  for k in row:
    if (count < 40 and count < plaezebelegt):color = 0 
    if (count > 39 and count < 92 and count < plaezebelegt):color = 1 
    if (count > 90 and count < plaezebelegt):color = 2 
    if (count > plaezebelegt):color = 3 
    w.create_rectangle(x, y,x+15,y+15, fill=colors[color])
    w.create_text(x+8,y+8, text=k+1, fill="black", 
        font=("Ariel", "10"))

    y += 18
    count +=1
  #print

mainloop()

Verfasst: Freitag 30. Oktober 2009, 11:21
von BlackJack
@sea-live: IMHO viel zu viele "magische" Zahlen, die man durch verständlich benannte Konstanten bzw. Berechnungen ersetzen sollte.

Ausserdem sieht der Code nicht gut durchdacht aus. Setz zum Beispiel mal `plaezebelegt` (sic!) auf 1, dann fliegt einem ein `NameError` um die Ohren, weil dann im ersten Durchlauf in keiner der ``if``-Verzweigungen `color` an einen Wert gebunden wird. Bei den Werten in den Abfragen scheinen mir die 90 und die 92 auch komisch. Wo liegt denn die Grenze? Das wäre vielleicht mit einer Liste mit den Grenzen und einer Schleife besser lösbar. Wobei: Hängen die Farben eigentlich wirklich von der aktuellen Platzzahl ab, oder nicht vielleicht doch von der Sitzreihe? So sieht jedenfalls die Grafik aus, die Du erzeugst, und dann wäre es einfacher und verständlicher nach der Sitzreihe zu färben.

Das Verhältnis von `count` zu `plaezebelegt` taucht auch in jedem der 4 ``if``\s als Bestandteil auf, da würde es Sinn machen, dass in eine übergeordnete Entscheidung heraus zu ziehen.

Mal eine Variante, die sich in der Grösse den Daten und den Vorgaben anpasst:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8
import Tkinter as tk

def main():
    master = tk.Tk()
    
    seats_per_row = [12, 12, 15, 15, 18, 18, 21, 21, 24]
    seats_total = sum(seats_per_row)
    row_count = len(seats_per_row)
    
    plaetzebelegt = 142  # Von einer datenbank übergeben.
    assert plaetzebelegt <= seats_total

    # Grösse eines Sitzes.
    seat_size = 16
    # Platz zwischen den Sitzen.
    seat_padding = 4
    # Platz zwischen Rand und den Sitzen.
    margin = 20
    
    width = (seat_size + seat_padding) * row_count + 2 * margin
    height = (seat_size + seat_padding) * max(seats_per_row) + 2 * margin
    
    w = tk.Canvas(master, width=width, height=height)
    w.pack() 
    w.create_rectangle(0, 0, width, height, fill='blue') 
    
    colors = ['red', 'yellow', 'green', 'white']
    
    count = 1
    for i, row in enumerate(seats_per_row):
        for k in xrange(row):
            if count < plaetzebelegt:
                for color, limit in enumerate([39, 90, seats_total]):
                    if count <= limit:
                        break
            else:
                color = 3
            
            size = seat_size + seat_padding
            x = width - size * (i + 1) - margin
            y = margin + size * k + (size / 2) * (row_count - 1 - i)
            w.create_rectangle(x,
                               y,
                               x + seat_size,
                               y + seat_size,
                               fill=colors[color])
            w.create_text(x + seat_size / 2,
                          y + seat_size / 2,
                          text=str(k + 1),
                          fill='black',
                          font=('Arial', '10'))
            count += 1
    
    tk.mainloop()


if __name__ == '__main__':
    main()

Verfasst: Freitag 30. Oktober 2009, 17:11
von sea-live
DANKE blackjack
:arrow: So sieht also ein Programm aus das Python profies generieren
WOW! :oops: