• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wieża hanoi python - oznaczenie klocków

0 głosów
355 wizyt
pytanie zadane 13 listopada 2020 w Python przez Lite Obywatel (1,030 p.)

Witam. Po krótce przedstawiam problem posiłkując się wcześniejszymi komentarzami pod innym zapytaniem.

Założenie jest takie, program umożliwiający układanie wierzy hanoi np. https://romek.info/games/hanoi5p.html

Zgodnie wcześniej pisanym kodem, użytkownik sam będzie decydował ile jest klocków. Potrzebuję czegoś co umożliwi mi identyfikację każdego z tych klocków oraz słupków.

Wartość liczbowa będzie niezmienna, ale litera będzie a,b lub c. W przypadku gdy użytkownik wykaże chęć przesunięcia klocka np. 3b na słupek c, program musi:

1. Ustalić czy na słupku c nie znajduje się klocek który ma mniejszą wartość niż 3

2. Zmienić "oznaczenie" klocka 3 z 3b na 3c

3. Wyświetlić 3 wierze z klockami w formie "obrazu" ASCII

 

 

aktualnie napisany kod:

import os
import sys
from termcolor import colored
import time
 
tn = ""
ob1 = 0
ob2 = 0
 
def zasady():
  print(colored("\n1. Pamiętaj że możesz poruszać tylko jeden klocek który jest na górze stosu.", "red"))
  print(colored("\n2. Możesz położyć tylko mniejszy krążek na większy! Nie odwrotnie!", "red"))
  cos = input(colored("\nWpisz cokolwiek jeżeli już poznałeś/aś zasady.", "yellow"))
  if cos == "" or cos != "":
    os.system("clear")
  else:
    sys.exit(0)
 
wiel = int(input(colored("Wpisz z ilu klocków ma się składać Twoja wieża: ", "green")))
print("\nCzy znasz zasady?")
 
while ob1 == 0:
    tn = input("\nWpisz T jeżeli tak Lub N jeżeli nie: \n\n")
    if tn == "T":
      print("\nNie będę Ci ich przedstawiał. Zagrajmy!\n")
      break
    elif tn == "N":
      print("\nPoznajmy je!")
      zasady()
      break
    elif ob2 == 2:
      print("Zbyt duża ilość prób. Zamykam program.")
      sys.exit(0)
    else:
      os.system("clear")
      print("\nWpisałeś złą wartość. Spróbuj ponownie")
      ob2 = ob2 + 1
      continue
print(colored("Zaczynamy naszą grę!", "blue"))
time.sleep(5)
os.system("clear")

 

1 odpowiedź

+1 głos
odpowiedź 13 listopada 2020 przez adrian17 Ekspert (300,820 p.)
edycja 13 listopada 2020 przez adrian17
 
Najlepsza

To tak jak ostatnio pisałem :)

Zamiast myśleć nad oznaczaniem krążków, co jest dość upierdliwe, lepiej pomyśleć jak zareprezentować słupki. No i jest to super proste, jeśli zorientujemy się że słupek opisuje listę krążków na nim.

Więc coś takiego:

Można zapisać jako:

a = [5, 4, 1]
b = [3]
c = [2]

Jak chcemy przesunąć krążek ze słupka A na B, to po prostu:

krazek = a.pop()
b.append(krazek)

I wtedy faktycznie się przesunął:

a == [5, 4]
b == [3, 1]
c == [2]

(być może jeszcze lepiej by zamiast a/b/c również trzymać te słupki w 3-elementowej liście, to łatwiej będzie je indeksować)

komentarz 14 listopada 2020 przez adrian17 Ekspert (300,820 p.)

Pętla taj jakby wogóle nie starowała

  if a != 0:
    while ax == 0:

Pętla wykonuje się póki ax == 0. Ale ax == a, a linię wyżej jest że a != 0, więc z definicji ta pętla nigdy się nie wykona.

Natomiast...

  y = 0
  u = 1
  m = 3
  ax = a
      x = min(lista4)
      z = x

Nie mam pojęcia czemu sobie to robisz :( Tego nie da się czytać ani zrozumieć.

komentarz 14 listopada 2020 przez Lite Obywatel (1,030 p.)
Nie mam pomysłu jak to sensownie inaczej zapisać. Po zmianie tak jak wypisałeś wcześniej, pętla trwa bez końca. Utknąłem ale staram się nie polec... Inaczej się nie nauczę
komentarz 14 listopada 2020 przez adrian17 Ekspert (300,820 p.)

Inaczej się nie nauczę

Nie nauczysz się próbując po omacku. Już mówiłem, że wieże z hanoi to nie jest dobre zadanie dla kogoś, kto godzinę temu nie słyszał o listach.

Spróbuj robić prostsze zadania i pytać innych o opinię, tutaj lub na discordzie lub gdziekolwiek indziej.

komentarz 14 listopada 2020 przez Oscar Pasjonat (19,350 p.)

@adrian17, ależ bez list jest to proste. O ile na jednym słupku może być różna liczba krążków, to relacja odwrotna jest znacznie prostsza. Jeden krążek może być na jednym i tylko jednym słupku. Tablica krążków zawierająca oznaczenie słupka na którym się znajduje. Jeżeli przyjmiemy że krążek 0 to ten najmniejszy i kolejne są coraz większe to mamy ścisłe warunki na możliwe ruchy, a każde przełożenie krążka to prosta zamiana oznaczenia słupka.

komentarz 14 listopada 2020 przez adrian17 Ekspert (300,820 p.)

Tablica krążków

No to masz listę :)

Podobne pytania

0 głosów
0 odpowiedzi 424 wizyt
pytanie zadane 20 marca 2020 w Algorytmy przez open Nowicjusz (120 p.)
0 głosów
1 odpowiedź 119 wizyt
0 głosów
2 odpowiedzi 976 wizyt
pytanie zadane 12 marca 2016 w C i C++ przez niezalogowany
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

85,243 zapytań

134,056 odpowiedzi

297,251 komentarzy

56,334 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...