Это держало меня в тупике довольно долгое время, я бы сделал что-то вроде этого:
Теперь, если вы console.log (дома), вы получите 3 случайных дома из случайных позиций (как указано выше) комментарий) позволение игрокам 2 и 3 получить дома раньше, чем игроки 1 и 2
Надеюсь, это поможет :) Кажется, это забавная игра:
//Houses Array:
var HousesArray = ['Stark', 'Lanister', 'Greyjoy', 'Barathion', 'Arryn', 'Tyrell', 'Martell', 'Targaryen'];
// stores the houses
var houses = [];
// Generates 3 random numbers and allows players 2 and 3 to get the houses early in position than player 1 and 2
var arr = [];
while (arr.length < 3) {
var r = Math.floor(Math.random() * 8);
if(arr.indexOf(r) === -1) arr.push(r);
}
// Pushed the houses to the house array
for (var x = 0; x < arr.length; x++) {
houses.push(HousesArray[arr[x]])
}
console.log(houses);
Сделайте приложение обычным приложением для Windows и, при необходимости, создайте консоль на лету.
Более подробная информация на по этой ссылке (код ниже)
using System;
using System.Windows.Forms;
namespace WindowsApplication1 {
static class Program {
[STAThread]
static void Main(string[] args) {
if (args.Length > 0) {
// Command line given, display console
if ( !AttachConsole(-1) ) { // Attach to an parent process console
AllocConsole(); // Alloc a new console
}
ConsoleMain(args);
}
else {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
private static void ConsoleMain(string[] args) {
Console.WriteLine("Command line = {0}", Environment.CommandLine);
for (int ix = 0; ix < args.Length; ++ix)
Console.WriteLine("Argument{0} = {1}", ix + 1, args[ix]);
Console.ReadLine();
}
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool AllocConsole();
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool AttachConsole(int pid);
}
}
Написать два приложения (одну консоль, одно окно), а затем написать другое приложение меньшего размера, которое на основе заданных параметров откроет одно из других приложений (а затем, вероятно, закроет себя, так как оно не будет больше не нужно)?
Я сделал это, создав два отдельных приложения.
Создайте приложение WPF с таким именем: MyApp.exe
. И создайте консольное приложение с таким именем: MyApp.com
. При вводе имени приложения в командной строке, например, MyApp
или MyApp / help
(без расширения .exe
) консольное приложение с . Расширение com
будет иметь приоритет. Вы можете сделать так, чтобы ваше консольное приложение вызывало MyApp.exe
в соответствии с параметрами.
Именно так ведет себя devenv. Ввод devenv
в командной строке запустит IDE Visual Studio. Если вы передадите такие параметры, как / build
, они останутся в командной строке.
Один из способов сделать это - написать приложение Window, которое не показывает окно, если аргументы командной строки указывают, что оно не должно.
Вы всегда можете получить аргументы командной строки и проверьте их, прежде чем показывать первое окно.
ПРИМЕЧАНИЕ. Я не проверял это, но считаю, что это будет работать ...
Вы можете сделать это:
Сделать ваше приложение приложением Windows Forms. Если вы получили запрос на консоль, не показывайте свою основную форму. Вместо этого используйте платформу invoke для вызова консольных функций в Windows API и выделения консоли на лету.
(Либо используйте API, чтобы скрыть консоль в консольном приложении, но вы ' вероятно, я увидел бы «мерцание» консоли, как оно было создано в этом случае ...)
Насколько я знаю, в исполняемом файле есть флаг, указывающий, запускать ли его как консольное или оконное приложение. Вы можете щелкнуть флаг с помощью инструментов, которые поставляются с Visual Studio, но вы не можете сделать это во время выполнения.
Если exe-файл скомпилирован как консоль, то он всегда будет открывать новую консоль, если она не запущена с одной. Если exe-приложение является приложением, оно не может быть выведено на консоль. Вы можете создать отдельную консоль, но она не будет вести себя как консольное приложение.
В прошлом мы использовали 2 отдельных exe-файла. Консоль, являющаяся тонкой оберткой над формой (вы можете ссылаться на exe, как если бы вы ссылались на dll, и вы можете использовать атрибут [assembly: InternalsVisibleTo ("cs_friend_assemblies_2")], чтобы доверять консоли, так что вы не должны нужно выставить больше, чем нужно).
Я бы создал решение, которое представляет собой приложение Windows Form, так как есть две функции, которые вы можете вызвать, которые подключатся к текущей консоли. Таким образом, вы можете рассматривать программу как консольную программу. или по умолчанию вы можете запустить графический интерфейс.
Функция AttachConsole не будет создавать новую консоль. Для получения дополнительной информации о AttachConsole, посмотрите PInvoke: AttachConsole
Ниже приведен пример программы, как его использовать.
using System.Runtime.InteropServices;
namespace Test
{
/// <summary>
/// This function will attach to the console given a specific ProcessID for that Console, or
/// the program will attach to the console it was launched if -1 is passed in.
/// </summary>
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool AttachConsole(int dwProcessId);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool FreeConsole();
[STAThread]
public static void Main()
{
Application.ApplicationExit +=new EventHandler(Application_ApplicationExit);
string[] commandLineArgs = System.Environment.GetCommandLineArgs();
if(commandLineArgs[0] == "-cmd")
{
//attaches the program to the running console to map the output
AttachConsole(-1);
}
else
{
//Open new form and do UI stuff
Form f = new Form();
f.ShowDialog();
}
}
/// <summary>
/// Handles the cleaning up of resources after the application has been closed
/// </summary>
/// <param name="sender"></param>
public static void Application_ApplicationExit(object sender, System.EventArgs e)
{
FreeConsole();
}
}
Нет 1. Легко.
Нет 2, я не думаю.
Документы говорят:
Вызовы, такие как Write и WriteLine, не влияют на приложения Windows.
Класс System.Console инициализируется по-разному в приложениях консоли и графического интерфейса. Вы можете убедиться в этом, посмотрев класс Console в отладчике в каждом типе приложения. Не уверен, есть ли способ его инициализации.
Демо: Создайте новое приложение Windows Forms, затем замените метод Main следующим:
static void Main(string[] args)
{
if (args.Length == 0)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
else
{
Console.WriteLine("Console!\r\n");
}
}
Идея состоит в том, что любые параметры командной строки будут выводиться на консоль и завершаться. Когда вы запускаете его без аргументов, вы получаете окно. Но когда вы запускаете его с аргументом командной строки, ничего не происходит.
Затем выберите свойства проекта, измените тип проекта на «Консольное приложение» и перекомпилируйте. Теперь, когда вы запускаете его с аргументом, вы получаете «Консоль!» Как ты хочешь. И когда вы запускаете его (из командной строки) без аргументов, вы получаете окно. Но командная строка не вернется, пока вы не выйдете из программы. И если вы запустите программу из Explorer, откроется командное окно, а затем вы получите окно.