• Как написать нейронную сеть для игры в шутер?

    @Wundarshular
    В общем смысле искусственные игровые противники имеют некоторую заданную цель, которой "стремятся" достигнуть. Для упрощения настройки и программирования, цель раскладывается на задачи и подзадачи.

    Например, цель ботов в Quake 3 или Counter Strike - доминировать в матче. Чтобы достигнуть этой цели, нужно выполнить следующие задачи: совершить больше всех убийств противников, быть убитым наименьшее число раз. Чтобы лидировать в списке убийц, нужно владеть лучшими предметами, занимать наиболее выгодные позиции на карте. Чтобы не быть убитым, необходимо иметь непредсказуемую тактику движения и, например, избегать открытых пространств. Эти подзадачи раскладываются на составляющие до тех пор, пока не будут максимально доступны для программирования.

    Далее на итоговом списке подзадач расставляются динамически изменяемые приоритеты, которые определяют поведение ИИ в конкретный момент: в этой ситуации лучше выполнять подзадачу избегания, а в другой - подзадачу поиска и захвата доминирующей позиции на карте. Приоритеты изменяются на основании каких-либо факторов, например: текущая экипировка, состояние здоровья\брони\аммуниции, близость противников, положение на карте и тд.
    Для того, чтобы закрепить определённую тактику за отдельно взятым экземпляром бота, добавьте в систему поощрения и наказания - то же место в таблице фрагов матча отлично для этого подходит.

    Вышеописанное является очень обобщённым вариантом, и в литературе по теме вы найдёте более изящные реализации. В том числе и с использованием всевозможных нейронных сетей.
    Прежде всего, как отметили выше, вам нужно определиться с вашими целями: какой игровый ИИ вы хотите сделать, и что он должен делать. Как только вы формализуете и структурируете свою задачу, вы быстро найдёте область решений и необходимую литературу.
    Ответ написан
    Комментировать
  • Как вывести символы из строки?

    @Wundarshular
    Прежде всего настоятельно рекомендую сначала ознакомиться с основами языка, а также используемыми вами функциями ввода вывода. Язык С очень прост: если вы хотите выстрелить себе в ногу, вы стреляете.

    Беглый просмотр вашего кода показывает, что вы не заботитесь о входных данных. Например, вот эта конструкция хоть и позволяет вам считать строку, но не даёт никаких гарантий, что она не превысит размер в 21 символ.

    #define N 21
    ...
    char str[N];
    printf("Enter a string no more than 20 symbols :\n\n");
    gets(str);


    А вот здесь вы наивно надеетесь, что у строки точно есть конец.
    for (int i=0; str[i] != '\0'; i++)

    Язык С очень прост: если вы хотите считать строку, вы её считаете. Но какой вы её получите - это ваша проблема.

    Что до вашей задачи, то, полагаю, самым простым способом в вашем случае будет цикл в цикле: главным циклом вы проходитесь по полученной строке, побочными циклами ищите совпадения в ваших справочниках (массивы vovels и тд) и при нахождении оного либо выводите сразу, либо копируете символ куда-либо для вывода позже.
    Вы значительно упростите код в этой части, если посмотрите таблицу ASCII.
    Задача ограничения длины решается, например, чтением справочника языка - all-ht.ru/inf/prog/c/func/fgets.html - или просто бесцеремонным обрубанием введённой строки. Для принуждения повторного ввода, думаю, вам подойдёт while либо do while - что больше нравится.
    Ответ написан
    Комментировать
  • Как выбрать несколько ячеек datagrid?

    @Wundarshular
    Вы пробовали считывать номер столбца и строки выбранной ячейки и выставлять у окружающих (от i-1,j-1 до i+1,j+1) свойство IsSelected в значение true?
    Ответ написан
    Комментировать
  • Функция gets() в C?

    @Wundarshular
    Как отметил jcmvbkbc, у вас "застревает" код клавиши enter в потоке ввода - это распространённый нюанс работы с потоком на начальных этапах.
    Как вариант, вы можете "вычищать" поток следующей конструкцией:
    while (getchar() != '\n');
    будет происходить считывание ввода посимвольно, отправляя результат "в никуда", пока не будет считан символ '\n' - после цикл завершится, и поток ввода уже не будет содержать данный символ.
    Ответ написан
    Комментировать
  • Когда нужно использовать var?

    @Wundarshular
    В вашем случае, как указали выше, происходит ошибка приведения типов, так как тип int действительно не равен типу Random.
    Если вы хотели сохранить в переменной rnd псевдослучайное число, то вам нужно предварительно создать и инициализировать экземпляр класса Random, а затем уже присвоить возвращаемое значение его метода Next() переменной:
    Random rnd = new Random();
    int rndNum = rnd.Next();

    Переменные, объявленные через "var" являются неявно типизированными, и их тип определит компилятор, то есть, в вашем случае
    var rnd = new Random();
    станет экземпляром класса Random на этапе компиляции. В очень простом пояснении: используйте var, когда заведомо не знаете, какого типа будет ваша переменная. Но имейте ввиду, что это может быть черевато.

    https://docs.microsoft.com/ru-ru/dotnet/csharp/lan...
    Ответ написан
    1 комментарий
  • Обработка события нажатия ЛКМ на заголовке DGV?

    @Wundarshular
    В теории, это область заголовка сетки таблицы. Вы пробовали DataGridView.ColumnHeaderMouseClick?
    Ответ написан
  • Можно как то сбросить пароль роутера не теряя настройки RB2011UIAS-RM?

    @Wundarshular
    Попробуйте воспользоваться утилитой netinstall с параметрами Keep old configuration и configure script, в котором создаёте нового пользователя с правами администратора.
    Эффективность решения не гарантирована.
    Ответ написан
    Комментировать
  • Как перейти на папку выше?

    @Wundarshular
    Посмотрите метод System.IO.Directory.GetParent();
    Ответ написан
    2 комментария
  • Как удалять и добавлять строки в БД?

    @Wundarshular
    DataGridView, несмотря на относительно богатый функционал, является лишь элементом для отображения данных из источника. То есть вам не нужно оперировать со строками в самой dgv. Вместо этого работайте с источником данных, к которому она привязана: bindingSource либо самой таблицей в вашем DataSet.
    То есть, все действия, которые вы визуально выполняете в dgv, должны выполняться на источнике данных.

    Помимо этого напомню, что для записи изменений на сервере, вам необходимо будет синхронизировать ваш DataSet с базой данных.
    Ответ написан
    Комментировать
  • Mikrotik проброс VLAN?

    @Wundarshular
    Если я правильно вас понял, то на RB260GS в разделе vlan вам следует установить значения:
    для sfp: здесь вы обмениваетесь трафиком с RB1100x, поэтому он уже должен быть тэгирован
    vlan mode = enabled,
    vlan recieve = only tagged (если вы планируете получать не только тегированный трафик - выставьте any)
    default vlan id = 1
    vlan header = leave as is
    для eth1-4:
    vlan mode = enabled (также попробуйте strict)
    vlan reiceve = only untagged
    default vlan id = 4
    vlan header = always strip
    для eth5:
    vlan mode = enabled (также попробуйте strict)
    vlan reiceve = only untagged
    default vlan id = 5
    vlan header = always strip
    В разделе vlans установите:
    vlan4:
    spf - leave as is
    eth1-4 add if missing (неточно)
    eth5 - not a member
    vlan5:
    spf - leave as is
    eth1-4 - not a member
    eth5 - add if missing(неточно)

    Что вы в итоге получите, если я правильно понял документацию на свитч: порты 1-4 будут принимать нетегированный трафик, давать тег 4 влана и отправлять на коммутацию, порт 5 будет делать то же самое для влан 5, а sfp будет пропускать через себя весь тегированный трафик. У меня есть некоторые подозрения касательно коммутации кадров, но ничего по этому поводу я не нашёл в викии.

    Для RB1100x (который, как я понял, управляется RouterOS) переместитесь в раздел /interface ethernet switch port:
    set 2 vlan-mode = fallback
    set 3 vlan-mode = fallback
    set 4 vlan-mode = fallback
    set 5 vlan-mode = fallback
    В это режиме все указанные порты rb1100x будут просто передавать тегированный трафик далее, не внося изменений. Как я понял, на портах 2,3 и 5 у вас продолжаются вланы. Если же оттуда тоже приходит нетегированный трафик, то
    set X vlan-mode=secure default-vlan-id=Y vlan-header=always-strip, где Х и Y это номер порта и влан-тег соответственно. Таким образом приходящий трафик будет тегироваться, а с исходящего - сниматься теги.
    В разделе /interface ethernet switch vlan:
    add vlan-id=4 ports=p2,p3,p4,switchX, switch=switchX
    add vlan-id=5 ports=p5,p4,switchX, switch=switchX
    Здесь вы задаёте "проброс" вланов через коммутатор. Переводя на русский: теперь влан4 сможет ходить по портам 2,3,4 через чип коммутации switchX и то же самое для влан5. Обратите внимание, что switchX - это не точно название вашего чипа коммутации, содержащееся в нотации RouterOS.

    Надеюсь ответ хотя бы направит вас в нужную сторону.
    Ответ написан
    Комментировать
  • Сервис по построению блок схем по ГОСТу?

    @Wundarshular
    В чём состоит вопрос? Вы не знаете с чего начать?
    Парсер текста
    Ответ написан
    Комментировать
  • Как записать 2 упорядоченных массива в один общий?

    @Wundarshular
    Вам известно, что длина результирующего массива равна n+m. Исходя из этого, самым примитивным образом заполнить результирующий массив можно так:

    #include <stdio.h>
    
    int main(void)
    {
    	short int n,m,i,k;
    	short int mass1[n],mass2[m],massR[n+m];
    
    	n=4;m=5;
    	k=0; // для заполнения результирующего массива вторым.
    	for(i=0;i<n;i++)
    		mass1[i]=i;
    	for(i=0;i<m;i++)
    		mass2[i]=(i+5)*2;
    	printf("mass1\n", mass1[i]);
    	for(i=0;i<n;i++)
    		printf("%d ", mass1[i]);
    	printf("\nmass2\n", mass1[i]);
    	for(i=0;i<m;i++)
    		printf("%d ", mass2[i]);
    	printf("\n");
    
    	for(i=0;i<n;i++) // заполнение результирующего массива первым
    		massR[i]=mass1[i];
    	for(i=n;i<m+n;i++) // и вторым
    	{
    		massR[i]=mass2[k];
    		k++;
    	}
    	printf("\nResult: ");
    	for(i=0;i<n+m;i++)
    		printf("%d ", massR[i]);
    
    	getchar();
    	return 0;
    }


    Вывод выглядит так:
    mass1
    0 1 2 3
    mass2
    10 12 14 16 18

    Result: 0 1 2 3 10 12 14 16 18
    Ответ написан
    Комментировать
  • Как заполнить квадратную матрицу 8x8 по указанной схеме?

    @Wundarshular
    У вас i и j меняются с 0 на 1 и обратно и с 7 на 8 и обратно соответственно. Элементы массива за пределами указываемых ими диапазонов остаются не инициализированными, поэтому там хранится "мусор". Как отметил SagePtr, вам следует пересмотреть условия, по которым вы перемещаете условный курсор по массиву.
    Ответ написан
    Комментировать
  • Работа с различными типами данных в си?

    @Wundarshular
    Обобщённо говоря, множество комплексных чисел включает в себя вещественные числа, а те, в свою очередь, включают в себя целые. Комплексное число - это число вида "a+bi", где а - действительная часть, выраженная вещественным числом, b - коэффициент мнимой части, выраженный вещественным числом, i = мнимая единица.
    Исходя из этого, можно попробовать использовать массив структур, где каждый элемент, это структура, выражающая собой комплексное число. У вещественных чисел поля b и i будут равны нулю, у целых, при вычислении, придётся игнорировать дробную часть.
    Ответ написан
    Комментировать
  • По какой книге можно хорошо СИ изучить?

    @Wundarshular
    King - C Programming. A Modern Approach - довольно подробно описаны основы и некоторые тонкости. Для стандартов C89 и C99.
    Ответ написан
    Комментировать
  • Как соединить два видео (байтовые массивы) в один видео файл с#?

    @Wundarshular
    Следует посмотреть общую структуру файла. Как заметил LiptonOlolo, в начале файла идёт заголовок, описывающий дальнейшее содержимое, в том числе и длину файла в байтах. Так как у вас, в итоге, получается новый файл, следует также отредактировать его заголовок.
    Ответ написан
    Комментировать