90 lines
2.5 KiB
Python
90 lines
2.5 KiB
Python
import random
|
|
|
|
|
|
class Game:
|
|
def __init__(self):
|
|
self.red = 2021
|
|
self.green = 2022
|
|
self.current = "Игрок"
|
|
|
|
def get_divisors(self, n):
|
|
return [i for i in range(1, n + 1) if n % i == 0]
|
|
|
|
def move(self, color, n):
|
|
if color == "r":
|
|
if self.green == 0:
|
|
return False
|
|
if n in self.get_divisors(self.green) and n <= self.red:
|
|
self.red -= n
|
|
return True
|
|
elif color == "g":
|
|
if self.red == 0:
|
|
return False
|
|
if n in self.get_divisors(self.red) and n <= self.green:
|
|
self.green -= n
|
|
return True
|
|
return False
|
|
|
|
def computer_move(self):
|
|
if self.red == 0 and self.green == 0:
|
|
return
|
|
|
|
options = []
|
|
|
|
if self.red > 0 and self.green > 0:
|
|
for d in self.get_divisors(self.green):
|
|
if d <= self.red:
|
|
options.append(("r", d))
|
|
for d in self.get_divisors(self.red):
|
|
if d <= self.green:
|
|
options.append(("g", d))
|
|
|
|
if not options:
|
|
return
|
|
|
|
color, n = random.choice(options)
|
|
self.move(color, n)
|
|
|
|
if color == "r":
|
|
print(f"Компьютер убрал {n} красных камней")
|
|
else:
|
|
print(f"Компьютер убрал {n} зелёных камней")
|
|
|
|
def is_over(self):
|
|
return self.red == 0 and self.green == 0
|
|
|
|
|
|
while True:
|
|
game = Game()
|
|
|
|
while True:
|
|
print(f"\nКрасные: {game.red}, Зелёные: {game.green}")
|
|
|
|
if game.current == "Игрок":
|
|
try:
|
|
color = input("Выберите цвет (r/g) или exit: ")
|
|
if color == "exit":
|
|
break
|
|
|
|
n = int(input("Введите количество: "))
|
|
|
|
if game.move(color, n):
|
|
if game.is_over():
|
|
print("Вы победили!")
|
|
break
|
|
game.current = "Компьютер"
|
|
else:
|
|
print("Некорректный ход")
|
|
except:
|
|
print("Ошибка ввода")
|
|
|
|
else:
|
|
game.computer_move()
|
|
if game.is_over():
|
|
print("Победил компьютер")
|
|
break
|
|
game.current = "Игрок"
|
|
|
|
if input("Сыграть ещё? (y/n): ") != "y":
|
|
break
|