program w c++

Awatar użytkownika
pool
Użytkownik
Użytkownik
Posty: 185
Rejestracja: 11 lis 2007, o 11:41
Płeć: Mężczyzna
Lokalizacja: z google :]
Podziękował: 78 razy

program w c++

Post autor: pool »

Witam, staram się napisac grę Kółko i krzyżyk w programie Builder C++. Oto fragment mojego kodu, który sprawdza kto wygrał grę(wszystkie możliwe kombinacje):

Kod: Zaznacz cały


void evaluateGame(char piece){

    char pieceArr[14] = "";
    pieceArr[0] = piece;
    if ((ticTacGame.board[0][0] == piece) && (ticTacGame.board[1][0] == piece) && (ticTacGame.board[2][0] == piece))
    {
        Form2->Label1->Caption = strcat(pieceArr, " wygrywa grę !");
        disableControls();
        Form2->Button10->Enabled = true;
        Form2->Button10->Visible = true;
    }
    else
    if ((ticTacGame.board[0][1] == piece) && (ticTacGame.board[1][1] == piece) && (ticTacGame.board[2][1] == piece))
    {
        Form2->Label1->Caption = strcat(pieceArr, " wygrywa grę !");
        disableControls();
        Form2->Button10->Enabled = true;
        Form2->Button10->Visible = true;
    }

    else
    if ((ticTacGame.board[0][2] == piece) && (ticTacGame.board[1][2] == piece) && (ticTacGame.board[2][2] == piece))
    {
        Form2->Label1->Caption = strcat(pieceArr, " wygrywa grę !");
        disableControls();
        Form2->Button10->Enabled = true;
        Form2->Button10->Visible = true;
    }

    else
    if ((ticTacGame.board[0][0] == piece) && (ticTacGame.board[0][1] == piece) && (ticTacGame.board[0][2] == piece))
    {
        Form2->Label1->Caption = strcat(pieceArr, " wygrywa grę !");
        disableControls();
        Form2->Button10->Enabled = true;
        Form2->Button10->Visible = true;
    }

    else
    if ((ticTacGame.board[1][0] == piece) && (ticTacGame.board[1][1] == piece) && (ticTacGame.board[1][2] == piece))
    {
        Form2->Label1->Caption = strcat(pieceArr, " wygrywa grę !");
        disableControls();
        Form2->Button10->Enabled = true;
        Form2->Button10->Visible = true;
    }

    else
    if ((ticTacGame.board[2][0] == piece) && (ticTacGame.board[2][1] == piece) && (ticTacGame.board[2][2] == piece))
    {
        Form2->Label1->Caption = strcat(pieceArr, " wygrywa grę !");
        disableControls();
        Form2->Button10->Enabled = true;
        Form2->Button10->Visible = true;
    }

    else
    if ((ticTacGame.board[0][0] == piece) && (ticTacGame.board[1][1] == piece) && (ticTacGame.board[2][2] == piece))
    {
        Form2->Label1->Caption = strcat(pieceArr, " wygrywa grę !");
        disableControls();
        Form2->Button10->Enabled = true;
        Form2->Button10->Visible = true;
    }

    else
    if ((ticTacGame.board[0][2] == piece) && (ticTacGame.board[1][1] == piece) && (ticTacGame.board[2][0] == piece))
    {
        Form2->Label1->Caption = strcat(pieceArr, " wygrywa grę !");
        disableControls();
        Form2->Button10->Enabled = true;
        Form2->Button10->Visible = true;
    }
/*
    else
    if()
     {
//  REMIS

     }
*/  
        return;
}
program działa jak trzeba tylko nie obsługuje mi sytuacji gdy nastąpi remis. Nie mogę sobie poradzić od dłuższego czasu z tym fragmentem. Nie chce wypisywać po kolei wszystkich możliwości na remis bo jest ich troszke:/ Czy da się to jakoś sprawdzić inaczej? Proszę o pomoc.
Rycho
Użytkownik
Użytkownik
Posty: 38
Rejestracja: 16 gru 2009, o 08:33
Płeć: Mężczyzna
Lokalizacja: Szczecin
Podziękował: 1 raz
Pomógł: 5 razy

program w c++

Post autor: Rycho »

Najprosciej jest chyba dodac licznik startujacy od 0 i inkrementowany przy kazdym zagraniu, a w pustym if'ie przyrownac go do 9. Mozna tez sprawdzic czy wszystkie pola sa zajete czyli lacznie 9 mozliwosci.
Awatar użytkownika
pool
Użytkownik
Użytkownik
Posty: 185
Rejestracja: 11 lis 2007, o 11:41
Płeć: Mężczyzna
Lokalizacja: z google :]
Podziękował: 78 razy

program w c++

Post autor: pool »

byłbym wdzięczny jak byś mi pomógł to rozpisać bo coś mi nie wychodzi:/
Rycho
Użytkownik
Użytkownik
Posty: 38
Rejestracja: 16 gru 2009, o 08:33
Płeć: Mężczyzna
Lokalizacja: Szczecin
Podziękował: 1 raz
Pomógł: 5 razy

program w c++

Post autor: Rycho »

Najprosciej jak sie da:

Zdefiniuj zmienna globalna "licznik", tuz za deklaracjami bibliotek:

Kod: Zaznacz cały

int licznik;
Na samym poczatku funkcji "main()" dodaj:

Kod: Zaznacz cały

licznik=0;
Przy funkcji w ktorej stawiasz pionek dodajesz:

Kod: Zaznacz cały

licznik++;
pustego if'a w kodzie który przesłaleś podstawiasz:

Kod: Zaznacz cały

if(licznik==9){
        Form2->Label1->Caption = "Remis";
        disableControls();
        Form2->Button10->Enabled = true;
        Form2->Button10->Visible = true;
}
Awatar użytkownika
pool
Użytkownik
Użytkownik
Posty: 185
Rejestracja: 11 lis 2007, o 11:41
Płeć: Mężczyzna
Lokalizacja: z google :]
Podziękował: 78 razy

program w c++

Post autor: pool »

dzieki wielkie, gra i buczy ))

-- 5 stycznia 2010, 23:29 --

Chcę jeszcze dodać możliwość gry z komputerem, oto moj kod:

plik .cpp

Kod: Zaznacz cały

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

#include <vcl.h>
#pragma hdrstop

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

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

}
//---------------------------------------------------------------------------





void __fastcall TForm1::RuchKomp()
// ruch komputera
{
int num; // numer obrazka - wstawienie kółka
if (Oblicz(20, num)) // dwie dziesiatki
graWToku = 0; // zatrzymanie gry
else if (Oblicz(2, num)) ; // dwie dwójki
else if (Oblicz(10, num)) ; // jedna dziesiatka
else
num = Dowolne(); // dowolny ruch
// wpisanie kółka do obrazka na pozycji num
if (num > 0)
obrazki[num-1]->Picture->LoadFromFile("o.bmp");
}



bool __fastcall TForm1::Oblicz(int s, int & num)
// sprawdzenie, czy istnieje wiersz, kolumna, czy tez
// przekatna o sumie równej s
// jezeli tak, to podawana jest pozycja num, na której bedzie
// wstawione kółko
{
int i,j,suma;
// przekatna lewo w skos
suma = 0;
for (i=0; i<3; i++)
suma += kod[2-i][i];
// jesli suma wartosci jest równa s
if (suma == s) {
num = WstawDoLewo();
return 1;
}
// wiersz o indeksie 1
suma = 0;
for (j=0; j<3; j++)
suma += kod[1][j];
// jesli suma wartosci jest równa s
if (suma == s) {
num = WstawDoWiersza(1);
return 1;
}
// kolumna o indeksie 1
suma = 0;
for (i=0; i<3; i++)
suma += kod[i][1];
// jesli suma wartosci jest równa s
if (suma == s) {
num = WstawDoKolumny(1);
return 1;
}
// wiersz o indeksie 2
suma = 0;
for (j=0; j<3; j++)
suma += kod[2][j];
// jesli suma wartosci jest równa s
if (suma == s) {
num = WstawDoWiersza(2);
return 1;
}
// przekatna prawo w skos
suma = 0;
for (i=0; i<3; i++)
suma += kod[i][i];
// jesli suma wartosci jest równa s
if (suma == s) {
num = WstawDoPrawo();
return 1;
}
// kolumna o indeksie 0
suma = 0;
for (i=0; i<3; i++)
suma += kod[i][0];
// jesli suma wartosci jest równa s
if (suma == s) {
num = WstawDoKolumny(0);
return 1;
}
// wiersz o indeksie 0
suma = 0;
for (j=0; j<3; j++)
suma += kod[0][j];
// jesli suma wartosci jest równa s
if (suma == s) {
num = WstawDoWiersza(0);
return 1;
}
// kolumna o indeksie 2
suma = 0;
for (i=0; i<3; i++)
suma += kod[i][2];
// jesli suma wartosci jest równa s
if (suma == s) {
num = WstawDoKolumny(2);
return 1;
}
return 0; // nic nie wstawiono
}



int __fastcall TForm1::WstawDoWiersza(int i)
// wstawienie wartosci 10 do i-tego wiersza
{
int j,k, liczbaZer, wybor;
// wyznaczenie liczby zer
liczbaZer = 0;
for (j=0; j<3; j++)
if (kod[i][j] == 0)
liczbaZer++;
// losowanie - tylko gdy sa dwa zera
if (liczbaZer == 2)
wybor = random(199)/100;
else
wybor = 0;
// wpisanie wartosci 10 na miejsce wylosowanego zera
k = 0;
for (j=0; j<3; j++)
if (kod[i][j] == 0) {
if (k == wybor) {
kod[i][j] = 10;
return cyfry[i][j];
}
k++;
}
return -1;
}
int __fastcall TForm1::WstawDoKolumny(int j)
// wstawienie wartosci 10 do j-tej kolumny
{
int i, k, liczbaZer, wybor;
// wyznaczenie liczby zer
liczbaZer = 0;
for (i=0; i<3; i++)
if (kod[i][j] == 0)
liczbaZer++;
// losowanie - tylko gdy sa dwa zera
if (liczbaZer == 2)
wybor = random(199)/100;
else
wybor = 0;
// wpisanie wartosci 10 na miejsce wylosowanego zera
k = 0;
for (i=0; i<3; i++)
if (kod[i][j] == 0) {
if (k == wybor) {
kod[i][j] = 10;
return cyfry[i][j];
}
k++;
}
return -1;
}



int __fastcall TForm1::WstawDoPrawo()
// wstawienie wartosci 10 do przekatnej prawo w skos
{
int i, k, liczbaZer, wybor;
// wyznaczenie liczby zer
liczbaZer = 0;
for (i=0; i<3; i++)
if (kod[i][i] == 0)
liczbaZer++;
// losowanie - tylko gdy sa dwa zera
if (liczbaZer == 2)
wybor = random(199)/100;
else
wybor = 0;
// wpisanie wartosci 10 na miejsce wylosowanego zera
k = 0;
for (i=0; i<3; i++)
if (kod[i][i] == 0) {
if (k == wybor) {
kod[i][i] = 10;
return cyfry[i][i];
}
k++;
}
return -1;
}
int __fastcall TForm1::WstawDoLewo()
// wstawienie wartosci 10 do przekatnej lewo w skos
{
int i, k, liczbaZer, wybor;
// wyznaczenie liczby zer
liczbaZer = 0;
for (i=0; i<3; i++)
if (kod[2-i][i] == 0)
liczbaZer++;
// wpisanie wartosci 10 na miejsce wylosowanego zera
if (liczbaZer == 2)
wybor = random(199)/100;
else
wybor = 0;
// wpisanie wartosci 10 na miejsce wylosowanego zera
k = 0;
for (i=0; i<3; i++)
if (kod[2-i][i] == 0) {
if (k == wybor) {
kod[2-i][i] = 10;
return cyfry[2-i][i];
}
k++;
}
return -1;
}



int __fastcall TForm1::Dowolne()
// wstawienie wartosci 10 na miejsce wylosowanego
// zera w całej tablicy
{
int i,j,k,liczbaZer,wybor;
// wyznaczenie liczby zer
liczbaZer = 0;
for (i=0; i<3; i++)
for (j=0; j<3; j++)
if (kod[i][j] == 0)
liczbaZer++;
// wylosowanie zera (które z kolei)
wybor = random(liczbaZer);
// wpisanie wartosci 10 na miejsce wylosowanego zera
k=0;
for (i=0; i<3; i++)
for (j=0; j<3; j++)
if (kod[i][j] == 0) {
if (k == wybor) {
kod[i][j] = 10;
return cyfry[i][j];
}
k++;
}
return -1;
}



void __fastcall TForm1::FormCreate(TObject *Sender)
{
int i,j,k;
// inicjalizacja generatora liczb losowych
randomize();
graWToku = 1; // gra w toku
liczbaRuchow = 0;
Komunikat->Visible = false;
// w tablicy same zera
for (i=0; i<3; i++)
for (j=0; j<3; j++)
kod[i][j] = 0;
// wypełnienie tablicy cyfry
cyfry[0][0] = 4;
cyfry[0][1] = 9;
cyfry[0][2] = 2;
cyfry[1][0] = 3;
cyfry[1][1] = 5;
cyfry[1][2] = 7;
cyfry[2][0] = 8;
cyfry[2][1] = 1;
cyfry[2][2] = 6;
// utworzenie 9 obrazków
for (k=0; k<9; k++) {
obrazki[k] = new SpecObraz(this);
obrazki[k]->Parent = this;
obrazki[k]->Left = 50 + k*60;
obrazki[k]->Top = 200;
obrazki[k]->Width = 30;
obrazki[k]->Height = 30;
obrazki[k]->Visible = true;
obrazki[k]->Stretch = true;
// załadowanie obrazka
obrazki[k]->Picture->LoadFromFile("puste.bmp");
// podanie nazwy metody wykonywanej po zajsciu
// zdarzenia OnClick
obrazki[k]->OnClick = Gracz;
// nadanie wartosci własnosciom i,j
for (i=0; i<3; i++)
for (j=0; j<3; j++)
if (cyfry[i][j] == k+1) {
obrazki[k]->i = i;
obrazki[k]->j = j;
}
}
// wyswietlenie cyfr w odpowiednim miejscu na formularzu
Label1->Left = 60;
Label1->Top = 165;
Label2->Left = 120;
Label2->Top = 165;
Label3->Left = 180;
Label3->Top = 165;
Label4->Left = 240;
Label4->Top = 165;
Label5->Left = 295;
Label5->Top = 165;
Label6->Left = 355;
Label6->Top = 165;
Label7->Left = 415;
Label7->Top = 165;
Label8->Left = 475;
Label8->Top = 165;
Label9->Left = 535;
Label9->Top = 165;
}



void __fastcall TForm1::Gracz(TObject *Sender)
// metoda wykonywana po nacisnieciu przycisku myszki na
// obiektach klasy SpecObraz
{
int i,j, nr, pom;
nr = 0;
// jesli koniec gry
if (!graWToku) return;
// wyznaczenie numeru obiektu, na którym nacisnieto
// przycisk myszki
for (i=0; i<9; i++)
if (obrazki[i] == Sender)
nr = i;
// jesli w danym obiekcie jest juz kółko lub krzyzyk
if (kod[obrazki[nr]->i][obrazki[nr]->j] == 10 ||
kod[obrazki[nr]->i][obrazki[nr]->j] ==1)
return;
// obliczenie liczby wykonanych ruchów przez gracza
liczbaRuchow++;
// wpisanie krzyzyka
obrazki[nr]->Picture->LoadFromFile("krzyz.bmp");
// do tablicy kodów wpisujemy 1
kod[obrazki[nr]->i][obrazki[nr]->j] = 1;
if (Oblicz(3,pom)) {
// sa trzy jedynki
Komunikat->Visible = true;
 // Komunikat->Caption = "GRATULACJE WYGRALES";
Komunikat->Text= "GRATULACJE WYGRALES";
graWToku = 0; // koniec gry
} else {
if (liczbaRuchow == 5) {
// wykonano wszystkie ruchy bez rozstrzygniecia
Komunikat->Visible = true;
Komunikat->Text = "REMIS";
}
RuchKomp();
if (!graWToku) {
// komputer zatrzymał gre
Komunikat->Visible = true;
Komunikat->Text = "NIESTETY PRZEGRALES";
}
}
}



void __fastcall TForm1::NowaClick(TObject *Sender)
// obsługa rozpoczecia nowej gry
{
int i,j,k;
graWToku = 1;
liczbaRuchow = 0;
Komunikat->Visible = false;
// wyzerowanie tablicy kodów
for (i=0; i<3; i++)
for (j=0; j<3; j++)
kod[i][j] = 0;
// załadowanie pustych obrazków
for (k=0; k<9; k++)
obrazki[k]->Picture->LoadFromFile("krzyz.bmp");
}

nagłówek .h

Kod: Zaznacz cały


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

#ifndef modyfikacja1H
#define modyfikacja1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
//---------------------------------------------------------------------------
class SpecObraz: public TImage
{
public:
int i,j;
__fastcall SpecObraz(TComponent *AOwner):
TImage(AOwner) {};
};

class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TImage *obrazki1;
        TImage *obrazki2;
        TImage *obrazki3;
        TImage *obrazki4;
        TImage *obrazki5;
        TImage *obrazki6;
        TImage *obrazki7;
        TImage *obrazki8;
        TImage *obrazki0;
        TEdit *Komunikat;
        TLabel *Label1;
        TLabel *Label2;
        TLabel *Label3;
        TLabel *Label4;
        TLabel *Label5;
        TLabel *Label6;
        TLabel *Label7;
        TLabel *Label8;
        TLabel *Label9;
        void __fastcall Gracz(TObject *Sender);

private: // User declarations
        int kod[3][3], cyfry[3][3];
        int graWToku, liczbaRuchow;
        SpecObraz *obrazki[9];
        void __fastcall RuchKomp();
        bool __fastcall Oblicz(int, int &);
        int __fastcall WstawDoWiersza(int);
        int __fastcall WstawDoKolumny(int);
        int __fastcall WstawDoPrawo();
        int __fastcall WstawDoLewo();
        int __fastcall Dowolne();

public:		// User declarations

        __fastcall TForm1(TComponent* Owner);
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall NowaClick(TObject *Sender);
                
};


//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Nie wiem dlaczego ale kompiluje się lecz nie dziala:/ Będę wdzięczny jeśli ktoś to skompiluje i rzuci okiem.-- 5 stycznia 2010, 23:32 --odświeżam
ODPOWIEDZ