Архив метки: Python

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

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()

Python: заготовка игры с использованием pygame

Пример программы на Python с использованием библиотеки pygame. Создаётся объект из рисунка, прописаны события на нажатие и отпускание клавиш со стрелками. В цикл добавлена задержка sleep.

Код:

import sys, pygame
pygame.init()

size = width, height = 640, 480
speed = [0, 0]
black = 0, 0, 0

screen = pygame.display.set_mode(size)

ball = pygame.image.load("hero.gif")
ballrect = ball.get_rect()

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                speed[1] -= 2
            if event.key == pygame.K_DOWN:
                speed[1] += 2
            if event.key == pygame.K_LEFT:
                speed[0] -= 2
            if event.key == pygame.K_RIGHT:
                speed[0] += 2
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                speed[1] = 0
            if event.key == pygame.K_DOWN:
                speed[1] = 0
            if event.key == pygame.K_LEFT:
                speed[0] = 0
            if event.key == pygame.K_RIGHT:
                speed[0] = 0
    ballrect = ballrect.move(speed)
    if ballrect.left < 0 or ballrect.right > width:
        #speed[0] = -speed[0]
        speed[0] = 0
    if ballrect.top < 0 or ballrect.bottom > height:
        #speed[1] = -speed[1]
        speed[1] = 0
    screen.fill(black)
    screen.blit(ball, ballrect)
    pygame.display.flip()
    pygame.time.delay(20)

https-клиент на python

Скрипт читает в переменную содержимое html-страницы:

# -*- coding: utf-8 -*-
import http.client
import ssl
print('Program started')

#выполнить http-запрос
print('Sending request to site...')
#https://stackoverflow.com/questions/39945702/httplib-httpsconnection-issue-certificate-verify-failed#39945733
conn = http.client.HTTPSConnection('kmsvsr.ru', timeout=5, context=ssl._create_unverified_context())

conn.request("GET", "/")
resp = conn.getresponse()
print(resp.status, resp.reason)

print('Reading answer...')
data = resp.read().decode()
print (data)

Скрипт не дописан, кто будет пользоваться — не забудьте добавить сюда обработку ошибок. А так по быстрому спарсить страницу пойдёт.

Из обобенностей: здесь в примере открывается сайт не по HTTP, а по HTTPS, при чём включен игнор ошибок, то есть код можно использовать для парсинга сайтов с самоподписанными сертификатами.

Использование кодировки UTF-8 в скриптах на Python

Если собираемся внутри скрипра на питоне писать текст на русском или ещё каком языке кроме английского, то в начало файла нужно вставить строку:

# -*- coding: utf-8 -*-

Иначе скрипт выплюнет ошибку вроде этой:

  File "1.py", line 1
SyntaxError: Non-ASCII character '\xd0' in file 1.py on 
line 1, but no encoding declared; see 
http://www.python.org/peps/pep-0263.html for details

Установка плагинов Python вручную без pip

1. Скачать плагин с сайта https://pypi.org/project/
2. Распаковать
3. Выполнить что-то вроде

C:\Users\user\Downloads\py\pyodbc-4.0.23.tar\dist\pyodbc-4.0.23\pyodbc-4.0.23> C:\Users\user\AppData\Local\Programs\Python\Python36\python.exe C:\Users\user\Downloads\py\pyodbc-4.0.23.tar\dist\pyodbc-4.0.23\pyodbc-4.0.23\setup.py install

Если для плагина все зависимости удовлетворены (например установлены другие плагины или компилятор Visual Studio и т.д.), то плагин успешно установится