示例#1
0
 def __init__(self, enemy_speed, label, dir_name=""):
     self.text_storage = TextStorage(dir_name)
     self.text_name, text = self.text_storage.get_random_string(label)
     super().__init__(text)
     self.enemy_input = UserInput(text)
     self.enemy_speed = enemy_speed
     self.inp_thread = Thread(target=self.input_thread)
     self.en_thread = Thread(target=self.enemy_thread)
     self.upd_thread = Thread(target=self.print_thread)
     self.threads_active = False
     self.enemy_finish = None
示例#2
0
    def __init__(self, dir_name):
        self._user = User(settings.get_name_from_config())
        self._strings = self._user.get_strings()
        self._dir_name = dir_name
        self._text_st = TextStorage(dir_name)
        self._menu_items = {
            '1': self._strings['start'],
            '2': self._strings['enemy_game'],
            '3': self._strings['show_stat'],
            '4': self._strings['change_user'],
            '5': self._strings['exit']
        }

        self._actions = {
            "1": self.start_game,
            "2": self.start_enemy_game,
            "3": self.show_stat,
            '4': self.change_name,
            '5': SimpleGame.clear
        }
示例#3
0
 def test_get_random_string(self):
     storage = TextStorage(f'{PATH}/tests/test/')
     storage.add_label('test1', 'test')
     text, string = storage.get_random_string('test')
     with open(f'{PATH}/texts/texts_test/json/test1.json') as f:
         alls = json.load(f)
     self.assertIn(string, alls)
     self.assertIn(text, storage.get_texts_names()['*'])
示例#4
0
class Menu:
    def __init__(self, dir_name):
        self._user = User(settings.get_name_from_config())
        self._strings = self._user.get_strings()
        self._dir_name = dir_name
        self._text_st = TextStorage(dir_name)
        self._menu_items = {
            '1': self._strings['start'],
            '2': self._strings['enemy_game'],
            '3': self._strings['show_stat'],
            '4': self._strings['change_user'],
            '5': self._strings['exit']
        }

        self._actions = {
            "1": self.start_game,
            "2": self.start_enemy_game,
            "3": self.show_stat,
            '4': self.change_name,
            '5': SimpleGame.clear
        }

    def run(self):
        if not os.path.exists(f'{settings.PATH}/statistics.json'):
            self.change_name()
        while True:
            self.print_options()
            option = getch.getch()
            if option in self._actions:
                self._actions[option]()
            if option == "5":
                break
            self._user.load_statistics()

    def change_name(self):
        SimpleGame.clear()
        new_name = input(self._strings['input_name'] + ' ')
        settings.change_user(new_name)
        self._user.update_config()
        self._user = User(settings.get_name_from_config())

    def print_options(self):
        SimpleGame.clear()
        strings = self._user.get_strings()
        print(f'{strings["welcome"]}, {self._user.name}')
        print(strings['select'])
        print()
        for k, v in self._menu_items.items():
            print(f'{k}. {v}')

    def start_game(self):
        label = self.get_label()
        game = SimpleGame(label, self._dir_name)
        game.start_game()
        print(f'{self._user.get_strings()["press"]}')
        while getch.getch() != '\r':
            pass

    def start_enemy_game(self):
        label = self.get_label()
        speed = self._user.stat['max_speed']
        game = EnemyGame(speed + 5, label, self._dir_name)
        game.start_game()
        print(f'{self._user.get_strings()["press"]}')
        while getch.getch() != '\r':
            pass

    def get_label(self):
        print(self._strings['choose_label'])
        print(f"1. {self._strings['choose_label_yes']}")
        print(f"2. {self._strings['choose_label_no']}")
        choice = getch.getch()
        if choice == "1":
            print(self.get_all_labels())
            label = input(self._strings['write_label'])
            if label in self._text_st.get_all_labels():
                return label
            else:
                return None
        elif choice == "2":
            return None

    def get_all_labels(self):
        labels = self._text_st.get_all_labels()
        return '\n'.join(labels)

    def show_stat(self):
        SimpleGame.clear()
        stat = self._user.get_stat()
        res = f'{self._strings["user"]} {self._user.name}\n' \
            f'{self._strings["text_count"]}: {stat["text_count"]}\n' \
            f'{self._strings["symbol_count"]}: {stat["symbol_count"]}\n' \
            f'{self._strings["average_speed"]}: {stat["average_speed"]} ' \
            f'{self._strings["speed"]}\n' \
            f'{self._strings["average_errors"]}: {stat["average_errors"]}\n' \
            f'{self._strings["dynamics"]}:\n'

        dynamic = stat['dynamic']
        for k, v in dynamic.items():
            res += f'{k}: {v["average_speed"]} {self._strings["speed"]}\n'
        print(res)
        print(f'{self._user.get_strings()["press"]}')
        while getch.getch() != '\r':
            pass
示例#5
0
class EnemyGame(Game):
    TIMER = 5

    def __init__(self, enemy_speed, label, dir_name=""):
        self.text_storage = TextStorage(dir_name)
        self.text_name, text = self.text_storage.get_random_string(label)
        super().__init__(text)
        self.enemy_input = UserInput(text)
        self.enemy_speed = enemy_speed
        self.inp_thread = Thread(target=self.input_thread)
        self.en_thread = Thread(target=self.enemy_thread)
        self.upd_thread = Thread(target=self.print_thread)
        self.threads_active = False
        self.enemy_finish = None

    def start_game(self):
        self.set_timer(self.current_state
                       (self.current_enemy_state(self.enemy_input),
                        self.current_state_string(self.user_input)))
        self._start_time = timeit.default_timer()
        self.inp_thread.start()
        self.en_thread.start()
        self.threads_active = True
        self.inp_thread.join()
        self.en_thread.join()
        if self.is_exit:
            SimpleGame.clear()
            sys.exit()
        finish_time = timeit.default_timer()
        res_time = finish_time - self._start_time
        if self.is_finished:
            self.print_results(self.current_state(None,
                                                  self.result_string(
                                                      self.user_input,
                                                      res_time,
                                                      finish_time)))
            self.get_label(self.text_storage, self.text_name)
        self._user.update_stat(self.user_input, res_time,
                               self.calc_current_speed())

    def input_thread(self):
        while not self.user_input.is_done():
            symbol = self.get_user_input()
            if symbol == '\x03':
                self.is_exit = True
                break
            if symbol is None:
                self.is_finished = False
                break
            self.user_input.update(symbol)
            self.print_results(
                self.current_state(self.current_enemy_state(self.enemy_input),
                                   self.current_state_string(self.user_input)))

    def print_thread(self):
        while not self.user_input.is_done():
            if not self.inp_thread.is_alive():
                break
            self.print_results(
                self.current_state(self.current_enemy_state(self.enemy_input),
                                   self.current_state_string(self.user_input)))
            time.sleep(0.5)

    def enemy_thread(self):
        while not self.enemy_input.is_done():
            if not self.inp_thread.is_alive():
                break
            symbol = self.enemy_input.get_blank_text()[0]
            self.enemy_input.update(symbol)
            spd = (self.enemy_speed // 60) or 1
            time.sleep(1 / spd)
            self.print_results(
                self.current_state(self.current_enemy_state(self.enemy_input),
                                   self.current_state_string(self.user_input)))
        self.enemy_finish = timeit.default_timer()
        self.upd_thread.start()
        self.upd_thread.join()

    def result_string(self, user_input, res_time, finish_time):
        s = f'{colored(user_input.text, "green")}\r\n' \
            f'{self._strings["acc"]}: ' \
            f'{user_input.accurate:.2%}\r\n' \
            f'{self._strings["time"]}: {res_time:.2f} ' \
            f'{self._strings["sec"]}\r\n' \
            f'{self._strings["avg_speed"]}:' \
            f' {self.calc_current_speed()} ' \
            f'{self._strings["speed"]}\r\n' \
            f'{self._strings["err"]}: ' \
            f'{user_input.error_count}\r\n' \
            f'{self._strings["delta"]}: ' \
            f'{finish_time - self.enemy_finish:.2f} ' \
            f'{self._strings["sec"]}'
        return s

    def current_state_string(self, user_input):
        s = f'{colored(user_input.correct_text(), "green")}' \
            f'{colored(user_input.get_incorrect_symbol(), "red")}' \
            f'{user_input.get_blank_text()}\r\n' \
            f'{colored(user_input.correct_input, "green")}' \
            f'{colored(user_input.incorrect_text, "red")}\r\n' \
            f'{self._strings["cur_speed"]}: ' \
            f'{self.calc_current_speed()} ' \
            f'{self._strings["speed"]}\r\n' \
            f'{self._strings["err"]}: ' \
            f'{self.user_input.error_count}\r'
        return s

    def current_state(self, enemy_res, user_res):
        res = user_res
        rows = os.get_terminal_size().columns
        if enemy_res:
            res = f"{enemy_res}\r\n{'-' * rows}\r\n{user_res}"
        return res

    def current_enemy_state(self, user_input):
        return '{}{}{}\r\n'.format(
            colored(user_input.correct_text(), 'magenta'),
            colored(user_input.get_incorrect_symbol(), 'red'),
            user_input.get_blank_text(),
        )
示例#6
0
 def __init__(self, label, dir_name=""):
     self.text_storage = TextStorage(dir_name)
     self.text_name, text = self.text_storage.get_random_string(label)
     super().__init__(text)
     self.printing_thread = Thread(target=self.print_thread)
     self.inp_thread = Thread(target=self.input_thread)
示例#7
0
class SimpleGame(Game):
    def __init__(self, label, dir_name=""):
        self.text_storage = TextStorage(dir_name)
        self.text_name, text = self.text_storage.get_random_string(label)
        super().__init__(text)
        self.printing_thread = Thread(target=self.print_thread)
        self.inp_thread = Thread(target=self.input_thread)

    def start_game(self):
        self.set_timer(self.current_state_string(self.user_input))
        self._start_time = timeit.default_timer()
        self.inp_thread.start()
        self.printing_thread.start()
        self.inp_thread.join()
        self.printing_thread.join()
        if self.is_exit:
            self.clear()
            sys.exit()
        res_time = timeit.default_timer() - self._start_time
        if self.is_finished:
            self.print_results(self.result_string(self.user_input, res_time))
            self.get_label(self.text_storage, self.text_name)
        self._user.update_stat(self.user_input, res_time,
                               self.calc_current_speed())

    def calc_current_speed(self):
        count = self.user_input.count
        curr_time = timeit.default_timer()
        res_time = (curr_time - self._start_time) / 60
        return int(count // res_time)

    def result_string(self, user_input, res_time):
        self.clear()
        s = f'{colored(user_input.text, "green")}\r\n' \
            f'{self._strings["acc"]}:{user_input.accurate:.2%}' \
            f'\r\n\r{self._strings["time"]}:' \
            f'{res_time:.2f} {self._strings["sec"]}\r\n' \
            f'{self._strings["avg_speed"]}: ' \
            f'{self.calc_current_speed()} ' \
            f'{self._strings["speed"]}' \
            f'\r\n\r{self._strings["err"]}: {user_input.error_count}'
        return s

    def current_state_string(self, user_input):
        s = f'{colored(user_input.correct_text(), "green")}' \
            f'{colored(user_input.get_incorrect_symbol(), "red")}' \
            f'{user_input.get_blank_text()}\r\n' \
            f'{colored(user_input.correct_input, "green")}' \
            f'{colored(user_input.incorrect_text, "red")}\r\n' \
            f'{self._strings["cur_speed"]}: ' \
            f'{self.calc_current_speed()}' \
            f' { self._strings["speed"]}\r\n' \
            f'{self._strings["err"]}: {self.user_input.error_count}\r'
        return s

    def print_thread(self):
        while not self.user_input.is_done():
            if not self.inp_thread.is_alive():
                break
            self.print_results(self.current_state_string(self.user_input))
            time.sleep(0.5)

    def input_thread(self):
        while not self.user_input.is_done():
            symbol = self.get_user_input()
            if symbol == '\x03':
                self.is_exit = True
                break

            if symbol is None:
                self.is_finished = False
                break
            self.user_input.update(symbol)
            self.print_results(self.current_state_string(self.user_input))
示例#8
0
 def test_create(self):
     storage = TextStorage()
     self.assertEqual(storage.path, "")
     self.assertEqual(storage.all_js_path,
                      f'{PATH}/texts/texts_/all_texts.json')
示例#9
0
 def test_get_names(self):
     storage = TextStorage(f'{PATH}/tests/test/')
     storage.add_label('test1', 'test')
     d = {'*': ['test1', 'test2'], "test": ['test1']}
     self.assertDictEqual(d, storage.get_texts_names())
示例#10
0
 def test_get(self):
     storage = TextStorage(f'{PATH}/tests/test/')
     storage.add_label('test1', 'test')
     self.assertIn('test1', storage.get_text_by_label('test'))
示例#11
0
 def test_add(self):
     storage = TextStorage(f'{PATH}/tests/test/')
     storage.add_label('test1', 'test')
     self.assertIn('*', storage.get_all_labels())
     self.assertIn('test', storage.get_all_labels())
示例#12
0
 def test_labels(self):
     storage = TextStorage(f'{PATH}/tests/test/')
     self.assertEqual(storage.path, 'test')
     self.assertEqual(storage.all_js_path,
                      f'{PATH}/texts/texts_test/all_texts.json')
     self.assertIn('*', storage.get_all_labels())