Тема: Гра в 21 з незрозумілими правилами
Потрібна ваша філософська думка на рахунок цьої гри
Чи можлива перемога гравця 1 якщо гравець 2 розумний?
Також можете приміняти цю гру та дурити людей)))
можливо якісь зауваження по коду будуть
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Python → Гра в 21 з незрозумілими правилами
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Потрібна ваша філософська думка на рахунок цьої гри
Чи можлива перемога гравця 1 якщо гравець 2 розумний?
Також можете приміняти цю гру та дурити людей)))
можливо якісь зауваження по коду будуть
Чи можлива перемога гравця 1 якщо гравець 2 розумний?
Якби ще автор був розумний і сформулював правила так, щоб їх можна було зрозуміти...
Якщо ж мова про описані кодом правила, а не їхнє формулювання, то неважливо, розумний гравець 2 чи ні - повідомлення, що він програв, кодом не передбачено, тому він може робити що завгодно.
Я винесу останні повідомлення в окрему тему в розділі Python
Скажімо, так програє гравець 1:
Гра починаєтся!
Введіть чифру або число яке відповідає правилам гри: 1
Сума чисел: 1
Гравець 2 додав число: 3
Сума чисел: 4
Введіть чифру або число яке відповідає правилам гри: 3
Сума чисел: 7
Гравець 2 додав число: 3
Сума чисел: 10
Введіть чифру або число яке відповідає правилам гри: 2
Сума чисел: 12
Гравець 2 додав число: 2
Сума чисел: 14
Введіть чифру або число яке відповідає правилам гри: 2
Сума чисел: 16
Гравець 2 додав число: 2
Сума чисел: 18
Введіть чифру або число яке відповідає правилам гри: 2
Сума чисел: 20
Гравець 2 додав число: 2
Сума чисел: 22
Досягнуто число 21!
Гравець 1 програв.
І так теж:
Введіть чифру або число яке відповідає правилам гри: 3
Сума чисел: 3
Гравець 2 додав число: 3
Сума чисел: 6
Введіть чифру або число яке відповідає правилам гри: 9
Сума чисел: 9
Гравець 2 додав число: 3
Сума чисел: 12
Введіть чифру або число яке відповідає правилам гри: 1
Сума чисел: 13
Гравець 2 додав число: 3
Сума чисел: 16
Введіть чифру або число яке відповідає правилам гри: 3
Сума чисел: 19
Гравець 2 додав число: 1
Сума чисел: 20
Оскільки сума чисел 20 то гравець 1 автоматично програв.
Я винесу останні повідомлення в окрему тему в розділі Python
винесіть будь ласка ще 1 (там саме відповідь, писав коли ви перетаскували повідоммлення сюди)
mamkin haker написав:Чи можлива перемога гравця 1 якщо гравець 2 розумний?
Якби ще автор був розумний і сформулював правила так, щоб їх можна було зрозуміти...
Згодится?
Гра у 21.
Правила:
1) Програє той хто першим назве число 21.
2) Можнаа вводити цифри (1, 2, 3)
3) Також є можливість вводити число яке в сумі з попередньойю сумую числел дає різницю від 1 до 3
Приклад:
Попереднє число було 6 ви можете ввести (7, 8, 9) оскільки 7 - 6 = 1, 8 - 6 = 2, 9 - 6 = 3 а ці цифри можна вводити
Якщо ви введете 10 (10 - 6 = 4) то воно не спрацює
Якщо ж мова про описані кодом правила, а не їхнє формулювання, то неважливо, розумний гравець 2 чи ні - повідомлення, що він програв, кодом не передбачено, тому він може робити що завгодно.
А мені просто розповіли цо в цій грі перемога гравця 1 неможлива
при умові що там буде стояти цей уривок коду
if suma % 2 == 0:
p2 = 2
else:
if 17 > (suma + 3) < 20:
p2 = 3
else:
p2 = 1
1) Програє той хто першим назве число 21.
У чому проблема назвати 22?
А мені просто розповіли цо в цій грі перемога гравця 1 неможлива
при умові що там буде стояти цей уривок коду
Ні, при умові, що там буде цей уривок коду:
if suma == 20:
print("\n\nОскільки сума чисел 20 то гравець 1 автоматично програв.")
else:
print("Досягнуто число 21!\nГравець 1 програв.")
Власне, всю програму можна скоротити до простого
if __name__ == '__main__':
print("Гравець 1 програв.")
Я б сказав, це досить пітонічно.
тіко таке вийшло (т_т)
як його зробити нормальним, незнаю
поідеї людина має завжди програвати
def main():
suma = 0
numbers = [1, 2, 3]
while suma < 21:
try:
p1 = int(input("Введіть чифру (можна вводити 1, 2, 3: "))
except Exception as e:
p1 = -1
duralition = p1 - suma
if p1 in numbers:
suma += p1
elif duralition in numbers:
suma += duralition
else:
continue
print("Сума чисел:", suma)
if suma > 20:
print("Гравець 1 програв!")
return
p2 = 0
if (16 - suma) in numbers:
p2 = 16 - suma
elif (20 - suma) in numbers:
p2 = 20 - suma
elif suma < 12 and suma % 2 == 0:
p2 = 2
elif suma + 3 < 21:
p2 = 3
else:
p2 = 1
suma += p2
print("Гравець 2 додав число:", p2)
print("Сума чисел:", suma)
if suma > 20:
print("Гравець 2 програв!")
return
if __name__ == '__main__':
main()
То, може, спершу обдумаєте алгоритм, опишете його словами, а вже потім кодитимете?
замінити ось це
if (16 - suma) in numbers:
p2 = 16 - suma
elif (20 - suma) in numbers:
p2 = 20 - suma
elif suma < 12 and suma % 2 == 0:
p2 = 2
elif suma + 3 < 21:
p2 = 3
else:
p2 = 1
ось цим
p2 = 4 - p1
G - Genius
Ось вам трохи ООП
from random import randint
class HumanPlayer:
def next(self, total:int) -> int:
while True:
try:
move = int(input("Введіть хід (можна вводити 1, 2, 3 або нову суму):"))
if 0 < move <= 3:
return move
if total < move <= total+3:
return move - total
except Exception as e:
pass
def name(self) -> str:
return "людяка"
class SmartPlayer:
def next(self, total:int) -> int:
move = 4 - total % 4 or randint(1,3)
print("Я обережно оберу {move}")
return move
def name(self) -> str:
return "розумака"
class RandomPlayer:
def next(self, total:int) -> int:
move = randint(1,3)
print("А я зроблю {move}")
return move
def name(self) -> str:
return "тупак"
def main():
while True:
try:
Opponent = [SmartPlayer(), RandomPlayer()][int(input("Виберіть, з ким граєте (0 - розумака, 1 - тупий):"))]
break
except:
pass
players = [HumanPlayer(), Opponent]
total = 0
while total<21:
print(f"Сума {total}, ходить {players[0].name()}")
total += players[0].next(total)
players = players[::-1]
print(f"Сума {total}, виграв {players[0].name()}")
if __name__ == "__main__":
main()
намагався зробити згадуючи попередні задачі, =_=
а рішення таке простеньке
тупенький я))
доречі, ви забули поставити f
#у вас
print("Я обережно оберу {move}")
#потрібно
print(f"Я обережно оберу {move}")
до речі, ви забули поставити f
Коали взагалі ліниві
можете прокоментувати оцей участок коду, ато я тупенький трішки(сильно)
move = 4 - total % 4 or randint(1,3)
навіщо тут or randint(1,3) ??
то на випадок коли першим буде ходити алгоритм?
та ні
Виберіть, з ким граєте (1 - розумаха, 2 - тупак):1
Сума 0, ходить розумаха
Я обережно оберу 4
Сума 4, ходить людяка
Введіть хід (можна вводити 1, 2, 3 або нову суму):
може це ви Ctrl+C Ctrl+V захопили і забули видалити ¯\_(ツ)_/¯
той хто грав зі мною в цю гру запропонував мені доробити алгоритм щоб туди можна було використовувати будь які числа там з 3 до 5 і не 21, а наприклад 98
from random import randint
import sys
MIN_NUMBER = 1
MAX_NUMBER = 3
TOTAL = 21
class HumanPlayer:
def next(self, total:int) -> int:
while 1:
try:
move = int(input(f"Введіть хід (можна вводити {MIN_NUMBER} - {MAX_NUMBER} або нову суму): "))
if MIN_NUMBER <= move <= MAX_NUMBER:
return move
if MIN_NUMBER+total < move <= total+MAX_NUMBER:
return move - total
except Exception:
pass
def name(self) -> str:
return "людяка"
class SmartPlayer:
def __init__(self):
self.number = self.think()
def think(self) -> int:
number = MAX_NUMBER + 1
min_number = MIN_NUMBER
while min_number > 0:
while number > MIN_NUMBER + 1:
if (TOTAL - min_number) % number == 0:
print(number)
return number
else:
number -= 1
min_number -= 1
print("100% перемога НЕМОЖЛИВА")
return 10000
def next(self, total:int) -> int:
if (TOTAL - total) > MAX_NUMBER + 1:
move = self.number - total % self.number
else:
move = TOTAL - MIN_NUMBER - total
print(f"Я обережно оберу {move}")
return move
def name(self) -> str:
return "розумаха"
class RandomPlayer:
def next(self, total:int) -> int:
move = randint(MIN_NUMBER,MAX_NUMBER); print(f"А я зроблю {move}")
return move
def name(self) -> str:
return "тупак"
def main() -> None:
if MIN_NUMBER < 1:
sys.exit(0)
elif MAX_NUMBER >= TOTAL - MIN_NUMBER - 1:
sys.exit(0)
while 1:
try:
Opponent = [SmartPlayer(), RandomPlayer()][int(input("Виберіть, з ким граєте (1 - розумаха, 2 - тупак): ")) - 1]
break
except:
pass
players = [HumanPlayer(), Opponent]
total = 0
while total < TOTAL:
print(f"\nСума {total}, ходить {players[0].name()}")
total += players[0].next(total)
players = players[::-1]
print(f"Сума {total}, виграв {players[0].name()}")
if __name__ == "__main__":
main()
незнаю чи працє але ніби все добре :3
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися