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

Gra wisielca

Ostatnio zmodyfikowano 2014-03-27 13:15
Autor Wiadomość
yorweth
Temat założony przez niniejszego użytkownika
Gra wisielca
» 2014-02-05 21:08:41
YO! Mam coś dla was, małe wyzwanie. Otóż miałem do wykonania grę w wisielca na zaliczenie, uwaliłem, jednak postanowiłem że i tak to zrobię, i możliwe że na poprawę dostanę to samo. Jeśli zaś chodzi o wisielca problem jest dość skomplikowany. Otóż:
Należy zrobić tablice 10-elementową, od użytkownika pobieramy słowo i wrzucamy do tablicy, następnie wyświetlamy tylko pierwszą i ostatnią litere, na przykład dla słowa, domek byłoby to d_ _ _ _ k, a w miejsce reszty liter wstawiamy takie o to przerywniki. Następnie użytkownik podaje litery jeśli poda literę która pasuję np. m, to program wyświetli nam: d _ m _ k. Jeśli zaś litera nie pasuje to wyświetla po jednej literkę z wyrazu "koniec", z kolejna nie trafioną literą wyświetla o jedna więcej, ąż do końca. I na koniec, jeśli użytkownik odgadnie całe hasło powinien pojawić się jakiś komunikat że wygrał, a gdy straci wszystkie szanse wyświetla się koniec, i miło by było żeby wyświetlał się cały wyraz ale to już nie jest konieczne. Nie rzucę wam oczywiście całego zadania i róbta. Udało mi się napisać już spory kawał programu. Wciąż jednak nie potrafię sobie poradzić z pobieraniem znaków, i ich sprawdzaniem czy są poprawne czy nie.
C/C++
#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main( int argc, char * argv[] ) {
    char tab[ 10 ];
    char a;
    char end[ 6 ] = { 'k', 'o', 'n', 'i', 'e', 'c' };
    int i, z, j, b, c = 0, d;
    char pomoc[ 10 ] = { '_', '_', '_', '_', '_', '_', '_', '_', '_', '_' };
    printf( "Witam w grze wisielec,podaj slowo na maks 10 liter:" );
    scanf( "%s", & tab[ i ] );
    do { printf( "%c", tab[ i ] );
        i++;
    } while( tab[ i ] != '\0' );
   
    printf( "\n" );
    for( i = 0; i < 10; i++ ) {
        if( tab[ i ] != '\0' ) z++;
        else break;
       
    }
    pomoc[ 0 ] = tab[ 0 ];
    pomoc[ z - 2 ] = tab[ z - 2 ];
    for( i = 0; i < z - 1; i++ ) {
        printf( "%c ", pomoc[ i ] );
    }
    for( i = 0; i < z - 3; i++ ) {
        scanf( "%s", & a );
        for( d = 0; d < z - 3; d++ ) {
            if( a = tab[ i ] ) { pomoc[ i ] = tab[ i ];
                for( b = 0; b < z - 1; b++ ) {
                    printf( "%c ", pomoc[ i ] );
                    i--;
                } }
            else { c++;
                for( j = 0; j < c; j++ ) {
                    printf( "%c ", end[ j ] );
                } }
        }
    }
   
    return 0;
}
 Można się troszeczkę pogubić, pod koniec jest poczwórna pętla, ale jak coś to usuńcie to, jeśli mój pomysł na system jest zły. Z góry dziękuje za pomoc.
P-104070
leon_w
» 2014-02-06 21:12:42
Możesz podpatrzyć jak ja to rozwiązałem przy grze "koło fortuny". Zasada jest bardzo podobna. Hasło jest "zasłaniane" przez jakiś znak, gdy użytkownik trafi literkę, zostaje odsłoniona.
 Gra konsolowa - Koło fortuny
P-104129
alixir
» 2014-02-07 14:29:47
Jak wyskrobiesz działający kod to pochwal się :)
Buduj program małymi kroczkami, upewniając się że wprowadzony kod jest poprawny i działa zgodnie z założeniem. Obecnie masz sporo podstawowych błędów i to już od samego początku kodu. Osobiście napisałem sobie taka gierkę, ale nie chcę ci mieszać w głowie i zbijać z tropu.
Człowiek najlepiej rozumie swój własny kod.

A jak masz jakiś konkretny problem to pytaj.
P-104168
yorweth
Temat założony przez niniejszego użytkownika
» 2014-03-27 11:53:08
A pochwale się. Co prawda temat już zdeczka zaleciał kurzem, ale mam dzialającego wicielca, co prawda program nie jest idealny, ale w odpowiednich  warunkach działa jak należy.
C/C++
#include <stdio.h>
#include <stdlib.h>

void wyswietlanie( char pomoc[], int z );
int main( int argc, char * argv[] )
{
    char tab[ 11 ];
    char pomoc[ 11 ] = { '_', '_', '_', '_', '_', '_', '_', '_', '_', '_' };
    char w;
    int flaga;
    int z = 0, i = 0, b = 6, a = 0;
    printf( "Witaj w wisielc\n" );
    printf( "Podaj slowo na maks 10 liter:" );
    scanf( "%s", & tab[ i ] );
    do {
        printf( "%c", tab[ i ] );
        i++;
        z++;
    } while( tab[ i ] != 0 );
   
    printf( "\n" );
    pomoc[ 0 ] = tab[ 0 ];
    pomoc[ z - 1 ] = tab[ z - 1 ];
    system( "cls" );
    for( i = 0; i < z; i++ ) {
        printf( " %c ", pomoc[ i ] );
    }
    fflush( stdin );
   
    do {
        printf( "pozostaly %d szanse\n", b );
        fflush( stdin );
        scanf( "%c", & w );
        flaga = 0;
        for( i = 1; i < z - 1; i++ )
        {
            if( w == tab[ i ] )
            {
                printf( "ok!!!\n" );
                pomoc[ i ] = tab[ i ];
                flaga = 1;
               
            }
           
           
        }
       
        wyswietlanie( pomoc, z );
       
        if( flaga == 0 ) {
            b = b - 1;
            printf( "error!!!\n" );
        }
        if( flaga == 1 ) {
            a = a + 1;
        }
       
    } while( b > 0 && a < z - 2 );
   
    if( b < 1 ) printf( "Koniec\n" );
   
    if( a > z - 3 ) printf( "Wygrales\n" );
   
    system( "PAUSE" );
    return 0;
} void wyswietlanie( char pomoc[], int z ) {
    int i;
   
    for( i = 0; i < z; i++ )
   
    {
        printf( " %c ", pomoc[ i ] );
    }
}
.
P-107278
alixir
» 2014-03-27 13:15:50
Tak jak napisałeś: tylko w sprzyjających warunkach.
Można podawać ciągle tą samą literę i też się wygra.

Też kiedyś pisałem wężyka. Zapewne ma sporo wad, ale wkleję go dla przykładu.

C/C++
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctype.h>

int readWord( char * );
void printText( char *, int );

int main()
{
    char word[ 21 ];
    char progress[] = "____________________";
    char endText[] = "KONIEC";
    char letter;
    int chances = 6;
    bool hit, victory;
   
    int word_length = readWord( word ); // wczytujemy wyraz
   
    progress[ 0 ] = word[ 0 ]; // inicjujemy pierwsza i ostatnia litere
    progress[ word_length - 1 ] = word[ word_length - 1 ];
   
    do {
        victory = true;
        hit = false;
       
        printText( endText, strlen( endText ) - chances ); // drukujemy kolejne litery KONIEC jesli jest potrzeba
        printText( progress, word_length ); // drukujemy zaszyfrowany wyraz
        printf( "  Podaj litere: " );
        letter = tolower( getchar() );
        while( getchar() != '\n' ) // czyscimy bufor ze smieci
             continue;
       
        for( int i = 1; i <( word_length - 1 ); i++ )
        if(( letter == word[ i ] ) &&( word[ i ] != progress[ i ] ) ) {
            progress[ i ] = word[ i ];
            hit = true;
            break;
        }
       
        if( !hit )
             chances--;
       
        for( int i = 0; i < word_length; i++ )
        if( word[ i ] != progress[ i ] )
             victory = false;
       
    } while( chances > 0 && !victory );
   
    if( victory )
         printf( "\nBRAWO\n" );
    else
         printf( "KONIEC\n\nNiestety nie udalo ci sie\n" );
   
    printf( "Szukany wyraz to: %s\n", word );
   
    return 0;
}

int readWord( char * txt ) {
    int i;
    do { // wczytujemy tak dlugo az wyraz bedzie mial min 3 znaki
        printf( "Podaj wyraz skladajacy sie z max 20 znakow: " );
        scanf( "%20s", txt );
        system( "cls" );
    } while(( i = strlen( txt ) ) < 3 );
   
    while( getchar() != '\n' ) // czyscimy bufor ze smieci
         continue;
   
    int n = 0;
    while( txt[ n ] ) { // zmniejszamy wszystkie wprowadzone litery dla ujednolicenia
        txt[ n ] = tolower( txt[ n ] );
        n++;
    }
   
    return i;
}

void printText( char * tab, int tsize ) {
    for( int i = 0; i < tsize; i++ )
         printf( "%c", tab[ i ] );
   
    printf( "\t" );
}
P-107280
« 1 »
  Strona 1 z 1