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

Gra w kółko i krzyżyk

0 głosów
169 wizyt
pytanie zadane 16 kwietnia w C i C++ przez macias17 Nowicjusz (180 p.)
edycja 16 kwietnia przez macias17
Witam!

Mam problem ze stworzeniem gry w kółko i krzyżyk. Nie wiem, jak w ogóle się za to zabrać. Takie oto zadanie znalazło się w książce Alexa Allaina "C++. Przewodnik dla początkujących" i brzmi ono następująco: Napisz grę w kółko i krzyżyk, w której dwie osoby grają przeciwko sobie. Jeśli to możliwe, użyj typu wyliczeniowego w celu przechowywania wartości pól planszy. Mniej więcej wiem, co to ten typ wyliczeniowy i na czym polega, ale nie mam pojęcia jak go wykorzystać oraz w czym mi pomoże. Dodam, że w momencie pojawienia się tego zadania w książce zostały przerobione już podstawy C++, instrukcje warunkowe, pętle, funkcje oraz instrukcje switch case wraz z typem wyliczeniowym.

Proszę o pomoc w zrozumieniu jak owe zadanie zrobić, gdyż nie zależy mi tylko na tym żeby zdobyć kod źródłowy i tyle, ponieważ chciałbym wiedzieć jak się za to zabrać i w przyszłości umieć taką grę napisać. Chciałbym również korzystać tylko z tych funkcji, które na ten moment znam z książki.

Mam świadomość, że tego typu pytania już się pojawiły na forum i przeczytałem je, lecz nie wyczerpują one moim zdaniem tematu. Po lekturze dalej nie wiem jak to zrobić, gdyż bardzo często był tam tylko podawany kod, a dokładnego wytłumaczenia nie znalazłem.

Z góry dziękuję!
komentarz 16 kwietnia przez JSHolic Maniak (70,250 p.)

Jaki konkretnie masz problem? Zapoznaj się z zasadami zadawania pytań. Podaj szczegóły problemu i pokaż kod.

komentarz 16 kwietnia przez macias17 Nowicjusz (180 p.)
Przypadkowo dodałem pytanie nie zawierając informacji, a w tym czasie je edytowałem, dlatego wyglądało to tak, a nie inaczej.
komentarz 16 kwietnia przez JSHolic Maniak (70,250 p.)

W kursie Mirosława Zelenta było Kółko i Krzyżyk - możesz zobaczyć na czym to polega i się wzorować.

https://www.youtube.com/watch?v=vd0zDG4vwOw

komentarz 17 kwietnia przez macias17 Nowicjusz (180 p.)
Dziękuję bardzo, w wolnej chwili na pewno obejrzę.

3 odpowiedzi

+1 głos
odpowiedź 17 kwietnia przez mokrowski Maniak (67,480 p.)

1. Pole w tej grze może mieć w trakcie rozgrywki 3 stany:

    X - KRZYZYK

    O - KOLKO

    P - PUSTE

Stąd typ enum będzie posiadał także 3 wartości. Z racji tego że nie używasz zapewne standardu C++11 lub nowszego, zadeklarujesz ten typ tak:

typedef enum {
    PUSTE,
    KRZYZYK,
    KOLKO
} StanPola;

2. Plansza w tej grze, jest 3 x 3 potrzebujesz więc kontenera tych "enum'ów" który je przechowa. Lepiej jest użyć std::array ale znów... pewnie nie było. Pozostają tablice. Możesz zrobić ją tak:

StanPola * plansza = new StanPola[3][3];
//
// Obowiązkowo przez zakończeniem programu...
//
delete [] plansza;

3. Potrzebujesz funkcji które:

    - Wyczyszczą całą planszę czyli ustawią wszystkie pola na wartość PUSTE.

    - Wyświetlą całą planszę z użyciem std::cout jako znaczki ASCII

    - Sprawdzą czy w wierszu nie ma 3 takich samych stanów/symboli

    - Sprawdzą czy w kolumnie nie ma 3 takich samych stanów/symboli

    - Sprawdzą czy diagonalnie ("na skos") nie ma takich samych stanów/symboli.

    - Funkcji która obsłuży logikę gry prezentując np. tekst "Maćku, grasz X. Gdzie postawisz symbol? Oddziel spacją: "
       i Maciek wpisze: 3 3 

A reszta zależy jak grę będziesz chciał rozbudować. Czy będą uprzejme pytania o imię, zapis stanu gry, gra sieciowa, może gra z AI (algorytm jest prosty a gra zupełna)  ... :)

1
komentarz 17 kwietnia przez draghan Szeryf (97,930 p.)

Z racji tego że nie używasz zapewne standardu C++11 lub nowszego, zadeklarujesz ten typ tak:

typedef enum {

    PUSTE,

    KRZYZYK,

    KOLKO

} StanPola;

A dlaczego nie po prostu:

enum StanPola
{
    PUSTE,
    KRZYZYK,
    KOLKO
};

?

komentarz 17 kwietnia przez Swipeyro Stary wyjadacz (10,090 p.)
Dlaczego lepiej array zamiast tablicy?
komentarz 17 kwietnia przez mokrowski Maniak (67,480 p.)
A czytaj z uwagą. Napisałem że lepiej lecz zapewne będzie informacja "nie wie nie znam". To samo z enum class.
komentarz 17 kwietnia przez draghan Szeryf (97,930 p.)

To samo z enum class.

Wiem, że w standardzie języka < C++11 nie ma silnie typowanych enumów. Ale dlaczego używać do tego typedef?

komentarz 17 kwietnia przez Swipeyro Stary wyjadacz (10,090 p.)

Chyba źle zrozumiałeś to zdanie.

Dlaczego? Lepiej array zamiast tablicy.

Olej, tutaj Twoja odpowiedź była by na miejscu. Ale ja zadałem pytanie

Dlaczego lepiej array zamiast tablicy? 

Swoją drogą, jak utworzyć array 3x3? 

komentarz 17 kwietnia przez mokrowski Maniak (67,480 p.)
edycja 17 kwietnia przez mokrowski

@draghan, w kilku kontekstach typedef pozwala uniknąć klepania niepotrzebnego słowa enum w starych i bardzo starych kompilatorach. Niestety jak napisałeś to jest tylko alias na typ enum i nie uruchamia żadnych mechanizmów ścisłego typowania. Dodatkowo (co nie jest wymaganiem tego projektu), jak zrobisz typedef, łatwiej integrować się z kodem w C. No i przyzwyczajenie z większych projektów gdzie IMHO łatwiej znaleźć typ. No ale tu każdy ma swoje przemyślenia... Ogólnie. Jak się da uciekać od enum "f Cee":)

komentarz 17 kwietnia przez mokrowski Maniak (67,480 p.)

Ok, moja wina.. odpisywanie w biegu... i to Ja nie doczytałem :) Przepraszam... 

Do sedna...

Dlaczego? Lepiej array zamiast tablicy.

std::array jest kontenerem zarządzającym cyklem życia danych. W momencie zniszczenia samego kontenera, zwalnia alokowaną pamięć na dane a w tablicy niestety robisz to ręcznie. Jeśli w programie z tablicą zostanie np. rzucony wyjątek, ryzykujesz że nieprawidłowa jego obsługa spowoduje wyciek pamięci. Z std::array zwijana ramka stosu zniszczy i poprawnie zdealokuje obiekt std:array. Jednocześnie std::array ma konieczność podania stałego rozmiaru i może stosować wewnętrzną optymalizację dostępu do tejże pamięci, posiada łatwe w użyciu iteratory.

Swoją drogą, jak utworzyć array 3x3? 

Ano można tak.. w przykładzie prosty int i już nie "siliłem się" na duszenie standardu poniżej C++11:

#include <iostream>
#include <array>
#include <iomanip>

int main() {
    // 2-wymiarowy std::array 3 x 3 z danymi int.
    // Dzięki {{0}} jednocześnie następuje zerowanie.
    std::array<std::array<int, 3>, 3> fields{{0}};
    // Jakiś dostęp... 
    fields[1][2] = 102;
    // Wyświetlenie... 
    for(const auto& row: fields) {
        for(const auto& field: row) {
            std::cout << std::setw(8) << field;
        }
        std::cout << '\n';
    }
}

 

komentarz 17 kwietnia przez macias17 Nowicjusz (180 p.)
Dziękuję bardzo za pomoc! W razie jakichkolwiek pytań będę pisał.
0 głosów
odpowiedź 16 kwietnia przez Swipeyro Stary wyjadacz (10,090 p.)

Po prostu np.

enum Field{X=0, O=1};

i na podstawie tego sprawdzasz kto wygrał. 

komentarz 16 kwietnia przez macias17 Nowicjusz (180 p.)
A można poprosić jakieś dokładniejsze informacje? Jak zrobić całą resztę? Zależy mi również na wytłumaczeniu. Mam narysować planszę za pomocą cout'ów czy jest na to jakaś lepsza metoda? Jak nanosić na planszę znaki wprowadzane przez użytkowników?
0 głosów
odpowiedź 16 kwietnia przez Beginer Pasjonat (21,170 p.)
komentarz 17 kwietnia przez macias17 Nowicjusz (180 p.)
Dzięki!

Podobne pytania

+1 głos
2 odpowiedzi 425 wizyt
0 głosów
1 odpowiedź 84 wizyt
pytanie zadane 16 stycznia w C i C++ przez BinaryMan Stary wyjadacz (11,820 p.)
0 głosów
3 odpowiedzi 250 wizyt
pytanie zadane 15 grudnia 2015 w C i C++ przez Munvik Mądrala (6,930 p.)
Porady nie od parady
Forum posiada swój własny chat IRC, dzięki któremu będziesz mógł po prostu pogadać z innymi Pasjonatami lub zapytać o jakiś problem. Podstrona z chatem znajduje się w menu pod ikoną człowieka w dymku.
Ciekawy innych porad? Odwiedź tę stronę!

48,556 zapytań

90,186 odpowiedzi

181,559 komentarzy

23,506 pasjonatów

Przeglądających: 197
Pasjonatów: 12 Gości: 185

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...