1 Востаннє редагувалося koala (11.10.2021 11:59:11)

Тема: Гра "міст" з "гри в кальмара"

Гра на виживання: 16 гравців мають пройти по одному скляний міст з 18 кроків. Кожен крок - вибір однієї з двох скляних пластин, одна міцна, інша - ні. Хто не вгадав - вибуває разом із пластиною, наступний гравець або бачить розбиту пластину, або мусить пам'ятати, на яку пластину попередній ставав (що не дуже складно, бо йдуть ланцюжком).
Щось у фільмі мало пройшло, навіть з урахуванням психологічних проблем. Лише 3.
Накидав ось код

Прихований текст
BAD_JUMP = 0.01
BAD_MEMORY = 0.2
TILES = 18
PLAYERS = 16

import random

class SquidBridge:
    def __init__(self, verbose = False):
        self.verbose = verbose
        self.tiles = [["left","right"]]*TILES
        self.players = PLAYERS
        self.completed = 0
    def done(self):
        return self.players == 0
    def run_player(self):
        if self.done():
            return
        for index, pair in enumerate(self.tiles):
            if "bad" in pair:
                if random.random()<BAD_MEMORY:
                    pair.remove("bad")
                    self.players -= 1
                    if self.verbose:
                        print(f"Player had forgot {index} step")
                    return
            elif len(pair)==2:
                if random.random()<0.5:
                    if self.verbose:
                        print(f"Player had guessed {index} step wrong")
                    self.players -= 1
                    pair.remove(random.choice(pair))
                    return
                else:
                    pair[random.randint(0,1)] = "bad"
            if random.random()<BAD_JUMP:
                if self.verbose:
                    print(f"Player had misstepped {index} step")
                self.players -= 1
                return
        self.players -= 1
        self.completed += 1
    def run(self):
        if self.verbose:
            print("Starting game!")
        while not self.done():
            self.run_player()
        if self.verbose:
            print(f"Game finished, {self.completed} alive!")
        
GAMES = 1000

def sample_game():
    completed = 0
    for _ in range(GAMES):
        game = SquidBridge()
        game.run()
        completed += game.completed
    print(completed/GAMES)

def one_game():
    game = SquidBridge(True)
    game.run()

if __name__=="__main__":
    sample_game()
    #one_game()

Якщо імовірність впасти при правильному стрибку 0.01 (там, здається, ніхто не зірвався таким чином, навіть під час бійок), а імовірність неправильно запам'ятати міцне скло 0.1 (у фільмі помилка була лише одна, тобто це досить завищена оцінка), то проходити мають в середньому 12.5 гравців з 16 - і це логічно, в середньому кожен гравець буде робити хоча б по 2 кроки, і якщо один зробив правильно - то наступні вже будуть рідко помилятися. А якщо пощастило і пройшов 4-5 кроків - то проводиш за собою натовп.
Чи я десь нагівнокодив?

(і це я не кажу, що ніхто не спробував пройти по рейках замість скла)

2

Re: Гра "міст" з "гри в кальмара"

Прихований текст

з вами хоч бери та й вчи пайтон  :(

3

Re: Гра "міст" з "гри в кальмара"

Чесно скажу, не досліджував ваш код. Проте, як на мене, тут вимальовується геометрична прогресія?
Тобто, якщо для будь-якого гравця, очікувана кількість пройдених пластин успішно, буде 1/(1/2) = 2.
Тоді, ми можемо очікувати, що якщо n людей переходять міст один за одним, то кількість пластин, які будуть виявлені, становить 2n.
Ігноруючи випадок з проходженням по рейках, середня оптимальна кількість гравців, які пройдуть буде n/2. Тож можна сказати, що виживе приблизно 7 людей. (?)

Але в реальності враховуючи психологічний чинник, підступність інших гравців, а також таймер, я б напевно це число ділив ще на два :)

Подякували: dot1

4 Востаннє редагувалося koala (11.10.2021 14:31:12)

Re: Гра "міст" з "гри в кальмара"

Ага, гівнокод. Це ще кому Python вчити треба...

-        self.tiles = [["left","right"]]*TILES
+        self.tiles = [["left","right"] for _ in range(TILES)]

Точно, тепер виживає 7 (з імовірностями помилок 0) і 1.5 за 0.01 і 0.1.

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