Piętnastka - opis


Podrozdziały:

 

W latach 70-tych ubiegłego wieku istniała popularna zabawa logiczna zwana Grą w Piętnastkę. Oryginał zbudowany jest w kształcie kwadratu, wewnątrz którego mieści się 15 przesuwnych segmentów. Na segmentach nadrukowane są kolejne liczby od 1 do 15. Jedno pole zawsze jest puste i można na nie przesunąć sąsiedni segment.

 

Zasady gry w Piętnastkę
  1. Pomieszaj losowo segmenty na planszy.
  2. Przesuń na puste pole jeden z sąsiadujących z nim segmentów.
  3. Czy segmenty są ułożone w odpowiedniej kolejności? Jeśli tak, kończymy. W przeciwnym razie wracamy do punktu 2.


Budowa planszy gry

W naszej wersji gry na segmentach umieścimy kolejne literki alfabetu od A do O. Dzięki temu znacznie uprości się nam algorytm - będziemy sprawdzać teksty zamiast liczb. Całość planszy przechowamy w zmiennej łańcuchowej o długości 16 znaków, gdzie każdy znak będzie reprezentował ruchomy segment Problemem jest jedynie przeliczanie współrzędnej segmentu na położenie wewnątrz zmiennej łańcuchowej. Przyglądnijmy się rozkładowi współrzędnych, aby wyprowadzić odpowiednie wzory:

 

 

1

2

3

4

 1 

1 

2 

3 

4 

 2 

5 

6 

7 

8 

 3 

9 

10 

11 

12 

 4 

 13 

 14 

 15 

 16 

 

U góry i z lewej strony mamy odpowiednio współrzędne segmentu na polu gry. Wewnątrz, kolorem czerwonym wypisano położenie danego segmentu w zmiennej łańcuchowej. Np. segment w trzecim wierszu i drugiej kolumnie znajduje się na pozycji 10.

Mamy dane współrzędne x (w poziomie) i y (w pionie) elementu na planszy. Chcemy znaleźć jego położenie wewnątrz zmiennej łańcuchowej. Stosujemy następujący wzór:

 

  p := 4 * (y - 1) + x;

 

Sprawdźmy, x = 3; y = 4; p = (4-1) * 4 + 3 = 15 - zgadza się.

Teraz sytuacja odwrotna. Mamy położenie w zmiennej łańcuchowej, chcemy znaleźć współrzędne segmentu na planszy. Wzory są następujące:

 

  x := 1 + (p - 1) mod 4;
  y := 1 + (p - 1) div 4;

 

Sprawdźmy, p = 11; x = 1 + (11-1) mod 4 = 3; y = 1 + (11-1) div 4 = 3 - zgadza się.

Dzięki podanym wzorom możemy bez problemu odwzorować zmienną łańcuchową w pole gry. Dlaczego stosujemy zmienną łańcuchową, a nie np. tablicę 4 x 4 ? Odpowiedź jest bardzo prosta. Jeśli chcemy sprawdzić, czy gracz ułożył wszystkie segmenty, wystarczy przyrównać naszą zmienną do tekstu "ABCDEFGHIJKLMNO ". W przypadku tablicy musielibyśmy się nieco natrudzić.

Przy wyświetlaniu segmentów na ekranie musimy otrzymane współrzędne odpowiednio przekształcić. Każdy segment będzie wyświetlony w postaci matrycy 3 x 3 znaki. Pomiędzy sąsiednimi segmentami będzie jeden znak odstępu. Dodatkowo chcemy, aby plansza była wyświetlona centralnie w oknie konsoli:

 

(33,6)        
  A B C D  
  E F G H  
  I J K L  
  M N O    
           

 

Ustalamy, iż pierwszy segment rozpocznie się na współrzędnych: kolumna 33 i wiersz 6. Każdy następny w poziomie i w pionie będzie odległy odpowiednio o 4 kolumny i wiersze. Stąd wzory na kolumnę i wiersz są następujące:

 

k := 33 + 4 * ((p - 1) mod 4);
w :=  6 + 4 * ((p - 1) div 4);

 

Sterowanie ruchem segmentów

Kolejnym zagadnieniem jest sterowanie grą. Wykorzystamy klawisze kursora, których odczyt jest identyczny jak w grze w Pole Minowe. Klawisze kursora będą sterowały segmentami przyległymi do pustego pola na planszy. Np. naciśnięcie strzałki w dół spowoduje ruch na puste pole segmentu górnego. Oczywiście ruch zostanie wykonany o ile jest możliwy - tzn. istnieje segment, który można w tym kierunku przesunąć. Segmenty będziemy przesuwać wykorzystując wzory przeliczeniowe pozycji segmentu na planszy. Współrzędne x i y odnoszą się do pozycji pustego miejsca:

Przy wykonywaniu przesunięć musimy sprawdzać odpowiednie warunki istnienia segmentu. Jeśli będą spełnione, to wyznaczamy pozycję przesuwanego segmentu w zmiennej łańcuchowej, przenosimy umieszczony tam znak na miejsce puste, a na pozycji segmentu umieszczamy spację.



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.