For schleifen wahnsinn suche lösungsansatz

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

sea-live, du bist wirklich etwas ganz Besonderes!
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Ich würd die Kringel einfach mit Buntstiften ausmalen. 8)
Benutzeravatar
snafu
User
Beiträge: 6881
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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? ^^
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

numerix hat geschrieben:sea-live, du bist wirklich etwas ganz Besonderes!
YMMD :twisted:
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

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 
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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!
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

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()
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()
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

DANKE blackjack
:arrow: So sieht also ein Programm aus das Python profies generieren
WOW! :oops:
Antworten