habrahabr

Питон, блэкджек и … игры

  • пятница, 14 июня 2019 г. в 00:17:20
https://habr.com/ru/post/455910/
  • Python
  • Программирование


К «Питону» приходят по-разному: кто-то увлекается ИИ, кто-то начинает изучать веб-разработку на «Питоне» взамен уже надоевшего PHP; у меня получилось по-другому – я стал замечать, что этот язык используется довольно часто в современном программировании не только среди энтузиастов, но и в среде крупных компаний. В общем, язык набирает популярность в массах, поэтому я решил к нему «присмотреться», ну, то есть, изучить.

Изучение нового алгоритмического языка, не сказать, что процесс уж очень увлекательный, если ты уже знаком с несколькими… Можно выбрать книгу, можно какой-нибудь онлайн-курс, а можно вообще «ролики-мультики» и … «сиди-читай-изучай». — Скука!

Набрёл я в Сети на самоучитель по «Питону», в принципе, неплохой, но не сказать, что претендующий на полноту изложения синтаксиса и наткнулся там на «Примеры программ». Среди нескольких других, был там один очень любопытный пример, который буквально «повернул время вспять», и я оказался в тех временах, когда «деревья были больше, а трава зеленее»… Его название: «Пишем блэкджек».

image

Всё началось с компьютерных игр, когда вместо использования «по назначению» выпукло-экранного телевизора его умудрялись «заюзать» в качестве монитора ко всяким «ZX spectrum» и прочим «корветам», а на уроках информатики, вместо того, чтобы программировать, молодая поросль того и гляди, норовила запустить какие-нибудь «гонки» или космическую «стрелялку» с учительского компьютера, загрузив её на все ученические по некому подобию локальной сети.

А в тиши лаборатории какого-нибудь кабинета химии обязательно гнездилась какая-нибудь ЕС ЭВМ, на которой более взрослые товарищи запускали «Принца Персии» или, о, самую крутую игру всех времён и народов, — «Metal mutant»! Да, были времена… А потом всех накрыло волной «Денди» и «Сеги».

image

image

Да, это было лирическое отступление, чтобы пояснить, что дети очень падки на всевозможные игрища. Поэтому, очень хороший ход — обучать их программированию на примере написания какой-нибудь игры. В своё время в ВУЗе я написал космическую стрелялку на Turbo Pascal, в то время «великий и ужасный» С++ ещё только начинал входить в программу обучения студентов и по «крутости» его опережал только Ассемблер.

А тут подвернулась такая возможность люто понастальгировать… В общем, загрузил я исходник в «Анаконду» и стал изучать (возможно, кто-то предпочитает IDLE, но мне нравится «Анаконда» за разнообразие инструментов). Так, что тут у нас… Ну, вроде ничего сложного. Давай проверим работоспособность кода. — Работает.

koloda = [6,7,8,9,10,2,3,4,11] * 4

import random
random.shuffle(koloda)

print('Поиграем в очко?')
count = 0

while True:
    choice = input('Будете брать карту? y/n\n')
    if choice == 'y':
        current = koloda.pop()
        print('Вам попалась карта достоинством %d' %current)
        count += current
        if count > 21:
            print('Извините, но вы проиграли')
            break
        elif count == 21:
            print('Поздравляю, вы набрали 21!')
            break
        else:
            print('У вас %d очков.' %count)
    elif choice == 'n':
        print('У вас %d очков и вы закончили игру.' %count)
        break

print('До новых встреч!')

Работает-то он работает… Да только вот не нравится мне такая игра. А где статистика, что сыграл один раунд – и по новой?! – Нет, так не годится! Я стал быстренько править код, убирая ненужные «бреки», добавляя цикл и счётчики побед и поражений. Ну вот, уже лучше. Ах да, в игре всего четыре колоды и они быстро закончатся, если сесть и начать активно «шпилить». Тогда пусть будет тысяча, нет — десять тысяч! Уж этого количества должно хватить до того момента, как программа завершится и скажет «Извини, друг, -Error».

import random

koloda = [6,7,8,9,10,2,3,4,11] * 10000
random.shuffle(koloda)

count = 0
looses = 0
wins = 0

while True:
    
    if count == 0 :
        print("------------")
        print("Новый раунд!")
        print("------------")
    
    choice = input('Будете брать карту? y/n\n')
    
    if choice == 'y':
        
        current = koloda.pop()
        print("")
        print('Вам попалась карта достоинством %d.' %current)
        count += current
        
        if count > 21:
            print('Итого %d очков.\n' %count)
            print('Извините, но вы проиграли. :-(\n')
        
        elif count == 21:
            print('Поздравляю, вы набрали 21!\n')
        
        else:
            print('Итого %d очков.' %count)
            
        if count >= 21:
            if count == 21: wins = wins + 1
            if count > 21: looses = looses + 1
            print("Статистика: %d побед," %wins, " %d поражений.\n" %looses)
            count = 0
    
    elif choice == 'n':
        
        print("Статистика: %d побед," %wins, " %d поражений.\n" %looses)
        break

print('До новых встреч!')

image

Да, всё замечательно… Только вот мне не нравится запускать сию программулину из под интерпретатора, а если я обычный юзер и не хочу ставить себе эти «Питоны»?! — Экзешник давай, говорю! Ну что же, и этому горю помочь… И вдруг откуда-то взялся Федя, который молвил своё слово:

image

— Шурик, а может не надо?!
— Надо, Федя… Надо!

Но об этом во второй части.