- W main wywołujesz funkcję o nazwie graj, a masz gra.
- Funkcja rysuj przyjmuje 3 argumenty - więc w 37 linii trzeba ten trzeci dodać.
- Przy każdym rysowaniu nadpisujesz sobie tablicę (linia 9). Wystarczy raz ją wypełnić spacjami.
Uwagi:
- Nie używaj VLA. Używaj dynamicznej tablicy, lub std::vector:
char* tab = new char[w*k];
// ...
delete tab;
- Nie widzę sensu tworzenia tablicy o rozmiarze w*k + 1. Zwłaszcza, że raz używasz całego zakresu, a raz nie. Wystarczy w*k i odpowiednio zmienić warunek instrukcji warunkowej (i warunek pętli w funkcji rysuj):
if ((i + 1)%k == 0) {
- Linia nr7 - odwołujesz się do ostatniego elementu tablicy i nic z tym nie robisz - ta linia jest zbędna:
tab[w*k + 1];
-
W funkcji gra wystarczy, że od razu odwołasz się do wybranej przez gracza pozycji czy to będzie tab[ruch] czy tab[ruch - 1] (po uprzednim sprawdzeniu czy znajduje się w zadanym przedziale od 0 do w * k, lub 1 do w*k + 1) - nie musisz nic dodatkowo wyszukiwać.
if (ruch >= 0 && ruch < w * k) {
tab[ruch] = 'X';
}
-
Tablicę możesz wypełnić spacjami już w main za pomocą funkcji std::fill (<algorithm>):
fill(tab, tab + w*k, ' ');
-
Brakuje sprawdzania czy w i k mają odpowiedni zakres.
Poprawny kod:
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
void rysuj(int w, int k, char tab[]) {
for (int i = 0; i < w * k; i++) {
cout << tab[i] << "|";
if ((i + 1)%k == 0) {
cout << endl;
}
}
}
void graj(int w, int k, char tab[]) {
int ruch;
for (int i = 0; i<w*k; i++) {
if (i % 2 == 0) {
cout << "Ruch gracza Player1: ";
cin >> ruch;
if (ruch >= 0 && ruch < w * k) {
tab[ruch] = 'X';
}
}
else {
cout << "Ruch gracza Player2: ";
cin >> ruch;
if (ruch >= 0 && ruch < w * k) {
tab[ruch] = 'O';
}
}
rysuj(w, k, tab);
}
}
int main() {
int w, k;
cout << "Podaj wiersze tablicy: ";
cin >> w;
cout << "Podaj kolumny tablicy: ";
cin >> k;
char* tab = new char[w*k];
fill(tab, tab + w*k, ' ');
rysuj(w, k, tab);
graj(w, k, tab);
delete tab;
}
Z std::vector:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void rysuj(int w, int k, const vector<char>& tab) {
for (int i = 0; i < w * k; i++) {
cout << tab[i] << "|";
if ((i + 1)%k == 0) {
cout << endl;
}
}
}
void graj(int w, int k, vector<char>& tab) {
int ruch;
for (int i = 0; i<w*k; i++) {
if (i % 2 == 0) {
cout << "Ruch gracza Player1: ";
cin >> ruch;
if (ruch >= 0 && ruch < w * k) {
tab[ruch] = 'X';
}
}
else {
cout << "Ruch gracza Player2: ";
cin >> ruch;
if (ruch >= 0 && ruch < w * k) {
tab[ruch] = 'O';
}
}
rysuj(w, k, tab);
}
}
int main() {
int w, k;
cout << "Podaj wiersze tablicy: ";
cin >> w;
cout << "Podaj kolumny tablicy: ";
cin >> k;
vector<char> tab(w*k, ' ');
rysuj(w, k, tab);
graj(w, k, tab);
}