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

Gra konsolowa - Kółko i krzyżyk

Object Storage Arubacloud
0 głosów
2,042 wizyt
pytanie zadane 11 listopada 2016 w C i C++ przez Undisputed Gaduła (3,040 p.)

Witajcie.

Uczę się C++ od jakiegoś czasu i jednym z zadań domowych znalezionych w książce jest do napisania gra w kółko i krzyżyk dla dwóch graczy.

I zrobiłem to zadanie jednak, pewnie na około i nie działa mi zakończenie gry tzn.

petla do...while 

Ponieważ po sprawdzenie wygranej i jeśli ona zachodzi to zeruję zmienne a warunek ktory konczy pertle to ta_zmienna!=0

Tutaj jest kod:

#include <iostream>

using namespace std;
char tab[3][3]={'1','2','3','4','5','6','7','8','9'}; //inicjalizacja tablicy do planszy kolko i krzyzyk
int gracz1; //ruch fla gracza 1 - X
int gracz12; //ruch dla gracz 2 - O
void Rysowanie_planszy() //funkcja to wyswietlania sytuacji na planszy
{
    cout << " " << tab[0][0] <<" | " << tab[0][1] <<" | " << tab[0][2] << " "<< endl;
    cout << "---|---|---" << endl;
    cout << " " << tab[1][0] <<" | " << tab[1][1] <<" | " << tab[1][2] << " "<< endl;
    cout << "---|---|---" << endl;
    cout << " " << tab[2][0] <<" | " << tab[2][1] <<" | " << tab[2][2] << " "<< endl;
    cout << "Gracz nr 1 - X" << endl;
    cout << "Gracz nr 2 - O" << endl;
}

void Sprawdzanie_wygranej_1() //funkcja do sprawdzania wygranej dla gracz nr 1 - X
{
    if (tab[0][0]==tab[0][1] && tab[0][0]==tab[0][2] && tab[0][1]==tab[0][2] ||
        tab[1][0]==tab[1][1] && tab[1][0]==tab[1][2] && tab[1][1]==tab[1][2] ||
        tab[2][0]==tab[2][1] && tab[2][0]==tab[2][2] && tab[2][1]==tab[2][2] ||
        tab[0][0]==tab[1][0] && tab[0][0]==tab[2][0] && tab[1][0]==tab[2][0] ||
        tab[0][1]==tab[1][1] && tab[0][1]==tab[2][1] && tab[1][1]==tab[2][1] ||
        tab[0][2]==tab[1][2] && tab[0][2]==tab[2][2] && tab[1][2]==tab[2][2] ||
        tab[0][0]==tab[1][1] && tab[0][0]==tab[2][2] && tab[1][1]==tab[2][2] ||
        tab[2][0]==tab[1][1] && tab[2][0]==tab[0][2] && tab[1][1]==tab[0][2])
    {
        cout << "Wygrywa gracz nr 1 - X" << endl;
        gracz1=0;
        gracz12=0;
    }
}

void Sprawdzanie_wygranej_2() // funkcja do sprawdzania wygranej dla gracza nr 2 - O
{
    if (tab[0][0]==tab[0][1] && tab[0][0]==tab[0][2] && tab[0][1]==tab[0][2] ||
        tab[1][0]==tab[1][1] && tab[1][0]==tab[1][2] && tab[1][1]==tab[1][2] ||
        tab[2][0]==tab[2][1] && tab[2][0]==tab[2][2] && tab[2][1]==tab[2][2] ||
        tab[0][0]==tab[1][0] && tab[0][0]==tab[2][0] && tab[1][0]==tab[2][0] ||
        tab[0][1]==tab[1][1] && tab[0][1]==tab[2][1] && tab[1][1]==tab[2][1] ||
        tab[0][2]==tab[1][2] && tab[0][2]==tab[2][2] && tab[1][2]==tab[2][2] ||
        tab[0][0]==tab[1][1] && tab[0][0]==tab[2][2] && tab[1][1]==tab[2][2] ||
        tab[2][0]==tab[1][1] && tab[2][0]==tab[0][2] && tab[1][1]==tab[0][2])
    {
        cout << "Wygrywa gracz nr 2 - O" << endl;
        gracz1=0;
        gracz12=0;
    }
}

int main()
{

    Rysowanie_planszy();
    cout << "Kolej gracza nr 1" << endl;
    do //petla ktora sluzy do wczytywania znakow do odopowiedniego miejsca tablicy
    {
    cin >> gracz1;
    switch(gracz1)
    {
    case 0:
        gracz1=0;
        break;
    case 1:
        tab[0][0]= 'X';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_1();
    cout << "Kolej gracza nr 2" << endl;
        break;
    case 2:
        tab[0][1]= 'X';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_1();
    cout << "Kolej gracza nr 2" << endl;
        break;
    case 3:
        tab[0][2]= 'X';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_1();
    cout << "Kolej gracza nr 2" << endl;
        break;
    case 4:
        tab[1][0]= 'X';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_1();
    cout << "Kolej gracza nr 2" << endl;
        break;
    case 5:
        tab[1][1]= 'X';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_1();
    cout << "Kolej gracza nr 2" << endl;
        break;
    case 6:
        tab[1][2]= 'X';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_1();
    cout << "Kolej gracza nr 2" << endl;
        break;
    case 7:
        tab[2][0]= 'X';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_1();
    cout << "Kolej gracza nr 2" << endl;
        break;
    case 8:
        tab[2][1]= 'X';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_1();
    cout << "Kolej gracza nr 2" << endl;
        break;
    case 9:
        tab[2][2]= 'X';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_1();
    cout << "Kolej gracza nr 2" << endl;
        break;
    default :
        cout << "YYY";
    }
    // to samo co wyzej dla gracz nr 2
    cin >> gracz12;
    switch(gracz12)
    {
    case 0:
        gracz1=0;
        break;
    case 1:
        tab[0][0]= 'O';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_2();
    cout << "Kolej gracza nr 1" << endl;
        break;
    case 2:
        tab[0][1]= 'O';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_2();
    cout << "Kolej gracza nr 1" << endl;
        break;
    case 3:
        tab[0][2]= 'O';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_2();
    cout << "Kolej gracza nr 1" << endl;
        break;
    case 4:
        tab[1][0]= 'O';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_2();
    cout << "Kolej gracza nr 1" << endl;
        break;
    case 5:
        tab[1][1]= 'O';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_2();
    cout << "Kolej gracza nr 1" << endl;
        break;
    case 6:
        tab[1][2]= 'O';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_2();
    cout << "Kolej gracza nr 1" << endl;
        break;
    case 7:
        tab[2][0]= 'O';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_2();
    cout << "Kolej gracza nr 1" << endl;
        break;
    case 8:
        tab[2][1]= 'O';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_2();
    cout << "Kolej gracza nr 1" << endl;
        break;
    case 9:
        tab[2][2]= 'O';
    Rysowanie_planszy();
    Sprawdzanie_wygranej_2();
    cout << "Kolej gracza nr 1" << endl;
        break;
    default :
        cout << "YYY";
    }
    }while (gracz1 != 0); // warunek ktory konczy gre
    return 0;
}

I tak wiem, że nie ma czegoś takiego jak sprawdzenie czy miejsce, w ktorym chcemy postawic kolko lub krzyzyk nie jest zajęte. Proszę o także o uwagi dotyczące kodu, tylko konstruktywnie :D (co mnie nie zabije to mnie wzmocni)

Z góry dziękuję za pomoc :) 

komentarz 11 listopada 2016 przez niezalogowany
Oj strasznie zawiły kod, wiesz że można go skrócić o +/- połowę?
komentarz 11 listopada 2016 przez criss Mędrzec (172,590 p.)
    cin >> gracz1;
    switch(gracz1)
    {
    case 0:
        gracz1=0;
        break;
    ...
    }

Hem?

komentarz 11 listopada 2016 przez Undisputed Gaduła (3,040 p.)
Po naciśnięciu klawisza 0 wyjście z gry, dlatego zeruję gracz1, żeby warunek w pętli się nie wykonał :)
komentarz 11 listopada 2016 przez Undisputed Gaduła (3,040 p.)
Pewnie, tak, ale tak jak mówię cały czas się uczę, tylko w sumie to nie wiem jak go skrócić, napisałem te funkcje żeby też nie mieć zbyt długiego kodu, także nie wiem co jeszcze mogę uczynić
komentarz 11 listopada 2016 przez niezalogowany

Choćby Sprawdzanie_wygranej() masz 2 razy (identyczny kod), podobnie switche są rozbite na 2 graczy a można to załatwić jedną wersją uniwersalną dla obu graczy.

Ogólnie to tego switcha można skrócić do 2 case'ów, nie musisz przecież korzystać z tablicy dwuwymiarowej, schematycznie coś takiego:

char board[9];

// uzupelnienie planszy
for (int i=0, char c='1'; i < 9; ++i, c)
  board = c++;

// tura gracza, domyslnie zaczyna O
char turn = 'O';

bool isEnd = false;
while (!isEnd)
{
  // pobranie pola na ktore gracz chce postawic swojego 'pionka'
  // zakladamy ze getplayerchoice uniemozliwia postawienie pionka na zajetym polu
  getplayerchoice(board, turn);
  
  int res = checkwin(turn); // 0: nikt nie wygral, 1: O, 2: X, 3: remis)
  if (res)
  {
    if (res == 3)
      std::cout << "Remis\n";
    else
      std::cout << "Wygral gracz: " << res == 1 ? "O" : "X" << "\n";
    isEnd = true;
  }

  // zmiana tury gracza
  turn = (turn == 'O' ? 'X' : 'O');
}

 

komentarz 11 listopada 2016 przez Undisputed Gaduła (3,040 p.)
Dzięki wielkie :)

Jak tylko będę miał trochę czasu to przeanalizuję i pewnie będę miał pytania co do tego kodu

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 706 wizyt
pytanie zadane 30 listopada 2021 w C i C++ przez niezalogowany
0 głosów
0 odpowiedzi 381 wizyt

92,565 zapytań

141,417 odpowiedzi

319,602 komentarzy

61,950 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!

...