mgr inż. Wacław Libront * Bobowa 2019

ZSO Bobowa, ul. Długoszowskich 1, 38-350 Bobowa, tel: 0183514009, fax: 0183530221, email: sekretariat@zsobobowa.eu, www: zsobobowa.eu

Lekcja

Logiczne gry komputerowe w C++

  1. losowanie
  2. wczytanie
  3. porównanie
  4. rozwiązania

Posiadamy już elementarną wiedzę w zakresie programowania. Pora więc zabrać się za rozwiązywanie problemów bardziej złożonych, które wymagają zastosowania typowych w informatyce chwytów algorytmicznych. Zdobyte wiedzę umiejętności zastosujemy do stworzenia znanej gry MasterMind.

MasterMind to prosta gra logiczna o następujących zasadach:

Przykład:


Tworzenie gry rozłożymy na zadania, które będą realizowały następujące części gry:


Losowanie

Głównym zdaniem programu jest wyświetlanie napisów składających się z liter od ‘A’ do ‘F’, dlatego przygotujemy funkcję, która losuje tego typu kody

Zadanie 1
Wyświetlanie na ekranie losowych znaków z przedziału ‘A’…’F’

  1. zadeklaruj zmienną X typu int

  2. do zmiennej przypisz liczbę losową z przedziału 0..5 (użyj funkcji rand)

  3. powiększ zmienną X o 65 (wynik dodawania w zmiennej X)

  4. zadeklaruj zmienną Z typu char

  5. przekonwertuj zmienną X na typ char i przypisz do zmiennej Z (użyj char(X))

  6. wyświetl na ekranie zawartość zmiennej Z

  7. ustaw na początku programu generator liczb pseudolosowych srand(time(NULL));

  8. wstaw do programu bibliotekę ctime 

Uruchom program kilka razy i sprawdź czy wypisywane są pojedyncze znaki z przedziału A..F


Zadanie 2
Wyświetl na ekranie tekst składający się z 100 losowych znaków A..F

  1. przygotuj pętlę (FOR lub WHILE), która wykona 100 razy punkty 1..6 z zadania 1

Uruchom program kilka razy i sprawdź czy wypisywane są ciągi znaków A..F w jednym wierszu


Zadanie 3
Tworzenie łańcuchów tekstowych złożonych z losowych znaków A..F
 

    przed pętlą z zadania 2

  1. zadeklaruj zmienną T typu string i przypisz do niej pusty tekst (””)

  2. w pętli
     

  3. doklej na koniec zmiennej T wylosowany znak w zmiennej Z – wynik w T

  4. usuń instrukcję wyświetlającą na ekranie znak Z

  5. za pętlą
     

  6. wyświetl na ekranie tekst znajdujący się w zmiennej T

Uruchom program kilka razy i sprawdź czy wypisywane są ciągi znaków A..F w jednym wierszu


Zadanie 4
Funkcja generująca napisy złożone z losowych znaków A..F

  1. utwórz funkcję o nazwie GENERUJ typu string z jednym parametrem ILE typu int

  2. w funkcji GENERUJ
     

  3. skopiuj do funkcji instrukcje z zadań 1-3

  4. zmiana w pętli – powinna wykonać się ILE razy

  5. usuń z funkcji wszystkie instrukcje wyświetlające wyniki na ekranie

  6. funkcja zwraca zawartość zmiennej T (return)

  7. w programie głównym
     

  8. usuń wszystkie instrukcje, zostaw generator pseudolosowy

  9. uruchom funkcję GENERUJ z parametrem równym 100 i wyświetl jej wynik na ekranie

Uruchom program kilka razy i sprawdź czy wypisywane są ciągi znaków A..F w jednym wierszu


Wczytanie

Zadaniem użytkownika jest wpisywać znaki A..F z klawiatury. Program musi sprawdzać między innymi, czy użytkownik wpisał je poprawnie. W pierwszym etapie, czy wpisał co najwyżej 4 litery, w kolejnym, czy wpisane znaki należą do przedziału A..F.

Zadanie 5
Wczytujemy z klawiatury tekst i sprawdzamy czy wpisane znaki są 4 znaki

    w programie głównym

  1. zadeklaruj zmienną KOD typu string i przypisz do niej pusty tekst

  2. wyświetl na ekranie napis ”Wpisz kod: ”

  3. wczytaj tekst z klawiatury do zmiennej KOD

  4. zadeklaruj zmienną D typu int

  5. przypisz do zmiennej D długość tekstu wyliczoną ze zmiennej KOD (funkcja length)

  6. instrukcja warunkowa
     

  7. jeżeli zmienna D jest różna od 4, to do zmiennej D przypisz liczbę 4

  8. wyświetl na ekranie zawartość zmiennej D

Uruchom program kilka razy i sprawdź czy wyświetlana jest liczba 4, niezależnie od liczby wpisanych znaków


Zadanie 6
Jeżeli litera w napisie jest różna od A..F, to zamień ją na ‘!’ (wykrzyknik)

    w programie głównym

  1. zadeklaruj zmienną Z typu char

  2. przypisz do zmiennej Z pierwszy znak napisu KOD (pierwszy znak napisu ma indeks zero)

  3. zadeklaruj zmienną K typu int (w zmiennej K będą przechowywane kody ASCII wpisywanych liter)

  4. przekonwertuj zmienną Z na typ int i wstaw do zmiennej K

  5. wyświetl na ekranie znak Z i jego kod K

  6. instrukcja warunkowa
     

  7. jeżeli K jest mniejsze od 65 lub K jest większe od 70,
    to do pierwszego znaku napisu KOD wstaw znak ‘!’ (wykrzyknik)

  8. wyświetl na ekranie zawartość zmiennej KOD

Uruchom program kilka razy. Jeżeli tekst składa się z liter A..F, to jest wyświetlany. Jeżeli pierwsza litera tekstu jest inna niż A..F to litera jest zastępowana wykrzyknikiem.


Zadanie 7
Sprawdzamy wszystkie litery w napisie i jeśli któraś z nich jest różna od A..F, to zamieniamy ją na ‘!’ (wykrzyknik)

    w programie głównym

  1. przygotuj pętlę (FOR lub WHILE), która wykona D razy (długość tekstu) punkty 1-7 z poprzedniego zadania

  2. w pętli
     

  3. do instrukcji KOD[] wstaw zmienną sterującą pętlą zamiast zera

  4. w podobny sposób zmień jeszcze 2 instrukcje, w których sprawdzanym był pierwszy znak zmiennej KOD

Uruchom program kilka razy. Jeżeli we wczytanym napisie znajdują się litery spoza zakresu A..F, to zamieniane są na wykrzykniki.


Zadanie 8
Funkcja testująca wczytany z klawiatury napis

  1. przygotuj funkcję o nazwie WCZYTAJ typu string bez parametrów

  2. funkcja WCZYTAJ
     

  3. skopiuj do funkcji instrukcje z zadań 5-7

  4. usuń z funkcji instrukcje wyświetlające zawartości zmiennych D, Z, K, KOD

  5. funkcja ma zwracać zawartość zmiennej KOD

  6. program główny
     

  7. usuń wszystkie instrukcje , zostaw generator pseudolosowy

  8. uruchom funkcję WCZYTAJ i wyświetl jej wynik na ekranie

Uruchom program kilka razy. Jeżeli we wczytanym napisie znajdują się litery spoza zakresu A..F, to zamieniane są na wykrzykniki.


Porównanie

Komputer potrafi generować napis. Gracz może wczytywać poprawne napisy. Podstawowym zadaniem gry będzie porównywanie obu tych napisów i wyświetlanie odpowiednich komunikatów. W pierwszym etapie porównamy oba napisy znak po znaku i jeśli znaki leżące na tych samych pozycjach w obu napisach są identyczne, to będziemy to mogli zasygnalizować.

Zadanie 9
Porównujemy napis wygenerowany przez komputer z napisem wczytanym z klawiatury. Sprawdzamy czy pierwsze litery napisów są identyczne.

    program główny

  1. zadeklaruj zmienne KOMPU, GRACZ, WYNIK, TESTY typu string

  2. do zmiennej KOMPU przypisz funkcję GENERUJ(4)

  3. do zmiennej GRACZ przypisz funkcję WCZYTAJ()

  4. do zmiennej WYNIK przypisz łańcuch pusty

  5. do zmiennej TESTY przypisz zmienną KOMPU Zmienna wynik będzie zawierała w dalszych etapach znaki ’X’ lub ‘O’.

    Zmienna TESTY pełni funkcję pomocniczą podczas porównywania. Na niej będziemy wykonywać pewne operacje, a w zmiennej GRACZ przechowywany będzie oryginalny kod wygenerowany przez komputer
     

  6. zadeklaruj zmienne G i T typu char

  7. do zmiennej G przypisz pierwszy znak napisu GRACZ

  8. do zmiennej T przypisz pierwszy znak napisu TESTY

  9. jeżeli T jest równe G, to wstaw do pierwszego pola zmiennej TESTY, znak ‘.’ (kropka)

  10. wyświetl na ekranie zmienne KOMPU, TESTY, T, GRACZ, G

Uruchom program kilka razy. Jeżeli pierwsze litery w napisach są takie same to pojawi się kropka


Zadanie 10
Sprawdzamy wszystkie litery w napisach. Jeżeli są identyczne, to wstawiane są kropki i generowany jest napis złożony ze znaków ‘x’

  1. przygotuj pętlę (FOR lub WHILE), która wykona 4 razy punkty 7-9 z poprzedniego zadania

  2. w pętli

  3. instrukcje, w których występuje pierwszy znak [0] zamień na zmienną sterującą pętlą

  4. w pętli, w instrukcji warunkowej
     

  5. jeżeli G jest równe T, to wykonywane są trzy instrukcje w bloku {}

  6. w bloku
     

  7. zamień badaną w pętli literę zmiennej TESTY na znak ‘.’ (kropka) – instrukcja już jest

  8. zamień badaną w pętli literę zmiennej GRACZ na znak ‘x’ (iks)

  9. doklej na końcu zmiennej WYNIK znak ‘x’, całość przypisz do zmiennej WYNIK

  10. za pętlą
     

  11. wyświetl na ekranie zmienną WYNIK

Uruchom program kilka razy. Jeżeli znaki są takie same, to zostaną zastąpione kropkami i pojawi się napis złożony z tej ilości znaków’x’


Zadanie 11
Funkcja SPRAWDZAJ testuje dwa napisy: wygenerowany przez komputer i wczytany z klawiatury przez gracza. Jeśli litery w napisach są na tych samych pozycjach, to funkcja wypisuje znaki ‘x’

  1. przygotuj funkcję o nazwie SPRAWDZAJ typu string z dwoma parametrami KOMPU i GRACZ typu string

  2. funkcja SPRAWDZAJ
     

  3. skopiuj do funkcji instrukcje z zadań 9-10

  4. usuń z funkcji instrukcje wyświetlające zmienne na ekranie

  5. usuń z funkcji deklarację zmiennych KOMPU i GRACZ

  6. usuń instrukcję generującą kod komputera i wczytywanie kodu z klawiatury

  7. funkcja zwraca zawartość zmiennej WYNIK

  8. program główny
     

  9. usuń wszystkie instrukcje, zostaw generator pseudolosowy

  10. sprawdź działanie funkcji wpisując następujący kod:

string KOMPU=GENERUJ(4);
string GRACZ=WCZYTAJ();
cout << KOMPU << " " << GRACZ << endl;
cout << SPRAWDZAJ(KOMPU,GRACZ) << endl;

Uruchom program kilka razy. Na ekranie wyświetli się napis złożony ze znaków ‘x’ – każda litera na swoim miejscu, to jeden znak ‘x’.


Umiemy sprawdzać znaki na tych samych pozycjach w obu napisach. Kolejnym zadaniem będzie sprawdzanie znaków, które nie występują na tych samych pozycjach. Jednym ze sposobów będzie użycie funkcji tekstowej FIND

Zadanie 12
Jeżeli w kodzie generowanym przez komputer i wczytanym przez gracza są znaki, ale nie na swoich miejscach, to generowany jest napis złożony ze znaków ‘o’

    program główny

  1. pozostaw instrukcje z punktu 8 poprzedniego zadania

  2. zadeklaruj zmienną WYNIK typu string i przypisz do niej tekst pusty

  3. zadeklaruj zmienną TESTY typu string i przypisz do niej zmienną KOMPU

  4. przygotuj pętlę (FOR lub WHILE), która wykona się 4 razy następujące instrukcje

  5. w pętli

  6. do zmiennej G typu char przypisz i-ty znak zmiennej GRACZ (gdzie i jest zmienną sterującą pętlą)

  7. do zmiennej O typu int przypisz wynik szukania znaku Z w zmiennej TESTY (użyj funkcji find)

  8. instrukcja warunkowa w pętli
     

  9. jeżeli zmienna O jest większa lub równa zero, to wykonaj dwie instrukcje w bloku {}

  10. w bloku

  11. do zmiennej TESTY na pozycję O wpisz znak ’.’

  12. do zmiennej WYNIK doklej na koniec znak ‘o’ – zapisz wszystko w zmiennej WYNIK

  13. w pętli, za instrukcją warunkową
     

  14. wyświetl na ekranie zmienne: G, O, TESTY

  15. wyświetl na ekranie zmienną WYNIK

Uruchom program kilka razy. Na ekranie wyświetlą się znaki wpisane przez gracza. Jeśli znak gracza znajduje się w napisie wygenerowanym przez komputer, to pokazywana jest liczba od 0 do 3. Jeśli znaku nie ma pojawia się -1. Na końcu znajduje się napis złożony ze znaków ‘o’ – tyle liter znaleziono


Zadanie 13
Funkcja SPRAWDZAJ najpierw przeszuka napis i „wyliczy” ilość znaków na takich samych pozycjach (x), a potem sprawdzi czy są znaki na nie tych samych pozycjach (o)

    funkcja SPRAWDZAJ

  1. całą pętlą z programu głównego, ze wszystkimi instrukcjami, wstaw do funkcji pomiędzy pętlę z funkcji, a instrukcję return

  2. usuń instrukcje wyświetlania zmiennych na ekranie

    program główny
     

  3. usuń pętlę ze wszystkimi instrukcjami

Uruchom program kilka razy. Funkcja SPRAWDZAJ powinna dawać poprawne wyniki. Każdy ‘x’ oznacza, że jedna z liter jest na swoim miejscu. Każdy znak ‘o’ oznacza, że jedna z liter jest nie na swoim miejscu.


I to już prawie koniec tworzenia gry MasterMind

Zadanie 14
Program główny. Losujemy kod i w pętli wczytujemy kod z klawiatury i sprawdzamy. Pętla kończy działanie, gdy odgadniemy oprawnie kod wygenerowany przez komputer


    program główny

  1. usuń wszystkie instrukcje, zostaw generator pseudolosowy

  2. do zmiennej KOMPU typu string przypisz funkcję GENERUJ z parametrem 4

  3. do zmiennej WYNIK typu string wstaw tekst pusty

  4. do zmiennej RUNDA typu int wstaw jeden

  5. przygotuj pętlę DO {} WHILE ()

  6. pętla jest kontynuowana póki zmienna WYNIK jest różna od napisu ”xxxx” (pętla zakończy działanie, gdy odgadniemy wszystkie cztery znaki)

    w pętli
     

  7. wyświetl na ekranie zmienną RUNDA

  8. wczytaj do zmiennej GRACZ typu string napis za pomocą funkcji WCZYTAJ

  9. do zmiennej WYNIK przypisz funkcję SPRAWDZAJ z parametrami KOMPU i GRACZ

  10. wyświetl na ekranie zawartość zmiennej WYNIK

  11. zwiększ zmienną RUNDA o jeden

  12. za pętlą
     

  13. napisz na ekranie ”KONIEC :-)”

Uruchom program i przetestuj działanie gry MasterMind


Rozwiązania


//SZABLON
#include <stdlib.h>	//system
#include <iostream>	//cout
#include <iomanip>	//fixed
#include <cmath>	//pow
#include <ctime>	//pow
using namespace std;
int main(){
  setlocale(LC_ALL, "");


  system("pause");
}