1 Востаннє редагувалося mamkin haker (08.10.2021 13:14:49)

Тема: Гра в 21 з незрозумілими правилами

Потрібна ваша філософська думка на рахунок цьої гри
Чи можлива перемога гравця 1 якщо гравець 2 розумний?
Також можете приміняти цю гру та дурити людей)))

можливо якісь зауваження по коду будуть :D

гра в 21 на пайтоні
def main():
    suma = 0
    numbers = [1, 2, 3]
    rule = input("Щоб дізнатись правила гри напишіть rule та нажміть ентер.\nЯкщо ви знайомі з правилами гри то нажміть ентер.\n")
    
    if rule == "rule":
        print("Гра у 21.\nПравила:\n1) Вводити цифри лише оці (1, 2, 3)\n2) Можна вводити число яке в сумі з попередньойю сумую числел дає різницю від 1 до 3\n\tПриклад: попереднє число було 6 ви хочете додати 3 тому вводите 9\n\tЯкщо ви введете 10 (10 - 6 = 4) то воно не спрацює.\n3)Програє той хто першим назве число 21.\n\n")
        print("Гра починаєтся!")
    elif rule != '':
        print("Здійснено некоректний ввід.")
        return

    while suma < 20:

        try:
            p1 = int(input("Введіть чифру або число яке відповідає правилам гри: "))
        except Exception as e:
            p1 = -1

        duralition = p1 - suma

        if p1 in numbers:
            suma += p1
        elif duralition in numbers:
            suma += duralition
        else:
            print("Введіть число від 1 до 3.")
            print("Сума чисел:", suma)
            continue

        print("Сума чисел:", suma)
        p2 = 0

        if suma % 2 == 0:
            p2 = 2
        else:
            if 17 > (suma + 3) < 20:
                p2 = 3
            else:
                p2 = 1

        suma += p2

        print("Гравець 2 додав число:", p2)
        print("Сума чисел:", suma)

    if suma == 20:
        print("\n\nОскільки сума чисел 20 то гравець 1 автоматично програв.")
    else:
        print("Досягнуто число 21!\nГравець 1 програв.")

if __name__ == '__main__':
    main()

2 Востаннє редагувалося koala (08.10.2021 13:18:17)

Re: Гра в 21 з незрозумілими правилами

mamkin haker написав:

Чи можлива перемога гравця 1 якщо гравець 2 розумний?

Якби ще автор був розумний і сформулював правила так, щоб їх можна було зрозуміти...

Якщо ж мова про описані кодом правила, а не їхнє формулювання, то неважливо, розумний гравець 2 чи ні - повідомлення, що він програв, кодом не передбачено, тому він може робити що завгодно.

Подякували: mamkin haker, leofun012

3

Re: Гра в 21 з незрозумілими правилами

Я винесу останні повідомлення в окрему тему в розділі Python

4 Востаннє редагувалося koala (08.10.2021 13:23:43)

Re: Гра в 21 з незрозумілими правилами

Скажімо, так програє гравець 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 автоматично програв.
Подякували: mamkin haker1

5

Re: Гра в 21 з незрозумілими правилами

koala написав:

Я винесу останні повідомлення в окрему тему в розділі Python

винесіть будь ласка ще 1 (там саме відповідь, писав коли ви перетаскували повідоммлення сюди) :D

6

Re: Гра в 21 з незрозумілими правилами

koala написав:
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) то воно не спрацює

koala написав:

Якщо ж мова про описані кодом правила, а не їхнє формулювання, то неважливо, розумний гравець 2 чи ні - повідомлення, що він програв, кодом не передбачено, тому він може робити що завгодно.

А мені просто розповіли цо в цій грі перемога гравця 1 неможлива =(
при умові що там буде стояти цей уривок коду

if suma % 2 == 0:
    p2 = 2
else:
    if 17 > (suma + 3) < 20:
        p2 = 3
    else:
        p2 = 1

7

Re: Гра в 21 з незрозумілими правилами

mamkin haker написав:

1) Програє той хто першим назве число 21.

У чому проблема назвати 22?

mamkin haker написав:

А мені просто розповіли цо в цій грі перемога гравця 1 неможлива =(
при умові що там буде стояти цей уривок коду

Ні, при умові, що там буде цей уривок коду:

    if suma == 20:
        print("\n\nОскільки сума чисел 20 то гравець 1 автоматично програв.")
    else:
        print("Досягнуто число 21!\nГравець 1 програв.")

Власне, всю програму можна скоротити до простого

if __name__ == '__main__':
    print("Гравець 1 програв.")

Я б сказав, це досить пітонічно.

Подякували: mamkin haker1

8

Re: Гра в 21 з незрозумілими правилами

тіко таке вийшло (т_т)
як його зробити нормальним, незнаю
поідеї людина має завжди програвати

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()

9

Re: Гра в 21 з незрозумілими правилами

То, може, спершу обдумаєте алгоритм, опишете його словами, а вже потім кодитимете?

10 Востаннє редагувалося mamkin haker (08.10.2021 14:48:44)

Re: Гра в 21 з незрозумілими правилами

замінити ось це

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

повний код(трішки змінив)
def main():
    suma = 0
    numbers = [1, 2, 3]
    while suma < 21:
        try:
            p = int(input("Введіть чифру (можна вводити 1, 2, 3: "))
        except Exception as e:
            continue

        if not(p in numbers):
            continue

        for i in range(1, 3):

            if i % 2 == 0:
                suma += 4 - p
                print(f"Гравець 2 додав {4 - p}")
            else:
                suma += p

            print("Сума чисел:", suma)

            if suma > 20:
                print(f"Гравець {i} програв!")
                return

if __name__ == '__main__':
    main()

11

Re: Гра в 21 з незрозумілими правилами

Ось вам трохи ООП

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()
Подякували: mamkin haker1

12

Re: Гра в 21 з незрозумілими правилами

намагався зробити згадуючи попередні задачі, =_=
а рішення таке простеньке

тупенький я))

13

Re: Гра в 21 з незрозумілими правилами

доречі, ви забули поставити f

#у вас
print("Я обережно оберу {move}")
#потрібно
print(f"Я обережно оберу {move}")

14

Re: Гра в 21 з незрозумілими правилами

mamkin haker написав:

до речі, ви забули поставити f

Коали взагалі ліниві

15 Востаннє редагувалося mamkin haker (08.10.2021 19:17:51)

Re: Гра в 21 з незрозумілими правилами

можете прокоментувати оцей участок коду, ато я тупенький трішки(сильно)

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 захопили і забули видалити ¯\_(ツ)_/¯

16 Востаннє редагувалося mamkin haker (23.10.2021 19:41:37)

Re: Гра в 21 з незрозумілими правилами

той хто грав зі мною в цю гру запропонував мені доробити алгоритм щоб туди можна було використовувати будь які числа там з 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