Kółko i Krzyżyk

0

Potrzebuje pomocy nie siedzę w c++, kod może być nie koniecznie jasny i przejrzysty ale potrzebuje do programu dołożyć zapisywanie wyniku do pliku tylko nie wiem jak to zrobić, mam voida zapisującego do pliku tylko nie wiem kiedy go wywołać, jak wpisać wynik do pliku. Pomoże ktoś ?

////////////////////////////////////////////gra.h

#include <iostream>

using namespace std;

class Gra{

public:
int r,i;
bool test;
char gracz;

bool sprawdz(char t[], char g);
bool remis(char t[]);
void rysuj(char t[]);
void ruch(char t[],char &gracz);

};

class Wynik
: public Gra
{
public:

void zapis();
void odczyt();

};

////////////////////////////////////////////////////////gra.cpp

#include <iostream>
#include <windows.h>
#include <string>
#include <fstream>
#include "gra.h"

using namespace std;

void Gra::rysuj(char t[])
{
// Funkcja rysuje planszê gry w kó³ko i krzy¿yk

for(int i = 1; i <= 9; i++)

{
cout << " " << t[i] << " ";
if(i % 3)
cout << "|";
else if(i != 9)
cout << "\n---+---+---\n";
else cout << endl;
}
}

bool Gra::sprawdz(char t[], char g)
{

test = false;
for(i = 1; i <= 7; i += 3)
test |= ((t[i] == g) && (t[i+1] == g) && (t[i+2] == g));
for(i = 1; i <= 3; i++)
test |= ((t[i] == g) && (t[i+3] == g) && (t[i+6] == g));
test |= ((t[1] == g) && (t[5] == g) && (t[9] == g));
test |= ((t[3] == g) && (t[5] == g) && (t[7] == g));
if(test)
{
rysuj(t);
cout << "\nGRACZ " << g << " WYGRYWA!!!\n\n";
return true;
}
return false;
}
bool Gra::remis(char t[])
{
for(int i = 1; i <= 9; i++)
if(t[i] == ' ') return false;
rysuj(t);
cout << "\nREMIS !!!\n\n";
return true;
}
void Gra::ruch(char t[], char &gracz)
{
rysuj(t);
cout << "\nGRACZ " << gracz << " : Twoj ruch : ";
cin >> r;
cout << "-----------------------\n\n";
if((r >= 1) && (r <= 9) && (t[r] == ' ')) t[r] = gracz;
gracz = (gracz == 'O') ? 'X' : 'O';

}
void Wynik::zapis()
{

fstream plik;
plik.open("wynik.txt",ios::out);

plik<<...

plik.close();

return 0;

/*
string const nazwaPliku("D:/ProjektyCodeBlock/TEST_milion/wynik.txt");
ofstream mojStrumien(nazwaPliku.c_str());

if(mojStrumien) // Sprawdzamy czy plik został otwarty.
{
mojStrumien<<sprawdz<<endl;

}
else
cout << "BŁĄD: nie można otworzyć pliku." << endl;
*/
}

/////////////////////////////////////////////////main.cpp

#include <iostream>
#include <windows.h>
#include <fstream>
#include "gra.h"

using namespace std;

int main()
{
Gra g1;
Wynik w1;

char p[10],g,w;
do
{
cout << "Gra w Kolko i Krzyzyk dla dwoch graczy\n"
"======================================\n\n";
for(int i = 1; i <= 9; i++) p[i] = ' ';
g = 'O';
while(!g1.sprawdz(p,'X') && !g1.sprawdz(p,'O') && !g1.remis(p)) g1.ruch(p,g);
cout << "Jeszcze raz ? (T = TAK) : ";
cin >> w;
cout << "\n\n\n";
} while((w == 'T') || (w == 't'));
}

0

Po pierwsze, wrzuć to w kodowanie dla cpp (taki trójkącik przy pisaniu posta obok znaku </> )

0
 
```gra.h


#include <iostream>

using namespace std;

class Gra{

public:
int r,i;
bool test;
char gracz;

bool sprawdz(char t[], char g);
bool remis(char t[]);
void rysuj(char t[]);
void ruch(char t[],char &gracz);

};

class Wynik
        : public Gra
{
public:

    void zapis();
    void odczyt();


};



gra.cpp

#include <iostream>
#include <windows.h>
#include <string>
#include <fstream>
#include "gra.h"

using namespace std;



void Gra::rysuj(char t[])
{
    // Funkcja rysuje planszê gry w kó³ko i krzy¿yk

    for(int i = 1; i <= 9; i++)
  {
    cout << " " << t[i] << " ";
    if(i % 3)
      cout << "|";
    else if(i != 9)
      cout << "\n---+---+---\n";
    else cout << endl;
  }
}

bool Gra::sprawdz(char t[], char g)
{

  test = false;
  for(i = 1; i <= 7; i += 3)
    test |= ((t[i] == g) && (t[i+1] == g) && (t[i+2] == g));
  for(i = 1; i <= 3; i++)
    test |= ((t[i] == g) && (t[i+3] == g) && (t[i+6] == g));
  test |= ((t[1] == g) && (t[5] == g) && (t[9] == g));
  test |= ((t[3] == g) && (t[5] == g) && (t[7] == g));
  if(test)
  {
    rysuj(t);
    cout << "\nGRACZ " << g << " WYGRYWA!!!\n\n";
    return true;
  }
  return false;
}
bool Gra::remis(char t[])
    {
        for(int i = 1; i <= 9; i++)
    if(t[i] == ' ') return false;
  rysuj(t);
  cout << "\nREMIS !!!\n\n";
  return true;
    }
void Gra::ruch(char t[], char &gracz)
{
   rysuj(t);
   cout << "\nGRACZ " << gracz << " : Twoj ruch : ";
   cin >> r;
   cout << "-----------------------\n\n";
   if((r >= 1) && (r <= 9) && (t[r] == ' ')) t[r] = gracz;
   gracz = (gracz == 'O') ? 'X' : 'O';

}
void Wynik::zapis()
{


fstream plik;
    plik.open("wynik.txt",ios::out);

    plik<<...

    plik.close();

    return 0;
/*
    string const nazwaPliku("D:/ProjektyCodeBlock/TEST_milion/wynik.txt");
    ofstream mojStrumien(nazwaPliku.c_str());

if(mojStrumien)    // Sprawdzamy czy plik został otwarty.
{
 mojStrumien<<sprawdz<<endl;

}
else
    cout << "BŁĄD: nie można otworzyć pliku." << endl;
    */
}


main.cpp

#include <iostream>
#include <windows.h>
#include <fstream>
#include "gra.h"

using namespace std;

int main()
 {
     Gra g1;
     Wynik w1;



char p[10],g,w;
  do
  {
    cout << "Gra w Kolko i Krzyzyk dla dwoch graczy\n"
            "======================================\n\n";
    for(int i = 1; i <= 9; i++) p[i] = ' ';
    g = 'O';
    while(!g1.sprawdz(p,'X') && !g1.sprawdz(p,'O') && !g1.remis(p)) g1.ruch(p,g);
    cout << "Jeszcze raz ? (T = TAK) : ";
    cin >> w;
    cout << "\n\n\n";
  } while((w == 'T') || (w == 't'));
}


0

Skoro robisz to obiektowo, to może wywołuj zapisywanie przy destruktorze klasy?

0

sprówbowałem czegoś takiego jak poniżej:

 
void Wynik::zapis()
{

FILE * save = fopen( "wynik.txt", "w" );
    fprintf( save, "%01d , %01d , %01d , %01d", remis() );
    fclose( save );


ale pokazuje się błąd : error: no matching function for call to 'Wynik::remis()'|
Ktoś coś ?

0

Tak jak Ci napisało: nie znalazło funkcji Wynik::remis(), zapewne dlatego, że takiej nie ma. Jak chcesz się odwołać do funkcji z innej przestrzeni nazw (więc na przykład Gra::remis()), to musisz to zrobić jawnie podając odp. przestrzeń nazw.

0

No ok a gdy daje np remis("") to wszystko się kompiluje tylko do pliku trafiają jakieś liczby a nie "REMIS !!! " WHY ??

0

Debugger do ręki, ustaw sobie break point i zobacz.

0

@carlos69
zapewne masz funkcje remis zdefiniowana kilkukrotnie. Bo ty chcesz uzyc ta z gra. Ale przeciez Ty wolasz to w sposob jakbys chcial tego remisu w Wyniku.
Pewnie gdziesz w Wyniku masz zdefiniowana funkcje remis z jednym parametrem

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.