Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Gra szubienica/wisielec

Ostatnio zmodyfikowano 2014-04-25 18:26
Autor Wiadomość
Goku145
Temat założony przez niniejszego użytkownika
Gra szubienica/wisielec
» 2014-03-12 18:51:39
Cześć! :)
Próbuję stworzyć taką mini grę pt. wisielec.
Napisałem już część, gdzie strzelając właściwą literę zamieniana jest ze znakiem "-", ale nie mogę poprawnie sformułować zakończenia pętli, które powinno odbywać się gdy tablica ze znakami ---- jest równa pomocniczej tablicy ze znakami ---- (czyli, jeżeli wszystkie poprawne litery zamienią się z tablicą znaków, to pętla powinna się zakończyć).

Póki co zrobiłem wyraz jako typ char, ale później zamienię to na stringa, aby łatwiej dodać więcej wyrazów (może spróbuję dodać wyrazy w pliku).
Próbowałem z tą pętlą różnymi sposobami, w tym z strcmp (czy jakoś tak), ale dalej nic nie pomaga.
Dodatkowo jak wszystkie litery się zamienią i podam cały wyraz wyskakuje, aby podać kolejne litery kilka razy.
Oto mój kod (jeżeli zauważycie jeszcze jakieś błędy lub macie jakieś rady bardzo bym prosił o podzielenie się :))

C/C++
//============================================================================
// Name        : Szubienica.cpp
// Author      :
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <cstdlib>
#include <string.h>
#include <cctype>
#include <cstdio>
using namespace std;


int main() {
   
    char wyraz[ 6 ] = "kajak";
    int dlugosc = strlen( wyraz );
    char znaki[ 6 ];
    char znaki_warunek[ 6 ];
    int i;
    int zycia = 5;
   
    cout << "Gra wisielec. \nSprobuj zgadnac wyraz zgadujac wystepujace w nim litery." << endl;
    cout << "W kazdej chwili mozesz rowniez sprobowac odgadnac caly wyraz." << endl;
    cout << "Kazda pomylka odejmuje jedno zycie, na poczatku gry posiadasz 5 zyc." << endl;
    cout << "Sprobuj zgadnac ponizszy wyraz: " << endl;
   
    for( i = 0; i < dlugosc; i++ ) { ///Przypisanie pustego znaku do elementow tablicy
        znaki[ i ] = '-';
        znaki_warunek[ i ] = '-';
    }
    cout << znaki << endl;
    char litera;
    i = 0;
   
    char znak;
   
    do {
        cout << endl << "Podaj litere: ";
        cin >> litera;
       
        ////////TRAFIENIE/////////////////////////////
        for( i = 0; i < dlugosc; i++ )
        if( litera == wyraz[ i ] ) {
            cout << endl; //Oddzielenie linijek po zmianie liter
            swap( znaki[ i ], wyraz[ i ] );
            cout << znaki;
        }
    } while( wyraz != znaki_warunek );
   
    cout << "Koniec.";
    return 0;
}
P-106196
Goku145
Temat założony przez niniejszego użytkownika
» 2014-03-14 20:09:45
Odświeżam...
P-106366
szymeczek31
» 2014-03-14 22:02:14
Zakonczylem petle po zgadnieciu i napisalem co jest bez sensu reszte sam pokombinuj...
C/C++
//============================================================================
// Name        : Szubienica.cpp
//============================================================================

#include <iostream>
#include <cstdlib>
#include <string.h>
#include <cctype>
#include <cstdio>
using namespace std;


int main()
{
    int l1, l2, l3;
    char wyraz[ 6 ] = "kajak";
    int dlugosc = strlen( wyraz );
    char znaki[ 6 ];
    char znaki_warunek[ 6 ];
    int i;
    int zycia = 5; //////Później tego nie używasz :P
   
    cout << "Gra wisielec. \nSprobuj zgadnac wyraz zgadujac wystepujace w nim litery." << endl;
    cout << "W kazdej chwili mozesz rowniez sprobowac odgadnac caly wyraz." << endl;
    cout << "Kazda pomylka odejmuje jedno zycie, na poczatku gry posiadasz 5 zyc." << endl;
    cout << "Sprobuj zgadnac ponizszy wyraz: " << endl << endl; //Lepiej przerwe daj dla czytelnosci
   
    for( i = 0; i < dlugosc; i++ )
    {
        znaki[ i ] = '-';
        znaki_warunek[ i ] = '-';
    }
    cout << znaki << endl;
    char litera;
    i = 0;
   
    char znak; ///////Tego też
   
    int i10 = 1;
    do
    {
        cout << endl << "Podaj litere: ";
        cin >> litera;
        if( litera == 'k' ) l1 = 1;
       
        if( litera == 'a' ) l2 = 1;
       
        if( litera == 'j' ) l3 = 1;
       
       
        ////////TRAFIENIE/////////////////////////////
        for( i = 0; i < dlugosc; i++ )
        if( litera == wyraz[ i ] )
        {
            cout << endl; //Oddzielenie linijek po zmianie liter
            swap( znaki[ i ], wyraz[ i ] );
            cout << znaki;
        }
        if( l1 == 1 && l2 == 1 && l3 == 1 ) break;
       
    }
    while( i10 );
   
    cout << "\nKoniec.";
    cin.ignore();
    getchar();
    return 0;
}
P-106376
szymeczek31
» 2014-03-14 22:05:06
I polecam dołączyć bibliotekę
#include <windows.h>
i polecenie w main
SetConsoleTitle( "Wisielec" );
 znacznie poprawi czytelność (to zmiana tytulu konsoli)
P-106377
MrPoxipol
» 2014-03-14 22:45:12
znacznie poprawi czytelność
Czego?
P-106380
Goku145
Temat założony przez niniejszego użytkownika
» 2014-03-15 19:24:39
To tak, dziękuję za odpowiedź, ale wydaje mi się, że da się to zrobić prościej, bo chcę aby w przyszłości można było dodać więcej wyrazów, a twój sposób tworzy if do każdej litery, no i w sumie nie rozumiem tego zapisu.
Programuję na laptopie z ubuntu, więc biblioteka windowsa nie będzie działała :)

Może ktoś inny ma jakąś propozycję?
P-106474
Goku145
Temat założony przez niniejszego użytkownika
» 2014-03-22 22:11:13
To tak, udało mi się już to zrobić swoim sposobem.
Miałem trochę problemów na koniec z liczbą żyć bo schodziło na liczby ujemne mimo warunku, ale przerobiłem to na if i zakończenie pętli poprzez break.

I teraz chciałbym zrobić, aby łatwo można było dodać kilka innych wyrazów, mógłby mnie ktoś jakoś nakierować jak to zrobić?

Tutaj obecny kod:
C/C++
#include <iostream>
#include <cstring>
#include <string>
using namespace std;

int main() {
   
    char wyraz[ 6 ] = "kajak";
    string napis = wyraz;
   
    //Sprawdzanie długości wyrazu i przypisywanie do zmiennej//////////////////////
    int dlugosc = strlen( wyraz );
   
    //Tablica z pustymi znakami///////////////////////////////////////////////////
    char znaki[ 6 ];
   
    int i = 0;
    char temp[ 6 ]; //Tablica pomocnicza do zakonczenia pętli
   
    cout << "Gra wisielec. \nSprobuj zgadnac wyraz zgadujac wystepujace w nim litery.\n";
    cout << "W kazdej chwili mozesz rowniez sprobowac odgadnac caly wyraz.\n";
    cout << "Kazda pomylka odejmuje jedno zycie, na poczatku gry posiadasz 5 zyc.\n";
    cout << "Sprobuj zgadnac ponizszy wyraz: \n\n";
   
    //Przypisanie pustego znaku do elementow tablicy/////////////////////////////////
    for( i = 0; i < dlugosc; i++ ) {
        znaki[ i ] = '-';
        temp[ i ] = '-';
    }
    cout << znaki << endl;
   
    char litera;
    int liczbaZyc = 5;
   
    do {
       
        //PROBA ZGADNIECA///////////////////////
        cout << endl << "Podaj litere: ";
        cin >> litera;
       
       
        //TRAFIENIE/////////////////////////////
        for( i = 0; i < dlugosc; i++ )
        if( litera == wyraz[ i ] ) {
            cout << endl; //Oddzielenie linijek po zmianie liter
            swap( znaki[ i ], wyraz[ i ] );
            cout << znaki;
        }
       
        //PUDŁO/////////////////////////////////
        size_t znalezionaPozycja = napis.find( litera );
        if( znalezionaPozycja == string::npos ) {
            cout << "Pudlo !" << endl << "Zostalo ci jeszcze: " << liczbaZyc - 1 << " zyc." << endl;
            liczbaZyc--;
            if( liczbaZyc == 0 ) {
                cout << endl << "Przegrales!" << endl;
                break;
            }
        }
        if( strcmp( temp, wyraz ) == 0 )
             cout << endl << "Gratulacje! Wygrałeś!" << endl;
       
    } while( strcmp( temp, wyraz ) != 0 );
   
    cout << "Koniec gry!" << endl;
    return 0;
}
P-107034
OczkoSX
» 2014-03-23 09:35:29
Ale zagmatwane. Zamień tablice charow na string i tam laduj wyrażenia. Co do odczyt z pliku to pobieraj całe linie, jedn linia = jedno wyrażenie. I wtedy będziesz potrzebował tablicę dynamiczną lub vektor. Bym to zrobił na klasach i funkcjach.
P-107045
« 1 » 2
  Strona 1 z 2 Następna strona