CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Kółko i krzyżyk- warunki

Kółko i krzyżyk- warunki

dział ogólny

Kółko i krzyżyk- warunki

Nowy postprzez _wędkarz_ » czwartek, 17 stycznia 2013, 09:08

Piszę, grę kółko i krzyżyk ale w formacie 30 na 30 kratek i żeby wygrać trzeba spełnić 5 jednakowych znaków pod rząd. Zrobiłem to na podstawie StringGrida i przy zdarzeniu kliknięcia sprawdza która komórka została nacisnięta i do niej wstawia dany znak.
Warunek do pionu i poziomu zrobiłem natomiast mam problem ze sprawdzaniem po ukosie. Działa mi tylko jedna możliwość.
Próbowałem różnymi sposobami. Dla informacji [kolumna][wiersz]. Po sprawdzeniu danej możliwości chciałem żeby mi dodało albo jedną wartość do [kolumn] czyli przesuneło w prawą stronę o jeden i tam znowu sprawdziło itd.
KOD cpp:     UKRYJ  
//po ukosie
//for(int i=0; i<30; i++)
/*{*/ int q=0,w=1,e=2,r=3,t=4;
  int z=0,x=1,c=2,v=3,b=4;
for(int i=0; i<30; i++)
{

  for(int l=0; l<26; l++)
  {
  if((Form1->StringGrid1->Cells[z][q]=="0")&&(Form1->StringGrid1->Cells[z][q]==Form1->StringGrid1->Cells[x][w])&&(Form1->StringGrid1->Cells[x][w]==Form1->StringGrid1->Cells[c][e])&&(Form1->StringGrid1->Cells[c][e]==Form1->StringGrid1->Cells[v][r])&&(Form1->StringGrid1->Cells[v][r]==Form1->StringGrid1->Cells[b][t])) wygrana_o();
  else if((Form1->StringGrid1->Cells[z][q]=="X")&&(Form1->StringGrid1->Cells[z][q]==Form1->StringGrid1->Cells[x][w])&&(Form1->StringGrid1->Cells[x][w]==Form1->StringGrid1->Cells[c][e])&&(Form1->StringGrid1->Cells[c][e]==Form1->StringGrid1->Cells[v][r])&&(Form1->StringGrid1->Cells[v][r]==Form1->StringGrid1->Cells[b][t])) wygrana_x();
  z++; x++; c++; v++; b++;
  //q++; w++; e++; r++; t++;//jakby to też dodawało jak i te (z,x,c,v,b) to by tylko od lewego górnego rogu do prawego dolnego sprawdziło, więc skomentowałem żeby chociaż od od górnej krawędzi zaczęło sprawdzać
 
z++; x++; c++; v++; b++;
}
  }


Wiecie w którym miejscu jest błąd?
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
_wędkarz_
Bladawiec
Bladawiec
 
Posty: 8
Dołączył(a): niedziela, 30 grudnia 2012, 10:33
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: CodeBlocks, BCB 6
Gadu Gadu: 0
    Windows 7Firefox

Re: Kółko i krzyżyk- warunki

Nowy postprzez polymorphism » czwartek, 17 stycznia 2013, 11:32

Heh, niezła sieczka ;) Przykład tego, jak nie powinien wyglądać kod. A wystarczy nieco zredukować, sformatować i proszę:
KOD cpp:     UKRYJ  
//po ukosie
//for(int i=0; i<30; i++)
/*{*/ int q = 0, w = 1,e = 2,r = 3,t = 4;
int z = 0, x = 1, c = 2, v = 3, b = 4;

TStringGrid *sg = Form1->StringGrid1;

for(int i=0; i<30; i++)
{
        for(int l=0; l<26; l++)
        {
       
                if((sg->Cells[z][q] == "0") &&
                (sg->Cells[z][q] == sg->Cells[x][w])&&
                (sg->Cells[x][w] == sg->Cells[c][e])&&
                (sg->Cells[c][e] == sg->Cells[v][r])&&
                (sg->Cells[v][r] == sg->Cells[b][t])) wygrana_o();
                       
                else if((sg->Cells[z][q] == "X")&&
                        (sg->Cells[z][q] == sg->Cells[x][w])&&
                        (sg->Cells[x][w] == sg->Cells[c][e])&&
                        (sg->Cells[c][e] == sg->Cells[v][r])&&
                        (sg->Cells[v][r] == sg->Cells[b][t])) wygrana_x();
                               
                z++; x++; c++; v++; b++;
                //z++; x++; c++; v++; b++;
        }
}

Czytelniej? Czytelniej. Można też tak:
KOD cpp:     UKRYJ  
TStringGrid *sg = Form1->StringGrid1;

for(int y = 0; y < 25; y++)
{
        for(int x = 0; x < 25; x++)
        {
                String s = sg->Cells[x][y];
               
                if(s == "0" || s == "X")
                {
                        if(     (sg->Cells[x + 1][y + 1] == s) &&
                                (sg->Cells[x + 2][y + 2] == s) &&
                                (sg->Cells[x + 3][y + 3] == s) &&
                                (sg->Cells[x + 4][y + 4] == s))
                        {
                                if(s == "0") wygrana_o();
                                else wygrana_x();
                        }
                }
        }
}



Nie rozumiem Twojego problemu. Jeśli zrobiłeś sprawdzanie ukosu od lewej do prawej, to zrób to samo tylko w drugą stronę.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Kółko i krzyżyk- warunki

Nowy postprzez Cyfrowy Baron » czwartek, 17 stycznia 2013, 20:27

A ja wymyśliłem coś takiego:

KOD cpp:     UKRYJ  
int iLineH = -1, iLineV = -1, iLineS = -1;
int TestHorizontal(TStringGrid *sG)
{
 for(int r = 0; r < sG->RowCount; r++)
 {
  int iTest = 0;
  for(int c = 0; c < sG->ColCount; c++)
  {
   if( sG->Cells[c][r].UpperCase() == "X" ) iTest += 1;
   if( iTest == 5) return r;
  }
 }
 return -1;
}
//----------------
int TestVertical(TStringGrid *sG)
{
 for(int c = 0; c < sG->ColCount; c++)
 {
  int iTest = 0;
  for(int r = 0; r < sG->RowCount; r++)
  {
   if( sG->Cells[c][r].UpperCase() == "X" ) iTest += 1;
   if( iTest == 5) return c;
  }
 }
 return -1;
}
//----------------
int TestSlant(TStringGrid *sG)
{
  int iTest1 = 0, iTest2 = 0;
 for(int r = 0; r < sG->RowCount; r++)
 {
   if( sG->Cells[r][r].UpperCase() == "X" ) iTest1 += 1;
   if( iTest1 == 5) return 1;
 }

 for(int r = 4; r >= 0; r--)
 {
   if( sG->Cells[4 - r][r].UpperCase() == "X" ) iTest2 += 1;
   if( iTest2 == 5) return 2;
 }

 return -1;
}
//----------------
void TestGrid(TStringGrid *StringGrid)
{
 iLineH = TestHorizontal( StringGrid );
 if(iLineH == -1) iLineV = TestVertical( StringGrid );
 if(iLineH == -1 && iLineV == -1) iLineS = TestSlant( StringGrid );

 StringGrid->Repaint();

 Application->ProcessMessages();


 if( iLineH > -1 || iLineV > -1 || iLineS > -1 )
 {
  int idx = Application->MessageBox(L"Wygrałeś! Chcesz zacząć od początku?",
  L"Zwycięstwo", MB_YESNO | MB_ICONQUESTION);

  if(idx == ID_YES)
  {
   for(int i = 0; i < StringGrid->RowCount; i++) StringGrid->Rows[i]->Clear();
   StringGrid->Options == StringGrid->Options << goEditing;
   iLineH = -1, iLineV = -1, iLineS = -1;
  }
  else StringGrid->Options = StringGrid->Options >> goEditing;

  StringGrid->Repaint();
 }

}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid2DrawCell(TObject *Sender, int ACol, int ARow,
          TRect &Rect, TGridDrawState State)
{
 StringGrid2->Canvas->Pen->Color = clRed;
 StringGrid2->Canvas->Pen->Width = 3;


  if( ARow == iLineH )
  {
   StringGrid2->Canvas->MoveTo(Rect.Left, Rect.Top + 12);
   StringGrid2->Canvas->LineTo(Rect.Right, Rect.Top + 12);
   return;
  }

  if( ACol == iLineV )
  {
   StringGrid2->Canvas->MoveTo(Rect.Left + 12, Rect.Top);
   StringGrid2->Canvas->LineTo(Rect.Left + 12, Rect.Bottom);
   return;
  }

  if(iLineS == 1)
  {
   for(int r = 0; r < StringGrid2->RowCount; r++)
   {
        if(ACol == r && ARow == r)
        {
         StringGrid2->Canvas->MoveTo(Rect.Left, Rect.Top);
         StringGrid2->Canvas->LineTo(Rect.Right, Rect.Bottom);
        }
   }
   return;
  }
  if(iLineS == 2)
  {
   for(int r = 4; r >= 0; r--)
   {
        if(ACol == 4 - r && ARow == r)
        {
         StringGrid2->Canvas->MoveTo(Rect.Right, Rect.Top);
         StringGrid2->Canvas->LineTo(Rect.Left, Rect.Bottom);
        }
   }
   return;
  }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::StringGrid2KeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
 TestGrid(StringGrid2);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
 for(int i = 0; i < StringGrid2->RowCount; i++) StringGrid2->Rows[i]->Clear();
 StringGrid2->Options == StringGrid2->Options << goEditing;

 iLineH = -1, iLineV = -1, iLineS = -1;

 StringGrid2->Repaint();
}


Na tym etapie działa to tylko ze znakiem krzyżyk, więc trudno w to grać.
Dzięki funkcjom testującym udało mi się uniknąć tworzenia długich ciągów warunków.


Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości