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
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:
Komputer: ABCD
Kod gracza EFBF o - jedna literka trafiona (B), ale na innej pozycji
Kod gracza AFFD xx - dwie literki trafione na dobrych pozycjach (A i D)
Kod gracza ACFD xxo - dwie na dobrych pozycjach (A i D) oraz jedna na innej (C)
Tworzenie gry rozłożymy na zadania, które będą realizowały następujące części gry:
komputer losuje czteroliterowy kod
gracz wpisuje z klawiatury swoje rozwiązanie
komputer porównuje oba napisy i wyprowadza wynik na ekran
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’
zadeklaruj zmienną X typu int
do zmiennej przypisz liczbę losową z przedziału 0..5 (użyj funkcji rand)
powiększ zmienną X o 65 (wynik dodawania w zmiennej X)
zadeklaruj zmienną Z typu char
przekonwertuj zmienną X na typ char i przypisz do zmiennej Z (użyj char(X))
wyświetl na ekranie zawartość zmiennej Z
ustaw na początku programu generator liczb pseudolosowych srand(time(NULL));
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
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
zadeklaruj zmienną T typu string i przypisz do niej pusty tekst (””)
w pętli
doklej na koniec zmiennej T wylosowany znak w zmiennej Z – wynik w T
usuń instrukcję wyświetlającą na ekranie znak Z
za pętlą
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
utwórz funkcję o nazwie GENERUJ typu string z jednym parametrem ILE typu int
w funkcji GENERUJ
skopiuj do funkcji instrukcje z zadań 1-3
zmiana w pętli – powinna wykonać się ILE razy
usuń z funkcji wszystkie instrukcje wyświetlające wyniki na ekranie
funkcja zwraca zawartość zmiennej T (return)
w programie głównym
usuń wszystkie instrukcje, zostaw generator pseudolosowy
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
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
zadeklaruj zmienną KOD typu string i przypisz do niej pusty tekst
wyświetl na ekranie napis ”Wpisz kod: ”
wczytaj tekst z klawiatury do zmiennej KOD
zadeklaruj zmienną D typu int
przypisz do zmiennej D długość tekstu wyliczoną ze zmiennej KOD (funkcja length)
instrukcja warunkowa
jeżeli zmienna D jest różna od 4, to do zmiennej D przypisz liczbę 4
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
zadeklaruj zmienną Z typu char
przypisz do zmiennej Z pierwszy znak napisu KOD (pierwszy znak napisu ma indeks zero)
zadeklaruj zmienną K typu int (w zmiennej K będą przechowywane kody ASCII wpisywanych liter)
przekonwertuj zmienną Z na typ int i wstaw do zmiennej K
wyświetl na ekranie znak Z i jego kod K
instrukcja warunkowa
jeżeli K jest mniejsze od 65 lub K jest większe od 70,
to do pierwszego znaku napisu KOD wstaw znak ‘!’ (wykrzyknik)
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
przygotuj pętlę (FOR lub WHILE), która wykona D razy (długość tekstu) punkty 1-7 z poprzedniego zadania
w pętli
do instrukcji KOD[] wstaw zmienną sterującą pętlą zamiast zera
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
przygotuj funkcję o nazwie WCZYTAJ typu string bez parametrów
funkcja WCZYTAJ
skopiuj do funkcji instrukcje z zadań 5-7
usuń z funkcji instrukcje wyświetlające zawartości zmiennych D, Z, K, KOD
funkcja ma zwracać zawartość zmiennej KOD
program główny
usuń wszystkie instrukcje , zostaw generator pseudolosowy
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.
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
zadeklaruj zmienne KOMPU, GRACZ, WYNIK, TESTY typu string
do zmiennej KOMPU przypisz funkcję GENERUJ(4)
do zmiennej GRACZ przypisz funkcję WCZYTAJ()
do zmiennej WYNIK przypisz łańcuch pusty
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
zadeklaruj zmienne G i T typu char
do zmiennej G przypisz pierwszy znak napisu GRACZ
do zmiennej T przypisz pierwszy znak napisu TESTY
jeżeli T jest równe G, to wstaw do pierwszego pola zmiennej TESTY, znak ‘.’ (kropka)
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’
przygotuj pętlę (FOR lub WHILE), która wykona 4 razy punkty 7-9 z poprzedniego zadania
w pętli
instrukcje, w których występuje pierwszy znak [0] zamień na zmienną sterującą pętlą
w pętli, w instrukcji warunkowej
jeżeli G jest równe T, to wykonywane są trzy instrukcje w bloku {}
w bloku
zamień badaną w pętli literę zmiennej TESTY na znak ‘.’ (kropka) – instrukcja już jest
zamień badaną w pętli literę zmiennej GRACZ na znak ‘x’ (iks)
doklej na końcu zmiennej WYNIK znak ‘x’, całość przypisz do zmiennej WYNIK
za pętlą
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’
przygotuj funkcję o nazwie SPRAWDZAJ typu string z dwoma parametrami KOMPU i GRACZ typu string
funkcja SPRAWDZAJ
skopiuj do funkcji instrukcje z zadań 9-10
usuń z funkcji instrukcje wyświetlające zmienne na ekranie
usuń z funkcji deklarację zmiennych KOMPU i GRACZ
usuń instrukcję generującą kod komputera i wczytywanie kodu z klawiatury
funkcja zwraca zawartość zmiennej WYNIK
program główny
usuń wszystkie instrukcje, zostaw generator pseudolosowy
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
pozostaw instrukcje z punktu 8 poprzedniego zadania
zadeklaruj zmienną WYNIK typu string i przypisz do niej tekst pusty
zadeklaruj zmienną TESTY typu string i przypisz do niej zmienną KOMPU
przygotuj pętlę (FOR lub WHILE), która wykona się 4 razy następujące instrukcje
w pętli
do zmiennej G typu char przypisz i-ty znak zmiennej GRACZ (gdzie i jest zmienną sterującą pętlą)
do zmiennej O typu int przypisz wynik szukania znaku Z w zmiennej TESTY (użyj funkcji find)
instrukcja warunkowa w pętli
jeżeli zmienna O jest większa lub równa zero, to wykonaj dwie instrukcje w bloku {}
w bloku
do zmiennej TESTY na pozycję O wpisz znak ’.’
do zmiennej WYNIK doklej na koniec znak ‘o’ – zapisz wszystko w zmiennej WYNIK
w pętli, za instrukcją warunkową
wyświetl na ekranie zmienne: G, O, TESTY
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
całą pętlą z programu głównego, ze wszystkimi instrukcjami, wstaw do funkcji pomiędzy pętlę z funkcji, a instrukcję return
usuń instrukcje wyświetlania zmiennych na ekranie
program główny
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
usuń wszystkie instrukcje, zostaw generator pseudolosowy
do zmiennej KOMPU typu string przypisz funkcję GENERUJ z parametrem 4
do zmiennej WYNIK typu string wstaw tekst pusty
do zmiennej RUNDA typu int wstaw jeden
przygotuj pętlę DO {} WHILE ()
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
wyświetl na ekranie zmienną RUNDA
wczytaj do zmiennej GRACZ typu string napis za pomocą funkcji WCZYTAJ
do zmiennej WYNIK przypisz funkcję SPRAWDZAJ z parametrami KOMPU i GRACZ
wyświetl na ekranie zawartość zmiennej WYNIK
zwiększ zmienną RUNDA o jeden
za pętlą
napisz na ekranie ”KONIEC :-)”
Uruchom program i przetestuj działanie gry MasterMind
//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"); } |