Logikfehler im Shop

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Logikfehler im Shop

    Da bin ich mal wieder! :D

    Habe bei mir im Spiel einen Shop eingebaut, in dem man Waffen, Energie, Bomben und Schilder kaufen kann, wenn bestimmte Bedingungen erfüllt sind. Der Code als Ganzes ist relativ komplex (für mich :P ) und deshalb würde ich von den Experten gerne einmal die Logik überprüfen lassen.

    Gedacht ist es so:

    eine Waffe darf gekauft werden, wenn man genug Geld hat und man die Waffe noch nicht hat. Verkaufen darf man die Waffe, wenn man sie hat und man mehr als eine Waffe besitzt. Die Variablen global.canbuy und global.cansale geben den Buttons den Befehl weiter, ob man kaufen / verkaufen darf, die Prüfung erfolgt in einem anderen Objekt. Die Variable global.ware sagt aus, welcher Artikel gewählt wurde.

    Als Beispiel für die Überprüfung hier mal die Waffe 1:

    Spoiler anzeigen

    GML-Quellcode

    1. // Waffe 1
    2. if global.ware = 4{
    3. if score >= global.buy{ // Wenn genug Geld da ist...
    4. if global.waffe[0] = false{ // ...und das Limit nicht erreicht wurde...
    5. global.canbuy = true; // ...kann gekauft werden
    6. }else{ // Wenn nicht...
    7. global.canbuy = false; // dann nicht :-)
    8. }
    9. }
    10. if global.waffe[0] = true{
    11. if global.waffenzaehler > 1{ // Wenn nur eine Waffe vorhanden ist
    12. global.cansale = true;
    13. }else{
    14. global.cansale = false;
    15. }
    16. }else{
    17. global.cansale = false;
    18. }
    19. }
    Alles anzeigen


    Ich bin mir hier nicht sicher, ob das "else" an den richtigen Stellen steht. :S
  • Das Else steht soweit ich das beurteilen kann (deine Klammerführung ist etwas ... verwirrend :3) an der Richtigen Stelle. Aber es wird z.b. global.canbuy nicht gesetzt, falls die Score zu niedrig ist. Deshalb....

    Mein Freund, ich werde dir jetzt mal das logische UND näher bringen. Das Logische UND (&&) und ODER (||) ist im Programmieren sehr wichtig, da es sachen wie if Statements extrem vereinfacht. Du hast mehrere Ifs ineinander verschachtelt, obwohl es logisch dafür keine Grund gibt. Aber zu erst mal wie die Teile Funktionieren. && und || verknüpfen bei boolesche Werte, also 0 und 1 (wobei 0 für Falsch und 1 für Richtig steht).

    Bei && ist das so, wenn alle Bedingungen richtig sind, ist das Ergebnis richtig. Bei Oder muß nur eine Bedingung Richtig sein und das Ergebnis stimmt:

    Quellcode

    1. 1 && 1 = 1
    2. 1 && 0 = 0
    3. 0 && 1 = 0
    4. 0 && 0 = 0
    5. 1 || 1 = 1
    6. 1 || 0 = 1
    7. 0 || 1 = 1
    8. 0 || 0 = 0


    Was hilft dir das bei deinem Problem: Viel.

    "score >= global.buy" ergibt Richtig oder Falsch.
    "global.waffe[0] == false" ergibt auch Richtig oder Falsch, und obwohl Gamemaker in einem IF Statement auch nur ein "=" zulässt, solltest du dir, falls du später vielleicht mal C oder was ähnlichens entwickeln willst gleich zwei "==" angewöhnen. Wenn du in C z.b. im IF Statement "global.waffe[0] = false" schreibst wird der variable global.waffe[0] der Wert false zugewiesen. "==" ist hingegen die abfrage ob die beiden werte identisch sind.

    Anyway, du kannst beide Statements wie folgt verknüfpen:

    GML-Quellcode

    1. if( (score >= global.buy) && (global.waffe[0] == false) )...


    Auf deinen ganzen Code angewandt würde das dann so aussehen:

    GML-Quellcode

    1. // Waffe 1
    2. if global.ware = 4
    3. {
    4. //Wenn Genug Geld da ist, und du die Waffe noch nicht besitzt
    5. if( (score >= global.buy) && (global.waffe[0] == false) )
    6. {
    7. global.canbuy = true;
    8. }
    9. else
    10. {
    11. global.canbuy = false;
    12. }
    13. // Wenn du die Waffe bereits besitzt und mehr als 1 Stück hast
    14. if( (global.waffe[0] == true) && (global.waffenzaehler > 1) )
    15. {
    16. global.cansale = true;
    17. }
    18. else
    19. {
    20. global.cansale = true;
    21. }
    22. }
    Alles anzeigen
    ...