Архивы автора: 1 1

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

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

Как играть

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

Код игры cards.py:

#!/usr/bin/env python3
# -*-coding:utf-8;-*-
"""
Детская игра в карточки
https://kmsvsr.ru/wp-admin/post.php?post=1558
"""

from random import randint, sample
from os import listdir

# класс игрока
class Player:
    """Участник игры"""
    def __init__(self, name):
        """Создание игрока"""
        self.name = name
        self.values = [0, 0, 0]
        self.score = 0
    def next_turn(self):
        """Следующий ход"""
        for value_pos in range(3):
            self.values[value_pos] = randint(1, 105)
    def get_values_string(self):
        """Вернуть значения через пробел"""
        return " ".join(
            list(
                map(str, self.values)
            )
        )

class HtmlPage:
    """Страница с игрой"""
    def __init__(self):
        """Подготовка к формированию"""
        self.content = ""
        self.card_images = list(listdir("./cards"))
    def clear(self):
        """Очистка содержимого страницы"""
        self.content = ""
    def update(self, game):
        """Обновление страницы"""
        with open("game.html", "w", encoding="utf-8") as page_file:
            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 player in game.players:
                self.content += f"""
          <div class='player'>
            <h2 class='name'>{player.name}</h2>
            <div class='score'>{player.score} очков</div>
            <div class='card'>
              <img src='cards/{sample(self.card_images, 1)[0]}'>
            </div>
            <div class='value value1'>{player.values[0]}</div>
            <div class='value value2'>{player.values[1]}</div>
            <div class='value value3'>{player.values[2]}</div>
          </div>
          """
            self.content += f"<div class='congrats'>Победитель - {game.last_winner}!</div>"
            self.content += "</div><!--game--></body></html>"
            page_file.write(self.content)

# игра
class Game:
    """Игра в карточки"""
    def __init__(self):
        """Подготовка к игре"""
        self.players = []
        self.last_winner = ""
    def get_last_winner(self):
        """Кто победил"""
        return self.last_winner
    def next_turn(self):
        """Следующий ход"""
        values = [[], [], []]
        for player in self.players:
            player.next_turn()
            print(f"Игрок {player.name}: {player.get_values_string()}")
            values[0].append(player.values[0])
            values[1].append(player.values[1])
            values[2].append(player.values[2])
        max_values = [
            max(values[0]),
            max(values[1]),
            max(values[2])
        ]
        max_value_wins = 0
        for player in self.players:
            player.value_wins = 0
            for value_pos, _ in enumerate(player.values):
                if player.values[value_pos] == max_values[value_pos]:
                    player.value_wins += 1
            if player.value_wins > max_value_wins:
                max_value_wins = player.value_wins
        self.last_winner = ""
        for player in self.players:
            if player.value_wins == max_value_wins:
                player.score += 1
                self.last_winner += player.name
        print(f"Победитель - {self.last_winner}!")
        print("Результаты:")
        for player in self.players:
            print(f"{player.name}: {player.score} очков")

print("Игра в карточки")
g = Game()
# сколько игроков?
num_players = int(input("сколько игроков? (2 - 4): "))
if 1 < num_players <= 4:
    # имена игроков
    for i in range(0, num_players):
        new_name = input(f"Введи имя игрока {i+1}: ")
        g.players.append(Player(new_name))
    while True:
        print("Играем дальше...")
        g.next_turn()
        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.

MSSQL Пример цикла по результатам запроса

DECLARE @mesto  varchar(30);  
DECLARE c CURSOR FOR SELECT mesto from MyPlaces
OPEN c
FETCH NEXT FROM c INTO @mesto
WHILE @@FETCH_STATUS = 0
BEGIN
      select 'Здесь ' + @mesto
      FETCH NEXT FROM c INTO @mesto
END
CLOSE c
DEALLOCATE c

Группировка данных по дням, по месяцам или по годам в MSSQL

По дням:

select convert(char(8),Date_and_Time,112) mydate, count(calls_id)
from calls
group by convert(char(8),Date_and_Time,112)
order by mydate

По месяцам:

select convert(char(6),Date_and_Time,112) mydate, count(calls_id)
from calls
group by convert(char(6),Date_and_Time,112)
order by mydate 

По годам:

select convert(char(4),Date_and_Time,112) mydate, count(calls_id)
from calls
group by convert(char(4),Date_and_Time,112)
order by mydate

Python подключение к базе данных MSSQL

import pyodbc
cnxn = pyodbc.connect("Driver={SQL Server};"
                      "Server=srvmssql;"
                      "Database=mydatabase;"
                      "Trusted_Connection=yes;")
cursor = cnxn.cursor()
cursor.execute('SELECT TOP 10 * FROM MYTABLE')
for row in cursor:
    print('row = %r' % (row,))
input()