BlackJack v0.1

Разработка приложений на python. Советы, примеры и обсуждение найденных ошибок
Ответить
Аватара пользователя
ZEN
Администратор
Сообщения: 1350
Зарегистрирован: 27 сен 2012, 18:23
Темы: 206
Откуда: Украина, Одесса
Статус: Не в сети

BlackJack v0.1

Сообщение ZEN » 15 май 2017, 23:10

Данная реализация BlackJack будет интересна скорее новичкам в Python.

Скриншот игры:
Изображение

Репозиторий с исходным кодом: https://github.com/LinuxHubRu/py-blackjack

Исходный код:

Код: Выделить всё

#!/usr/bin/env python3

import sys
import random

from unicards import unicard


class Card:
    Hearts = 1
    Diamonds = 2
    Clubs = 3
    Spades = 4
    mask_by_id = {
        1: 'h',  # Hearts
        2: 'd',  # Diamonds
        3: 'c',  # Clubs
        4: 'd',  # Spades
    }

    def __init__(self, value, mask_id):
        if not 5 < value < 15:
            raise ValueError('Invalid value')
        if mask_id not in (1, 2, 3, 4):
            raise ValueError('Invalid mask id')
        self.value = value
        self.mask_id = mask_id

    def __int__(self):
        value = self.value
        if value > 10:
            value = dict(zip((11, 12, 13, 14), (2, 3, 4, 11)))[value]
        return value

    def __str__(self):
        value = self.value
        if value > 10:
            value = dict(zip((11, 12, 13, 14), ('J', 'Q', 'K', 'A')))[value]
        return "%s%s" % (value, self.mask_by_id[self.mask_id])


class CardsInv:
    def __init__(self):
        self.stash = list()
        for i in range(6, 15):
            self.stash.append(Card(i, Card.Hearts))
            self.stash.append(Card(i, Card.Diamonds))
            self.stash.append(Card(i, Card.Clubs))
            self.stash.append(Card(i, Card.Spades))
        random.shuffle(self.stash)

    def pop(self):
        return self.stash.pop()


class Player:
    def __init__(self):
        self.cards = list()

    def sum_cards(self):
        return sum([int(x) for x in self.cards])

    def add_card(self, card):
        self.cards.append(card)

    def show_cards(self):
        return [str(x) for x in self.cards]


class BlackJack:
    @staticmethod
    def run():
        # Start new game
        cards = CardsInv()
        player1 = Player()
        player2 = Player()

        # Add two random cards
        player1.add_card(cards.pop())
        player1.add_card(cards.pop())

        player2.add_card(cards.pop())
        player2.add_card(cards.pop())

        step = 0
        while True:
            step += 1
            print("Yours cards: %s" % '  '.join(
                [unicard(x, True) for x in player1.show_cards()]))
            print("Opponents cards: %s" % '  '.join(
                [unicard(x, True) for x in player2.show_cards()]))
            print("~~~~~~")

            if ((player1.sum_cards() > 21) and (player2.sum_cards() > 21) or
               (player1.sum_cards() == player2.sum_cards() == 21)):
                print("Double")
                break

            if (player1.sum_cards() > 21) or (player2.sum_cards() == 21):
                print("You are looser")
                break

            if (player2.sum_cards() > 21) or (player1.sum_cards() == 21):
                print("You are winner")
                break

            if step % 2 == 0:
                player2.add_card(cards.pop())
            else:
                r = input('Do you want to take a card? (Y/n): ')
                if r in ('Y', 'y', ''):
                    player1.add_card(cards.pop())


if __name__ == '__main__':
    try:
        while True:
            BlackJack.run()
            if input("Play again? (Y/n): ") not in ('Y', 'y', ''):
                break
    except KeyboardInterrupt:
        print()

    sys.exit(0)

бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Аватара пользователя
A.T.W.A.
Сообщения: 221
Зарегистрирован: 30 сен 2012, 01:50
Темы: 2
Статус: Не в сети

Re: BlackJack v0.1

Сообщение A.T.W.A. » 16 май 2017, 19:14

Шрифта какого-то не хватает?
Изображение
Изображение

Аватара пользователя
ZEN
Администратор
Сообщения: 1350
Зарегистрирован: 27 сен 2012, 18:23
Темы: 206
Откуда: Украина, Одесса
Статус: Не в сети

Re: BlackJack v0.1

Сообщение ZEN » 17 май 2017, 13:44

Терминал точно поддерживает юникод? У меня в tilda/terminator используется шрифт Monospace.
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Аватара пользователя
A.T.W.A.
Сообщения: 221
Зарегистрирован: 30 сен 2012, 01:50
Темы: 2
Статус: Не в сети

Re: BlackJack v0.1

Сообщение A.T.W.A. » 17 май 2017, 21:59

Терминал у меня rxvt-unicode — поддерживает. Шрифт ubuntu mono.
Кстати, monospace — это алиас на некий шрифт :)

Код: Выделить всё

$ fc-match monospace
UbuntuMono-R.ttf: "Ubuntu Mono" "Regular"
Изображение

Аватара пользователя
ZEN
Администратор
Сообщения: 1350
Зарегистрирован: 27 сен 2012, 18:23
Темы: 206
Откуда: Украина, Одесса
Статус: Не в сети

Re: BlackJack v0.1

Сообщение ZEN » 18 май 2017, 13:50

Даже не знаю, что сказать) Можно попробовать запустить вот так:

Код: Выделить всё

$ LC_ALL='' /tmp/py-blackjack/run.py
Если не поможет, то можно вообще выпилить отображение карт в юникоде:

Код: Выделить всё

$ ./run.py 
Yours cards: Kd  10h
Opponents cards: 9d  Ac
~~~~~~
Do you want to take a card? (Y/n): 
Yours cards: Kd  10h  Jc
Opponents cards: 9d  Ac
~~~~~~
Yours cards: Kd  10h  Jc
Opponents cards: 9d  Ac  9d
~~~~~~
You are winner
Play again? (Y/n): n


$ git diff
diff --git a/run.py b/run.py
index 2d00df7..7711966 100755
--- a/run.py
+++ b/run.py
@@ -3,8 +3,6 @@
 import sys
 import random
 
-from unicards import unicard
-
 
 class Card:
     Hearts = 1
@@ -85,10 +83,8 @@ class BlackJack:
         step = 0
         while True:
             step += 1
-            print("Yours cards: %s" % '  '.join(
-                [unicard(x, True) for x in player1.show_cards()]))
-            print("Opponents cards: %s" % '  '.join(
-                [unicard(x, True) for x in player2.show_cards()]))
+            print("Yours cards: %s" % '  '.join(player1.show_cards()))
+            print("Opponents cards: %s" % '  '.join(player2.show_cards()))
             print("~~~~~~")
 
             if ((player1.sum_cards() > 21) and (player2.sum_cards() > 21) or
А после взять PyQt5 и запилить GUI, если у кого-то будет желание этим заниматься.
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Аватара пользователя
A.T.W.A.
Сообщения: 221
Зарегистрирован: 30 сен 2012, 01:50
Темы: 2
Статус: Не в сети

Re: BlackJack v0.1

Сообщение A.T.W.A. » 21 май 2017, 20:20

ZEN писал(а):
18 май 2017, 13:50
Можно попробовать запустить вот так:

Код: Выделить всё

$ LC_ALL='' /tmp/py-blackjack/run.py
Неа, так тоже не хочет. Ну да ладно.
Изображение

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей