Помощь в расстановке циклов python
Всем доброго времени суток! Недавно я начал изучать python, не судите строго. Вопрос более для того чтобы начать коммуникацию с единомышленниками и по-тихоньку внедряться во все плюшки типа stackoverflow. Понимаю что вопрос совсем легкий, но повторюсь я решил спросить у Вас, для общего кругозора.
Вкратце, я начал проходить небольшой курс по python, но математические задачи меня в нем убивают... Решил попробовать написать небольшую игру. Игра называется "1000", Правила игры оставлю здесь, в принципе алгоритм не сложный, но придется поковыряться, т.к. это мой первый проект.
Что я сделал на текущий момент:
from random import randint
points = 0
counter_1 = 0
counter_2 = 0
counter_3 = 0
counter_4 = 0
counter_5 = 0
print('Бросает Игрок_1')
for i in range(1, 6):
drop = randint(1, 6)
print(drop)
if drop == 1:
counter_1 += 1
elif drop == 2:
counter_2 += 1
if counter_1 == 1:
points += 10
elif counter_1 == 2:
points += 20
elif counter_1 == 3:
points += 100
elif counter_1 == 4:
points += 200
elif counter_1 == 5:
points += 1000
elif counter_2 == 1:
points += 0
elif counter_2 == 2:
points += 0
elif counter_2 == 3:
points += 20
elif counter_2 == 4:
points += 40
elif counter_2 == 5:
points += 200
print('Сумма очков броска =', points)
Сделал пока расчет для двух цифр. Чтобы не удлинять абракадабру.
Я полностью осознаю корявость своего кода и наверняка его можно уместить короче, но в данный момент мне важно понять структуру отступов, потому что при запуске идет не совсем правильный расчет очков. При выпадании двух единиц выпадает 30, а должно 20. Спасибо большое тем кто отнесется с пониманием и откликнется на мой зов помощи.
Всем добра!
Ответы (2 шт):
Главным недостатком вашего кода является то, что ваш код сразу после броска каждого отдельного кубика пытается анализировать, не зная, что будет дальше.
Сделайте сначала броски всех 5 кубиков, и только после этого анализируйте.
Я не знаю степень ваших знаний в Питоне, потому буду пользоваться только тем, что я увидел в вашем коде.
И так, сначала бросаем 5 кубиков:
for _ in range(5): # нагладнее, чем ваше range(1, 6); вместо i я дал _
drop = randint(1, 6)
print(drop)
if drop == 1:
counter_1 += 1
elif drop == 2:
counter_2 += 1
elif drop == 3:
counter_3 += 1
elif drop == 4:
counter_4 += 1
elif drop == 5:
counter_5 += 1
elif drop == 6:
counter_6 += 1
Конец вашего цикла for!
Но и теперь вы можете анализировать результат, уже не в цикле, а после него. Значит, без отступов:
if counter_1 == 1:
points += 10
elif counter_1 == 2:
points += 20
elif counter_1 == 3:
points += 100
...... и т.д. ......
Для дальнейшего развития.
Учёл правила: 3-5 одинаковых, 1-2 единицы или пятерки, два стрита, повторы не делал.
Как упрощается со списками счётчиков, достоинств граней, ценности больших количеств. Это весь код.
from random import randint
cnt = [0]*7
for _ in range(5):
drop = randint(1, 6)
print(drop, end = ' ')
cnt[drop] += 1
print(cnt)
result = 0
prices = [0, 10, 2, 3, 4, 5, 6]
count_factors = [0, 0, 0, 10, 20, 100]
if cnt[2]*cnt[3]*cnt[4]*cnt[5]==1:
result += 250 if cnt[1]==0 else 125
else:
for i in range(1, 7):
if i in [1,5] and cnt[i] in [1,2]:
result += cnt[i] * prices[i]
else:
result += prices[i] * count_factors[cnt[i]]
print(result)
Примеры:
6 3 2 5 1 [0, 1, 1, 1, 0, 1, 1]
15
6 4 4 6 4 [0, 0, 0, 0, 3, 0, 2]
40
2 5 1 1 1 [0, 3, 1, 0, 0, 1, 0]
105
3 1 4 5 2 [0, 1, 1, 1, 1, 1, 0]
125
1 1 1 1 1 [0, 5, 0, 0, 0, 0, 0]
1000