Delphi-PRAXiS
Seite 5 von 7   « Erste     345 67      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Eine Projektarbeit (https://www.delphipraxis.net/182706-eine-projektarbeit.html)

Sir Rufo 17. Dez 2014 14:31

AW: Eine Projektarbeit
 
Spätestens jetzt solltest du gemerkt haben, dass ein Konzept (was soll wie wo warum angezeigt werden) sehr hilfreich bei der Umsetzung in den echten Code ist.

Und dafür sind zunächst Papier und Bleistift (+ frisches Radiergummi) gefragt.

Einfach planlos drauflosklappern bringt nichts - oder eben ein Snake wofür es nur 6 Punkte gibt.

BadenPower 17. Dez 2014 20:11

AW: Eine Projektarbeit
 
Zitat:

Zitat von Mavarik (Beitrag 1283589)
Soll Joshua auch Spieler Anzahl 0 können damit er lernt das der beste Spielzug - nicht zu spielen ist...? :cyclops:

Zu oft Wargames im Kino geschaut???


Sorry für OT, konnt ich mir nicht verkneifen, denn der Film ist irgendwie doch gut.

Mavarik 18. Dez 2014 13:55

AW: Eine Projektarbeit
 
Zitat:

Zitat von BadenPower (Beitrag 1283815)
Zu oft Wargames im Kino geschaut???

War mir nicht sicher, ob "alle" alt genug sind für die Anspielung...

@Felix Stein...
hmm ob "mein Snakeland 3d" auch nur 6 Punkte bringen würde?
oder "Schiffe versenken"? Sind auch "nur" entstanden weil hier einer ne Frage hatte...

[OT]Das konnte ich mir jetzt nicht nehmen lassen[/OT]

Felix Stein 19. Jan 2015 09:13

AW: Eine Projektarbeit
 
Morgen, wir melden uns mal wieder und sind jetzt schon ein ganzes stück weiter. Bis lang steht Tic Tac Toe und jetzt sitzen wir am Memory. Leider sitzen wir was das angeht aber in einer kleinen Misere wir wissen einfach nicht weiter. Ich werde das Programm unten anheften, vielleicht wisst ihr Rat wir haben keinen Plan wie wir folgendes Problem lösen sollen:

Feld mit Bild wird ausgewählt.
Zweites Feld mit Bild wird ausgewählt, keine Übereinstimmung.
Felder sollen zugedeckt werden.
Wir würden gerne vermeiden das der User das ganze manuell machen muss das verleitet ja zum Selbstbetrug (einfach die Felder offen lassen und hups ich bin der meister des Memory). wie immer ist uns Literatur lieber als eine Lösung wir wollen dieses Thema ja mit in das Literaturverzeichnis pack. Ich habe den Ordner als Zip verpackt hoffe das so alles funktioniert und danke schon mal im voraus für die Hilfe :)

MFG Felix

Ach ja Datei anhängen hat nicht funktioniert :( habe es als Zip verpackt aber da kommt leider eine Fehlermeldung (vermutlich ist die Datei zu groß)

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls;

type

{ TForm1 }

TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
Image10: TImage;
Image12: TImage;
Image13: TImage;
Image14: TImage;
Image16: TImage;
Image18: TImage;
Image19: TImage;
Image2: TImage;
Image3: TImage;
Image4: TImage;
Image5: TImage;
Image6: TImage;
Image7: TImage;
Image8: TImage;
Image9: TImage;
procedure Button1Click(Sender: TObject);
procedure Image10Click(Sender: TObject);
procedure Image12Click(Sender: TObject);
procedure Image13Click(Sender: TObject);
procedure Image14Click(Sender: TObject);
procedure Image16Click(Sender: TObject);
procedure Image18Click(Sender: TObject);
procedure Image19Click(Sender: TObject);
procedure Image1Click(Sender: TObject);
procedure Image2Click(Sender: TObject);
procedure Image3Click(Sender: TObject);
procedure Image4Click(Sender: TObject);
procedure Image5Click(Sender: TObject);
procedure Image6Click(Sender: TObject);
procedure Image7Click(Sender: TObject);
procedure Image8Click(Sender: TObject);
procedure Image9Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;

var
Form1: TForm1;
neuesBild:Integer=0;
listevonbildern:Array[0..7]of string =
('tulips.jpg',
'test.jpg',
'tulips.jpg',
'test.jpg',
'tulips.jpg',
'test.jpg',
'tulips.jpg',
'test.jpg');


implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
image1.Visible:=True;
image2.Visible:=True;
image2.Visible:=True;
image4.Visible:=True;
image5.Visible:=True;
image6.Visible:=True;
image7.Visible:=True;
image8.Visible:=True;
image9.Visible:=True;
image10.Visible:=True;
image12.Visible:=True;
image13.Visible:=True;
image14.Visible:=True;
image16.Visible:=True;
image18.Visible:=True;
image19.Visible:=True;


end;

procedure TForm1.Image10Click(Sender: TObject);
begin
Image10.Picture.LoadFromFile(ListevonBildern[neuesBild]);
inc(neuesBild);
if neuesBild> High(ListevonBildern)
then neuesBild :=Low(ListevonBildern);



end;

procedure TForm1.Image12Click(Sender: TObject);
begin
Image12.Picture.LoadFromFile(ListevonBildern[neuesBild]);
inc(neuesBild);
if neuesBild> High(ListevonBildern)
then neuesBild :=Low(ListevonBildern);
end;

procedure TForm1.Image13Click(Sender: TObject);
begin
Image13.Picture.LoadFromFile(ListevonBildern[neuesBild]);
inc(neuesBild);
if neuesBild> High(ListevonBildern)
then neuesBild :=Low(ListevonBildern);
end;

procedure TForm1.Image14Click(Sender: TObject);
begin
Image14.Picture.LoadFromFile(ListevonBildern[neuesBild]);
inc(neuesBild);
if neuesBild> High(ListevonBildern)
then neuesBild :=Low(ListevonBildern);
end;

procedure TForm1.Image16Click(Sender: TObject);
begin
Image16.Picture.LoadFromFile(ListevonBildern[neuesBild]);
inc(neuesBild);
if neuesBild> High(ListevonBildern)
then neuesBild :=Low(ListevonBildern);
end;

procedure TForm1.Image18Click(Sender: TObject);
begin
Image18.Picture.LoadFromFile(ListevonBildern[neuesBild]);
inc(neuesBild);
if neuesBild> High(ListevonBildern)
then neuesBild :=Low(ListevonBildern);
end;

procedure TForm1.Image19Click(Sender: TObject);
begin
Image19.Picture.LoadFromFile(ListevonBildern[neuesBild]);
inc(neuesBild);
if neuesBild> High(ListevonBildern)
then neuesBild :=Low(ListevonBildern);
end;

procedure TForm1.Image1Click(Sender: TObject);
begin
Image1.Picture.LoadFromFile(ListevonBildern[neuesBild]);
inc(neuesBild);
if neuesBild> High(ListevonBildern)
then neuesBild :=Low(ListevonBildern);
end;

procedure TForm1.Image2Click(Sender: TObject);
begin
Image2.Picture.LoadFromFile(ListevonBildern[neuesBild]);
inc(neuesBild);
if neuesBild> High(ListevonBildern)
then neuesBild :=Low(ListevonBildern);
end;

procedure TForm1.Image3Click(Sender: TObject);
begin
Image3.Picture.LoadFromFile(ListevonBildern[neuesBild]);
inc(neuesBild);
if neuesBild> High(ListevonBildern)
then neuesBild :=Low(ListevonBildern);
end;

procedure TForm1.Image4Click(Sender: TObject);
begin
Image4.Picture.LoadFromFile(ListevonBildern[neuesBild]);
inc(neuesBild);
if neuesBild> High(ListevonBildern)
then neuesBild :=Low(ListevonBildern);
end;

procedure TForm1.Image5Click(Sender: TObject);
begin
Image5.Picture.LoadFromFile(ListevonBildern[neuesBild]);
inc(neuesBild);
if neuesBild> High(ListevonBildern)
then neuesBild :=Low(ListevonBildern);

end;

procedure TForm1.Image6Click(Sender: TObject);
begin
Image6.Picture.LoadFromFile(ListevonBildern[neuesBild]);
inc(neuesBild);
if neuesBild> High(ListevonBildern)
then neuesBild :=Low(ListevonBildern);
end;

procedure TForm1.Image7Click(Sender: TObject);
begin
Image7.Picture.LoadFromFile(ListevonBildern[neuesBild]);
inc(neuesBild);
if neuesBild> High(ListevonBildern)
then neuesBild :=Low(ListevonBildern);
end;

procedure TForm1.Image8Click(Sender: TObject);
begin
Image8.Picture.LoadFromFile(ListevonBildern[neuesBild]);
inc(neuesBild);
if neuesBild> High(ListevonBildern)
then neuesBild :=Low(ListevonBildern);
end;

procedure TForm1.Image9Click(Sender: TObject);
begin
Image9.Picture.LoadFromFile(ListevonBildern[neuesBild]);
inc(neuesBild);
if neuesBild> High(ListevonBildern)
then neuesBild :=Low(ListevonBildern);
end;

end.
ich hoffe es geht auch so ansonsten muss ich es von zu Hause probieren.

Felix Stein 19. Jan 2015 10:07

AW: Eine Projektarbeit
 
Ok, ok vergesst den letzten Beitrag.
Wir haben gerade mit unserem Lehrer geredet und haben einige neue Ideen bekommen um das ganze einfacher zu gestalten.

Grundsätzlich sollen wir für Tic Tac Toe und Memory das selber System benutzen.

Schritt eins: "Bilder im Hintergrund" deren Eigenschaften dann verändert werden. Funktioniert ja im Grunde genommen mit beiden Spielsystemen. Wie richten wir also am besten diese Bilder ein?

Schritt zwei: Eigenschaften verändern.

Unterteilt in Memory und Tic Tac Toe:

Memory: Wir haben zwei formen die das Bild annehmen kann Deckseite (bei allen 18 Bildern gleich) und Frontseite die eben aus 9 Paaren besteht. Wie wir die Bilder platzieren wissen wir ist nun auch keine mentale Höchstleistung doch wir wissen nicht mit welchem Befehl wir klar machen, das zwei Bilder zu einem Paar gehören oder eben nicht.

Tic Tac Toe:
Wir haben 3 Grundformen leeres Feld, Bild das X anzeigt und Bild das O anzeigt. Bei dem anderen Programm sind wir am Schluss hängen geblieben wo es dann hieß welche Kombinationen jetzt Sieg, Niederlage oder Unentschieden waren und dann wurde uns eben ans Herz gelegt mit den Bildern im Hintergrund zu arbeiten.

Schritt drei: der Feinschliff.

Memory: Uns fehlt die Funktion das wenn zwei Bilder nun aufgedeckt werden, aber kein paar sind und nun automatisch wieder verdeckt werden. Daran hapert es wir finden keine Befehlskette und raten hat noch keinem Programm geholfen (Literatur könnte schon helfen).

Tic Tac Toe: Wir müssen die Siegesbedingungen Festlegen sprich
-3 Hochkant, Seitlich oder Schräg
Wir haben uns darauf geeinigt "nur" ein manuell bedientes Tic Tac Toe zu erstellen sprich keine KI, man könnte also in der Theorie auch gegen sich selbst spielen. Unser einziges Problem ist nun also die Siegesbedingung.

Wir würden uns über baldige Antwort freuen und bedanken uns schon im Voraus :)

p80286 19. Jan 2015 10:59

AW: Eine Projektarbeit
 
Zitat:

Zitat von Felix Stein (Beitrag 1287024)
Tic Tac Toe:
Wir haben 3 Grundformen leeres Feld, Bild das X anzeigt und Bild das O anzeigt. Bei dem anderen Programm sind wir am Schluss hängen geblieben wo es dann hieß welche Kombinationen jetzt Sieg, Niederlage oder Unentschieden waren und dann wurde uns eben ans Herz gelegt mit den Bildern im Hintergrund zu arbeiten.

U.U. hast Du Dich ungeschickt ausgedrückt, aber die "Drei Bilder" haben mit dem eigentlichen Spiel nichts zu tun. Die Bilder werden nur für die Darstellung des Spielstandes genutzt. der Spielstand sollte in einem Array oder ähnlichem verwaltet werden.

Und das gilt auch für das Memoryspiel. Hier sind zwei Arrayfelder gleich egal welche Darstellung für die beiden Felder genutzt wird!

Gruß
K-H

isilive 20. Jan 2015 19:42

AW: Eine Projektarbeit
 
Das Problem ist, dass ihr das Pferd von hinten aufzäumt. Wie p80286 richtigerweise anmerkt sollte man sich beim Austüfteln des Programms zuerst auf die Programmlogik und erst später auf die Darstellung konzentrieren.

Beispiel1:
Ich habe ein Programm das schöne Bilder anzeigt. Wenn ich draufklicke passiert entweder nix oder etwas zufälliges.
Beispiel2:
Ich habe ein Programm das mir nur 14 mal ein "X" als Text hinschreibt. Wenn ich per Tastatur ein X aufmache erscheint eine Zahl. Decke ich zwei gleiche Zahlen hintereinander auf bleiben sie offen. Sind alle "X" offen habe ich gewonnen.
Welches Programm ist "mehr" Memory?


Ok, also was braucht ihr noch? Richtig, die gesamte Spiellogik.

Wie kann ich die einbauen?

Man braucht eine Funktion die immer aufgerufen wird, egal auf welche Karte man geklickt hat. Und die weiß auf welche Karte man klickte und die sich ein paar Sachen "merkt" (zB in globalen Variablen).

Dazu muss man aber etwas abstrahieren. Ihr habt 14 Karten(Bilder) und ihr schreibt 14x den "fast" selben Code hin. Erstens kannn man das bei 100 Bildern nicht mehr machen, und zweitens müsstet ihr jede kleine Änderung der Logik immer 14x ändern.

Ich würde das beispielsweise so angehen:

1) Ihr müsst allen Bildern das selbe Klickevent zuweisen. Es soll die selbe Funktion aufgerufen werden. Dies macht ihr in dem ihr bei allen Bildern im Objektinspektor bei OnClick die selbe Funktion angebt.

2) Natürlich muss man aber wissen auf WELCHES Bild geklickt wurde.
Das geht über Auswerten des Senders:
wird zb hier erklärt: http://www.festra.com/wwwboard/messages/2235.html

2b) Als mögliche Alternative fällt mir gerade ein: alle Klick-Events rufen danach eine einheitliche Funktion auf und schicken als Parameter mit auf welche Karte geklickt wurde.

3) Jetzt haben wir einen Eventhandler der von allen Karten ausgelöst wird und der weiß auf welche Karte geklickt wurde. Dann können wir mit der Logik beginnen.

4) Diese braucht ein paar globale Variablen. Sie muss wissen:
ob wir gerade auf die "erste" oder die "zweite" Karte geklickt haben
wieviele Karten schon aufgedeckt sind
evtl. welche Karten aufgedeckt und verdeckt sind (Array/Liste)

5) Ich würde zB. eine Integer Variable "Status" nehmen
zu Beginn ist status := 0
klicke ich auf die erste Karte:
status := 1
decke diese karte auf
merke dir diese karte (in einer variablen)

klicke ich auf die nächste (zweite) Karte:
status := 2
decke diese karte auf
if diese karte = die erste karte then:
speichere irgendwie (variable, array, liste, whatever) dass diese beiden karten nach dem nächsten klick offen bleiben
Speichere auch wieviele Karten offen sind. Sind alle offen ist das Spiel gewonnen.

klicke ich wieder auf eine Karte:
decke die 2 vorigen Karten wieder zu (außer es waren 2 gleiche)
status := 1
und mache es wie oben bei status 1


Die Spiellogik von Memory ist gar nicht so trivial zu implementieren wie man meinen möchte, jedoch ist es gut mit Standardmethoden möglich.

Ich würde mir zu beginn die Arbeit vereinfachen und nur mal:
- ich klicke auf eine Karte
- es wird immer der gleiche Eventhandler (Funktion) aufgerufen.
- ein Memo schreibt mir hin auf welche Karte geklickt wurde (zur Kontrolle. Debugging) Wird über "Sender" rausgefunden - siehe oben.
- ich kann erstmal einfach alle Karten aufmachen
- wenn alle Karten offen sind erkennt das Programm das

später:
- das Memo schreibt auch den Status hin. (siehe oben)
- wenn der status von 2 auf 1 geht könnte mich - erstmal zur Vereinfachung - auch eine Messagebox fragen ob die letzten 2 Karten identisch waren. Als braver Bürger beantworte ich die Frage natürlich wahrheitsgemäss und kann spielen :-D

Mavarik 23. Jan 2015 19:14

AW: Eine Projektarbeit
 
Liste der Anhänge anzeigen (Anzahl: 3)
hmm, konnte es mal wieder nicht lassen...

Anbei mein Umsetzung vom Memory!

"Firemerk in Version 0.9" als POC

Augenmerk habe ich auch eher auf die Animation gelegt...

Anbei ist auch ein Bildeditor.
Hier kann man fertige Bilder aus dem Internet benutzen..

Einfach mal "memory bilder zum ausdrucken" googlen...

Wenn die Vorlage alle Bilder schon doppelt hat, gibt es einen entsprechenden Hacken...

Ansonsten kann man auch sein Lieblingsbild nehmen...:-D

Grüsse Mavark :coder:

[EDIT] Bild für Doppelbilder mit rotem Pfeil für den Hacken!

kinza 5. Mär 2015 06:35

AW: Eine Projektarbeit
 
Ist es möglich mehrere Label per Schleife zu benennen?
So funktioniert es nicht:

Delphi-Laie 5. Mär 2015 06:50

AW: Eine Projektarbeit
 
Zitat:

Zitat von kinza (Beitrag 1292386)
Ist es möglich mehrere Label per Schleife zu benennen?

FindComponent

Zitat:

Zitat von kinza (Beitrag 1292386)
So funktioniert es nicht:

Wie?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:08 Uhr.
Seite 5 von 7   « Erste     345 67      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz