Детская игра в карточки, написана за один выходной от 2 до 4 игроков На каждой карточке 3 случайные цифры Цифры у игроков сравниваются поочерёдно У кого больше максимальных цифр, тот победил Очки — количество побед Игра запускается в консоли, но формирует html-страницу game.html, которую можно открыть в браузере
Как играть
зарускаем «python3 cards.py»
вводим количество игроков
вводим имена игроков
нажимаем 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("до новых встреч и всё такое")
Пример программы на 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)
Скрипт не дописан, кто будет пользоваться — не забудьте добавить сюда обработку ошибок. А так по быстрому спарсить страницу пойдёт.
Из обобенностей: здесь в примере открывается сайт не по HTTP, а по HTTPS, при чём включен игнор ошибок, то есть код можно использовать для парсинга сайтов с самоподписанными сертификатами.
Если собираемся внутри скрипра на питоне писать текст на русском или ещё каком языке кроме английского, то в начало файла нужно вставить строку:
# -*- 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