Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
__pycache__
.idea
12 changes: 12 additions & 0 deletions exceptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
"""exception module"""

class GameOver(Exception):
"""finishes the game"""
@classmethod
def write_score(cls, gm_score, gm_name):
with open("score.txt", "a") as file:
file.write(gm_name + " -" " Очков: " + str(gm_score) + "\n")


class EnemyDown(Exception):
pass
68 changes: 68 additions & 0 deletions game.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
"""main executable"""
from exceptions import GameOver, EnemyDown
from models import Player, Enemy, Score
import settings

player_list = [0]



def play():
while True:
command = input("What you want to do? START, SHOW, HELP, TOP, EXIT: ")
if command == "START":
next_lvl = 1
names = input("Enter your name: ")
print()

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

?

while Player.validate_names(names) is False:
print("Name already exists")
names = input("Enter your name: ")
player = Player(names, settings.LIVES, 0, 0)
enemy = Enemy(1, 1)
while True:
try:
while True:
player.allowed_attacks = int(input("Choose your hero: 1-Wizard, 2-Warrior, 3-Rogue "))
if player.validate_allowed_attacks() is False:
print("The selected hero does not exist")
continue
else:
player.attack(enemy)
break
while True:
player.allowed_attacks = int(input("Choose defense: 1-Wizard, 2-Warrior, 3-Rogue "))
if player.validate_allowed_attacks() is False:
print("The selected hero does not exist")
continue
else:
player.defence(enemy)
break
except EnemyDown:
next_lvl += 1
print("------------------------------------")
print("You killed enemy!", "Score:", player.score, "Level:", enemy.level)
print("------------------------------------")
enemy = Enemy(enemy.level+next_lvl, enemy.lives+next_lvl)
player.score += 5
player_list.append(player)
if command == "SHOW":
with open("score.txt", "r") as file:
print(file.read())
if command == "HELP":
print("All commands:", ",".join(settings.HELP))
if command == "TOP":
Score.player_top()
if command == "EXIT":
raise KeyboardInterrupt


if __name__ == '__main__':
try:
play()
except GameOver:
GameOver.write_score(player_list[-1].score, player_list[-1].name)
except KeyboardInterrupt:
pass
finally:
print()

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

?

print("Good bye!")
88 changes: 88 additions & 0 deletions models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
"""all logic"""
import random


from exceptions import GameOver, EnemyDown


class Enemy:
"""Creates enemy"""
def __init__(self, level: int, lives: int):
self.level = level
self.lives = lives

@staticmethod
def select_attack():
return random.randint(1, 3)

def decrease_lives(self):
self.lives -= 1
print("Enemy HP:", self.lives)
if self.lives == 0:
raise EnemyDown


class Player:
"""Creates player"""
def __init__(self, name: str, lives: int, score: int, allowed_attacks: int):
self.name = name
self.lives = lives
self.score = score
self.allowed_attacks = allowed_attacks

@staticmethod
def fight(attack, defense):
if attack == defense:
return 0
elif attack == 1 and defense == 3 or attack == 2 and defense == 1 or attack == 3 and defense == 2:
return -1

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

or?

else:
return 1

def decrease_lives(self):
self.lives -= 1
if self.lives == 0:
raise GameOver

def attack(self, enemy_obj):
self.fight(self.allowed_attacks, enemy_obj.select_attack())
if self.fight(self.allowed_attacks, enemy_obj.select_attack()) == 0:
print("Attack: It's a draw!")
elif self.fight(self.allowed_attacks, enemy_obj.select_attack()) == 1:
print("Attack: You attacked successfully!")
enemy_obj.decrease_lives()
else:
print("Attack: You missed!")

def defence(self, enemy_obj):
self.fight(enemy_obj.select_attack(), self.allowed_attacks)
if self.fight(enemy_obj.select_attack(), self.allowed_attacks) == 0:
print("Defence: It's a draw!")
elif self.fight(enemy_obj.select_attack(), self.allowed_attacks) == 1:
print("Defence: You missed!")
self.decrease_lives()
else:
print("Defence: You attacked successfully!")
self.score += 1

@classmethod
def validate_names(cls, names):
with open("score.txt", "r") as file:
for i in file.readlines():
if names in i.split()[0]:
return False

def validate_allowed_attacks(self):
if self.allowed_attacks not in [1,2,3]:
return False


class Score:
"""Shows the top ten players by score"""
@classmethod
def player_top(cls):
with open("score.txt", "r") as file:
lines = file.readlines()
lines.sort(key=lambda x: int(x.split()[-1]), reverse=True)
for i in lines[:10]:
print(i.strip())
Empty file removed requirements.txt
Empty file.
22 changes: 20 additions & 2 deletions score.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,24 @@ Igor -
lor - �����: 13
nisha - �����: 1
ursa - �����: 2
Igor - �����: 6
Igor - �����: 9
fe - �����: 6
kip[ - �����: 3
gosha - �����: 5
vala - �����: 10
llll - �����: 10
igol - �����: 10
gg - �����: 10
fjkfkf - �����: 6
fjfjfj - �����: 2
fkfkfkfk - �����: 1
jfjfjf - �����: 6
fkfkfkkf - �����: 11
kiiie - �����: 1
fpfpfppf - �����: 1
fffjfjfj - �����: 17
flflflflflf - �����: 6
2 - �����: 1
jffjfj - �����: 4
fkfkfkfk2 - �����: 5
qqqw - �����: 3
sasuke - �����: 11
11 changes: 11 additions & 0 deletions settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
"""const and command list"""

LIVES = 1

HELP = {
"START",
"SHOW",
"HELP",
"EXIT",
"TOP"
}
32 changes: 32 additions & 0 deletions test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from unittest import TestCase
from unittest.mock import patch, mock_open

from models import Player


class TestEnemy(TestCase):

@patch('models.Enemy.select_attack', return_value=1)
def test_select_attack(self, select_attack):
self.assertEqual(select_attack(), 1)


class TestPlayer(TestCase):

def setUp(self):
self.player = Player('test', 1, 1, 1)

def test_fight(self):
self.assertEqual(self.player.fight(1, 1), 0)
self.assertEqual(self.player.fight(1, 3), -1)
self.assertEqual(self.player.fight(3, 1), 1)

def test_validate_names(self):
self.assertIsNone(self.player.validate_names(self.player.name))

def test_validate_names_mock(self):
with patch('builtins.open', mock_open(read_data='name')):
self.assertIsNone(self.player.validate_names(self.player.name))

def test_validate_allowed_attacks(self):
self.assertIsNone(self.player.validate_allowed_attacks())