• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Gra kółko i krzyzyk. Gracz rysuje plansze

Object Storage Arubacloud
0 głosów
178 wizyt
pytanie zadane 9 grudnia 2018 w C i C++ przez Michał_Warmuz Mądrala (5,830 p.)

Czesc. Mam zadanie z ksiazki ktore mowi ze gracz wybiera sobie plansze i gra w kolko i krzyzyk w skrocie i mam probe  chodzi o to ze pole ktore wybiera nie wstawia sie kółko lub krzyzk nie działa mechanika wybierania pola. Z góry dziekuje za pomoc :)

Moj kod:

#include <iostream>
#include <string>

using namespace std;

void rysuj(int w, int k,char tab[]) {
    tab[w*k+1];
    for(int i=1; i<=w*k; i++) {
        tab[i] = ' ';
        cout << tab[i] << "|";
        if(i%k == 0) {
            cout << endl;
        }
    }
}

void gra(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;
            for(int j=0; j<w*k; j++) {
                if(ruch == j) tab[j] = 'X';
            }
        }
        else {
            cout << "Ruch gracza Player2: ";
            cin>>ruch;
            for(int j=0; j<w*k; j++) {
                if(ruch == j) tab[j] = 'O';
            }
        }
        rysuj(w,k);
    }
}
int main() {

    int w,k;
    cout << "Podaj wiersze tablicy: ";
    cin>>w;
    cout << "Podaj kolumny tablicy: ";
    cin>>k;
    char tab[w*k+1];
    rysuj(w,k,tab);
    graj(w,k,tab);
    return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 10 grudnia 2018 przez niezalogowany
wybrane 14 grudnia 2018 przez Michał_Warmuz
 
Najlepsza
  1. W main wywołujesz funkcję o nazwie graj, a masz gra.
  2. Funkcja rysuj przyjmuje 3 argumenty - więc w 37 linii trzeba ten trzeci dodać.
  3. Przy każdym rysowaniu nadpisujesz sobie tablicę (linia 9). Wystarczy raz ją wypełnić spacjami. 

Uwagi:

  1. Nie używaj VLA. Używaj dynamicznej tablicy, lub std::vector:
    char* tab = new char[w*k];
    // ...
    delete tab;
    
  2. 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) {
    
  3. Linia nr7 - odwołujesz się do ostatniego elementu tablicy i nic z tym nie robisz - ta linia jest zbędna:
    tab[w*k + 1];
    
  4. 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';
    }
    
  5. Tablicę możesz wypełnić spacjami już w main za pomocą funkcji std::fill (<algorithm>):

    fill(tab, tab + w*k, ' ');
    
  6. 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);
}

Podobne pytania

0 głosów
2 odpowiedzi 470 wizyt
pytanie zadane 30 stycznia 2016 w C i C++ przez Patryk L Bywalec (2,000 p.)
0 głosów
0 odpowiedzi 703 wizyt
pytanie zadane 30 listopada 2021 w C i C++ przez niezalogowany
0 głosów
0 odpowiedzi 379 wizyt

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...