Add Project Game
This commit is contained in:
parent
305f55e35f
commit
9b86dacd15
|
@ -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
|
|
@ -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()
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue