• 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
187 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 (72,090 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 (72,090 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 Szeryf (79,060 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 (98,270 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 Hiskiel Stary wyjadacz (14,420 p.)
Dlaczego lepiej array zamiast tablicy?
komentarz 17 kwietnia przez mokrowski Szeryf (79,060 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 (98,270 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 Hiskiel Stary wyjadacz (14,420 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 Szeryf (79,060 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 Szeryf (79,060 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 Hiskiel Stary wyjadacz (14,420 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 (22,110 p.)
komentarz 17 kwietnia przez macias17 Nowicjusz (180 p.)
Dzięki!

Podobne pytania

+1 głos
2 odpowiedzi 453 wizyt
0 głosów
1 odpowiedź 105 wizyt
pytanie zadane 16 stycznia w C i C++ przez BinaryMan Stary wyjadacz (11,860 p.)
0 głosów
3 odpowiedzi 275 wizyt
pytanie zadane 15 grudnia 2015 w C i C++ przez Munvik Mądrala (7,130 p.)
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

51,919 zapytań

94,689 odpowiedzi

193,028 komentarzy

25,307 pasjonatów

Przeglądających: 254
Pasjonatów: 23 Gości: 231

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.

...