Problem mit einer Aufgabe

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.
Stephan1993
User
Beiträge: 16
Registriert: Freitag 19. Februar 2010, 15:08

Guten Tag,

Wir haben in Info seit nem halbem Jahr das Thema Python und ich blicke kaum noch durch... jetzt haben wir eine Aufgabe aufbekommen die lautet wie folgt:

In einer Militärkapelle spielen eine Anzahl Trompeter. Dann kommt irgendwann der Befehl "Rechts-Um" und prompt gibt eine (zufällige)Anzahl von Trompetern, die rechts und links vertauschen.

--> Sprich, da stehen sagen wir mal 6 Trompter (in 2D) und "random"-mäßig links oder nach rechts schauend

Weiter im Text:
Nun ht der Feldwebel das vorausgesehen und folgenden Befehl erlassen:

Wenn dem Start-Kommando zwei Trompeter von Gesicht zu Gesicht gegenüber stehen, dann sollen diese beiden beim nächsten Takt der Musik(Mausklick) eine Kehrtwende von 180° machen. Das soll bei jedem Folgenden Takt auch passieren, bis alle Trompeter wieder in der richtigen Position stehen. Dabei hat der Feldwebel denjenigen Trompeter, der bei dem Befehl "Rechts-Um" als letzter in der Reihe steht so ausgesucht, dass er immer richtig bleibt und dann während der folgenden Takte immer richt steht.

Die Aufgabe besteht nun darin, das in einem Fenster grafisch darzustellen.

Die Anzahl soll(in vermünftigen Grenzen natürlich) frei wählbar sein. Es soll zwei Ablaufmodi geben:

1. Das Betätigen einer Taste ist genau ein Takt.
2. Das Ganze soll im Sekunden-Takt automatisch ablaufen.

Die Simulation endet, wenn alle Trompeter wieder in einer richtung stehen.

In einem Fenster wird die Anzahl der Takte bis dahin mitgezählt



sooooo ich habe mir die Aufgabe lange angeguckt und die ein wenig "komisch" versucht zu verwirklichen..(leider nicht wirklich funktionstüchtig :D) habe dabei die meisten bedingungen ausgelassen ^^

Code: Alles auswählen

from xturtle import *
import random 
winsize(1024, 768)
hideturtle()

tro01=Turtle()
screen=tro01.getscreen()

tro02=Turtle()
screen=tro02.getscreen()

tro03=Turtle()
screen=tro03.getscreen()

tro04=Turtle()
screen=tro04.getscreen()

tro05=Turtle()
screen=tro05.getscreen()

tro06=Turtle()
screen=tro06.getscreen()



screen.addshape("trompeter.gif")
screen.getshapes()

screen.addshape("trompeter2.gif")
screen.getshapes()
        


tro01.pu()
tro02.pu()
tro03.pu()
tro04.pu()
tro05.pu()
tro06.pu()


tro01.fd(360)
tro02.fd(240)
tro03.fd(120)
tro05.lt(180)
tro05.fd(120)
tro06.lt(180)
tro06.fd(240)


links=("trompeter.gif")
rechts=("trompeter2.gif")
trompeterwahl = random.randint(0,1)

liste =[links, rechts]
tro01.shape("trompeter.gif")

trompeterwahl = random.randint(0,1)
tro02.shape(liste[trompeterwahl])

trompeterwahl = random.randint(0,1)
tro03.shape(liste[trompeterwahl])  

trompeterwahl = random.randint(0,1)
tro04.shape(liste[trompeterwahl])  

trompeterwahl = random.randint(0,1)
tro05.shape(liste[trompeterwahl])  


trompeterwahl = random.randint(0,1)
tro06.shape(liste[trompeterwahl])  

pu()

oe=0

def Paar1() :
    if (tro02 == links):
        tro02.shape(rechts)
    else:
        print"test"


#def Paar2() :
    #if (tro03.shape(liste[trompeterwahl]) == tro03.shape(rechts)):
        #tro02.shape(rechts)
        #tro03.shape(links)
    #else:
        #print"Trompeter stehen richtig!"

#def Paar3() :
    #if (tro04.shape(liste[trompeterwahl]) == tro04.shape(rechts)):
        #tro03.shape(rechts)
        #tro04.shape(links)
    #else:
        #print"Trompeter stehen richtig!"

#def Paar4() :
    #if (tro05.shape(liste[trompeterwahl]) == tro05.shape(rechts)):
        #tro04.shape(rechts)
        #tro05.shape(links)
    #else:
        #print"Trompeter stehen richtig!"
        
#def Paar5() :
    #if (tro06.shape(liste[trompeterwahl]) == tro06.shape(rechts)):
        #tro05.shape(rechts)
        #tro06.shape(links)   
        
Paar1()
Habe mir gedacht, ich mache das nur mit 6 Trompetern... jeder Trompeter ist eine Turtle.... dann erstelle ich 2 neue shapes, einen Trompeter der nach links guckt und einen der nach rechts guckt.... dann lasse ich die random mäßig aufstellen etc... dann wollte ich die in paare unterteilen, die dann halt die bedingung haben, das wenn sich das paar anguckt, sich beide wegdrehen usw....

ich weiß es is ziemlich im "arsch" :D

kann mir jemand helfen? tipps geben? evtl eine muster lösung, an der ich mich orientieren kann ?

mfg
Zuletzt geändert von Stephan1993 am Freitag 19. Februar 2010, 20:33, insgesamt 1-mal geändert.
Jack Daniels
User
Beiträge: 30
Registriert: Freitag 1. Januar 2010, 11:38

Hallo,

1. gibt es keine fertige Lösung oder eine "Musterlösung", die dann unverstanden abgegeben wird (siehe hier).

2. Variablen nummerieren ist böse! ;) Es gibt Listen, damit man sowas nicht machen muss. Dann kann man auch verschiedene Anzahlen von Trompetern leicht realisieren.

3. Wenn die Trompeter nicht mehr nummeriert sind kann man die per Schleife relativ einfach durchgehen und dementsprechend umdrehen. Außerdem würde ich nicht schauen, ob das Bild einem nach links oder rechts schauenden Trompeter entspricht, sondern diese Information in einer Variablen speichern (wenn du 2.) berücksichtigst eher ebenfalls in einer Liste...), dafür gibts die ja... Diese Lösung ist außerdem schöner, da die Programmlogik von der Ausgabe getrennt wird, wie es sein sollte.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Nette Aufgabe!

Ein vernünftiger Weg wäre, das ganze zunächst einmal ohne Grafik zu realisieren. Eine Zeile mit Trompetern könnte dann z.B. so aussehen:

Code: Alles auswählen

> > > > > < < > < < > > > < > < < > > < >
Die Spitze gibt jeweils die Ausrichung des Trompeters an, bei jedem Drücken der <Enter>-Taste wird die nächste Zeile erzeugt mit dem entsprechend geänderten Status der Trompeter bis der Endzustand erreicht ist.

Wenn du das geschafft hast, dann braucht du bloß noch die Konsolentrompeter durch Turtles zu ersetzen und die Aufgabe ist gelöst. :D
Stephan1993
User
Beiträge: 16
Registriert: Freitag 19. Februar 2010, 15:08

Jack Daniels hat geschrieben: 1. gibt es keine fertige Lösung oder eine "Musterlösung", die dann unverstanden abgegeben wird (siehe hier).
jaja ich weiß :) ich denke auch, dass mein info lehrer schlau genug ist, einen kurzen teil des quelltextes bei google einzugeben, und das dann zu finden....
ich will nur irgendwelche ansätze oder tipps bekommen :) ich wäre nich so blöd und würde so eine fertige aufgabe abgeben, ohne das ich da irgwas von verstehe...

@ numerix
ja das mit den pfeilen ist eine gute idee... ich denke du meinst damit eine turtle im arrow shape.. :) und dann ganz einfach "lt(180)" für die rotation... nur ist das problem(zumindest bei mir), dass sich die turtle im "trompeter shape" nicht sichtbar dreht.. :-( er guckt immer in die eine richtung, deshalb dachte ich mache ich 2 verschiedene shapes und tausche die dann immer... 2tes prob ist, wie kriege ich mit "Raw_input() eine beliebige anzahl an turtles? :D
BlackJack

@Stephan1993: Nein, Numerix meinte keine Turtles sondern wirklich die Zeichen als Textausgabe. Ohne `xturtle`, ohne Grafik, erst einmal nur auf der Textkonsole um das *Problem* zu lösen. Wenn Du das hast, kannst Du Dich um die grafische Ausgabe kümmern.
Benutzeravatar
Klip
User
Beiträge: 98
Registriert: Donnerstag 10. August 2006, 20:39

Hallo,
Stephan1993 hat geschrieben: @ numerix
ja das mit den pfeilen ist eine gute idee... ich denke du meinst damit eine turtle im arrow shape.. :) und dann ganz einfach "lt(180)" für die rotation...
Nein, meint er nicht ;) Er meint einfach die ASCII-Zeichen `>` und `<`. xTurtle != Python!
Stephan1993
User
Beiträge: 16
Registriert: Freitag 19. Februar 2010, 15:08

danke :) also das mit den pfeilen kriege ich noch nich so ganz hin... wie bekomme ich die in eine liste? list=["<",">"] funzt da nich so ganz :D und danach weiß ich noch nich so wirklich wie ich das via raw_input() auf eine beliebige anzahl an pfeilen bekomme
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Stephan1993 hat geschrieben:danke :) also das mit den pfeilen kriege ich noch nich so ganz hin... wie bekomme ich die in eine liste? list=["<",">"] funzt da nich so ganz :D und danach weiß ich noch nich so wirklich wie ich das via raw_input() auf eine beliebige anzahl an pfeilen bekomme

Code: Alles auswählen

anzahl = int(raw_input("Trompeterzahl: "))
trompeter = "<"*anzahl
Die Problembeschreibung ist m.E. nicht klar.
- Der Trompeter ganz rechts dreht sich bei jedem Kommando um 180°. Richtig?
- Stehen sich zwei gegenüber (><), dann drehen sie sich jeweils (<>). Richtig?
- Was ist aber mit denen, die keinem anderen von Trompete zu Trompete gegenüberstehen? Drehen die sich? Manchmal? Immer? Gar nicht?
- Was ist, wenn die beiden rechten so stehen "><"? Dreht sich dann nur der letzte Trompeter, weil der sich immer dreht? Oder drehen sich beide?
Je nachdem ist nämlich gar nicht sichergestellt, dass die gewünschte Ordnung (= alle in eine Richtung?) überhaupt hergestellt werden kann.
BlackJack

@numerix: Also ich finde die Aufgabenstellung klar. Sie führt bloss nicht immer zu einer korrekten Ausrichtung. :-)

1. Ja. Wobei nicht bei jedem Takt ein Kommando kommt, sondern immer erst wenn alle mal richtig standen. Steht nicht wirklich so da, aber das der Feldwebel bei jedem Takt der Musik "Rechts um!" brüllt, ist recht unwahrscheinlich.
2. Richtig.
3. Der Punkt, ist IMHO das Problem. Die Aufgabenstellung sagt nur was über "Angesicht zu Angesicht, dann…", wenn an einem Ende ein "Dummer" falsch herum steht, kann der ein Problem werden.
4. Der aussen der rechts und links auseinanderhalten kann, dreht sich nur auf Kommando -- nicht bei jedem Takt.
Stephan1993
User
Beiträge: 16
Registriert: Freitag 19. Februar 2010, 15:08

alsoo... bei jedem takt muss jeder, der jemanden von angesicht zu angesicht steht um 180° drehen... und es führt IMMER zu einer lösung.. bsp:

> > < < > <
"Takt"
> < > < < >
"Takt"
> > < > < >
"Takt"
> < > < > >
"Takt"
> > < > > >
"Takt"
> < > > > >
"Takt"
> > > > > >

... der allererste is der einziege schlaue... der bleibt immer so stehen
Stephan1993
User
Beiträge: 16
Registriert: Freitag 19. Februar 2010, 15:08

soo ich habe mir mal folgendes gedacht :

Code: Alles auswählen

import random
anzahl = int(raw_input("Trompeterzahl: ")) 

liste =["< ", "> "]
trompeterwahl = random.randint(0,1)

i=0
while (i<anzahl):
    trompeter = liste[trompeterwahl]
    print trompeter
    i=i+1
nur habe ich das prob, dass er 1tens nur einmal eine zufallsrichtung auswählt und die dann für alle benutzt und 2tens alles ja untereinander schreibt.. ist das irgwie möglich, dass der die trotzdem immer hintereinander schreibt?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Stephan1993 hat geschrieben:... der allererste is der einziege schlaue... der bleibt immer so stehen
Jetzt ist es klar. Nach deiner Beschreibung oben hatte ich es anders verstanden.

Du braucht gar keine Liste, eine Zeichenkette genügt.
Das hat den Vorteil, dass du ganz einfach mittels replace()-Methode den Zustand "><" in "<>" umkehren kannst. Der 1. Trompeter braucht natürlich eine Sonderbehandlung ...
Stephan1993
User
Beiträge: 16
Registriert: Freitag 19. Februar 2010, 15:08

wie soll ich es denn hinkriegen, ohne liste eine zufällige richtung der zeiger hinzubekommen?
und was ist replace? :) kann mir das einer ebend kurz erklären? :D
BlackJack

Du darfst halt nicht nur *einmal* auswählen, Du musst `anzahl` mal auswählen. Und das nicht einfach ausgeben, sondern Dir merken, denn später musst Du ja wieder drauf zugreifen und das manipulieren. Wenn man vor der Schleife weiss wie oft sie ausgeführt wird, nimmt man in der Regel eine ``for``-Schleife.

Und ich würde nur '<' und '>' ohne Leerzeichen nehmen. Vielleicht die beiden Varianten auch an aussagekräftige Namen binden. Und eventuell sogar keine Zeichenketten nehmen sondern einen Datentyp der genau zwei Möglichkeiten bietet, und den man einfach "umdrehen" beziehungsweise negieren kann.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Stephan1993 hat geschrieben:wie soll ich es denn hinkriegen, ohne liste eine zufällige richtung der zeiger hinzubekommen?
und was ist replace? :) kann mir das einer ebend kurz erklären? :D

Code: Alles auswählen

>>> s = ">>>><><><"
>>> s.replace(">>","<<")
'<<<<<><><'
@BlackJack: In diesem speziellen Fall würde ich eine Zeichenkette bevorzugen, weil der gesamte "Drehvorgang" pro Takt mit einem einfachen replace zur realisieren ist. Mit einer Liste von Wahrheitswerten ist das schwieriger.
Stephan1993
User
Beiträge: 16
Registriert: Freitag 19. Februar 2010, 15:08

Tut mir leid, aber ich blick da nicht so ganz durch..
Die Pfeile sind doch da trotzdem nicht in eine Zufällige Richtung aufgestellt
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Stephan1993 hat geschrieben:Tut mir leid, aber ich blick da nicht so ganz durch..
Die Pfeile sind doch da trotzdem nicht in eine Zufällige Richtung aufgestellt
Nee, natürlich nicht. Ich wollte ja auch nicht deine Arbeit machen.
Du wolltest wissen, wie replace() funktioniert. Das habe ich dir gezeigt.

Zunächst muss natürlich eine Zeichenkette mit zufälliger Anordnung der Trompeter hergestellt werden. Das kann man elegant z.B. mittels list comprehension oder generator lösen, aber auch weniger elegant mittels einer Schleife, in der an eine Zeichenkette immer zufällig ein weiterer Trompeter angehängt wird.

Also etwa so:

Code: Alles auswählen

Anzahl der Trompeter n
Leere Zeichenkette kapelle
Zähle von 1 bis n und mache folgendes
  erzeuge einen zufälligen Trompeter t
  hänge ihn an kapelle an
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

numerix hat geschrieben:Der 1. Trompeter braucht natürlich eine Sonderbehandlung ...
Jein, man kann ihn ja einfach wieder auf '>' setzen. Damit wird jeder Schritt zum Einzeiler.
MfG
HWK
Stephan1993
User
Beiträge: 16
Registriert: Freitag 19. Februar 2010, 15:08

Code: Alles auswählen

import random
n = int(raw_input("Trompeterzahl: ")) 

kapelle=[]
liste=['<','>']
zufall = random.randint(0,1)

for n in range(n):
   t=liste[zufall]
   kapelle.append(t)
   
print kapelle
    
warum wählt er hier immernoch nur einmal einen zufälligen trompeter aus und nutzt ihn für alle anderen???
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

HWK hat geschrieben:
numerix hat geschrieben:Der 1. Trompeter braucht natürlich eine Sonderbehandlung ...
Jein, man kann ihn ja einfach wieder auf '>' setzen. Damit wird jeder Schritt zum Einzeiler.
Nichts anderes hatte ich im Sinn ... :wink:
Antworten