• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[CR] Obiektowy C++ (#9): Tic-tac-toe - gra w kółko i krzyżyk

Object Storage Arubacloud
+4 głosów
2,276 wizyt
pytanie zadane 14 maja 2016 w Nasze poradniki przez Mirosław Zelent Nałogowiec (34,750 p.)

CR = Code Review. O co chodzi? Zajrzyj tutaj
Pełna lista wszystkich Code Review? Zajrzyj tutaj

https://www.youtube.com/watch?v=vd0zDG4vwOw

Unit1.cpp:

​//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

  char p1,p2,p3,p4,p5,p6,p7,p8,p9;
  //p1..p9 pola w grze (ich zawartosc: p1='n'; nic lub 'x' lub 'o' )
  char kto;

  void sprawdz()
  {
     if((p1==p2 && p2==p3 && p1!='n') ||
        (p4==p5 && p5==p6 && p4!='n') ||
        (p7==p8 && p8==p9 && p7!='n') ||
        (p1==p4 && p4==p7 && p7!='n') ||
        (p2==p5 && p5==p8 && p2!='n') ||
        (p3==p6 && p6==p9 && p3!='n') ||
        (p1==p5 && p5==p9 && p1!='n') ||
        (p3==p5 && p5==p7 && p3!='n'))
     {
        char * w;

        if (kto=='x') w="Wygrywa kółko!";
        else w="Wygrywa krzyżyk!";

        Application->MessageBox(w, "Koniec gry", MB_OK);

     }
  }


//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    pole1->Picture->LoadFromFile("img/nic.bmp");
    pole2->Picture->LoadFromFile("img/nic.bmp");
    pole3->Picture->LoadFromFile("img/nic.bmp");
    pole4->Picture->LoadFromFile("img/nic.bmp");
    pole5->Picture->LoadFromFile("img/nic.bmp");
    pole6->Picture->LoadFromFile("img/nic.bmp");
    pole7->Picture->LoadFromFile("img/nic.bmp");
    pole8->Picture->LoadFromFile("img/nic.bmp");
    pole9->Picture->LoadFromFile("img/nic.bmp");
    tura->Picture->LoadFromFile("img/osmall.bmp");

    p1='n'; p4='n'; p7='n';
    p2='n'; p5='n'; p8='n';
    p3='n'; p6='n'; p9='n';

    kto='o';

    pole1->Enabled = true;
    pole2->Enabled = true;
    pole3->Enabled = true;
    pole4->Enabled = true;
    pole5->Enabled = true;
    pole6->Enabled = true;
    pole7->Enabled = true;
    pole8->Enabled = true;
    pole9->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::pole1Click(TObject *Sender)
{
   if(p1=='n')
   {
      if(kto=='o')
      {
         pole1->Picture->LoadFromFile("img/o.bmp");
         p1='o';
         kto='x';
         tura->Picture->LoadFromFile("img/xsmall.bmp");
      }
      else
      {
         pole1->Picture->LoadFromFile("img/x.bmp");
         p1='x';
         kto='o';
         tura->Picture->LoadFromFile("img/osmall.bmp");
      }
      pole1->Enabled=false;
      sprawdz();
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::pole2Click(TObject *Sender)
{
if(p2=='n')
   {
      if(kto=='o')
      {
         pole2->Picture->LoadFromFile("img/o.bmp");
         p2='o';
         kto='x';
         tura->Picture->LoadFromFile("img/xsmall.bmp");
      }
      else
      {
         pole2->Picture->LoadFromFile("img/x.bmp");
         p2='x';
         kto='o';
         tura->Picture->LoadFromFile("img/osmall.bmp");
      }
      pole2->Enabled=false;
      sprawdz();
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::pole3Click(TObject *Sender)
{
if(p3=='n')
   {
      if(kto=='o')
      {
         pole3->Picture->LoadFromFile("img/o.bmp");
         p3='o';
         kto='x';
         tura->Picture->LoadFromFile("img/xsmall.bmp");
      }
      else
      {
         pole3->Picture->LoadFromFile("img/x.bmp");
         p3='x';
         kto='o';
         tura->Picture->LoadFromFile("img/osmall.bmp");
      }
      pole3->Enabled=false;
      sprawdz();
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::pole4Click(TObject *Sender)
{
if(p4=='n')
   {
      if(kto=='o')
      {
         pole4->Picture->LoadFromFile("img/o.bmp");
         p4='o';
         kto='x';
         tura->Picture->LoadFromFile("img/xsmall.bmp");
      }
      else
      {
         pole4->Picture->LoadFromFile("img/x.bmp");
         p4='x';
         kto='o';
         tura->Picture->LoadFromFile("img/osmall.bmp");
      }
      pole4->Enabled=false;
      sprawdz();
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::pole5Click(TObject *Sender)
{
if(p5=='n')
   {
      if(kto=='o')
      {
         pole5->Picture->LoadFromFile("img/o.bmp");
         p5='o';
         kto='x';
         tura->Picture->LoadFromFile("img/xsmall.bmp");
      }
      else
      {
         pole5->Picture->LoadFromFile("img/x.bmp");
         p5='x';
         kto='o';
         tura->Picture->LoadFromFile("img/osmall.bmp");
      }
      pole5->Enabled=false;
      sprawdz();
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::pole6Click(TObject *Sender)
{
if(p6=='n')
   {
      if(kto=='o')
      {
         pole6->Picture->LoadFromFile("img/o.bmp");
         p6='o';
         kto='x';
         tura->Picture->LoadFromFile("img/xsmall.bmp");
      }
      else
      {
         pole6->Picture->LoadFromFile("img/x.bmp");
         p6='x';
         kto='o';
         tura->Picture->LoadFromFile("img/osmall.bmp");
      }
      pole6->Enabled=false;
      sprawdz();
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::pole7Click(TObject *Sender)
{
if(p7=='n')
   {
      if(kto=='o')
      {
         pole7->Picture->LoadFromFile("img/o.bmp");
         p7='o';
         kto='x';
         tura->Picture->LoadFromFile("img/xsmall.bmp");
      }
      else
      {
         pole7->Picture->LoadFromFile("img/x.bmp");
         p7='x';
         kto='o';
         tura->Picture->LoadFromFile("img/osmall.bmp");
      }
      pole7->Enabled=false;
      sprawdz();
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::pole8Click(TObject *Sender)
{
if(p8=='n')
   {
      if(kto=='o')
      {
         pole8->Picture->LoadFromFile("img/o.bmp");
         p8='o';
         kto='x';
         tura->Picture->LoadFromFile("img/xsmall.bmp");
      }
      else
      {
         pole8->Picture->LoadFromFile("img/x.bmp");
         p8='x';
         kto='o';
         tura->Picture->LoadFromFile("img/osmall.bmp");
      }
      pole8->Enabled=false;
      sprawdz();
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::pole9Click(TObject *Sender)
{
if(p9=='n')
   {
      if(kto=='o')
      {
         pole9->Picture->LoadFromFile("img/o.bmp");
         p9='o';
         kto='x';
         tura->Picture->LoadFromFile("img/xsmall.bmp");
      }
      else
      {
         pole9->Picture->LoadFromFile("img/x.bmp");
         p9='x';
         kto='o';
         tura->Picture->LoadFromFile("img/osmall.bmp");
      }
      pole9->Enabled=false;
      sprawdz();
   }
}
//---------------------------------------------------------------------------

Paczka z odcinka: POBIERZ​

1 odpowiedź

+3 głosów
odpowiedź 16 maja 2016 przez maly Nałogowiec (37,190 p.)
if(p1 == 'n')
if(p2 == 'n')
if(p3 == 'n')
...

Te wszystkie sprawdzenia w poleXClick są niepotrzebne ponieważ poleX->Enabled=false wyłącza też obsługę zdarzeń dla tej kontrolki.

char p1,p2,p3,p4,p5,p6,p7,p8,p9;

To powinno być tablicą.

 

Co prawda wykracza to poza zakres kursu ale skróciłem na szybko kod.

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

char p[9];
//p[0]..p[8] pola w grze (ich zawartosc: p[0]='n'; nic lub 'x' lub 'o' )
char kto;

void sprawdz()
{
	if((p[0] == p[1] && p[1] == p[2] && p[0] != 'n') ||
	        (p[3] == p[4] && p[4] == p[5] && p[3] != 'n') ||
	        (p[6] == p[7] && p[7] == p[8] && p[6] != 'n') ||
	        (p[0] == p[3] && p[3] == p[6] && p[6] != 'n') ||
	        (p[1] == p[4] && p[4] == p[7] && p[1] != 'n') ||
	        (p[2] == p[5] && p[5] == p[8] && p[2] != 'n') ||
	        (p[0] == p[4] && p[4] == p[8] && p[0] != 'n') ||
	        (p[2] == p[4] && p[4] == p[6] && p[2] != 'n'))
	{
		char *w;
		if (kto == 'x') w = "Wygrywa kółko!";
		else w = "Wygrywa krzyżyk!";
		Application->MessageBox(w, "Koniec gry", MB_OK);
	}
}


//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent *Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
	TImage *images[] = {pole1, pole2, pole3, pole4, pole5, pole6, pole7, pole8, pole9};
	for(int i = 0; i < ARRAYSIZE(images); ++i)
	{
		images[i]->Picture->LoadFromFile("img/nic.bmp");
		images[i]->Enabled = true;
		images[i]->Tag = i;
	}

	tura->Picture->LoadFromFile("img/osmall.bmp");

	for(int i = 0; i < 9; ++i)
		p[i] = 'n';

	kto = 'o';
}
//---------------------------------------------------------------------------
void __fastcall TForm1::poleClick(TObject *Sender)
{
	TImage *pole = (TImage *)Sender;
	if(kto == 'o')
	{
		pole->Picture->LoadFromFile("img/o.bmp");
		p[pole->Tag] = 'o';
		kto = 'x';
		tura->Picture->LoadFromFile("img/xsmall.bmp");
	}
	else
	{
		pole->Picture->LoadFromFile("img/x.bmp");
		p[pole->Tag] = 'x';
		kto = 'o';
		tura->Picture->LoadFromFile("img/osmall.bmp");
	}
	pole->Enabled = false;
	sprawdz();
}
//---------------------------------------------------------------------------

 

komentarz 21 lipca 2016 przez BlueSky Początkujący (330 p.)

Właśnie wczoraj intensywnie myślałem, że lepiej byłoby zastąpić 9 elementów pi tablicą 9 elementową p[9] ale nie wiedziałem jak tego dokonać. Wszystko co się dzieje w funkcji TForm1::FormCreate rozumiem mam natomiast pytanie jak stworzyć funkcję TForm1::poleClick. W programie mamy 9 pól i jak klikniemy na jakieś to przechodzimy do funkcji np. TForm1::pole4Click. Jakim sposobem przejść do/stworzyć funkcję TForm1::poleClick?

PS. Wielkie dzięki maly!

komentarz 29 lipca 2016 przez maly Nałogowiec (37,190 p.)
Dwukliknij w pierwszy Image, utworzy się metoda pole1Click potem dla reszty w Object Inpector w zakładce Events rozwiń właściwość OnClick i wybierz pole1Click.
komentarz 29 lipca 2016 przez BlueSky Początkujący (330 p.)
Mhm, jednak na dal nie wiem skąd wzięła się metoda TForm1::poleClick? Przecież nie ma takiego obiektu na ekranie. Wszystkie imgage mają numer 1-9.

W twoim zoptymalizowanym kodzie nie ma też metody pole1Click.
komentarz 29 lipca 2016 przez maly Nałogowiec (37,190 p.)
No, zamiast poleClick będziesz miał pole1Click a cała reszta clicków podłączona będzie do tej jednej metody.
komentarz 29 lipca 2016 przez BlueSky Początkujący (330 p.)

Cały czas mi nie działa tak jak powinno. Dla pewności wrzuciłem twój kod do programu. Zmieniłem nazwę funkcji z poleClick na pole1Click i podmieniłem OnClick wszystkich image na pole1Click. Po uruchomieniu programu po naciśnięciu na jakiś image nic się nie dziele. Plik nagłówkowy wygląda tak:
 

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
#include <Buttons.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TImage *pole1;
        TImage *pole2;
        TImage *pole3;
        TImage *pole4;
        TImage *pole5;
        TImage *pole6;
        TImage *pole7;
        TImage *pole8;
        TImage *pole9;
        TLabel *TuraGracza;
        TImage *tura;
        TBitBtn *Odnowa;
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall pole1Click(TObject *Sender);

private:	// User declarations
        //TImage *daj_pole(int i);
        //void zablokuj();
        //void sprawdz();

public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

 

komentarz 29 lipca 2016 przez maly Nałogowiec (37,190 p.)
Pokaż co masz w .cpp.
1
komentarz 29 lipca 2016 przez BlueSky Początkujący (330 p.)
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

char p[9];
//p[0]..p[8] pola w grze (ich zawartosc: p[0]='n'; nic lub 'x' lub 'o' )
char kto;
 
void sprawdz()
{
    if((p[0] == p[1] && p[1] == p[2] && p[0] != 'n') ||
            (p[3] == p[4] && p[4] == p[5] && p[3] != 'n') ||
            (p[6] == p[7] && p[7] == p[8] && p[6] != 'n') ||
            (p[0] == p[3] && p[3] == p[6] && p[6] != 'n') ||
            (p[1] == p[4] && p[4] == p[7] && p[1] != 'n') ||
            (p[2] == p[5] && p[5] == p[8] && p[2] != 'n') ||
            (p[0] == p[4] && p[4] == p[8] && p[0] != 'n') ||
            (p[2] == p[4] && p[4] == p[6] && p[2] != 'n'))
    {
        char *w;
        if (kto == 'x') w = "Wygrywa kółko!";
        else w = "Wygrywa krzyżyk!";
        Application->MessageBox(w, "Koniec gry", MB_OK);
    }
}
 
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent *Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    TImage *images[] = {pole1, pole2, pole3, pole4, pole5, pole6, pole7, pole8, pole9};
    for(int i = 0; i < ARRAYSIZE(images); ++i)
    {
        images[i]->Picture->LoadFromFile("img/nic.bmp");
        images[i]->Enabled = true;
        images[i]->Tag = i;
    }

    tura->Picture->LoadFromFile("img/osmall.bmp");

    for(int i = 0; i < 9; ++i)
        p[i] = 'n';

    kto = 'o';
}
//---------------------------------------------------------------------------
void __fastcall TForm1::pole1Click(TObject *Sender)
{
    TImage *pole = (TImage *)Sender;
    if(kto == 'o')
    {
        pole->Picture->LoadFromFile("img/o.bmp");
        p[pole->Tag] = 'o';
        kto = 'x';
        tura->Picture->LoadFromFile("img/xsmall.bmp");
    }
    else
    {
        pole->Picture->LoadFromFile("img/x.bmp");
        p[pole->Tag] = 'x';
        kto = 'o';
        tura->Picture->LoadFromFile("img/osmall.bmp");
    }
    pole->Enabled = false;
    sprawdz();
}
//---------------------------------------------------------------------------

 

komentarz 30 lipca 2016 przez BlueSky Początkujący (330 p.)
Działa w ogóle ten kod?
1
komentarz 30 lipca 2016 przez maly Nałogowiec (37,190 p.)

Testowałem go i działał

Spróbuj programowo podłączyć onClicki.

for(int i = 0; i < ARRAYSIZE(images); ++i)
{
	images[i]->OnClick = pole1Click;
	
	images[i]->Picture->LoadFromFile("img/nic.bmp");
	images[i]->Enabled = true;
	images[i]->Tag = i;
}

A jeśli nadal nie działa to spakuj cały projekt do zipa wrzuć na jakiś filehosting i sprawdzę co tam jest nie tak.

komentarz 30 lipca 2016 przez BlueSky Początkujący (330 p.)
Teraz działa, wielkie dzięki. Bardzo mi pomagasz ! :D
komentarz 7 sierpnia 2016 przez MrMcDanio Początkujący (360 p.)
Lepiej użyć dwuwymiarową tablicą [3]x[3] (ja tak robiłem przy konsolowym kółko & krzyżyk).

Latasz po tablicy (najszybciej zmieniają się indeksy najbardziej z  prawej- drugi nawias kwadratowy).

Podobne pytania

–1 głos
1 odpowiedź 324 wizyt
pytanie zadane 11 sierpnia 2016 w C i C++ przez james30k Bywalec (2,260 p.)
+3 głosów
0 odpowiedzi 1,667 wizyt
0 głosów
1 odpowiedź 130 wizyt
pytanie zadane 13 czerwca 2016 w C i C++ przez ArturVillain Nowicjusz (120 p.)

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...