[C++] Losowanie znaków z klawiatury


(pawelek5) #1

Witam,

Chcę stworzyć małą, prostą grę, która wylosuje jakiś klawisz i trzeba będzie zgadnąć jaki to klawisz.

Nie wiem jednak jak wywołać takie losowanie. Chcę 4 tryby losowania

* [ŁATWY] małe litery

* [NORMALNY] małe litery + cyfry

* [TRUDNY] małe litery + cyfry + znaki (np.!@#$%^&*()\|)

* [HARDCORE] małe litery + cyfry + znaki (np.!@#$%^&*()\|) + duże litery

Myślę jeszcze nad trybem pełnej klawiatury (CAPSLOCK, LOGO WINDOWS, F1-F12, DELETE, BACKSPACE...). Jak by ktoś chciał to jeszcze mógłby mi pokazać kod na losowanie klawisza z całej klawiatury.

Jeżeli źle by się wybrało, program by podpowiadał, np. wybiorę G, a wylosowaną jest J i ma mi wyświetlić "Bardziej w prawo". Żeby nie było za łatwo to bym ograniczył ilość prób, ale to już się sam pobawię, żeby nie było, że "zróbcie mi" :slight_smile:

A więc:

* Jak wylosować te klawisze?

* Jak zrobić, by program wiedział, że klawisz np. J jest po prawej stronie od G?

* Czy do pobierania znaku bez entera służy getch()?

Kompilator: Microsoft Visual C++ 2010 Express

Język oprogramowania: C++

Typ programu: konsolowy

System: Microsoft Windows 7 x64

Dodam jeszcze, że program musi działać na komputerze z Windows XP... Nie jestem pewien czy ta wersja Windowsa. Może to być nawet 95, ale najbardziej prawdopodobne to XP.


(matty24) #2

Może wrzuć po prostu te znaki do tablicy w odpowiedniej kolejności. Skorzystaj też z kodów ASCI.


(pawelek5) #3

A czy mógłbyś podać jakiś przykład kodu? Ja się dopiero uczę :slight_smile:

Dodane 27.08.2013 (Wt) 17:20

#include 

#include 

#include 

void main()

{

// wylosowanie liczby

srand ((int) time(NULL));

int nWylosowana = rand() % 100 + 1;

std::cout << "Wylosowano liczbe z przedzialu 1-100." << std::endl;

// pierwsza próba odgadnięcia liczby

int nWprowadzona;

std::cout << "Sprobuj ja odgadnac: ";

std::cin >> nWprowadzona;

// kolejne próby, aż do skutku - przy użyciu pętli while

while (nWprowadzona != nWylosowana)

{

if (nWprowadzona < nWylosowana)

std::cout << "Liczba jest zbyt mala.";

else

std::cout << "Za duza liczba.";

std::cout << " Sprobuj jeszcze raz: ";

std::cin >> nWprowadzona;

}

std::cout << "Celny strzal :) Brawo!" << std::endl;

getch();

}

O coś jak to, tyle, że ma znaki wylosować, nie tylko liczby, podpowiedź nie jako “za mała/ za duża liczba”, lecz w którą stronę klawiatury jest klawisz, który trzeba odgadnąć.


(kostek135) #4

http://en.wikipedia.org/wiki/ASCII


(pawelek5) #5

Takie coś stworzyłem…

#include 

#include 

#include 

#include 


int main()

{


    char wylosowany_znak;

    char wpisany_znak;


	srand( (unsigned)time( NULL ) );

    wylosowany_znak=rand()%2+65;




	std::cout << "Wpisz jakąś literę." << std::endl;

	std::cin >> wpisany_znak;

	if (wpisany_znak == wylosowany_znak)

	{

		std::cout << "Odgadłeś!" << std::endl;

	}

	else

	{

		std::cout << "Nie udało się." << std::endl;

	}

	system("pause");

}

Są 2 możliwości: albo wylosowane będzie A albo B. Później sobie zamienię to na swoje znaki, lecz brakuje temu programowi wprowadzanie bez entera i tej podpowiedzi…

Dodane 27.08.2013 (Wt) 20:19

ooo

wpisany_znak = getch();

A może użyć getchar?


(kostek135) #6

Ehh może jeszcze raz http://en.wikipedia.org/wiki/ASCII#ASCI … characters

zobacz

jak napiszesz

printf("%c", 65);

to ci wypisze A zobacz teraz w tabelkę, i myśl jaka zależność istnieje… ewentualnie wersja c++, by wyglądała tak

std::cout << (char)65;

W każdym razie bez znaczenia dla tego co masz zrozumieć.

Dodane 27.08.2013 (Wt) 20:32

Co do części dodanej potem, getchar jest funkcją z C, można używać, ale nie zalecane. Jeśli chcemy trzymać się pisania w C++. Oczywiście nie znaczy to, że nie możesz go użyć po prostu się nie zaleca.

http://www.cplusplus.com/reference/istr … ream/read/


(pawelek5) #7

No ale to jest do wypisywania, a ja chcę właśnie wpisywanie. Ja już coś tam rozumiem, ale jak te podpowiedzi zrobić?

Rozumiem, że getch() jest standardem C++?


(Rolek0) #8

Nie jest, ale zwykle jest dostępna.


(matty24) #9

Ja na Twoim miejscu najpierw zrobiłbym sobie tablicę która będzie odpowiednikiem klawiatury, np. tak:

#include 

const short PION = 4;

const short POZIOM = 10;


int main()

{

    using namespace std;

    char tab1[PION][POZIOM] = {

        { '1', '2', '3', '4', '5', '6', '7' },

        { 'q', 'w', 'e', 'r', 't', 'y', 'u' },

        { 'a', 's', 'd', 'f', 'g', 'h', 'j' },

        { 'z', 'x', 'c', 'v', 'b', 'n', 'm' },

    }; 


    cout << "Klawiatura - podgląd" << endl;

    cout << "| " << tab1[0] << " | "<< endl;

    cout << "| " << tab1[1] << " | "<< endl;

    cout << "| " << tab1[2] << " | "<< endl;

    cout << "| " << tab1[3] << " | ";


    return 0;

}

Oczywiście nie jest do końca wypełniona i idealnie nie odzwierciedla układu, ale do Twojego pomysły powinno wystarczyć. Potem losujesz sobie znak z tej tablicy i porównujesz go z wprowadzonym przez kogoś znakiem. Jak się zgodzi to sprawa prosta. Jak nie, to już troszkę trudniej. Musisz napisać kod, który najpierw sprawdzi gdzie w tablicy znajduje się wprowadzona litera (znak) a potem ustalić w jakim kierunku od wylosowanego się znajduje. Koledzy programiści na pewno znajdą jakieś bardziej wydajne i prostsze rozwiązanie, ale do tego czasu możesz spróbować tego pomysłu. ---------EDIT----------------- Nie mogę spać więc skleiłem takie coś. Co prawda nie ma zabezpieczenia przed wpisywaniem kilku liter na raz oraz przed podaniem innych znaków niż dozwolone.

#include 

#include 

#include 

using namespace std;

const short PION = 4;

const short POZIOM = 11;


//Funckja losuje znak z klawiatury w zaleznosci od poziomu

//nalezy podac wybrany poziom w formie liczby calkowitej oraz referencje do zmiennych calkowitych

void losuj(int poziom, int &k, int &w )

{

    srand( time( NULL ) );


    switch (poziom)

    {

    //poziom latwy - same male litery

    case 0:

    k = (rand()%3)+1;

        switch(k)

        {

            case 1:

            w = rand()%10;

            break;


            case 2:

            w = rand()%9;

            break;


            case 3:

            w = rand()%7;

            break;

        }

    break;


    //poziom normalny - male litery i cyfry

    case 1:

    k = rand()%4;

         switch(k)

        {

            case 0:

            w = rand()%10;

            break;


            case 1:

            w = rand()%10;

            break;


            case 2:

            w = rand()%9;

            break;


            case 3:

            w = rand()%7;

            break;

        }

    break;


    default:

    cout << "Wybrales zly poziom! Automatycznie przydzielilismy poziom latwy." << endl;

     k = (rand()%3)+1;

        switch(k)

        {

            case 1:

            w = rand()%10;

            break;


            case 2:

            w = rand()%9;

            break;


            case 3:

            w = rand()%7;

            break;

        }

    break;

    }

}

int main()

{

    int poziom;

    //zmienne przechowuja numer kolomny i wiersza wylosowanego znaku z tabeli

    int k=0,w=0;


    cout << "Wybierz poziom: " << endl

    << "[0] Latwy" << endl

    << "[1] Normalny" << endl

    << "Wybor: ";


    //sprawdzenie czy wpisano cyfre

    while(!(cin>>poziom))

    {

      cin.clear();

      cin.sync();

    }


    //wywolanie funkcji losujacej

    losuj(poziom,k,w);

    //zmienne przechowuja wylosowany znak (x) oraz znak wprowadzany przez użytkownika

    char x,in;

    //zmienne przechowujace numer kolumny i wiersza wprowadzonego znaku w tabeli

    int wyb_k, wyb_w;

    //zmienna przechowuje liczbe prob

    int licz=0;


    //tabela imitujaca klawiature

    char tab1[PION][POZIOM] = {

        { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', },

        { 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p' },

        { 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l',char(59)},

        { 'z', 'x', 'c', 'v', 'b', 'n', 'm',char(44),char(46),char(47) },

    };

    cout << "Klawiatura - podglad" << endl;

    cout << "| " << tab1[0] << " | "<< endl;

    cout << "| " << tab1[1] << " | "<< endl;

    cout << "| " << tab1[2] << " | "<< endl;

    cout << "| " << tab1[3] << " | "<< endl;


    x = tab1[k][w];

    cout << x << endl;


    do

    {

        cout << "Zgadnij znak" << endl;

        cin >> in;


        for (int i=0; i
        {

            for (int j=0; j
            {

                if (tab1[i][j] == in)

                {

                    wyb_k = i;

                    wyb_w = j;

                }

            }

        }


        if (!(wyb_k==k))

        {

            if (wyb_k < k) {cout << "Nizej" << endl;}

            else {cout << "Wyzej" << endl;}

        }

        if (!(wyb_w==w))

        {

            if (wyb_w > w) {cout << "W lewo" << endl;}

            else {cout << "W prawo" << endl;}

        }

        licz++;

    }

    while (!(x==in));

    cout << "BRAWO! Udalo Ci sie za: " << licz << " razem!" << endl;


    return 0;

}