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
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,7 @@
/.idea
/venv
/__pycache__
/scores.txt
/test.txt


39 changes: 39 additions & 0 deletions exceptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import csv
import datetime


class GameOver(Exception):
@staticmethod
def add_score(name, score):
scores = []
dict = {
'id': '',
'name': '',
'score': '',
'date': ''}
fieldnames = dict.keys()

with open('scores.txt', 'r', newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
row['score'] = int(row['score'])
scores.append(row)
new = {
'name': name,
'score': score,
'date': str(datetime.datetime.today())
}
scores.append(new)
scores = sorted(scores, key=lambda j: j['score'], reverse=True)
with open('scores.txt', 'w', newline='') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
i = 0
while i < len(scores) and i < 10:
scores[i]['id'] = i+1
writer.writerow(scores[i])
i += 1


class EnemyDown(Exception):
pass
77 changes: 77 additions & 0 deletions game.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import os
import models
import exceptions
import settings


def start(name):
player = models.Player(name)
level = 1
enemy = models.Enemy(level)
while True:
attack = 0
while str(attack) not in ['1', '2', '3']:
attack = input('Choose fighter. Enter "1" for Waterbender, "2" for Firebender, "3" for Earthbender: ')

player.actor = int(attack)
enemy.select_attack()

try:
print('_'*46)
attack_result = player.attack(enemy)
print(attack_result)
defence_result = player.defence(enemy)
print(defence_result)
print('_'*46)

except exceptions.EnemyDown:
level += 1
player.score += 5
print("You attacked successfully! Score is {}".format(player.score))
print("{} wins! Level up to {}.".format(name, level))
print('_'*46)
enemy = models.Enemy(level)
except exceptions.GameOver as err:
print("You were hit!")
print('{} dies! Score is {}.'.format(name, player.score))
err.add_score(name, player.score)
break


def show_help():
print(settings.ALLOWED_COMMAND)


def show_scores():
with open('scores.txt', 'r') as f:
if os.path.getsize('scores.txt') == 0:
print('There are no results yet!')
else:
line = f.readlines()
print(' '.join(line))


def play():
name = input('Enter your Name: ')
while True:
act = input('Enter "Start" for beginning or "Help" for command list: ')
act = act.lower()
if act == "start":
start(name)
elif act == 'show scores':
show_scores()
elif act == "exit":
raise exceptions.GameOver
else:
show_help()


if __name__ == '__main__':
try:
play()
except exceptions.GameOver as err:
pass
except KeyboardInterrupt:
pass
finally:
print("Good bye!")
73 changes: 73 additions & 0 deletions models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import random
import exceptions
import settings
from datetime import datetime


class Enemy:
level = None
lives = None
actor = None

def __init__(self, level):
self.level = level
self.lives = level

def select_attack(self):
random.seed(datetime.now())
self.actor = random.randint(1, 3)

def decrease_lives(self):
if self.lives > 1:
self.lives -= 1
else:
raise exceptions.EnemyDown


class Player:
name = None
lives = None
score = 0
actor = None

def __init__(self, name):
self.name = name
self.lives = settings.LIVES

@staticmethod
def fight(attack_side, defense_side):
if attack_side.actor == defense_side.actor:
return 0
elif attack_side.actor == 3 and defense_side.actor == 1:
return 1
elif attack_side.actor < defense_side.actor:
return 1
else:
return -1

def decrease_lives(self):
if self.lives > 1:
self.lives -= 1
else:
raise exceptions.GameOver

def attack(self, enemy):
res = self.fight(self, enemy)
if res == 0:
return "It's a draw!"
elif res == 1:
self.score += 1
enemy.decrease_lives()
return "You attacked successfully! Score is {}".format(self.score)
elif res == -1:
return "You missed!"

def defence(self, enemy):
res = self.fight(enemy, self)
if res == 0:
return "It's a draw!"
elif res == 1:
self.decrease_lives()
return "You were hit!"
elif res == -1:
return "You evaded!"
2 changes: 2 additions & 0 deletions settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
LIVES = 1
ALLOWED_COMMAND = 'Start, Help, Show Scores, Exit'