Tic Tac Toe for kids
-
hallo leute,
ich bin neu hier und wollte einfach mal fragen ob ihr mir mit meinem Programm helfen könntet?
Ich möchte ein leicht programmiertes Tic Tac Toe spiel machen. Ich hab Labels eingebaut die per click Xe bzw Oe anzeigen lassen.#pragma resource "*.dfm" TForm2 *Form2; TImage* x1; TImage* x2; TImage* x3; TImage* x4; TImage* x5; TImage* x6; TImage* x7; TImage* x8; TImage* x9; //--------------------------------------------------------------------------- __fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm2::Label1Click(TObject *Sender) { x1 = new TImage(this); x1->Parent = this; x1->Width = 90; x1->Height = 86; x1->Stretch = true; x1->Top = 22; x1->Left = 40; x1->Picture->LoadFromFile("X.bmp"); } //--------------------------------------------------------------------------- void __fastcall TForm2::Label2Click(TObject *Sender) { x2 = new TImage(this); x2->Parent = this; x2->Width = 90; x2->Height = 86; x2->Stretch = true; x2->Top = 22; x2->Left = 148; x2->Picture->LoadFromFile("X.bmp"); } //--------------------------------------------------------------------------- void __fastcall TForm2::Label3Click(TObject *Sender) { x3 = new TImage(this); x3->Parent = this; x3->Width = 90; x3->Height = 86; x3->Stretch = true; x3->Top = 22; x3->Left = 255; x3->Picture->LoadFromFile("X.bmp"); } //--------------------------------------------------------------------------- void __fastcall TForm2::Label4Click(TObject *Sender) { x4 = new TImage(this); x4->Parent = this; x4->Width = 90; x4->Height = 86; x4->Stretch = true; x4->Top = 116; x4->Left = 40; x4->Picture->LoadFromFile("X.bmp"); } //--------------------------------------------------------------------------- void __fastcall TForm2::Label5Click(TObject *Sender) { x5 = new TImage(this); x5->Parent = this; x5->Width = 90; x5->Height = 86; x5->Stretch = true; x5->Top = 116; x5->Left = 149; x5->Picture->LoadFromFile("X.bmp"); } //--------------------------------------------------------------------------- void __fastcall TForm2::Label6Click(TObject *Sender) { x6 = new TImage(this); x6->Parent = this; x6->Width = 90; x6->Height = 86; x6->Stretch = true; x6->Top = 116; x6->Left = 255; x6->Picture->LoadFromFile("X.bmp"); } //--------------------------------------------------------------------------- void __fastcall TForm2::Label7Click(TObject *Sender) { x7 = new TImage(this); x7->Parent = this; x7->Width = 90; x7->Height = 86; x7->Stretch = true; x7->Top = 208; x7->Left = 42; x7->Picture->LoadFromFile("X.bmp"); } //--------------------------------------------------------------------------- void __fastcall TForm2::Label8Click(TObject *Sender) { x8 = new TImage(this); x8->Parent = this; x8->Width = 90; x8->Height = 86; x8->Stretch = true; x8->Top = 208; x8->Left = 149; x8->Picture->LoadFromFile("X.bmp"); } //--------------------------------------------------------------------------- void __fastcall TForm2::Label9Click(TObject *Sender) { x9 = new TImage(this); x9->Parent = this; x9->Width = 90; x9->Height = 86; x9->Stretch = true; x9->Top = 208; x9->Left = 255; x9->Picture->LoadFromFile("X.bmp"); }
jetzt wollt ich halt ne if-funktion einbauen, damit das immer zwischen X und O wechselt und man nach 3 X oder O in einer reihe gewinnt.
ich weiß nicht wie ich das anstellen soll. Danke im vorraus
mfg anfänger
-
Wie wäre es denn mit einem Array of TLabel*. Das würde vermutlich den ganzen Kram erleichtern. Du könntest die Koordinaten der Labels dynamisch setzen und dann auch in der OnClick Funktion des Labels anhand eines Tags oder was-auch-immer das angeklickte Label identifizieren. dann bräuchtest du nur noch irgendwo ein Array wo die Stati der 9 Felder gespeichert werden. Und dann müsstest du in der Onclick-Funktion einfach nur den Status ändern, nachdem du das Label identifiziert hast.
-
anfänger911 schrieb:
ich bin neu hier...
...was man alleine schon daran bemerkt das du im falschen Unterforum bist. Dein Code ist eindeutig C++ Builder spezifisch und kein ANSI C++.
Aber davon abgesehen:
1. Grundsätzlich sind globale Variablen wo immer möglich zu vermeiden.
2. Wie auch von it0101@loggedoff genannt solltest du ein Array (oder besser noch eine geeignete Containerklasse wie std::vector) verwenden.cu André
-
Empfehlen würde ich dir folgendes Tutorial zur dynamischen Erzeugung von C++ Builder Komponenten:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39211.html
-
( PS: ist kein Tutorial, nur ein FAQ )
Desweiteren lohnen sich auch viele andere FAQs im C++ Builder-FAQ-Unterforum.
-
ok danke für die antworten, aber wie kann ich das arry denn machen bzw wie sieht es aus?
-
anfänger911 schrieb:
ok danke für die antworten, aber wie kann ich das arry denn machen bzw wie sieht es aus?
1. Such ein vernümftiges Buch (z.B. Thinking in C++, C++ Primer)
2. Arbeite dieses Buch durchBei dir hapert es noch an grundlegendsten C++ Fähigkeiten (Lies dir mal etwas über Arrays durch, das steht in wirklich jedem C++ Grundlagen Buch).
-
Dieser Thread wurde von Moderator/in Phoemuex aus dem Forum C++ in das Forum VCL (C++ Builder) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hallo
Zum Thema Arrays siehe die FAQ hier im Builder-Forum. Da gibt es im Abschnitt "Komponenten benutzen" einen Eintrag "Array von Komponenten".
Zur eigentlichen Ausgangsfrage : Das nennt sich die Spiellogik, und sollte eigentlich der erste Teil des Quellcodes sein der konzeptioniert wird. Du must den Zustand der 3x3 Felder noch extra zwischenspeichern, um nach jedem Zug die Lage neu auszuwerten. Jedes Feld kann drei mögliche Zustände annehmen : leer, X oder O. Am besten machst du dir ein extra Abzählungstyp
enum FeldStatus {Leer, X, O};
Da du für jedes Feld ein Status brauchst, legst du wieder ein Array an
bis bald
akari
-
akari schrieb:
Da du für jedes Feld ein Status brauchst, legst du wieder ein Array an
Oder Du verwendest dafür die Eigenschaft TLabel::Tag, dann brauchst Du kein zusätzliches Array.
-
Joe_M. schrieb:
Oder Du verwendest dafür die Eigenschaft TLabel::Tag, dann brauchst Du kein zusätzliches Array.
Oder man packt das, was logisch zusammen gehört in eine Struktur (bzw. Klasse) und legt diese auf dem Array ab...
Wobei ich leichte Bauchschmerzen mit dem Zusammenlegen von den Labeln und den Zustand (ob nun über das Tag oder die Struktur) habe, da ich eigentlich Logik und UI trenne.
-
asc schrieb:
da ich eigentlich Logik und UI trenne.
Grundsätzlich richtig. Aber ich weiß nicht, ob der Threadstarter da jetzt schon mit klar kommt.
-
danke für die hilfei ch hab mich mal informiert aber ich bekomme die arry nicht hin
wie muss das denn ungefähr dann aussehen für das tic tac toe spielp.s.: als tic tac toe feld hab ich nen bild als hintergrundeingefügt
mfg anfänger911
-
anfänger911 schrieb:
danke für die hilfei ch hab mich mal informiert aber ich bekomme die arry nicht hin
Tut mir leid, aber wenn du noch nicht einmal mit dem dir schon gegebenen Link auf einen FAQ-Eintrag weiterkommst, in dem fast 1:1 dein Problem beschrieben ist, solltest du dich vielleicht erstmal mit den C++ Grundlagen ohne VCL auseinander setzen. Vorkauen bis auf Ebene des einfachen Abschreibens - ohne zu verstehen was gemacht wird - bringt wirklich nichts (und kostet uns nur Zeit).