Детская игра в карточки на python

Детская игра в карточки, написана за один выходной
от 2 до 4 игроков
На каждой карточке 3 случайные цифры
Цифры у игроков сравниваются поочерёдно
У кого больше максимальных цифр, тот победил
Очки — количество побед
Игра запускается в консоли, но формирует html-страницу game.html,
которую можно открыть в браузере

Как играть

  1. зарускаем «python3 cards.py»
  2. вводим количество игроков
  3. вводим имена игроков
  4. нажимаем Enter после каждого хода —
    компьютер «раздаёт» игрокам новые карточки
    и смотрит, кто победил

Код игры cards.py:

#-*-coding:utf-8;-*-
from random import randint, sample
from os import listdir
from os.path import isfile

# класс игрока
class Player:
  def __init__(self, name):
    self.name = name
    self.value1 = 0
    self.value2 = 0
    self.value3 = 0
    self.score = 0
  def nextTurn(self):
    self.value1 = randint(1, 105)
    self.value2 = randint(1, 105)
    self.value3 = randint(1, 105)
    
class HtmlPage:
  def __init__(self):
    self.card_images = [f for f in listdir('./cards')]    
    
  def update(self, game):
    f = open('game.html','w')
    self.content = '''<!DOCTYPE>
<html>
<head>
  <title>Карточки</title>
  <!--meta http-equiv="content-type" content="text/html; charset=utf-8" /-->
  <meta http-equiv="Refresh" content="3" />
  <link rel="stylesheet" type="text/css" href="cards.css" />
</head>    
<body>   
  <div class='game'> 
    '''
    for p in game.players:
      self.content += '''
      <div class='player'>
        <h2 class='name'>%s</h2>
        <div class='score'>%s очков</div>
        <div class='card'>
          <img src='cards/%s'>
        </div>
        <div class='value value1'>%s</div>
        <div class='value value2'>%s</div>
        <div class='value value3'>%s</div>
      </div>
      ''' % (p.name, p.score, sample(self.card_images,1)[0], p.value1, p.value2, p.value3) 
    
    self.content += "<div class='congrats'>Победитель - %s!</div>" % (game.last_winner)
    self.content += '</div><!--game--></body></html>'
    f.write(self.content)
    f.close()
    
# игра
class Game:
  def __init__(self):
    self.players = []
    
  def nextTurn(self):
    values1 = []
    values2 = []
    values3 = []
    
    for p in self.players:
      p.nextTurn()
      print('Игрок %s: %s %s %s' % (p.name, p.value1, p.value2, p.value3))
      values1.append(p.value1)
      values2.append(p.value2)
      values3.append(p.value3)
      
    max_value1 = max(values1)
    max_value2 = max(values2)
    max_value3 = max(values3)
    
    max_value_wins = 0
    
    for p in self.players:
      p.value_wins = 0
      if p.value1 == max_value1:
        p.value_wins += 1
      if p.value2 == max_value2:
        p.value_wins += 1
      if p.value3 == max_value3:
        p.value_wins += 1
      if p.value_wins > max_value_wins:
        max_value_wins = p.value_wins
    self.last_winner = ''
    for p in self.players:
      if p.value_wins == max_value_wins:
        p.score += 1
        self.last_winner += p.name
    print("Победитель - %s!" % self.last_winner)   
    print("Результаты:")
    for p in self.players:
      print('%s: %s очков' % (p.name, p.score))

print('Игра в карточки')
g = Game()
# сколько игроков?
get_num_players = input("сколько игроков? (2 - 4): ")
# проверка ответа
num_players = int(get_num_players)
if num_players > 1 and num_players <= 4:
  # имена игроков
  for i in range(0, num_players):
    new_name = input('Введи имя игрока %s: ' % (i+1))
    g.players.append(Player(new_name))
  while True:
    print('Играем дальше...')
    g.nextTurn()
    h = HtmlPage()
    h.update(g)
    input()
    

print('до новых встреч и всё такое')    

Шаблончик cards.css:

html{
  font-family: Verdana,Arial,sans-serif;
}

body{
  background-color: #eeeeee; /* Цвет фона веб-страницы */
} 

.player{
  display:inline-block;
  width: 200px;
}

.name{
  font-size:30px;
}

.score{
  font-size:30px;
}

.card{
  height:250px;
  width:200px;
  box-shadow: 0 0 5px 2px;
  
}

.value{
  display: inline;
  font-size:30px;
  font-weight:bold;
}

.value1{
  color:blue;
}

.value2{
  color:green;
}

.value3{
  color:red;
}

.congrats{
  font-size:30px;
  font-weight:bold;
  color:red;
}

Архив с игрой: Скачать

Python Base64 encode decode

import base64                                                       

a = base64.b64encode(bytes(u’complex string: ñáéíóúÑ’, «utf-8»))

# a: b’Y29tcGxleCBzdHJpbmc6IMOxw6HDqcOtw7PDusOR’

b = base64.b64decode(a).decode(«utf-8», «ignore»)                   

print(b)

# b :complex string: ñáéíóúÑ

Как удалить CBS.LOG без перезагрузок

Файл CBS.LOG занял всё место на диске C и не удаляется (потому что открыт на запись службой Windows Modules Installer, которую просто так не остановить), а компьютер перезагружать нельзя. Если выхода нет, и файл удалить точно надо (ответственность за возможные последствия берёте на себя), то сначала выполняем команду:

sc queryex TrustedInstaller

В выводе команды нас интересует строка PID:4455 . Теперь разблокируем файл CBS.LOG через принудительную остановку службы:

taskkill /F /PID 4455

Дальше успешно удаляем файл CBS.LOG, ну и после этого службу Windows Modules Installer можно снова запускать.