Transform grę pseudo kod w Pythonie

głosy
1

Sprawiają, że komputer odgadnąć numer, który użytkownik wybiera pomiędzy 1 a 1000 w nie więcej niż 10 guesses.This przypisanie wykorzystuje algorytm o nazwie wyszukiwania binarnego. Po każdym odgadnięcia algorytm tnie liczbę możliwych odpowiedzi szukać w połowie. Pseudokod dla całego programu znajduje się poniżej; Twoim zadaniem jest, aby włączyć je do programu Pythona roboczego. Program powinien rozpocząć drukując instrukcjami na ekranie, wyjaśniając, że użytkownik powinien wybrać liczbę od 1 do 1000, a komputer będzie go odgadnąć w czasie nie dłuższym niż 10 prób. Następnie zaczyna produkować przypuszczenia, a po każdy chyba pyta użytkownika o informacje zwrotne. Użytkownik powinien być poinstruowany, aby wejść -1 jeśli przypuszczenie musi być niższa, 0 jeśli to było w porządku, a 1 jeśli to musi być higher.When program odgadnie, powinien zgłosić jak potrzebne były liczne domysły. Jeżeli użytkownik wprowadzi nieprawidłową odpowiedź, instrukcje powinny być powtarzane i użytkownik mogą spróbować ponownie.

Pseudo kod

- Print instructions to the user  
-Start with high = 1000, low = 1, and tries = 1 
- While high is greater than low   
  - Guess the average of high and low  
  - Ask the user to respond to the guess  
  - Handle the four possible outcomes:  
    - If the guess was right, print a message that tries guesses were required and quit the program
    - If the guess was too high, set high to one less than the guess that was displayed to the user and increment tries  
    - If the guess was too low, set low to one more than the guess that was displayed to the user and increment tries
    - If the user entered an incorrect value, print out the instructions again
- high and low must be equal, so print out the answer and the value of tries

Muszę poważne pomocy! Nie rozumiem, każdy z tych rzeczy w ogóle! To wszystko co mam

def main(x, nums, low, high):
        input(Enter -1 if the guess needs to be lower, 0 if the guess was right, or 1 if the guess needs to be higher: )
    for i in range (1, 1001):

main()

a ja nawet nie wiem, czy to prawda!

Utwórz 14/06/2009 o 04:28
źródło użytkownik
W innych językach...                            


7 odpowiedzi

głosy
4

Jesteś oczywiście bardzo nowy w programowaniu, i myślę, że to jeden z powodów, dla opóźnionej reakcji ze strony społeczności. Trudno zdecydować, od czego zacząć i jak poprowadzić Cię przez cały ten ćwiczeń.

Tak więc, zanim dostać dobrą odpowiedź tutaj, że obejmuje także zrozumieć, co się tam dzieje, i prowadząc Cię przez budowanie rozwiązania samemu (najlepiej!) Proponuję odwiedzić tę stronę, aby spróbować uzyskać zrozumienie samego rzeczywistego problemu.

http://www.openbookproject.net/pybiblio/gasp/course/4-highlow.html

W międzyczasie, spojrzeć na wszystkie odpowiedzi w tym wątku i zachować edycji swojego posta tak, że wiemy, dostajesz go.

Odpowiedział 14/06/2009 o 04:37
źródło użytkownik

głosy
1

Dobra, miła część o Pythonie jest to, że prawie pseudokod tak.

Teraz pomyślmy o poszczególnych etapach:

  1. Jak uzyskać średnią między wysokie i niskie?

  2. Jak pan pyta użytkownika, czy jest poprawny answerr

  3. Co zrobić, „jeśli” Sprawozdania wyglądać w Pythonie, a jak byś napisać Pseudokod, jakby stwierdzeniami?

Oto kolejna wskazówka - można uruchomić Pythona jako tłumacza i spróbować jednostkowych sprawozdań wzdłuż, tak, na przykład, można zrobić

high=23
low=7

następnie obliczyć, co myślisz powinien być średni lub punkt środkowy między nimi (podpowiedź: 15)

Odpowiedział 14/06/2009 o 04:42
źródło użytkownik

głosy
11

Nie rozumiem, każdy z tych rzeczy w ogóle!

To dość problematyczne, ale w porządku, zróbmy jeden krok na raz! Odrabianie zadania zaczyna:

Instrukcje drukowania do użytkownika

Więc nie rozumiem z tych rzeczy, można powiedzieć tak, że oznacza, że ​​nie rozumiem tej części albo. Dobrze: „użytkownik” to osoba, która jest uruchomiony program. „Instrukcja” to angielskie zdania, że ​​jego lub jej powiedzieć, co zrobić, aby zagrać w grę, jak na poniższym cytatem z tego doskonale jasnego i szczegółowego przypisania:

Program powinien rozpocząć drukując instrukcjami na ekranie, wyjaśniając, że użytkownik powinien wybrać liczbę od 1 do 1000, a komputer będzie go odgadnąć w czasie nie dłuższym niż 10 prób.

print” To instrukcja Pythona, który emituje informacji; na przykład wypróbować program zawierający tylko

print "some information"

aby zobaczyć jak to działa. OK, można proszę edytować swoją odpowiedź, aby pokazać nam, że dotarłeś do tego punktu, więc możemy przejść do następnego? Zapraszam do komentowania tutaj z dalszych pytań, jeśli jakichkolwiek słów czy pojęć używam nadal są zbyt zaawansowane dla Ciebie, i postaram się wyjaśnić!

Odpowiedział 14/06/2009 o 04:43
źródło użytkownik

głosy
14

Przed myślenie o tym, jak zaimplementować to w Pythonie (lub dowolnym języku) pozwala spojrzeć na pseudokod, który wygląda jak całkiem dobry plan, aby rozwiązać ten problem.

Przypuszczam, że jedną rzeczą, którą może być utknięcie na to sposób pseudokod odwołuje zmienne , jak highi low. Droga do zrozumienia zmiennych jest rozważenie nich szczeliny, które wartości mogą być przechowywane. W danym momencie, zmienna ma jakąś wartość, podobnie jak numer 5 lub odniesienie do otwartego pliku. Wartość ta może być zwołane w każdej chwili za pomocą jego nazwy, lub może mieć nową wartość poprzez przypisanie do niego i stara wartość zostanie zapomniane z nową wartość przy jego miejsce.

Pseudokod odwołuje trzy zmienne high, lowi tries. Informuje także, jakie są ich wartości początkowe powinno być. Po drugiej linii został wykonany, te wartości są ustawione na 1000, 1 i 1, odpowiednio, ale biorą na nowe wartości w miarę postępu programu.

Inną cechą warunkowa Pseudokod pętli, a analiza przypadek wprowadzania. Twoje tłumaczenie z pętli pseudokod jest nieprawidłowe. W twoim przypadku, stworzyliśmy nową zmienną, ioraz poinstruować program, aby uruchomić ciało pętli przy każdej wartości I między 1 i 1000. Oczywiście nie ma dużo wspólnego z Pseudokod.

Zamiast tego, co chcesz zrobić, to pętla na zawsze, dopóki jakiś warunek (która zmienia się w ciele pętli) staje się fałszywe. W Python, whileoświadczenie to robi. Jeśli jesteś zaznajomiony z ifoświadczeniem, whilewygląda tak samo, ale po ciało jest zrobione, warunek jest ponownej ocenie i korpus jest wykonany ponownie, jeśli nadal jest prawdą.

Wreszcie, analiza case w ciele pętli wymaga porównujące coś do oczekiwanej wartości. Chociaż niektóre inne języki mają wiele sposobów wyrażania tego, w python tylko mamy if- elif- elseklauzule.


Poza przekształcania Pseudokod do kodu działa, to chyba warto zrozumieć, co program jest rzeczywiście robi. Kluczem tutaj jest na linii 4, w którym program odgadnie średnią z dwóch wartości. Po tym program działa jak dobrze przypuszczenie wypracowane.

W pierwszym biegu przez pętlę, z highzawierającym 1000 i lowzawierający 1, średnia wynosi 500 (w rzeczywistości średnia wynosi 500,5, ale ponieważ jesteśmy średnio liczb całkowitych, zgaduje Pythona, który chcemy, aby wynik podziału będzie również liczbą całkowitą ). Oczywiście, że przypuszczenie ma tylko 0,1% szans na bycie w porządku, ale jeśli to się stało, oczekuje się, że użytkownik, aby powiedzieć nam, czy to zbyt wysoka lub zbyt niska. Tak czy inaczej, że odpowiedź całkowicie eliminuje 50% możliwych domysłów.

Jeśli, na przykład, użytkownik myślał o małej liczbie, a następnie, gdy program domyślić 500, użytkownik mógłby powiedzieć, że program 500 jest zbyt wysoka, a wtedy program nie będzie nigdy musiał się domyślać, że liczba była w Zakres 501 thru 1000. to może zaoszczędzić komputerowi dużo pracy.

Aby umieścić tę informację w użyciu program śledzi zakresie możliwych wartości liczba cel może być. Gdy liczba domyślić jest zbyt wysoka, program dostosowuje jej górna granica w dół, tuż poniżej odgadnięcia, a jeśli przypuszczenie było zbyt niskie, program dostosowuje jej dolnej granicy w górę tuż nad odgadnięcia.

Gdy program odgadnie kolejny domysł jest w samym środku możliwym zakresie, ponownie cięcia zakres w połowie. Liczba możliwych prób poszedł z oryginalnego 1000 do 500 w jednym przypuszczeniem, do 250 w dwóch prób. Jeśli program ma straszną szczęścia, i nie może się on dwa (co jest rzeczywiście bardzo prawdopodobne), a następnie przez trzeci, ma tylko 125 numerów w lewo, aby martwić. Po czwartym odgadnięcia tylko 62 numerów pozostają w zasięgu. To w dalszym ciągu, a po ośmiu prób, pozostają tylko 3 numery, a program próbuje środku numer na swojej dziewiątej odgadnięcia. Jeśli okaże się, że będzie źle, tylko jeden numer jest w lewo, a program odgadnie go!

Ta technika dzielenia zakres w pół, a następnie dalej do bliższej połowie jest nazywany bisekcji i pojawia się w szeroki zakres tematów interesujących informatyki.


Jak o jakiś kod! Ponieważ nie chcą pozbawić cię doświadczenie uczenia się, po prostu podać kilka fragmentów, które mogą Ci pomóc wzdłuż. Python to język przeznaczony do interaktywnej eksploracji, tak odpalić swój tłumacza i dać tę szansę. Będę delegowania przykłady z podpowiedzi pokazanych w rzeczywistości nie wpisać tego.

Oto przykład przy użyciu whileklauzuli:

>>> x = 1000
>>> while x > 1:
...     x = x/2
...     print x
...
500
250
125
62
31
15
7
3
1
>>> x
1

Pierwsze wejście konsola z użytkownikiem powinna odbywać się za pośrednictwem raw_input()funkcji. To po prostu zwraca niezależnie od typów użytkowników. To jest trochę trudniejsze, aby pokazać. Aby uprościć, po każdym wierszu pytona, który wymaga wkładu, będę wpisać „Hello World!” (bez cudzysłowów)

>>> raw_input()
Hello World!
'Hello World!'
>>> y = raw_input()
Hello World!
>>> print y
Hello World!
>>> 

Jak o niektórych łączenie pojęć!

>>> myvar = ''
>>> while myvar != 'exit':
...     myvar = raw_input()
...     if myvar == 'apples':
...         print "I like apples"
...     elif myvar == 'bananas':
...         print "I don't like bananas"
...     else:
...         print "I've never eaten", myvar
...
apples
I like apples
mangoes
I've never eaten mangoes
bananas
I don't like bananas
exit
I've never eaten exit
>>> 

Ups. Trochę tam błąd. Sprawdzić, czy można to naprawić!

Odpowiedział 14/06/2009 o 05:17
źródło użytkownik

głosy
0

Oto kilka wskazówek na początek:

Wartość średnia = + + Wartość Wartość [...] / liczba wartości; (Na przykład, ((2 + 5 + 3) / (3))

Wiele języków programowania użyć innego pierwszeństwo operatora. Kiedy jestem programowania, zawsze używać nawiasów, gdy jestem pewien pierwszeństwa operatora. W moim przykładzie powyżej, jeśli tylko nie 2 + 5 + 3/3, program zrobi czynności podziału przed dodaniem - tak byłoby evaulate do 2 + 5 + (3/3), lub 2 + 5 + 1 == 7 ,

Przejdź to dla użytkowników Python / * Po drugie: twoje najwcześniejsze programy mogą korzystać z const poprawności ( tutaj jest to dobre wyjaśnienie, co to jest i dlaczego jest to bardzo dobra praktyka). Proszę przeczytać i zrozumieć, że dlaczego należy używać stałych (lub cokolwiek jest odpowiednikiem python). Również wyszukać „magicznych liczb”, który jest wielkim obszarem, w którym wykorzystywane są stałymi. * /

Google „Proszę Przepraszam moi drodzy ciotka Sally” (UWAGA: tylko oferty z operatorów matematycznych, a przede wszystkim odnosi się do języków programowania, bardziej kompleksowe badania pierwszeństwa operatora patrzeć dokumentację wybranym języku dla pierwszeństwa - również pamiętać, że większość programów nie mają wbudowane operatorów energetycznych, ale większość standardowych bibliotek posiadają funkcje pow).

Mówiąc o standardowej biblioteki: Zapoznać się ze standardowych funkcji bibliotecznych (nigdy nie używane Python, nie wiem jak to się realizuje SL, ale byłbym bardzo zaskoczony, jeśli język, który popularny nie mają dobrze rozwiniętą SL). Jeśli nie wiesz co to jest, i książka / samouczek nie ma go dostać nowy. Wszelkie zasoby, które nie odwoływać się do biblioteki standardowej nie jest warte czasu.

Na koniec: podczas gdy ten post może wyglądać Wiem, co mówię, ja naprawdę jestem jeszcze we wczesnych etapach nauki, tak jak ty. Kilka rzeczy może chcesz, aby przyzwyczaić się wcześnie (kiedy pominięty tych części, to zwolnił moją naukę dużo): korzystanie z referencji i wskaźników (Q za komentarze: czy Python posiadają wskaźniki?), Różnicę między danymi w miejscu pamięci i rzeczywistą lokalizację pamięci (często położenie wartości w pamięci będzie bardziej przydatny niż sama wartość, przynajmniej podczas pisania struktur danych). Szczególnie przyzwyczaić się do biblioteki standardowej; spojrzeć na kopię, znaleźć, itp typu funkcje przydatne w ciąg manipulacji.

Właściwie rereading oryginalny post, nie zdawałem sobie sprawy, że był to przydział rodzaj pracy domowej. Jeśli nie robią tego dla zabawy, prawdopodobnie nigdy nie radzę. Wystarczy pamiętać, że programowanie może być bardzo zabawne, jeśli nie sprawiają, że jest chore - i nie denerwować, gdy kod nie skompilować (lub ... zinterpretować) lub uzyskać niespodziewane wyniki, itp

Odpowiedział 14/06/2009 o 05:24
źródło użytkownik

głosy
1

Witamy na przepełnienie stosu!

Sztuką jest, aby zdać sobie sprawę, że program Python powinien wyglądać niemal jak Pseudokod.

Najpierw spróbujmy zrozumieć, co dokładnie pseudokod robi. Gdybyśmy mieli do interakcji z programem opisanym przez Pseudokod, to będzie wyglądać mniej więcej tak:

Think of a number between 1 and 1000 and press Enter.
>>> 
Is it 500? Enter -1 if it's lower, 0 if I guessed right, or 1 if it's higher.
>>> 1
Is it 750? Enter -1 if it's lower, 0 if I guessed right, or 1 if it's higher.
>>> -1
Is it 625? Enter -1 if it's lower, 0 if I guessed right, or 1 if it's higher.

itp.

Kiedy po raz pierwszy myśli o nasz numer, program wie tylko, że jest między 1 a 1000. Reprezentuje tę wiedzę poprzez ustawienie zmiennej „niski” 1, a zmienną „wysokie” do 1000. Jej pierwszym przypuszczeniem jest średnią z nich liczby, które jest 500.

Po tym, jak powiedzieć, że nasz program jest większa niż liczba 500, aktualizuje wartość „niski” do 501. Innymi słowy program wtedy wie, że nasz numer jest między 501 a 1000. To wtedy zgaduje średnio 501 do 1000, który jest 750. Mówimy to, że nasza liczba jest mniejsza, więc program aktualizuje wartość „wysoki” do 749 i zgaduje średnio 501 i 749 następny, i tak dalej, aż odgadnie prawo, lub że zawęził możliwy zakres w dół do jednego numeru (czyli jego następny przypuszczenie będzie po prawej).

Więc z powrotem do pisania programu w Pythonie: My w zasadzie po prostu przetłumaczyć wiersz pseudokod dla linii. Na przykład nasza pętla program powinien wyglądać podobnie jak to ma miejsce w pseucode:

while high > low:
  # Guess (high + low) / 2 and ask user to respond
  # Handle user response

Nie ma potrzeby do pętli for jak masz w kodzie.

Aby wziąć wejście możemy zrobić coś takiego:

guess = (high + low) / 2
response = input('Is it ' + str(guess) + '? Enter -1 if it's lower, 0 if I guessed right, or 1 if it's higher.')

Teraz dane wprowadzone przez użytkownika są przechowywane w zmiennej „reakcji”, a my możemy poradzić sobie z możliwości jeśli stwierdzenia typu „jeśli odpowiedź == -1:” na przykład.

Wystarczy pamiętać, aby wydrukować instrukcje i ustawić „wysokie” i „niskie” do wartości początkowej przed wejściem do pętli while i powinno być wszystko gotowe.

Powodzenia!

Odpowiedział 14/06/2009 o 06:59
źródło użytkownik

głosy
2

Nie pasuje do psudocode dokładnie, ale to działa. lol ;)

Wiem, że to niegodziwy stary post, ale to jest to samo zadanie mam również. Oto, co skończyło się z:

high = 1000
low = 1
print "Pick a number between 1 and 1000."
print "I will guess your number in 10 tries or less."
print "Or at least i'll try to.  ;)"
print "My first guess is 500."
guess = 500
tries = 0
answer = 1
print "Enter 1 if it's higher."
print "Enter -1 if it's lower."
print "Enter 0 if I guessed it!"
print ""
while (answer != 0):
    answer = int(raw_input("Am I close?"))
    if answer == 1:
        tries = tries + 1
        low = guess
        guess = (high + low) / 2
        print "My next guess is:"
        print guess
    elif answer == -1:
        tries = tries + 1
        high = guess
        guess = (high + low) / 2
        print "My next guess is:"
        print guess
    elif answer == 0:
        tries = tries + 1
        print "Your number is:"
        print guess
        print "Yay! I got it! Number of guesses:"
        print tries
Odpowiedział 25/09/2010 o 20:02
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more