• 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

Object Storage Arubacloud
0 głosów
1,237 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 (344,860 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 13 listopada 2020 przez Lite Obywatel (1,030 p.)
Ooo, to jest coś co wreszcie rozumiem o co około chodzi bo niestety ale wcześniejszej odpowiedzi nie rozumiałem nawet w najmniejszym stopniu nie rozumiałem. Tylko teraz ważne pytanie, co to jest? Nie rozumiem sposobu działania tych poleceń. Wytłumaczyłbyś lub dał jakiś link gdzie jest wszystko wytłumaczone?
W jaki sposób to działa, syntax itd.
komentarz 13 listopada 2020 przez adrian17 Ekspert (344,860 p.)
Um, to znaczy... nie używałeś wcześniej list? Bo to dość podstawowe, a bez list to nie widzę jak można by takie zadanie w jakikolwiek sposób zrobić - tak więc proponuję o nich poczytać ASAP.
komentarz 13 listopada 2020 przez Lite Obywatel (1,030 p.)
Niestety z list nie korzystałem, dlatego zwróciłem się do was tutaj. Moje umiejętności pythona są naprawdę podstawowe. Cały kod to zlepek myśli na które wpadłem i udało mi się je uporządkować i znaleźć na różnych stronach. Poprzeczkę zawiesiłem wysoko, ale właśnie dlatego żeby nauczyć się więcej. Tematu nie zamykam bo możliwe że jeszcze jakieś pytania urodzą się w trakcie.
komentarz 13 listopada 2020 przez adrian17 Ekspert (344,860 p.)

To proponuję po prostu poczytać o listach i nauczyć się robić z nimi proste rzeczy, a dopiero wtedy do tego zadania wrócić. A skądkolwiek uczysz się Pythona, to powinno być bardzo wcześnie, na przykład w Automate the Boring Stuff with Python to czwarty rozdział już :)

komentarz 13 listopada 2020 przez Lite Obywatel (1,030 p.)
W szkole, nic dodać nic ująć...
komentarz 14 listopada 2020 przez Lite Obywatel (1,030 p.)
edycja 14 listopada 2020 przez Lite

@adrian17,

lista1 = [8, 5, 3]
a = len(lista1)

def a_slupek():
  y = 0
  u = 1
  m = 3
  ax = a
 
  if a != 0:
    while ax == 0:
      lista4 = lista1.copy()
      x = min(lista4)
      z = x
      while z == 0:
        if z == 1:
          y = u
          z = z - 1
          print(" " + "-"*m)
          print("|" + " "*y + str(x) + " "*y + "|")
          print(" " + "-"*m)
        else:
          u = u+1
          z = z-1
          m = m+2
      lista4.remove(x)
  else:
    sys.exit(0)

a_slupek()

Jeżeli odnajdziesz się w tym bałaganie, powiedz gdzie jest błąd.

Pętla tak jakby wogóle nie starowała. Oczywiście odnośnik do def a_slupek(): jest w innym miejscu w kodzie

komentarz 14 listopada 2020 przez adrian17 Ekspert (344,860 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 (344,860 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 Nałogowiec (29,290 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 (344,860 p.)

Tablica krążków

No to masz listę :)

Podobne pytania

0 głosów
0 odpowiedzi 1,472 wizyt
pytanie zadane 20 marca 2020 w Algorytmy przez open Nowicjusz (120 p.)
0 głosów
1 odpowiedź 389 wizyt
0 głosów
2 odpowiedzi 1,399 wizyt
pytanie zadane 12 marca 2016 w C i C++ przez niezalogowany

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...