Autor Beitrag
MatthiasT
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 09.01.07 17:07 
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" :


ausblenden volle Höhe 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 user profile iconChristian S.: Delphi-Tags hinzugefügt
freedy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 403
Erhaltene Danke: 1

Winows 7
Delphi XE
BeitragVerfasst: 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:
ausblenden 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;

//  usw.


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 196

Windows Vista
Delphi 7 Prof.
BeitragVerfasst: 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

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
case random(6)+1 of

  1begin
       ShowMessage ('Eins!');
     end;

  2begin
       ShowMessage ('Zwei!');
     end;

end{Nicht sicher ob das Case ein end braucht.}
MatthiasT Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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.


ausblenden volle Höhe 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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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


 1begin
       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;


  2begin
     Form1.Image2.Visible := True;
     Form1.Label1.Caption :='Du hast eine 2 geworfen. Wenigstens keine 1!';
       Form1.Label3.Caption := IntToStr (x+2);
        end;

  3begin
  Form1.Image3.Visible := True;
  Form1.Label1.Caption := 'Du hast eine 3 geworfen. Nicht schlecht!';
  Form1.Label3.Caption := IntToStr (x+3);
  end;

  4begin
  Form1.Image4.Visible := True;
  Form1.Label1.Caption :='Du hast eine 4 geworfen. Gut!';
  Form1.Label3.Caption := IntToStr (x+4);
  end;

  5begin
  Form1.Image5.Visible := True;
  Form1.Label1.Caption :='Hey, du hast eine 5 geschmissen! Klasse!';
  Form1.Label3.Caption := IntToStr (x+5);
  end;

  6begin
  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 user profile iconGausi: Code- durch Delphi-Tags ersetzt
Dragonclaw
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 196

Windows Vista
Delphi 7 Prof.
BeitragVerfasst: Di 09.01.07 21:01 
user profile iconMatthiasT 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
ausblenden 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

ausblenden Delphi-Quelltext
1:
2:
x := x + 2//X wird zu X+2
Form1.Label3.Caption := IntToStr (x); //X wird ins Lable geschrieben


oder

ausblenden Delphi-Quelltext
1:
2:
inc(x,2//inc heißt increase(eng. erhöhen), X wird also um 2 erhöht
Form1.Label3.Caption := IntToStr (x); //X wird ins Lable geschrieben


Du kannst übrigens das Form1. weglassen.

user profile iconMatthiasT 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 10.01.07 01:32 
Hallo!

Bitte erstelle bei neuen Fragen pro Frage jeweils einen Thread. Danke!

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.

Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.