Add Project Game

This commit is contained in:
danii 2023-06-27 20:04:17 +02:00
parent 305f55e35f
commit 9b86dacd15
8 changed files with 338 additions and 0 deletions

0
Game/Player.py Normal file
View File

153
Game/game.py Normal file
View File

@ -0,0 +1,153 @@
import random
def dice():
return random.randint(1, 6)
def move(player, steps, field):
# Алгоритм действий такой:
# сначала увеличиваем позицию игрока на кол-во шагов.
player.position += steps
if player.position >= len(field):
player.position = len(field) - 1
# Затем проверяем, нет ли особых действий на клетке, на которую попал игрок.
cell = field[player.position]
if cell > 0:
# Если есть, то либо перемещаем игрока на новую позицию, либо выставляем свойство skip.
if cell == player.position:
# Пропусти следующий ход!
player.skip = True
else:
player.position = cell
def draw(field, players):
for i in range(0, len(field), 10):
sub = field[i:i+10]
line = ''
for j in range(len(sub)):
e = sub[j]
pos = i + j
player_found = False
for player_index in range(len(players)):
pl = players[player_index]
if pl.position == pos:
line += pl.color[:2]
player_found = True
break
if not player_found:
if e < 10:
line += ' ' + str(e)
else:
line += str(e)
line += ' '
print(line)
def game_loop(auto, field):
random.seed()
exit_game = False
winner = None
result = 0
# Инициализируем список игроков
players = [Player("red"), Player("green"), Player("blue"), Player("yellow")]
if not auto:
# Изначально вывести пустое поле без игроков
draw(field, players)
# Игровой цикл (бесконечный)
while True:
# Если дана команда выйти из игры
if exit_game:
if not auto:
# Рисуем поле
draw(field, players)
# Вывод информации
print("Игра прервана")
# Сохранить результат
result = -1
break
if winner is not None:
if not auto:
# Нарисовать поле
draw(field, players)
# Вывести победителя
print((f'{winner.color} is winner'))
print(f'moves of winner are {winner.dices}')
# Сохранить результат
result = len(winner.dices)
break
# Выполняет действия для каждого игрока
for p in players:
# Если игрок должен пропустить ход
if p.skip:
if not auto:
# Вывести на экран информацию о том, что он пропускает ход
print(f'{p.color} skips')
# Не пропускать СЛЕДУЮЩИЙ ход
p.skip = False
# Если ход пропускать не надо
else:
if not auto:
# Выводит текст на экран и ждет ввода
inp = input(f'{p.color} to move')
else:
inp = ''
# Обработка ввода
# Если пользователь ввел exit или quit
if inp == 'exit' or inp == 'quit':
# Даем команду выйти из игры
exit_game = True
# Прервать цикл обработки игроков
break
# Бросает кубик
diced = dice()
# Двигаем игрока на кол-во шагов с кубика
move(p, diced, field)
# Сохраняем значение кубика
p.dices.append(diced)
# Eсли игрок попал в последнюю клетку
if p.position == len(field) - 1:
# Установить победителя (таким образом дать команду выйти из игры)
winner = p
# Прервать цикл обработки игроков
break
if not auto:
# Пустая строка
print()
# Рисует поле
draw(field, players)
# Возвращаем кол-во бросков
return result

135
Game/main.py Normal file
View File

@ -0,0 +1,135 @@
from Player import Player
def load(file):
# 1. Загрузить весь файл в строку
f = open(file, 'r')
s = f.read()
# 2. Заменить все пробелы и переводы строки на "ничего"
s = s.replace(' ', '')
s = s.replace('\n', '')
# 3. Из полученной строки создать массив, используя разделитель ","
a = s.split(',')
# a - массив строк, в которых хранятся числа
b = []
for x in a:
b.append(int(x))
# b - массив чисел из а
f.close()
return b
def level_menu():
for i in range(1, len(levels) + 1):
print(f'{i}. Level {i}')
print(f'{len(levels) + 1}. Назад')
def level_menu_loop():
while True:
level_menu()
inp = input()
if inp.isnumeric():
op = int(inp)
if 1 <= op <= len(levels) + 1:
if op <= len(levels):
# Выбор уровня
return levels[op - 1]
else:
# Выход из меню
return None
else:
print('Выберите номер из меню!')
else:
print('Вводите только цифры!')
def main_menu():
print('1. Выбор уровня')
print('2. Выбор кол-ва запусков')
print('3. Запуск')
print('4. Выход')
def main_menu_loop():
level = ''
runs = 1
while True:
print(f'Выбранный уровень: {level}')
print(f'Кол-во запусков: {runs}')
print()
# Вывод меню на экран
main_menu()
# Ввод от пользователя
inp = input()
# Валидация ввода пользователя
if inp.isnumeric():
op = int(inp)
if 1 <= op <= 4:
# Ввод пользователя валидирован, выполняем действие
if op == 1:
# Выбор уровня
ret = level_menu_loop()
if ret is not None:
level = ret
elif op == 2:
# Ввод кол-во запусков
inp2 = input('Введите кол-во запусков: ')
if inp2.isnumeric():
runs = int(inp2)
else:
print('Вводите только цифры!')
elif op == 3:
# Запуск
if level in levels:
run(load(level), runs)
else:
print('Для начала выберите уровень!')
else:
# Завершение программы
break
else:
print('Выберите номер из меню!')
else:
print('Вводите только цифры!')
def run(level, runs):
# Ручной или авто режим
auto = False
# Если больше одного запуска
if runs > 1:
# Автоматически включаем авто режим
auto = True
results = []
for i in range(runs):
results.append(game_loop(auto, level))
print(f'Average: {sum(results)/runs}')
print()
levels = ['level1.txt', 'level2.txt', 'level3.txt', 'level4.txt', 'level5.txt', 'level6.txt']
#random.seed()
main_menu_loop()

10
Level/level_1.txt Normal file
View File

@ -0,0 +1,10 @@
0, 0, 2, 0, 0, 0, 13, 22, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 90, 0, 0,
0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 98, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 5, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 12, 89, 0, 0

10
Level/level_2.txt Normal file
View File

@ -0,0 +1,10 @@
0, 0, 2, 0, 0, 0, 13, 22, 0, 0,
0, 0, 12, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 25, 0, 0, 90, 0, 0,
0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 45, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 98, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 63, 0, 5, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 76, 12, 89, 0, 0

10
Level/level_3.txt Normal file
View File

@ -0,0 +1,10 @@
0, 0, 2, 0, 0, 0, 13, 22, 0, 0,
0, 0, 12, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 25, 0, 0, 90, 0, 0,
0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 45, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 98, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 63, 0, 5, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 76, 12, 2, 0, 0

10
Level/level_4.txt Normal file
View File

@ -0,0 +1,10 @@
0, 1, 2, 0, 4, 0, 13, 22, 0, 0,
0, 0, 12, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 25, 0, 27, 90, 0, 0,
0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 45, 0, 47, 0, 0, 0,
0, 1, 0, 0, 0, 0, 98, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 63, 0, 5, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 76, 10, 2, 0, 0

10
Level/level_5.txt Normal file
View File

@ -0,0 +1,10 @@
0, 1, 2, 0, 4, 0, 13, 22, 0, 0,
0, 0, 12, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 25, 0, 27, 90, 0, 0,
0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
0, 0, 52, 0, 45, 0, 47, 0, 0, 0,
0, 1, 0, 0, 0, 0, 98, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 83, 0, 5, 0, 0, 0, 0, 0,
0, 0, 93, 0, 0, 76, 10, 2, 98, 0