Entwickler-Ecke
Sonstiges (Delphi) - Würfelspiel
MatthiasT - Di 09.01.07 17:07
Titel: Würfelspiel
Hallo Leute, ich wusste nicht genau, in welche "Abteilung" mein Thread gehört (bin neu hier) und hoffe, dass er hier hin passt.
Wir haben über die Ferien auf (enden nächsten Montag), ein kleines Spiel zu programmieren mit Delphi zu programmieren.
Leider kann ich sehr sehr sehr wenig in Delphi und habe mich für ein ganz simples Spiel entschieden ^^.
Das Spiel geht so: Man würfelt mit einem Würfel. Das Ziel ist es eine möglichst hohe Punktzahl zu erreichen.
Man kann selber entscheiden, wie oft man würfelt. Das Risiko bei dem Spiel besteht darin, dass man bei einer geworfenen 1 praktisch verliert, da die Punktzahl auf einen Punkt reduziert wird. Also muss man immer abwegen, ob sich das Risiko lohnt noch einmal zu werfen oder lieber bei der erreichten Punktzahl bleibt.
So jetzt habe ich angefangen zu programmieren. Ich habe mir Würfelbilder von den einzelnen Augenzahlen mit Paint gemalt und diese in Delphi mit dieser Imagefunktion gezeigt. Diese Imagefelder habe ich dann übereinander gezogen. Am Anfang ist ein Bild mit einem Fragezeichen Platzhalter für den später gezeigten Würfel.
Dann hab ich nen Button gemacht und folgendes "programmiert" :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| procedure TForm1.Button1Click(Sender: TObject); var z :integer; begin
Form1.Image1.Visible := False; Form1.Image2.Visible := False; Form1.Image3.Visible := False; Form1.Image4.Visible := False; Form1.Image5.Visible := False; Form1.Image6.Visible := False; sleep (300) ;
randomize; z := random(6) + 1; Form1.Image7.Visible := False; if z = 1 then Form1.Image1.Visible := True; if z = 1 then ShowMessage ('Mist, du hast leider eine 1 geworfen!'); if z = 2 then Form1.Image2.Visible := True; if z = 2 then ShowMessage ('Du hast eine 2 geworfen. Wenigstens keine 1!'); if z = 3 then Form1.Image3.Visible := True; if z = 3 then ShowMessage ('Du hast eine 3 geworfen. Nicht schlecht!'); if z = 4 then Form1.Image4.Visible := True; if z = 4 then ShowMessage ('Du hast eine 4 geworfen. Gut!'); if z = 5 then Form1.Image5.Visible := True; if z = 5 then ShowMessage ('Hey, du hast eine 5 geschmissen! Klasse!'); if z = 6 then Form1.Image6.Visible := True; if z = 6 then ShowMessage ('Du hast eine 6 geworfen!Spitze!'); end; |
Zum Verständnis Image7 ist das Fragezeichen.
So, d.h jetzt kommt bei jedem Wurf eine Nachricht und sagt mir was ich gewürfelt habe und der entsprechen Würfel mit der passenden Augenzahl wird gezeigt. doch jetzt steh ich irgendwie auf dem Schlauch. Als nächstes müssen ja die Augenpaar immer addiert werden mit jedem Wurf und bei einer geworfenen 1 auf 1 gesetzt werden.
Doch das klappt bei mir irgendwie nicht, d.h jetzt brauche ich eure Hilfe ^^ .
Ich wollte das so machen, dass ich am Anfang x=0 setze und dann x=x+z benutze, aber das hat na klar nicht geklappt.
MfG Matze
Moderiert von
Christian S.: Delphi-Tags hinzugefügt
freedy - Di 09.01.07 17:19
Hi!
Ist eine nette Spielidee. "Böse 1" habe ich früher schon gerne gespielt.
Also, deinen Sourcecode solltest du dir nochmal angucken. Da das ganze Spiel ja in einer Prozedur abgehandelt werden kann, empfehle ich dir, dich mal case-Anweisungen auseinander zu setzen. Des Weiteren brauchst du nicht zwei mal hintereinander eine if-Abfrage, wenn sich der Wert nicht ändert.
Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| if z = 1 then begin Form1.Image1.Visible := True; ShowMessage ('Mist, du hast leider eine 1 geworfen!'); end; if z = 2 then begin Form1.Image2.Visible := True; ShowMessage ('Du hast eine 2 geworfen. Wenigstens keine 1!'); end;
|
Die Funktion Randomize() braucht nur einmalig aufgerufen werden. Pack sie z.B. in das OnCreate des TForms.
Als Spieler fände ich es nervig, wenn nach jedem Wurf eine MessageBox aufgeht. Das drückt den Spielspaß. Bei einer "1" wäre das okay. Gib die Nachrichten doch lieber in einem Textfeld aus, dass nicht beschreibbar ist.
Das Zusammenzählen muss auch unterschieden werden. Wo machst du das genau? Poste doch evtl. mal deinen ganzen Code. (Delphi-Tags nicht vergessen ;-) )
Gruß
Dragonclaw - Di 09.01.07 17:26
Hallo!
Ahh da war jemand schneller, naja dann kann ich ja mal nen kurzes Beispiel für Case posten
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| case random(6)+1 of
1: begin ShowMessage ('Eins!'); end;
2: begin ShowMessage ('Zwei!'); end;
end; |
MatthiasT - Di 09.01.07 20:11
So ihr mal der ganze Code. Hab die Casefunktion jetzt hoffentlich richtig angewendet. Zumindest funktioniert sie ^^ . Eine Message kommt jetzt nur noch bei der 1. Die anderen Sprüche werden in einem Label (Label 1)angezeigt und in dem Label wird auch nochmal am Ende die Gesamtpunktzahl angezeigt, wenn man aufhören möchte (Button2). Hab jetzt 2 Probleme. Das erste ist das Addieren der geworfenen Zahlen. Wollte das so machen, dass ich x beim Starten des Programms gleich 0 setze und dann z.b x+2 , x+3 usw rechne. Dachte wenn ich das x in Create gleich 0 setze klappt das, aber irgendwie nicht... jetzt setz er es bei jedem Wurf =0 ..
und mein 2. Problem liegt darin, dass ich nicht weiß, wie ich das Programm nach dem Spiel von vorne beginnen lassen kann.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, jpeg, ExtCtrls, Buttons;
type TForm1 = class(TForm) Button1: TButton; Image1: TImage; Image2: TImage; Image3: TImage; Image4: TImage; Image5: TImage; Image6: TImage; Image7: TImage; Label1: TLabel; Label2: TLabel; Label3: TLabel; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); private public end;
var x :integer; Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin
Form1.Image1.Visible := False; Form1.Image2.Visible := False; Form1.Image3.Visible := False; Form1.Image4.Visible := False; Form1.Image5.Visible := False; Form1.Image6.Visible := False; Form1.Image7.Visible := False;
case random(6)+1 of
1: begin Form1.Image1.Visible := True; ShowMessage ('Das Spiel ist vorbei. Deine Punktzahl beträgt leider nur 1!'); Form1.Label1.Caption := 'Das Spiel ist vorbei. Deine Punktzahl beträgt leider nur 1!'; Form1.Label3.Caption := '1' end;
2: begin Form1.Image2.Visible := True; Form1.Label1.Caption :='Du hast eine 2 geworfen. Wenigstens keine 1!'; Form1.Label3.Caption := IntToStr (x+2); end;
3: begin Form1.Image3.Visible := True; Form1.Label1.Caption := 'Du hast eine 3 geworfen. Nicht schlecht!'; Form1.Label3.Caption := IntToStr (x+3); end;
4: begin Form1.Image4.Visible := True; Form1.Label1.Caption :='Du hast eine 4 geworfen. Gut!'; Form1.Label3.Caption := IntToStr (x+4); end;
5: begin Form1.Image5.Visible := True; Form1.Label1.Caption :='Hey, du hast eine 5 geschmissen! Klasse!'; Form1.Label3.Caption := IntToStr (x+5); end;
6: begin Form1.Image6.Visible := True; Form1.Label1.Caption :='Du hast eine 6 geworfen!Spitze!'; Form1.Label3.Caption := IntToStr (x+6); end; end; end;
procedure TForm1.FormCreate(Sender: TObject); begin randomize; x := 0; end;
procedure TForm1.Button2Click(Sender: TObject); begin Form1.Label1.Caption := 'Deine Punktzahl beträgt ' + IntToStr (x); end;
end. |
Moderiert von
Gausi: Code- durch Delphi-Tags ersetzt
Dragonclaw - Di 09.01.07 21:01
MatthiasT hat folgendes geschrieben: |
Hab jetzt 2 Probleme. Das erste ist das Addieren der geworfenen Zahlen. Wollte das so machen, dass ich x beim Starten des Programms gleich 0 setze und dann z.b x+2 , x+3 usw rechne. Dachte wenn ich das x in Create gleich 0 setze klappt das, aber irgendwie nicht... jetzt setz er es bei jedem Wurf =0 .. |
Du hast im Code das hier drinstehen
Delphi-Quelltext
1:
| Form1.Label3.Caption := IntToStr (x+2); |
Diese Zeile bewirkt das dem Label3 der Wert von X PLUS 2 zugewiesen werden soll. Es bewirkt aber NICHT das X um 2 erhöht wird. Damit das Richtig klappt hast du 2 Möglichkeiten
Delphi-Quelltext
1: 2:
| x := x + 2; Form1.Label3.Caption := IntToStr (x); |
oder
Delphi-Quelltext
1: 2:
| inc(x,2) Form1.Label3.Caption := IntToStr (x); |
Du kannst übrigens das Form1. weglassen.
MatthiasT hat folgendes geschrieben: |
und mein 2. Problem liegt darin, dass ich nicht weiß, wie ich das Programm nach dem Spiel von vorne beginnen lassen kann.
|
Du machst einfach einen neuen Button der X auf Null setzt, und sämtliche Lables leert.
MatthiasT - Mi 10.01.07 01:29
Danke Leute, das Spiel funktioniert! Jetzt habe ich noch 2 kleine Fragen zur Listbox und ein neues Problem :( .
Meine Fragen zur Listbox lauten:
1. Kann man die Listbox umdrehen, so das sie horizontal liegt und die Werte nebeneinander stehen?
2. Die Listbox soll sozusagen die Highscores anzeigen. Konnte im Objektinspektor auch die Eigenschaft sorted finden, welche praktisch schon alles erledigt. Nur fängt sie mit dem kleinsten Wert an und es wäre schöner, wenn der größte Wert ganz vorne steht. Kann man das irgendwo umstellen?
So nun zu meinem Problem: Wenn ich mein Spiel starte hängt sich zu verschiedenen Zeiten das Programm auf / wird unterbrochen und es öffnet sich ein Fenster, welches oben links mit CPU beschriftet ist und voll mit Zahlen und Buchstaben ausgefüllt ist.
Und die Buchstaben ntdll.DbgBreakPoint: sind dick gekennezichnet. Ein grüner Pfeil zeigt auf die Buchstaben 7c911231 ret
Könnt ihr damit was anfangen??
Ich muss das Programm dann immer zurücksetzen. Das Problem besteht, glaub ich, seit dem beim Schließen von Delphi eine Meldung kam mit einem Text, der ungefähr so lautete: "Der Debugger läuft gerade. wollen sie das Programm trotzdem schließen?" und ich Ok geklickt habe.
Könnft ihr mir da helfen???
Christian S. - Mi 10.01.07 01:32
Hallo!
Bitte erstelle bei neuen Fragen pro Frage jeweils einen Thread. Danke!
Grüße
Christian
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!