Детская игра в карточки на 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: ñáéíóúÑ

ifconfig против ip

Некоторое время назад появилась команда /bin/ip. Но народ привык пользоваться более старой командой /sbin/ifconfig. Ну и типа дело идёт к тому, что скоро надо будет перейти с  ifconfig на ip, вроде как потому что ip более мощная и делает то же самое.

Показать устройства и их конфигурацию:

ifconfig
ip addr show
ip link show

Включить сетевое устройство:

ifconfig eth0 up
ip link set eth0 up

Отключаются устройства похожим образом:

ifconfig eth0 down
ip link set eth0 down

Присвоить IP-адрес:

ifconfig eth0 192.168.0.77
ip address add 192.168.0.77 dev eth0

Это была простая версия команды. Часто надо ещё указывать сетевую маску или broadcast-адрес. В следующих примерах показаны варианты для ifconfig и ip.

Нет необходимости говорить, что сетевая маска может быть указана в CIDR-нотации, вроде 192.168.0.77/24.

ifconfig eth0 192.168.0.77 netmask 255.255.255.0 broadcast 192.168.0.255
ip addr add 192.168.0.77/24 broadcast 192.168.0.255 dev eth0

Удаление IP-адреса:

ip addr del 192.168.0.77/24 dev eth0

Добавление алиаса:

ifconfig eth0:1 10.0.0.1/8
ip addr add 10.0.0.1/8 dev eth0 label eth0:1

ARP протокол

Add an entry in your ARP table.

arp -i eth0 -s 192.168.0.1 00:11:22:33:44:55
ip neigh add 192.168.0.1 lladdr 00:11:22:33:44:55 nud permanent dev eth0

Switch ARP resolution off on one device

ifconfig -arp eth0
ip link set dev eth0 arp off

Показать routing table

route
ip route show

Положительная особенность ip route в том, что можно запросить, через какой интерфейс пойдут пакеты к интересующему IP-адресу:

ip route get 192.168.88.77

Внесение изменений в routing table

Команды для добавления маршрута на интерфейс:

route add -net 192.168.3.0/24 dev eth3
ip route add 192.168.3.0/24 dev eth3

То же для удаления маршрута:

route del -net 192.168.3.0/24 dev eth3
ip route del 192.168.3.0/24 dev eth3

Команда для добавления шлюза:

route add -net 192.168.4.0/24 gw 192.168.4.1
ip route add 192.168.4.0/24 via 192.168.4.1

Можно добавить имя интерфейса, например eth3.