Wie kann ich in PyGame einen Counter programmieren?

1 Antwort

Die Zählervariable solltest du zunächst auch nach ihrem Zweck benennen. Mit a ist dies nicht erfüllt. Die Variable sollte zudem global verfügbar sein, nicht nur in draw existieren. Andernfalls kannst du auf sie in anderen Code-Blöcken doch gar nicht zugreifen. Für das Erhöhen des Wert der Variable ist das allerdings wichtig. Die Änderung des Werts muss im Falle eines Treffers geschehen. Du siehst ja, wo das ist.

Der Klick-Handler sollte außerdem nicht die Berechtigung besitzen, die Anwendung zu beenden. Viel eher sollte von ihm eine Variable gesetzt werden, die angibt, ob das Spiel noch läuft oder bereits verloren wurde. In der draw-Funktion kann deren Zustand geprüft werden. Je nachdem, hast du dann auch die Möglichkeit, den String zu ändern, der den Punktestand angibt und du kannst die Hintergrundfarbe korrekt festlegen.

jonasd123 
Fragesteller
 14.05.2020, 14:29

Danke, jedoch komme ich trotzdem nicht drauf, da ich dabei Probleme habe, in den Code-Blöcken auf die globale Variable zuzugreifen. Hätte jemand einen Vorschlag für einen Code, das wäre SEHR hilfreich, weil ich selber nicht darauf komme. Dabei soll auch bei "def fruit_score():" etwas darunter stehen. Es geht nur um den Zähler (wie oben beschrieben).

0
regex9  14.05.2020, 15:04
@jonasd123

Beispiel für eine globale Variable:

iAmAGlobalVar = 0

def doSomething():
  global iAmAGlobalVar
  iAmAGlobalVar = 2

print(iAmAGlobalVar) # 0
doSomething()
print(iAmAGlobalVar) # 2

Wenn du die Variable innerhalb der Funktion, in der du sie anwenden möchtest, nicht mit dem Schlüsselwort global kennzeichnest, wird stattdessen eine lokale Variable angelegt, die nur innerhalb der Funktion sichtbar ist. Diese überdeckt dann die globale Variable von außerhalb.

1
jonasd123 
Fragesteller
 14.05.2020, 16:38
@regex9

Danke. Aber wie genau wäre das mit meinem Counter umsetzbar? Weil ich weiß nicht, wie ich das mit der draw()-Funktion und auch mit den anderen Funktionen, wie on_mouse_down(pos) usw., vereinen kann, damit alles mitgezählt wird und dann auch der Hintergrund rot wird und sich der Text in „Endstand: x“ ändert, wenn man daneben klickt (Beschreibungen ganz oben). Ich komme gar nicht darauf und auch Tipps „in Worten“ sind zwar hilfreich und danke dafür, aber ich komme trotzdem wirklich nicht drauf, weil es nie klappt. Ich verzweifle - könnte jemand bitte meinen Code oben (Bild), den man dafür braucht, erweitern und hier reinschreiben?

Das wäre SEHR HILFREICH und ich könnte es so viel besser nachvollziehen, weil selber habe ich sonst keine Chance, draufzukommen.

0
regex9  14.05.2020, 23:10
@jonasd123

Wie gehst du denn konkret vor, sodass es nie klappt?

0
jonasd123 
Fragesteller
 15.05.2020, 00:30
@regex9

Danke für die Antwort. Ich gehe so vor: Ich lege zB „fruit_score“ als globale Variable fest und weiß dann aber trotzdem nicht, wie ich genau vorgehen soll, damit alles klappt. Ich habe mir auch zB while-Schleifen überlegt, um die Punktezahl zu erhöhen, aber nichts klappt bzw. komme ich einfach nicht drauf wie ich alles vereinen kann, damit es funktioniert.

Hilfestellungen in Form von Worten helfen mir dabei, Ideen zu geben, und dafür bin ich natürlich sehr dankbar, aber ich komme trotzdem nicht auf den richtigen Code und besonders dieses Zurückgreifen auf globale Variablen, lokale Variablen und auch diese Funktionen usw. ist für mich kompliziert.

Ich weiß, dass der Code im Endeffekt eigentlich ganz einfach ist für viele - aber ich komme wirklich nicht drauf, keine Chance. Ich würde ihn sicherlich verstehen, falls ich ihn mal hätte, aber dieses selber draufkommen ist das Problem.

Deswegen wäre es ganz nett, wenn Sie (und/oder jemand anderes, der vielleicht auch Vorschläge hat und sich da gut auskennt) meinen Code vollständig erweitert reinschicken könnten, damit ich das mit meinen Vorstellungen vergleichen kann und die Sache schließlich verstehe und so besser werden kann. Der Code im Bild müsste nur so erweitert werden, dass es einen Counter gibt und beim Endstand dann die Hintergrundfarbe usw. geändert werden würde (genaue Angaben in der ursprünglichen Frage).

Es muss sonst nichts weiteres verbessert werden, es geht nur um diesen speziellen Counter. Ich glaube, User, die sich da auskennen, können das ganz schnell machen - es wäre der einzige Ausweg, damit ich Bescheid weiß, wie man diesen Counter programmieren kann und mich so verbessern kann.

Ich wäre wirklich SEHR, SEHR dankbar. :)

0
regex9  15.05.2020, 04:55
@jonasd123
Ich lege zB „fruit_score“ als globale Variable fest (...)

Passe hier auf mit den Bezeichnungen. In deinem Skript existiert ganz unten bereits eine Funktion namens fruit_score. Für neue Elemente, die du nun in dein Skript einfügst - seien es Funktionen, Variablen, o.a., solltest du andere Namen finden. Andernfalls wird es schnell unübersichtlich. Nenne die Variable doch einfach nur points, score, o.ä..

Ich habe mir auch zB while-Schleifen überlegt, um die Punktezahl zu erhöhen, (...)

Du brauchst keine Schleifen. Die draw-Funktion agiert hier bereits als Schleife. Dein Skript arbeitet doch mit Pygame Zero. Das ist ein Framework, welches konkret (nach dem Aufruf von go, siehe letzte Zeile) eine Funktion mit dem Namen draw suchen und dann in einem regelmäßigen Intervall aufrufen wird. Das heißt, draw stellt deine Game Loop dar. Jeder (Zeichen-)Schritt deines Spiels wird dort stattfinden (vergleiche es mit einem Daumenkino).

(...) besonders dieses Zurückgreifen auf globale Variablen, lokale Variablen und auch diese Funktionen usw. ist für mich kompliziert.

Ja, das musst du üben. Globale/Lokale Variablen werden ziemlich gut auf dieser Seite erklärt, mitsamt praktischen Beispielen. Zu Funktionen lässt sich ebenfalls ein Beitrag finden.

1
jonasd123 
Fragesteller
 15.05.2020, 12:02
@regex9

Vielen Dank für die ausführliche Antwort!! Dann werde ich es einmal versuchen

0