К «Питону» приходят по-разному: кто-то увлекается ИИ, кто-то начинает изучать веб-разработку на «Питоне» взамен уже надоевшего 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

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

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

Комментарии (7)


  1. kleveriwe
    13.06.2019 09:13

    Извините, конечно, но мне кажется, что подобный код можно найти в каждой второй книге «Python для чайников».


  1. samhuawey
    13.06.2019 09:41

    А где GUI и графика? Тем более что есть библиотечки которые позволяют сделать это очень простым способом.


  1. YernarShambayev
    13.06.2019 11:54

    Подозреваю, что экзешник для Windows будет делаться при помощи pyinstaller


    1. shalm
      13.06.2019 20:38

      Можно использовать блендер, он содержит встроенный игровой движок работающий на питоне и легко создаёт экзешник.


  1. berez
    13.06.2019 12:03

    Работает-то он работает… Да только вот не нравится мне такая игра. А где статистика, что сыграл один раунд – и по новой?! – Нет, так не годится!

    Это вообще не игра, а только половина игры. Даже не половина, а четверть.
    Цель игры в блэкджек — обыграть крупье. В вашем же варианте игрок играет просто сам с собой: других игроков нет, ставок нет, статистика побед и поражений невнятная (даже процентов нет).
    Кроме того, в реальной игре есть вариант не брать карту, имея на руках меньше 21 очка. У вас же отказ брать карту — это просто выход из игры. Другими словами, от игрока не зависит абсолютно ничего: вся «битва» укладывается в подсчет, сколько раз удалось набрать 21 очко без перебора. Замените ваш бесконечный цикл на цикл со счетчиком, уберите пользовательский ввод — и игра станет даже интереснее. :)

    Тогда пусть будет тысяча, нет — десять тысяч! Уж этого количества должно хватить до того момента, как программа завершится и скажет «Извини, друг, -Error».

    Плохое решение.
    Одна из стратегий игры в блэкджек — это подсчет оставшихся карт в колоде и, соответственно, корректировка вероятностей выпадения карты того или иного достоинства. У вас же эта идея душится в зародыше.
    В казино в блэкджек играют одной, двумя или четырьмя колодами, максимум — десятью.

    И кстати, в блэкджеке колода полная (52 листа), а очки распределены по-другому: все фигуры — 10 очков, туз — 1 или 11 очков в зависимости от того, есть перебор или нет. Когда колода заканчивается, ее перетасовывают и используют снова.


  1. neurocore
    13.06.2019 13:38

    Статья закончилась не успев начаться


  1. mactep3230
    14.06.2019 08:41

    Мне почему-то грустно становится от
    koloda = [6,7,8,9,10,2,3,4,11] * 10000
    И я не о имени переменной, а о объеме памяти, доступной в те времена, когда я так называл.