|
Serwis Edukacyjny w I-LO w Tarnowie
Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2026 mgr Jerzy Wałaszek
|
ProblemNależy opracować algorytm gry
|

Gra
Zasady gry są następujące:
Do gry potrzebna jest plansza oraz kolorowe, plastikowe grzybki z wyprofilowanymi główkami, które wtykamy nóżkami w otwory na planszy. Grzybki są w dwóch rodzajach: kodowe o sześciu różnych kolorach oraz kluczowe, mniejsze o dwóch kolorach – czarnym i białym. W grze uczestniczy zawsze dwóch graczy – koder (ang. coder) oraz łamacz
kodu (ang. code breaker). Koder
przy pomocy grzybków kodowych tworzy tajny kod zbudowany
Na pierwszy rzut oka gra
x – literka kodu łamacza odpowiada dokładnie literce kodu kodera
co do rodzaju i co do położenia w kodzie.
o – literka kodu łamacza zgadza się z literką kodu kodera tylko co do rodzaju.
Przykład:
| Kod | Klucz | ||
| Kod kodera | BFAC | ||
| 1. | Kod łamacza | ABCD | ooo |
| 2. | Kod łamacza | BADE | xo |
| 3. | Kod łamacza | BACF | xooo |
| 4. | Kod łamacza | BFCA | xxoo |
| 5. | Kod łamacza | BFAC | xxxx |
Zadanie naszego algorytmu będzie polegało zatem na wygenerowaniu
Tworzenie kodu klucza jest dwuetapowe:
Najpierw tworzymy kopię roboczą kodu kodera, ponieważ algorytm niszczy zawartość tego kodu.
W pierwszym etapie wyznaczamy znaki zgodne co do pozycji i rodzaju. W tym celu wystarczy porównać ze sobą kolejne znaki kodu kodera i łamacza. Jeśli są zgodne, do kodu klucza wstawiamy
W drugim etapie wyznaczamy znaki zgodne co do rodzaju. W tym celu
każdy znak kodu kodera porównujemy z każdym znakiem kodu łamacza aż do
napotkania zgodności. Jeśli mamy zgodność, to do kodu klucza wstawiamy
K01: Generuj skoder ; generujemy 4-znakowy kod kodera K02: Dla runda = 1, 2, …, 6: ; łamacz ma maksymalnie 6 prób wykonuj kroki K03…K19
K03: Czytaj słamacz ; odczytujemy kod łamacza K04: Dopóki |słamacz| < 4, ; kod łamacza musi być co najmniej wykonuj: słamacz ← słamacz+w2 ; 4-ro znakowy, w2 – wartownik K05: sk ← skoder ; kopiujemy kod kodera K06: sklucz ← "" ; zerujemy kod klucza K07: Dla i = 1, 2, 3, 4: ; szukamy znaków zgodnych co do typu i pozycji wykonuj kroki K08…K11 K08: Jeśli sk[i] ≠ słamacz[i], ; znaki niezgodne pomijamy to następny obieg pętli K07 K09: sklucz ← sklucz+"x" ; w kluczu umieszczamy znak x K10: sk[i] ← w1 ; znaki zastępujemy wartownikami K11: słamacz[i] ← w2 ; aby nie były później zaliczane K12: Dla i = 1, 2, …, 4: ; szukamy znaków zgodnych co do pozycji wykonuj kroki K13…K18 K13: Jeśli sk[i] = w1, ; znaki usunięte pomijamy to następny obieg pętli K12 K14: Dla j = 1, 2, …, 4: ; znak kodera porównujemy wykonuj kroki K15…K18 ; z kolejnymi znakami łamacza K15: Jeśli sk[i] ≠ słamacz[j], ; pomijamy znaki różne to następny obieg pętli K14 K16: sklucz ← sklucz+"o" ; w kluczu umieszczamy znak o K17: słamacz[j] ← w2 ; znak łamacza zastępujemy wartownikiem K18: Następny obieg pętli K12 ; przechodzimy do następnego ; znaku kodera K19: Pisz sklucz ; wyprowadzamy kod klucza K20: Jeśli sklucz = "xxxx", ; kończymy pętlę K02, to idź do kroku K21 ; jeśli kod kodera odgadnięty K21: Pisz skoder ; wyprowadzamy kod kodera K22: Zakończ
|
Uwaga: Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich. |
| Program gry
|
Pascal// MasterMind-komputer <-> człowiek
// Data: 13.08.2008
// (C)2020 mgr Jerzy Wałaszek
//-----------------------------
program prg;
var
skoder, slamacz, sklucz, sk : string;
i, j, runda : integer;
begin
// generujemy kod kodera
randomize;
skoder := '';
for i := 1 to 4 do
skoder := skoder+chr(65+random(6));
// rozpoczynamy rozgrywkę
for runda := 1 to 6 do
begin
// odczytujemy kod łamacza
write ('Runda ', runda, ' : ');
readln(slamacz);
// normalizujemy kod łamacza
while length(slamacz) < 4 do
slamacz := slamacz+'$';
// generujemy kod klucza
sk := skoder; // kopia robocza kodu kodera
sklucz := '';
for i := 1 to 4 do
if sk[i] = slamacz[i] then
begin
sklucz := sklucz+'x';
sk[i] := '#'; // wartownik w1
slamacz[i] := '$'; // wartownik w2
end;
for i := 1 to 4 do
if sk[i] <> '#' then
for j := 1 to 4 do
if sk[i] = slamacz[j] then
begin
sklucz := sklucz+'o';
slamacz[j] := '$'; // wartownik w2
break;
end;
// wyświetlamy kod klucza
writeln(' : ', sklucz);
// jeśli odgadnięto kod kodera, kończymy
if sklucz = 'xxxx' then break;
end;
writeln('KOD : ', skoder);
writeln;
end. |
// MasterMind-komputer <-> człowiek
// Data: 13.08.2008
// (C)2020 mgr Jerzy Wałaszek
//-----------------------------
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
string skoder, slamacz, sklucz, sk;
int i, j, runda;
// generujemy kod kodera
srand(time(NULL));
skoder = "";
for(i = 0; i < 4; i++)
skoder += char(65+rand()%6);
// rozpoczynamy rozgrywkę
for(runda = 1; runda <= 6; runda++)
{
// odczytujemy kod łamacza
cout << "Runda " << runda << ": ";
cin >> slamacz;
// normalizujemy kod łamacza
while(slamacz.length() < 4)
slamacz += '$';
// generujemy kod klucza
sk = skoder; // kopia robocza kodu kodera
sklucz = "";
for(i = 0; i < 4; i++)
if(sk[i] == slamacz[i])
{
sklucz += 'x';
sk[i] = '#'; // wartownik w1
slamacz[i] = '$'; // wartownik w2
}
for(i = 0; i < 4; i++)
if(sk[i] != '#')
for(j = 0; j < 4; j++)
if(sk[i] == slamacz[j])
{
sklucz += 'o';
slamacz[j] = '$'; // wartownik w2
break;
}
// wyświetlamy kod klucza
cout << " : "
<< sklucz << endl;
// jeśli odgadnięto kod kodera, kończymy
if(sklucz == "xxxx") break;
}
cout << "KOD : "
<< skoder
<< endl << endl;
return 0;
} |
Basic' MasterMind-komputer <-> człowiek
' Data: 13.08.2008
' (C)2020 mgr Jerzy Wałaszek
'---------------------------------
Dim As String skoder, slamacz, sklucz, sk
Dim As Integer i, j, runda
' generujemy kod kodera
Randomize
skoder = ""
For i = 1 To 4
skoder += Chr(65+Cint(Rnd*5))
Next
' rozpoczynamy rozgrywkę
For runda = 1 To 6
' odczytujemy kod łamacza
Print "Runda";runda;": ";
Line Input slamacz
' normalizujemy kod łamacza
While Len(slamacz) < 4
slamacz += "$"
Wend
' generujemy kod klucza
sk = skoder ' kopia robocza kodu kodera
sklucz = ""
For i = 1 To 4
If Mid(sk, i, 1) = Mid(slamacz, i, 1) Then
sklucz += "x"
Mid(sk, i, 1) = "#" ' wartownik w1
Mid(slamacz, i, 1) = "$" ' wartownik w2
End If
Next
For i = 1 To 4
If Mid(sk, i, 1) <> "#" Then
For j = 1 To 4
If Mid(sk, i, 1) = Mid(slamacz, j, 1) Then
sklucz += "o"
Mid(slamacz, j, 1) = "$" ' wartownik w2
Exit For
End If
Next
End If
Next
' wyświetlamy kod klucza
Print " : ";sklucz
' jeśli odgadnięto kod kodera, kończymy
If sklucz = "xxxx" Then Exit For
Next
Print "KOD : ";skoder
Print
End |
Python
(dodatek)# MasterMind-komputer <-> człowiek
# Data: 23.03.2024
# (C)2024 mgr Jerzy Wałaszek
#---------------------------------
import random
# generujemy kod kodera
skoder = ""
for i in range(4):
skoder += chr(random.randrange(65, 70))
# rozpoczynamy rozgrywkę
for runda in range(1, 7):
# odczytujemy kod łamacza
print("Runda", runda, ": ", end="")
slamacz = input()
# normalizujemy kod łamacza
while len(slamacz) < 4:
slamacz += "$"
# generujemy kod klucza
sk = skoder[:] # kopia robocza kodu kodera
sklucz = ""
for i in range(4):
if sk[i] == slamacz[i]:
sklucz += "x"
sk = sk[:i]+"#"+sk[i+1:]
slamacz = slamacz[:i]+"$"+slamacz[i+1:]
for i in range(4):
if sk[i] != "#":
for j in range(4):
if sk[i] == slamacz[j]:
sklucz += 'o'
slamacz = slamacz[:j]+"$"+slamacz[j+1:]
break
# wyświetlamy kod klucza
print(" :", sklucz)
# jeśli odgadnięto kod kodera, kończymy
if sklucz == "xxxx":
break
print("KOD :", skoder)
print()
|
| Wynik: |
Runda 1 : ABCD
: oo
Runda 2 : BCAF
: xxx
Runda 3 : DCAF
: xxx
Runda 4 : FCAF
: xxx
Runda 5 : ECAF
: xxxx
KOD : ECAF
|
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.