Zamieniłby mi ktoś kod C++ na C? Ja sama nie mam pojęcia jak to zrobić bo jestem strasznie słaba z informatyki, a projekt jest na zaliczenie
Kod: Zaznacz cały
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <stdio.h>
#define WIDTH 10 // szerokosc tablicy
#define HEIGHT 8 // wysokosc tablicy
#define ST_COUNT 3 // ilosc rodzajow statkow
#define ALL_COUNT 6 // ilosc wszystkich statkow, musi byc to liczba, gdy np. mamy 3 rodzaje to 1 + 2 + 3 = 6, dla 2 rodzajow 1 + 2 = 3, dla 4 rodzajow nie wszystkie statki sie mieszcza
using namespace std;
int gracz1_wyg;
int gracz2_wyg;
int gracz1_rem;
int gracz2_rem;
int gracz1_przeg;
int gracz2_przeg;
class Statek
{
protected:
int x; // pozycja w wierszu
int y; // pozycja w kolumnie
int w; // koncowa pozycja w wierszu
int h; // koncowa pozycja w kolumnie
int count; // dlugosc statku
public:
Statek(int x, int y, int w, int h) // konstruktor statku
{
this->x = x;
this->y = y;
this->w = w;
this->h = h;
}
int traf(int i, int j) // probujemy trafic w statek
{
if (i<x || i>w || j < y || j > h) // jesli nie miescimy sie w granicach statku
{
return -1;
}
count--; // zmiejszamy rozmiar statku
if (count==0)
zatopiony(); // jesli statek juz nie ma masztow
else
trafiony(); // jesli statek ma jeszcze maszty
return count;
}
virtual void zatopiony() = 0; // funkcja wirtuala przeslonieta przes klasy pochodne
void trafiony()
{
cout << "Trafiles statek
";
}
};
class Statek_1 : public Statek // klasa pochodna dla jednomasztowca
{
private:
static const int size = 1; // rozmiar
int tab[size]; // tablica masztow
public:
Statek_1(int x, int y, int w, int h) : Statek(x, y, w, h) // konstruktor jednomasztowca
{
count = size;
for(int i = 0;i<count;i++)
{
tab[i] = 0;
}
}
void zatopiony()
{
cout << "Zatopiles jednomasztowca!
";
}
};
class Statek_2 : public Statek// klasa pochodna dla dwumasztowca
{
private:
static const int size = 2;
int tab[size];
public:
Statek_2(int x, int y, int w, int h) : Statek(x, y, w, h) // konstruktor dwumasztowca
{
count = size;
for(int i = 0;i<count;i++)
{
tab[i] = 0;
}
}
void zatopiony()
{
cout << "Zatopiles dwumasztowca!
";
}
};
class Statek_3 : public Statek// klasa pochodna dla trzymasztowca
{
private:
static const int size = 3;
int tab[size];
public:
Statek_3(int x, int y, int w, int h) : Statek(x, y, w, h)// konstruktor trzymasztowca
{
count = size;
for(int i = 0;i<count;i++)
{
tab[i] = 0;
}
}
void zatopiony()
{
cout << "Zatopiles trzymasztowca!
";
}
};
class Statek_4 : public Statek// klasa pochodna dla czteromasztowca
{
private:
static const int size = 4;
int tab[size];
public:
Statek_4(int x, int y, int w, int h) : Statek(x, y, w, h)// konstruktor czteromasztowca
{
count = size;
for(int i = 0;i<count;i++)
{
tab[i] = 0;
}
}
void zatopiony()
{
cout << "Zatopiles czteromasztowca!
";
}
};
class Plansza
{
int tab[HEIGHT][WIDTH]; // plansza na ktorej sa statki
private:
vector<Statek*> vec; // wektor statkow
int count[ST_COUNT]; // kazda komorka zawiera informacje ile mamy statkow danego typu
public:
Plansza() // konstruktor planszy
{
vec.clear(); // czyscimy wektor
for(int i=0;i<ST_COUNT;i++)
count[i] = 0;
for(int i=0;i<HEIGHT;i++) // wszystkie pola ustawiamy na 0, czyli puste
{
for(int j=0;j<WIDTH;j++)
{
tab[i][j] = 0;
}
}
}
int strzal(int i, int j) // sprawdzamy trafienie
{
if (tab[i][j]>0) // jesli znajduje sie w tym miejscu statek
{
for(int l = 0;l<vec.size();l++) // dla kazdego statku
{
if (vec[l]->traf(i, j) == 0) // jesli trafilismy wlasnie w ten statek i jest zatopiony
{
vec.erase(vec.begin()+l); // usuwamy go z wektora
}
}
tab[i][j] = -1; // ustawiamy pole trafienia na -1
}
if (tab[i][j]==0) // jesli pole bylo puste
{
tab[i][j] = -2; // zaznaczamy strzal jako -2
return -2;
} else
return vec.size(); // zwracamy ilosc statkow
}
int ustaw(int i, int j, int w, int h, int klasa) // ustawienie statku przed gra, klasa oznacza dlugosc statku
{
if (i<=0 || j <= 0 || w <= 0 || h <=0) // czy nie wybhodzimy poza granice planszy
{
return -1;
}
if (i>=HEIGHT-1 || j>=WIDTH-1 || w>=HEIGHT-1 || h>=WIDTH-1)// czy nie wybhodzimy poza granice planszy
{
return -1;
}
if (i!=w && j!=h) // wszystkie wspolrzedne nie moga byc rozne
{
return -1;
}
if (i!=w && abs(i-w)!=klasa-1) // jesli dlugosc nie zgadza sie do wspolrzednych
{
return -1;
}
if (j!=h && abs(j-h)!=klasa-1) // jesli dlugosc nie zgadza sie do wspolrzednych
{
return -1;
}
for(int l = i-1; l<=w+1 ;l++) // sprawdzamy czy istnieja sasiedzi
{
for(int k = j-1;k<=h+1;k++)
{
if (tab[l][k]!=0)
{
return -1;
}
}
}
if (klasa < 1 || klasa > ST_COUNT) // jesli dlugosc jest bledna
{
return -1;
}
if (count[klasa-1] >= (ST_COUNT+1-klasa)) // jesli mamy jeszcze miejsce na ustawienie statku danego typu
{
return -1;
}
switch(klasa) // wybieramy odpowiedni statek do dlugosci i wrzucamy go do wektora
{
case 1:
{
Statek_1 *st1 = new Statek_1(i, j, w, h);
vec.push_back(st1);
break;
}
case 2:
{
Statek_2 *st2 = new Statek_2(i, j, w, h);
vec.push_back(st2);
break;
}
case 3: {
Statek_3 *st3 = new Statek_3(i, j, w, h);
vec.push_back(st3);
break;
}
case 4: {
Statek_4 *st4 = new Statek_4(i, j, w, h);
vec.push_back(st4);
break;
}
}
for(int l = i; l<=w ;l++) // tam gdzie znajduje sie statek ustawiamy pola na 1
{
for(int k = j;k<=h;k++)
{
tab[l][k] = 1;
}
}
count[klasa-1]++; // zwiekszamy licznik statku danego typu
return ALL_COUNT-vec.size(); // zwracamy ile statkow zostalo do ustawienia
}
void show_visible() // procedura drukuje tablice w czasie ustawiania statkow
{
cout << " ";
for(int i = 1;i<WIDTH-1;i++) // wypisanie liczb odpowiadajacych kolumnom
{
cout << " ";
cout.width(2);
cout << i;
}
cout << "
";
for(int i=1;i<HEIGHT-1;i++)
{
cout << char(i+96) << " "; // wypisanie liter odpowiadajacych wierszom
for(int j=1;j<WIDTH-1;j++)
{
switch(tab[i][j]) // dla kazdej komorki wypisujemy odpowiedni status
{
case 0: cout << "[ ]";
break;
case 1: cout << "[s]";
break;
}
}
cout << "
";
}
}
void show() //drukowanie planszy w czasie gry
{
cout << " ";
for(int i = 1;i<WIDTH-1;i++)
{
cout << " ";
cout.width(2);
cout << i;
}
cout << "
";
for(int i=1;i<HEIGHT-1;i++)
{
cout << char(i+96) << " ";
for(int j=1;j<WIDTH-1;j++)
{
switch(tab[i][j])
{
case -2: cout << "[*]"; // jesli bylo pudlo
break;
case -1: cout << "[s]"; // jesli trafiony zostal statek
break;
case 0: cout << "[ ]"; // jesli pole puste
break;
case 1: cout << "[ ]"; // jesli pole nieodkryte
break;
}
}
cout << "
";
}
}
void recznie() // reczne ustawienie statkow
{
char wiersz;
int kolumna;
int kier, klasa;
system("clear");
cout << "Pozostalo Ci 10 statkow do ustawienia
";
while(true) // dopoki nie ustawimy 10 statkow
{
show_visible(); // drukujemy plansze
cout << "Podaj pozycje np. e4: ";
cin >> wiersz >> kolumna; // pobranie wspolrzednych
if (wiersz < 97 || wiersz > 102 || kolumna < 1 || kolumna > WIDTH-2) // sprawdzenie poprawnosci wspolrzednych
{
cout << "Podales bledna pozycje
";
continue;
}
cout << "Podaj orientacje masztowca 1. pionowy, 2. poziomy: ";
cin >> kier;
if (kier < 1 || kier > 2) // sprawdzenie poprawnosci kierunku
{
cout << "Podales zla orientacje
";
continue;
}
cout << "Podaj rozmiar statku: ";
cin >> klasa;
if (klasa < 1 || klasa > ST_COUNT) // sprawdzenie poprawnosci dlugosci
{
cout << "Podales zly rozmiar
";
continue;
}
wiersz-=96;
int result;
switch(kier) // wzgledem kierunku probujemy ustawic nowy statek
{
case 1:
result = ustaw(wiersz, kolumna, wiersz+klasa-1, kolumna, klasa);
break;
case 2:
result = ustaw(wiersz, kolumna, wiersz, kolumna+klasa-1, klasa);
break;
}
system("clear");
if (result == 0) // jesli nie pozostaly juz statki do ustawienia
{
cout << "Ustawiono wszystkie statki
";
break;
}
else
{
if (result > 0) // jesli pozostaly jeszcze statki do ustawienia
cout << "Pozostalo Ci " << result << " statkow do ustawienia
";
else // jesli nie udalo sie ustawic statku czyli result = -1
cout << "Nie mozna ustawic w tym miejscu statku, poniewaz zachacza o inny badz wybiega poza plansze
";
}
}
}
void losowo() // losowe ustawienie statkow
{
char wiersz;
int kolumna;
int kier, klasa;
system("clear");
while(true)
{
wiersz = rand()%HEIGHT+1; // wybranie losowe danych
kolumna = rand()%WIDTH+1;
kier = rand()%2 + 1;
klasa = rand()%ST_COUNT+1;
int result;
switch(kier)
{
case 1:
result = ustaw(wiersz, kolumna, wiersz+klasa-1, kolumna, klasa);
break;
case 2:
result = ustaw(wiersz, kolumna, wiersz, kolumna+klasa-1, klasa);
break;
}
if (result == 0) // koncowy komunikat
{
cout << "Ustawiono wszystkie statki
";
break;
}
}
}
};
void show_results()
{
cout << " W R P
";
cout << "Gracz1 "<<gracz1_wyg << " " << gracz1_rem << " " <<gracz1_przeg << endl;
cout << "Gracz2 "<<gracz2_wyg << " " << gracz2_rem << " " <<gracz2_przeg << endl;
}
int main()
{
gracz1_wyg = gracz2_wyg = gracz1_rem = gracz2_rem = gracz1_przeg = gracz2_przeg = 0;
int opcja;
cout << "Gra w statki (gracz-gracz)
";
cout << "Aby kontynuowac nacisnij ENTER...";
getchar();
while(opcja != 3)
{
cout << "Wybierz opcje: " << endl;
cout << "1. Rozpocznij gre
";
cout << "2. Wypisz statystyki
";
cout << "3. Zakoncz program
";
cin >> opcja;
switch(opcja)
{
case 1:
{
Plansza plansze[2];
int gracz = 0;
int wybor = 0;
while(gracz < 2) // dla kazdego gracza
{
while(wybor<1 || wybor >2) // jesli wybor byl bledny
{
cout << "Wybierz sposob rozmieszczenia statkow dla "<< gracz+1 << " gracza
";
cout << "1. Reczny
";
cout << "2. Losowy
";
cin >> wybor;
switch(wybor) // wybor ustawiania
{
case 1: plansze[gracz].recznie();
plansze[gracz].show_visible();
cout << "Aby kontynuowac nacisnij ENTER...";
getchar();
getchar();
system("clear");
gracz++;
break;
case 2: plansze[gracz].losowo();
plansze[gracz].show_visible();
cout << "Aby kontynuowac nacisnij ENTER...";
getchar();
getchar();
system("clear");
gracz++;
break;
default: cout << "Wybrales zla opcje
";
}
}
wybor = 0;
}
gracz = 0;
int przeciwnik = 1;
char wiersz;
int kolumna;
while(true) // gra wlasciwa
{
system("clear");
cout << "Ruch ma gracz " << gracz+1 << endl;
plansze[przeciwnik].show(); // drukowanie tablicy przeciwnika
cout << "Podaj pozycje np. e4: ";
cin >> wiersz >> kolumna;
if (wiersz < 97 || wiersz > 102 || kolumna < 1 || kolumna > WIDTH-2) // pobranie wspolrzednych
{
cout << "Podales bledna pozycje
";
cout << "Aby kontynuowac nacisnij ENTER...";
getchar();
getchar();
continue;
}
int result = plansze[przeciwnik].strzal(wiersz-96, kolumna); // proba strzalu
switch(result)
{
case 0:// jesli nie pozostaly juz statki
cout << "Wygral gracz nr " << gracz+1 << "
";
break;
case -2: // jesli pole bylo puste
cout << "Pudlo
";
break;
}
int tmp = gracz; // zamiana graczy
gracz = przeciwnik;
przeciwnik = tmp;
if (result == 0) // jesli result==0 to jeden z graczy ma zbite wszystkie statki i konczymy gre
{
if (gracz == 0)
{
gracz1_wyg++;
gracz2_przeg++;
}
else
{
gracz2_wyg++;
gracz1_przeg++;
}
break;
}
cout << "Aby kontynuowac nacisnij ENTER...";
getchar();
getchar();
}
}
break;
case 2:
show_results();
cout << "Aby kontynuowac nacisnij ENTER...";
getchar();
getchar();
system("clear");
break;
case 3:
"Zapraszam ponownie
";
break;
default:
"Wybrales zla opcje
";
}
}
cout << "Aby kontynuowac nacisnij ENTER...";
getchar(); // zatrzymanie programu
getchar();
}