Форум сайта python.su
0
Доброго времени суток!
Сделал следующее задание из книги Python Programming for the Absolute Beginner (автор Michael Dawson):
Here's a bigger challenge. Write the pseudocode for a program where the player and the computer trade places in the number guessing game. That is, the player picks a random number between 1 and 100 that the computer has to guess. Before you start, think about how you guess. If all goes well, try coding the game.
Сейчас интересно: А как бы другие справились с этим заданием?
Я понимаю, что нужно было сделать так: компьютер просит Вас выбрать любое число в пределах от 1 до 100 (в моей игре его надо ввести), после чего он делает свою первую попытку и называет произвольное число (естественно в тех же самых пределах). Если предложенное компьютером число не соответствует числу, которое Вы загадали, компьютер просит Вас подсказать ему “выше” или “ниже” (в игре слова ‘UP’ и ‘DOWN’ соответственно) находится загаданное Вами число. После того как компьютер угадывает Ваше число, игра заканчивается и компьютер сообщает Вам о том, сколько попыток ему потребовалось для того, чтобы угадать это число.
Я выполнил задание, но что на мой взгляд не менее важно - я “обучил” программу делать следущее.
К примеру, Вы загадали число 20 => компьютер делает свою первую попытку и называет число 40 => Вы подсказываете (я это так называю): DOWN => компьютер генерирует произвольное число В ПРЕДЕЛАХ ОТ 1 ДО 39 включительно и предлагает его в качестве ответа; допустим сгенерировано число 39 => Вы решаете “обмануть” компьютер и подсказываете: UP => компьютер не дурак (!) - выводит следущее сообщение: Oops, kazhetsya, Vi pozabili: kogda ya nazval chislo 40, Vi skazali MEN'SHE! T.k. posle chisla 39 idet chislo 40, men'she kotorogo, yakobi, nahoditsya zagadannoe Vami chislo, ya otkazivajus' gadat' VISHE 39!!!; еще пару раз скажите UP - компьютер прекратит игру и выведит следущее сообщение: Ya tak ne igraju!!!; если не будете как в танке и скажите DOWN => компьютер продолжит игру и сгенерирует произвольное число в пределах от 1 до 38 включительно; допустим компьютер сгенерировал и предложил число 36 => Вы случаем толи забыли, толи перегадали, так сказать, свое то-самое, первоначально Вами загаданное/введенное число 20 и говорите UP => компьютер не знает, что UP - “неверно” и произвольно выбирает либо 37, либо 38 (т.к. ранее Вы сказали компьютеру, что Ваше число находится выше 36, но ниже 39); допустим выбрано число 38 => Вам либо “UP”, либо “DOWN”: скажите UP - компьютер напомнит, что выше ни-ни - там знакомое нам число 39 (в общем, известный случай); говорите DOWN => и компьютер наталкивается на единственно возможное число 37; wow, думает он, what the hell? - число же совсем не ТО!!! Ну, как говорится, чем богаты, тем и рады: 37 так 37; выводит сообщение: Naskol'ko mne izvestno, pervonachal'no Vi zagadali chislo 20, no t.k. Vi skazali mne, chto Vashe chislo vishe 36 i nizhe 38, to ostaetsya tol'ko chislo 37. Nesmotrya na to, chto chislo 37 ne yavlyaetsya chislom Vami pervonachal'no zagadanim, ya budu schitat', chto ya otgadal Vashe chislo i igra zakonchena!
Выше были рассмотрены нестандартные случаи, о которых, как я счел, должен знать компьютер (т.к от human being можно ожидать все, что угодно) и которые я прописал в программу. Единственное, что не достает - так это то, что пользователь вместо числа может ввести муру какую-нибудь, которую, соответственно, программа не в состоянии обработать. Кстати, на случай если пользователь вместо UP или DOWN вводит что-либо иное, программа просит его: Ispol'zujte ‘UP’ ili ‘DOWN’! Mne nuzhna podskazka!!! Если б знал КАК, то прописал бы подобную просьбу и для “числа”, но к сожалению за неимением такого “know-how” вынужден отложить внедрение подобной функции на будущее. Знаю, в JavaScript есть такая штука как NaN (Not a Number), которая отличает numbers от strings, но как такое организовать в Питоне - еще не научился! Если кто знает, можете подсказать - буду рад!
Отредактировано (Март 8, 2009 04:42:40)
Офлайн
3
Ну тут еще можна добавить какие-то более продвинутое АИ генерации случайных чисел компьютером, а не в тупую генерировать равномерное распределение…
Я когда-то таким игрался в школе еще на Паскале. Еще добавил, что при варианте угадывания чисел компьютером (оригинальная версия задачи) создавался файлик статистики (авторизация была, так что для каждого пользователя разный). Компьютер “набирал опыта” о каждом игроке и старался генерировать число в каждом случае такое, чтобы было труднее угадать. Такое отлично работало, если применялась какая-то система угадывания, в случае тупого рандома, никакого эффекта не было =).
все =)
Отредактировано (Март 2, 2009 13:32:45)
Офлайн
1
Когда-то давно решил подобную задачку на МК-61 Ээх ностальгия :). Но ваш вариант не совсем верен. Вы все время берёте произвольное число ищ оставшегося промежутка. Но таким образом не минимизируется количество шагов. Наименьшее количество шагов гораздо вероятнее будет получатся, если каждый раз брать число наибольшие близкое к середине промежутка.
Офлайн
3
Ferroman, именно это я имел ввиду, написав
regall=)
Ну тут еще можна добавить какие-то более продвинутое АИ генерации случайных чисел компьютером…
Офлайн
0
FerromanЯ полагаю, чем меньше предсказуемостей, тем больше вероятностей!
Когда-то давно решил подобную задачку на МК-61 Ээх ностальгия. Но ваш вариант не совсем верен. Вы все время берёте произвольное число из оставшегося промежутка. Но таким образом не минимизируется количество шагов. Наименьшее количество шагов гораздо вероятнее будет получатся, если каждый раз брать число наибольшие близкое к середине промежутка.
Офлайн
0
regallКстати, из той же самой книги вычитал, что существует генерация, основанная на естественном и непредсказуемом процессе радиоактивного распада.
Ну тут еще можна добавить какие-то более продвинутое АИ генерации случайных чисел компьютером…
Офлайн
1
Newbie
Наверное, стоит почитать теорию вероятности перед сном.
Кстати, пример взят один из самых длинных. В вашем “случайном” варианте может быть гораздо больше попыток.
50 - down - 35 - down - 32- down -22- down- 13 -down- 12 -down - 8 - down - 5 - down - 2 up - 4 - down - 3
Отредактировано (Март 2, 2009 15:10:30)
Офлайн
0
FerromanВся фишка в том, что может и НЕ БЫТЬ! А в Вашем варианте - ГАРАНТИРОВАНО!
В вашем “случайном” варианте МОЖЕТ БЫТЬ гораздо больше попыток. 50 - down - 35 - down - 32- down -22- down- 13 -down- 12 -down - 8 - down - 5 - down - 2 up - 4 - down - 3
Отредактировано (Март 4, 2009 13:05:24)
Офлайн
0
Newbieгарантировано наименьшее кол-во попыток.FerromanВся фишка в том, что МОЖЕТ и НЕ БЫТЬ! А в Вашем варианте - ГАРАНТИРОВАННО!
В вашем “случайном” варианте МОЖЕТ БЫТЬ гораздо больше попыток. 50 - down - 35 - down - 32- down -22- down- 13 -down- 12 -down - 8 - down - 5 - down - 2 up - 4 - down - 3
Офлайн
0
Таким галопом можно в инструкции к игре прописать большими буквами: ЗАГАДАЕТЕ ЧИСЛО 50 - СИЮ МИНУТУ ПРОИГРАЕТЕ; ЗАГАДАЕТЕ ЧИСЛО 1 ИЛИ 99 (к примеру) - ПОИГРАЕТЕ ПОДОЛЬШЕ!
Мое личное мнение: предсказуемая игра - неинтересная игра! А там как изволите: можете пополам, а можете иначе.
Отредактировано (Март 2, 2009 16:03:56)
Офлайн