Я согласен с более ранними ответами о том, что реальная случайность в небольших тиражах некоторых игр нежелательна - для некоторых случаев использования она кажется слишком несправедливой.
Я написал простую сумку в случайном порядке, как в Ruby, и сделал некоторые тесты. Реализация сделала это:
Это считается несправедливым на основе граничных вероятностей. Например, для вероятности 20% вы можете установить 10% в качестве нижней границы и 40% в качестве верхней границы.
Используя эти границы, я обнаружил, что с прогонами 10 ударов 14,2% время, когда истинная псевдослучайная реализация дала результаты, которые были вне этих границ. Примерно в 11% случаев, 0 критических ударов были забиты в 10 попытках. 3,3% времени, 5 или более критических ударов были высажены из 10. Естественно, используя этот алгоритм (с минимальным количеством рулонов 5), гораздо меньшее количество (0,03%) пробелов «Fairish» было за пределами границ , Даже если приведенная ниже реализация не подходит (возможно, более умные вещи можно сделать, конечно), стоит отметить, что часто пользователи могут почувствовать, что это несправедливо с реальным псевдослучайным решением.
Вот мясо мой FairishBag
написан на Ruby.
def fire!
hit = if @rolls >= @min_rolls && observed_probability > @unfair_high
false
elsif @rolls >= @min_rolls && observed_probability < @unfair_low
true
else
rand <= @probability
end
@hits += 1 if hit
@rolls += 1
return hit
end
def observed_probability
@hits.to_f / @rolls
end
Обновление: использование этого метода увеличивает общую вероятность получения критического удара, примерно до 22%, используя границы выше. Вы можете компенсировать это, установив свою «реальную» вероятность немного ниже. Вероятность 17,5% с помощью волшебной модификации дает наблюдаемую долгосрочную вероятность около 20% и сохраняет справедливость в краткосрочной перспективе.
У меня есть диалоговое окно, которое я записал, назвал диалоговое окно OpenFileOrFolder, которое позволяет Вам открывать или папку или файл.
, Если Вы устанавливаете его значение AcceptFiles ко лжи, затем она работает в, только принимают режим папки.
Попробуйте этого от Codeproject (кредит к Нитрону):
я думаю, что это - то же диалоговое окно, о котором Вы говорите - возможно, помогло бы, добавляете ли Вы снимок экрана?
bool GetFolder(std::string& folderpath, const char* szCaption=NULL, HWND hOwner=NULL)
{
bool retVal = false;
// The BROWSEINFO struct tells the shell how it should display the dialog.
BROWSEINFO bi;
memset(&bi, 0, sizeof(bi));
bi.ulFlags = BIF_USENEWUI;
bi.hwndOwner = hOwner;
bi.lpszTitle = szCaption;
// must call this if using BIF_USENEWUI
::OleInitialize(NULL);
// Show the dialog and get the itemIDList for the selected folder.
LPITEMIDLIST pIDL = ::SHBrowseForFolder(&bi);
if(pIDL != NULL)
{
// Create a buffer to store the path, then get the path.
char buffer[_MAX_PATH] = {'\0'};
if(::SHGetPathFromIDList(pIDL, buffer) != 0)
{
// Set the string value.
folderpath = buffer;
retVal = true;
}
// free the item id list
CoTaskMemFree(pIDL);
}
::OleUninitialize();
return retVal;
}
Можно использовать код как это
К усовершенствованному скрываются текстового поля для имени файла, на которое необходимо посмотреть OpenFileDialogEx
код:
{
openFileDialog2.FileName = "\r";
openFileDialog1.Filter = "folders|*.neverseenthisfile";
openFileDialog1.CheckFileExists = false;
openFileDialog1.CheckPathExists = false;
}
Я предполагаю, что Вы находитесь на Vista с помощью VS2008? В этом случае я думаю, что опция FOS_PICKFOLDERS используется при вызове диалогового окна файла Vista IFileDialog. Я боюсь, что в.NET кодируют, это включило бы много непростого кода P/Invoke interop для получения работы.
Хорошо, позвольте мне попытаться соединить первую точку ;-) Проигрывание немного со Шпионом ++ или Winspector показывает, что текстовое поле Folder в Месте Проекта VS является настройкой стандартного диалогового окна. Это не то же поле как текстовое поле имени файла в стандартном диалоговом окне файла, таком как то в Блокноте.
Оттуда на, я фигурирую, VS скрывает текстовые поля/поля комбинированного списка имени файла и типа файла и использует пользовательский диалоговый шаблон для добавления его собственной части в нижней части диалогового окна.
РЕДАКТИРОВАНИЕ: вот пример такой настройки и как сделать это (в Win32. не.NET):
m_ofn является структурой OPENFILENAME, которая лежит в основе диалогового окна файла. Добавьте эти 2 строки:
m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FILEDIALOG_IMPORTXLIFF);
m_ofn.Flags |= OFN_ENABLETEMPLATE;
, где IDD_FILEDIALOG_IMPORTXLIFF является пользовательским диалоговым шаблоном, который будет добавлен в нижней части диалогового окна. Посмотрите часть красного цвета ниже.
(источник: apptranslator.com )
В этом случае, специализированная часть является только маркировкой + гиперссылка, но это могло быть любое диалоговое окно. Это могло содержать кнопку OK, которая позволит нам проверить папку только выбор.
, Но как мы избавились бы от некоторых средств управления в стандартном компоненте диалогового окна, я не знаю.
[еще 1113] деталь в эта статья .MSDN
Точная Аудио Копия прокладывает себе путь на Windows XP. Стандартный файл открывается, диалоговое окно показывают, но поле имени файла содержит текст "Имя файла, будет проигнорирован".
Просто предположение здесь, но я подозреваю, что строка введена в средства редактирования поля комбинированного списка каждый раз, когда существенное изменение внесено в диалоговое окно. Пока поле не является пробелом, и диалоговые флаги установлены не проверить существование файла, диалоговое окно может обычно закрываться.
Редактирование: это намного легче, чем я думал. Вот является код в C++ / MFC, можно перевести его в среду по Вашему выбору.
CFileDialog dlg(true, NULL, "Filename will be ignored", OFN_HIDEREADONLY | OFN_NOVALIDATE | OFN_PATHMUSTEXIST | OFN_READONLY, NULL, this);
dlg.DoModal();
Редактирование 2: Это должно быть переводом в C#, но я не бегло говорю на C#, так не стреляйте в меня, если он не работает.
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.FileName = "Filename will be ignored";
openFileDialog1.CheckPathExists = true;
openFileDialog1.ShowReadOnly = false;
openFileDialog1.ReadOnlyChecked = true;
openFileDialog1.CheckFileExists = false;
openFileDialog1.ValidateNames = false;
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
// openFileDialog1.FileName should contain the folder and a dummy filename
}
Редактирование 3: Наконец посмотрел на фактическое рассматриваемое диалоговое окно, в Visual Studio 2005 (у меня не было доступа к нему ранее). Это не стандартный файл открытое диалоговое окно! , Если Вы осматриваете окна в Шпионе ++ и сравниваете их со стандартным открытым файлом, Вы будете видеть, что структура и имена классов не соответствуют. Когда Вы смотрите тесно, можно также определить некоторые различия между содержанием диалоговых окон. Мое заключение состоит в том, что Microsoft полностью заменила стандартное диалоговое окно в Visual Studio, чтобы дать ему эту возможность. Мое решение или что-то подобное будут так близки, как можно добраться, если Вы не готовы кодировать свое собственное с нуля.
Лучше использовать FolderBrowserDialog для этого.
using (FolderBrowserDialog dlg = new FolderBrowserDialog())
{
dlg.Description = "Select a folder";
if (dlg.ShowDialog() == DialogResult.OK)
{
MessageBox.Show("You selected: " + dlg.SelectedPath);
}
}
Ookii. Диалоговые окна пакет содержат управляемую оболочку вокруг нового (стиль Vista) диалоговое окно браузера папки. Это также ухудшается корректно в более старых операционных системах.
Можно использовать FolderBrowserDialogEx - допускающая повторное использование производная встроенного FolderBrowserDialog. Этот позволяет Вам вводить в пути, даже пути UNC. Можно также просмотреть для компьютеров или принтеров с ним. Работы точно так же, как встроенный FBD, но... лучше.
(РЕДАКТИРОВАНИЕ: Я должен был указать, что это диалоговое окно может быть установлено выбрать файлы или папки.)
Полный Исходный код (один короткий модуль C#). Свободный. Общедоступная MS лицензия.
Код для использования его:
var dlg1 = new Ionic.Utils.FolderBrowserDialogEx();
dlg1.Description = "Select a folder to extract to:";
dlg1.ShowNewFolderButton = true;
dlg1.ShowEditBox = true;
//dlg1.NewStyle = false;
dlg1.SelectedPath = txtExtractDirectory.Text;
dlg1.ShowFullPathInEditBox = true;
dlg1.RootFolder = System.Environment.SpecialFolder.MyComputer;
// Show the FolderBrowserDialog.
DialogResult result = dlg1.ShowDialog();
if (result == DialogResult.OK)
{
txtExtractDirectory.Text = dlg1.SelectedPath;
}
Можно разделить диалоговое окно файла на подклассы и получить доступ ко всем его средствам управления. У каждого есть идентификатор, который может использоваться для получения его дескриптора окна. Можно затем показать и скрыть их, получить сообщения от них об изменениях выбора и т.д. и т.д. Все это зависит, сколько усилий Вы хотите приложить.
Мы сделали наш использование поддержка класса WTL и настроили диалоговое окно файла для включения пользовательской панели мест и сменных представлений COM.
MSDN предоставляет информацию о том, как сделать это использование Win32, , эта статья CodeProject включает пример , и , эта статья CodeProject предоставляет пример.NET .