TGTGInsightтелеграм анализLIVE / telegram public index
← Такты, стеки, два колеса

TGINSIGHT SIMILAR POSTS

Намери подобно съдържание

Изходен канал @clockstackwheels · Post #949 · 26.01

На выходных попробовали Трон Кубов. Это такая полудуэльная игра на сражение между разными персонажами. У игры фантастически крутой продакшен — каждый планшет героя оформлен в своём стиле со своими цветами, кубики сделаны с персональной текстурой и гранями, своя колода карточек и жетоны состояний. Вообще, каждый персонаж это просто такая мини-коробочка со всем необходимым, можно носить на турниры (под это, собственно, игра изначально и создавалась). У каждого персонажа свои способности, но сам игровой процесс одинаковый: бросаешь кубики, и по ним определяешь, какую из способностей активировать. На кубики можно влиять: во-первых, выбирать, какие и сколько раз перебросить; во-вторых, играть с руки карты вроде "Установи любой кубик в желаемое положение", "Скопируй один из выпавших кубиков", "Измени значение на единицу". Игра моим друзьям очень понравилась, а ещё она оказалась на удивление сбалансированной: первую партию сыграли вничью, во второй мы убили соперников, когда у нас самих оставалось 2 жизни из начальных 50. Задумался в целом о рандоме в играх. Кит Бургун пишет, что синглплеерные игры без источника случайности вообще не могут существовать, потому что иначе они превращаются в пазлы: для каждой ситуации находится и фиксируется оптимальный ход, игра становится решённой (solved). В играх против других людей ваш соперник является источником случайности для вас, потому что вы не знаете, как он думает. И всё-таки, добавление случайности в саму механику часто очень важно. Бывают игры с огромным пространством неоднозначных решений, как, например, шахматы или го. У них есть своя интересная специфика, но нередко они требуют очень длительного обдумывания хода, потому что человек начинает перебирать это пространство в глубину, и делает это сравнительно медленно. Бывают игры с очень маленьким пространством решений, например, крестики-нолики, и любому взрослому играть в них скучно. Найти баланс довольно сложно, поэтому (по крайней мере среди казуальных игр) хорошо работает следующая механика: игрок с помощью случайности либо получает небольшой кусочек пространства решений, либо ему меняют веса в этом пространстве так, чтобы его настоящий выбор был не таким большим. В добавок это создаёт мета-игру на риск, повышает реиграбельность, а ещё позволяет более слабому игроку выиграть за счёт удачи — очень хорошие свойства для казуальной настолки. Впрочем, в такой системе тоже не слишком легко сбалансировать процесс. Иногда от случайности может зависеть слишком многое, и мы получим Монополию или Колонизаторов, в которых скилл вообще не влияет на победу. Иногда случайность добавлена, но она скорее мешает: в Brass шесть разных действий, доступных с помощью карт, но только в одном важно, какая именно карта вам пришла. Иногда случайность добавлена и не работает как надо: в Hearthstone порядок прихода карт почти не влияет на решения игрока — он всегда играет оптимальную карту в конкретный ход. А иногда рандом приводит к злоупотреблению другими аспектами игры: в Baldurs Gate 3 из-за броска одного кубика может зависеть результат сложнейшего боя, поэтому иногда выгоднее просто перезапускать сохранение, пока не выпадет, как надо. Так что задача геймдизайнера отнюдь не становится простой при работе со случайностью. По первым двум партиям кажется, что авторы Трона Кубов вполне справились с управляемым рандомом, но евро-игрокам скорее всего такая степень случайности будет казаться большой, да и стратегически игра совершенно не глубокая. В любом случае, продолжим играть, пока не надоест :) #games

Hashtags

Резултати

Намерени 3 подобни публикации

Търсене: #concurrent

当前筛选 #concurrent清除筛选
djangoproject

@djangoproject · Post #90 · 11.07.2016 г., 11:56

https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Executor 17.4.1. #Executor Objects class #concurrent.futures.Executor An abstract class that provides methods to execute calls asynchronously. It should not be used directly, but through its concrete subclasses. submit(fn, *args, **kwargs) Schedules the callable, fn, to be executed as fn(*args **kwargs) and returns a Future object representing the execution of the callable. with ThreadPoolExecutor(max_workers=1) as executor: future = executor.submit(pow, 323, 1235) print(future.result()) map(func, *iterables, timeout=None, chunksize=1) Equivalent to #map(func, *iterables) except func is executed asynchronously and several calls to func may be made concurrently. The returned iterator raises a concurrent.futures.TimeoutError if __next__() is called and the result isn’t available after timeout seconds from the original call to #Executor.map(). timeout can be an int or a float. If timeout is not specified or None, there is no limit to the wait time. If a call raises an exception, then that exception will be raised when its value is retrieved from the iterator. When using ProcessPoolExecutor, this method chops iterables into a number of chunks which it submits to the pool as separate tasks. The (approximate) size of these chunks can be specified by setting chunksize to a positive integer. For very long iterables, using a large value for chunksize can significantly improve performance compared to the default size of 1. With ThreadPoolExecutor, chunksize has no effect. Changed in version 3.5: Added the chunksize argument.

djangoproject

@djangoproject · Post #261 · 16.02.2017 г., 06:56

http://www.giantflyingsaucer.com/blog/?p=5557 In spring 2014 Python 3.4 shipped a provisional package (#asyncio) which according to the docs “provides infrastructure for writing single-threaded #concurrent code using #coroutines, #multiplexing I/O access over #sockets and other resources, running network clients and servers, and other related primitives“. I can’t possibly cover everything in this article but I can introduce some of the things you can do with it. As per my New’s Years resolution I’ll be building these #examples using Python 3.4.2 (Asyncio has been ported back to Python 3.3 now as well).

djangoproject

@djangoproject · Post #290 · 04.04.2017 г., 21:36

https://pymotw.com/3/asyncio/executors.html Combining Coroutines with Threads and Processes A lot of existing libraries are not ready to be used with #asyncio natively. They may block, or depend on concurrency features not available through the module. It is still possible to use those libraries in an application based on asyncio by using an #executor from #concurrent.futures to run the code either in a separate thread or a separate process. #Threads The #run_in_executor() method of the event loop takes an executor instance, a regular callable to invoke, and any arguments to be passed to the callable. It returns a Future that can be used to wait for the function to finish its work and return something. If no executor is passed in, a #ThreadPoolExecutor is created. This example explicitly creates an executor to limit the number of worker threads it will have available. #Processes A ProcessPoolExecutor works in much the same way, creating a set of worker #processes instead of threads. Using separate processes requires more system resources, but for computationally-intensive operations it can make sense to run a separate task on each CPU core. #learn