Transformeer spel pseudo-code in python

stemmen
1

Maak de computer denk dat een nummer dat de gebruiker kiest tussen 1 en 1000 in niet meer dan 10 guesses.This opdracht maakt gebruik van een algoritme heet een binary search. Na elke gok, het algoritme snijdt het aantal mogelijke antwoorden te zoeken in de helft. Pseudocode voor het volledige programma is hieronder gegeven; uw taak is om te zetten in een werkende python programma. Het programma moet beginnen met het afdrukken van de instructies op het scherm, waarin wordt uitgelegd dat de gebruiker een nummer moet halen tussen 1 en 1000 en de computer zal het denk in niet meer dan 10 pogingen. Het begint dan het maken van gissingen, en na elke denk dat vraagt ​​de gebruiker om feedback. De gebruiker moet worden geïnstrueerd om in te voeren -1 als de gok moet lager, 0 als het goed was, en 1 als het moet zijn higher.When het programma correct geraden, moet dit melden hoeveel gissingen nodig waren. Als de gebruiker een ongeldig antwoord komt, moeten de instructies worden herhaald en de gebruiker toegestaan ​​om opnieuw te proberen.

pseudocode

- 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

Ik heb een aantal ernstige hulp nodig! Ik begrijp niet een van deze dingen at all! Dit is alles wat ik heb

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()

en ik weet niet eens of het klopt!

De vraag is gesteld op 14/06/2009 om 04:28
bron van user
In andere talen...                            


7 antwoorden

stemmen
4

Je bent natuurlijk erg nieuw voor de programmering, en ik denk dat dat is een van de redenen voor een vertraagde reactie van de gemeenschap. Het is moeilijk om te beslissen waar te beginnen en hoe om u te begeleiden door middel van deze hele exercitie.

Dus, voordat je een goed antwoord krijgen hier dat omvat het maken van je begrijpen wat er daar gebeurt, en begeleiden u door het bouwen van de oplossing zelf (idealiter!) Ik stel u deze pagina bezoekt om te proberen een greep van het eigenlijke probleem zelf te krijgen.

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

In de tussentijd, kijk naar alle antwoorden in deze thread en houd het bewerken van uw bericht, zodat we weten dat je krijgt het.

antwoordde op 14/06/2009 om 04:37
bron van user

stemmen
1

Okay, het leuke gedeelte over het gebruik van Python is dat het bijna pseudocode toch.

Laten we nu eens nadenken over de afzonderlijke stappen:

  1. Hoe ziet u de gemiddelde tussen hoge en lage te krijgen?

  2. Hoe beoordeelt u de gebruiker vragen of de answerr klopt

  3. Wat doen "if" verklaringen eruit in Python, en hoe zou je schrijft de pseudocode uit alsof uitspraken?

Hier is nog een hint - je kunt python draaien als tolk en probeer individuele opgaven samen, dus, bijvoorbeeld, zou u kunnen doen

high=23
low=7

dan berekenen wat je denkt dat zou de gemiddelde of midden tussen hen (hint: 15)

antwoordde op 14/06/2009 om 04:42
bron van user

stemmen
11

Ik begrijp niet een van deze dingen at all!

Dat is vrij problematisch, maar prima, laten we één stap tegelijk! Uw huiswerkopdracht begint als volgt:

Print instructies aan de gebruiker

Dus je begrijpt het niet ENIGE van de spullen, je zeggen, dus dat betekent dat je niet dit deel ook te begrijpen. Well: "de gebruiker" is de persoon die het runnen van uw programma. "Instructies" zijn Engels zinnen die hem of haar vertellen wat te doen om het spel te spelen, volgens het volgende citaat uit deze uitstekend duidelijke en gedetailleerde opdracht:

Het programma moet beginnen met het afdrukken van de instructies op het scherm, waarin wordt uitgelegd dat de gebruiker een nummer moet halen tussen 1 en 1000 en de computer zal het denk in niet meer dan 10 pogingen.

" print" Is een Python instructie die informatie uitzendt; bijvoorbeeld, probeer dan een programma alleen met

print "some information"

om te zien hoe het werkt. OK, kunt u alstublieft bewerken van uw antwoord op ons te laten zien dat u dit punt hebt gekregen, dus we kunnen verhuizen naar de volgende? Voel je vrij om hier te reageren met verdere vragen of geen woorden of begrippen die ik gebruik zijn nog steeds te geavanceerd voor u, en ik zal proberen duidelijk te maken!

antwoordde op 14/06/2009 om 04:43
bron van user

stemmen
14

Alvorens te denken over hoe dit te implementeren in python (of een andere taal) laten we kijken naar de pseudo-code, die eruit ziet als een vrij goed plan om het probleem op te lossen.

Ik denk dat dat zou een ding dat je zou kunnen vast komen te zitten op de manier waarop de pseudo-code verwijst naar variabelen , zoals highen low. De manier om variabelen te begrijpen, is te beschouwen slots die waarden kunnen worden opgeslagen. Op elk willekeurig moment een variabele enige waarde, zoals het aantal 5 of een verwijzing naar een open bestand. Die waarde kan op elk moment worden opgeroepen door het gebruik van de naam, of het kan een nieuwe waarde worden gegeven door toe te wijzen aan het, en de oude waarde zal worden vergeten met de nieuwe waarde in de plaats.

De pseudo-code verwijst naar drie variabelen high, lowen tries. Het vertelt je ook wat hun beginwaarden moeten zijn. Na de tweede lijn is uitgevoerd, worden deze waarden ingesteld tot 1000, 1 en 1, respectievelijk, maar ze nemen over nieuwe waarden als het programma vordert.

Een ander kenmerk van de pseudocode een voorwaardelijke lus en een individuele analyse van de gebruikersinvoer. Uw vertaling van de lus van de pseudocode is onjuist. In uw geval, heb je een nieuwe variabele gemaakt, ien het programma om de lus lichaam uitgevoerd met elke waarde van i tussen 1 en 1000. hebben geïnstrueerd Uiteraard is dit niet een heel veel te maken met de pseudocode.

In plaats daarvan wat je wilt doen is lus voor altijd, totdat enige voorwaarde (welke wijzigingen in de loop lichaam) vals wordt. In python, de whileverklaring doet dit. Als u bekend bent met een ifverklaring, whileziet er hetzelfde uit, maar nadat het lichaam is gedaan, de toestand is opnieuw geëvalueerd en het lichaam wordt opnieuw uitgevoerd als het is nog steeds zo.

Ten slotte is de case-analyse in het lichaam van de lus moet vergelijken iets te verwachte waarden. Hoewel sommige andere talen hebben een aantal manieren om dit uit te drukken, in python we hebben alleen if- elif- elseclausules.


Buiten het transformeren van pseudocode om werkende code, is het waarschijnlijk nuttig om te begrijpen wat het programma eigenlijk aan het doen is. De sleutel is hier op lijn 4, waarbij het programma raadt het gemiddelde van twee waarden. na dat het programma werkt op hoe goed de gok uitgewerkt.

In de eerste run door de lus met highdaarin 1000 en lowdie 1 is het gemiddelde 500 (eigenlijk het gemiddelde 500.5, maar omdat we gemiddeld hele getallen, python gissingen dat we de gewenste positie van de divisie ook een geheel getal ). Het is duidelijk dat de gok heeft slechts een kans om recht 0,1%, maar als het verkeerd is, wordt de gebruiker naar verwachting om ons te vertellen als het te hoog of te laag was. Hoe dan ook, het antwoord elimineert 50% van de mogelijke gissingen.

Als, bijvoorbeeld, is de gebruiker te denken van een klein aantal, dan wanneer het programma geraden 500, zou de gebruiker het programma dat 500 te hoog was, en dan is het programma niet zou ooit raden dat het aantal was in het vertellen range van 501 thru 1000. Dat de computer een hoop werk besparen.

Om die informatie te maken aan het gebruik, het programma houdt het bereik van mogelijke waarden het doel nummer zou kunnen zijn. Wanneer het aantal geraden te hoog is, het programma stelt de bovengrens beneden, net onder de raden, en als de schatting te laag, het programma stelt de onderzijde omhoog gehouden net boven de raden.

Wanneer het programma opnieuw raadt, de schatting is in het midden van het mogelijke bereik, snijden het bereik anderhalf keer. Het aantal mogelijke gissingen ging van de oorspronkelijke 1000-500 in een gok, tot 250 in twee schattingen. Als het programma vreselijk geluk, en kan het niet krijgen twee (dat is eigenlijk vrij waarschijnlijk is), en vervolgens door de derde, het heeft slechts 125 nummers beschikbaar te maken over. Na de vierde raden, slechts 62 nummers blijven binnen bereik. Dit gaat zo door, en na acht gissingen, slechts 3 nummers blijven, en het programma probeert het middelste getal voor zijn negende gok. Als dat blijkt niet te kloppen, is slechts een nummer naar links, en het programma gissingen it!

Deze techniek van het splitsen van een reeks in de helft en dan blijven de dichter helft is genoemd tweedeling en lijkt in een breed scala onderwerpen die van belang zijn voor de informatica.


Hoe over enkele CODE! Omdat ik wil niet om u te beroven van de leerervaring, ik geef u een aantal fragmenten die je verder kunnen helpen. python is een taal ontwikkeld voor interactieve exploratie, dus start uw tolk en geef dit een schot. Ik zal het plaatsen van voorbeelden met de getoonde aanwijzingen, niet echt het type dat.

Hier is een voorbeeld met behulp van de whileclausule:

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

Het krijgen van de console input van de gebruiker moet worden gedaan door middel van de raw_input()functie. Het geeft gewoon wat de gebruiker typt. Dit is een beetje moeilijker om te laten zien. Om alles te vereenvoudigen, na elke lijn van de python die input nodig is, zal ik het type "Hello World!" (zonder de aanhalingstekens)

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

Wat dacht je van een combinatie van concepten!

>>> 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
>>> 

Oeps. beetje een bug daar. Kijk of je het kan oplossen!

antwoordde op 14/06/2009 om 05:17
bron van user

stemmen
0

Hier zijn een paar tips om mee te beginnen:

Gemiddeld = Value + Value + Waarde [...] / aantal waarden; (Bijvoorbeeld ((2 + 5 + 3) / (3))

Veel programmeertalen gebruiken verschillende operator voorrang. Als ik het programmeren, gebruik ik altijd haakjes als ik ben onzeker over operator voorrang. In mijn voorbeeld hierboven, als je alleen deden 2 + 5 + 3/3, het programma zou divisie handelingen uit te voeren vóór de toevoeging - dus het zou evaulate tot 2 + 5 + (3/3), of 2 + 5 + 1 == 7 .

Sla deze voor python gebruikers / * Ten tweede: uw vroegste programma's kunnen profiteren van const correctheid ( hier is een goede uitleg van wat het is en waarom het is uiterst goede praktijken). Lees in dat en begrijpen waarom je constanten moet gebruiken (of wat dan ook de python equivalent). Ook opzoeken "magic numbers", dat is een groot gebied waar constanten worden gebruikt. * /

Google "Please Excuse My Dear Aunt Sally" (LET OP: dit alleen maar bezig met rekenkundige operatoren, en meestal geldt voor programmeertalen, voor een meer uitgebreide studie van de exploitant voorrang, kijk omhoog documentatie door u gekozen taal voor voorrang - er ook rekening mee dat de meeste programma niet hebben gebouwd aan de macht operators, maar de meeste standaard bibliotheken hebben pow functies).

Spreken van standaard bibliotheek: Maak kennis met standaardfuncties bibliotheek (ik heb nooit gebruikt Python, ik weet niet hoe het implementeert een SL, maar ik zou zeer verbaasd zijn als een taal die populair niet een goed ontwikkelde SL hebben). Als je niet weet wat dat is, en uw boek / handleiding niet hebben, krijgen een nieuwe. Elke bron die niet verwijzen naar een standaard bibliotheek is de tijd niet waard.

Tot slot: terwijl deze post kan eruit alsof ik weet waar ik het over heb, ik ben nog steeds in de vroege fasen van het leren, net als jij. Een paar dingen die je zou willen om te wennen aan al vroeg (toen ik deze onderdelen overgeslagen, is vertraagd mijn leren veel): Het gebruik van referenties en pointers (Q voor commentaar: heeft Python hebben pointers?), Het verschil tussen de data in een geheugen en de werkelijke geheugenplaats (vaak, zal de locatie van de waarde in het geheugen nuttiger dan de waarde zelf, althans wanneer het schrijven gegevensstructuren). Vooral wennen aan de standaard bibliotheek; kijk voor kopiëren, te vinden, enz. functies van het type bruikbaar in string manipulatie.

Eigenlijk, herlezen uw oorspronkelijke bericht, ik wist niet dat dit was een soort huiswerkopdracht. Als u dit niet voor de lol doen, zul je waarschijnlijk nooit mijn advies in te winnen. Vergeet niet dat de programmering kan zeer leuk zijn, als je het niet maken het een hele klus - en niet gefrustreerd als je de code niet compileert (of ... interpreteren), of als u onverwachte resultaten, enz. krijgen

antwoordde op 14/06/2009 om 05:24
bron van user

stemmen
1

Welkom bij stack overflow!

De truc is hier om te beseffen dat je Python programma moet er bijna uit als de pseudocode.

Laten we eerst proberen te begrijpen precies wat de pseudocode doet. Als we om te communiceren met de door de pseudo-programma, zou het er ongeveer zo uitzien:

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.

enz.

Toen we voor het eerst denken aan onze nummer, het programma weet alleen dat het tussen 1 en 1000. Het vertegenwoordigt deze kennis door het instellen van de variabele 'laag' tot 1 en de variabele 'hoog' tot 1000. De eerste gok is het gemiddelde van deze getallen, dat is 500.

Nadat we het programma dat ons getal groter is dan 500 vertellen, werkt het de waarde van 'laag' tot 501. Met andere woorden, het programma weet dan dat onze nummer ligt tussen de 501 en 1000. Vervolgens raadt het gemiddelde van 501 en 1000, dat is 750. We vertellen dat onze aantal lager is, zodat het programma werkt de waarde van 'hoog' tot 749 en raadt het gemiddelde van 501 en 749 volgende, en zo verder tot het goed raadt, of is het mogelijke bereik versmald neer op een enkel nummer (wat betekent dat de volgende gok bevindt zich midden).

Dus terug naar het schrijven van het programma in Python: We hebben eigenlijk alleen maar vertalen de pseudocode lijn voor lijn. Bijvoorbeeld ons programma lus moet er net zo uit als in de pseucode:

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

Er is geen behoefte aan een voor-loop als je in je code.

Om input te nemen kunnen we zoiets als dit te doen:

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.')

Nu is de invoer van de gebruiker wordt opgeslagen in de variabele 'respons', en we kunnen omgaan met de mogelijkheden met als uitspraken als 'als reactie == -1:' bijvoorbeeld.

Vergeet niet om de instructies afdrukken en 'hoog' en 'laag' tot de oorspronkelijke waarden voor het invoeren van de while-lus en je moet helemaal klaar zijn.

Succes!

antwoordde op 14/06/2009 om 06:59
bron van user

stemmen
2

Niet exact overeenkomen met de psudocode maar het werkt. lol ;)

Ik weet dat dit een boze oude post, maar dit is hetzelfde opdracht ook ik kreeg. Hier is wat ik eindigde met:

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
antwoordde op 25/09/2010 om 20:02
bron van user

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