-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.py
109 lines (86 loc) · 2.95 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
#
# Created at 12.09.2020.
# Python 3.7.3 x64
# Contacts: alexandrsokolov@cock.li
#
"""
пользователь начинает игру указывая первый город
если города нет в списке, то говорим ему что надо указать город другой
заносим город с список уже названных городов
получаем название города первая буква которого начинается с последней буквы названного
выводим на экран
если городов не осталдось, то пользователь выйграл
"""
from itertools import cycle
check_list = []
def normalize_city_name(name):
return name.strip().lower().replace('ё', 'е')
def check_point(fun):
check_list.append(fun)
return fun
@check_point
def is_city_startswith_char(city, char, **kwargs):
if char is None or city.startswith(char):
return True
else:
print(f'Город должен начинаться с буквы {char.capitalize()}.')
return False
@check_point
def is_non_cached(city, cache, **kwargs):
if city not in cache:
return True
else:
print("Этот город уже был назван.")
return False
@check_point
def is_available(city, cities, **kwargs):
if city in cities:
return True
else:
print("Я такого города не знаю.")
return False
def move_to_cache(city, cities, cache):
# убираем из списка доступных
cities.remove(city)
# перекидываем город в кэш
cache.add(city)
def get_next_char(city):
wrong_char = ("Ъ", "ь", "ы", "й")
# выбираем букву для следующего города
for char in city[::-1]:
if char in wrong_char:
continue
else:
break
else:
raise RuntimeError
return char
def user_point(char):
user_say = input(f"[{char or 'any'}] Start:")
city = normalize_city_name(user_say)
kw = {"char": char, "cache": cache, "cities": cities}
if not all(x(city, **kw) for x in check_list):
return user_point(char)
return city
def ai_point(char):
# выбираем город
for city in cities:
if city.startswith(char):
break
else:
raise SystemExit("Вы победили!")
print(city)
return city
def main():
char = None
for point in cycle((user_point, ai_point)):
next_city = point(char)
move_to_cache(next_city, cities, cache)
char = get_next_char(next_city)
if __name__ == '__main__':
cache = set()
# вот тут есть куча варинтов развания собыйти.
cities = {normalize_city_name(x) for x in open("cities.txt", "r").readlines() if x.strip()}
main()