Попробуйте обернуть вашу еду в цикл for + if:
var foodNotPlaced;
snake.forEach(function(segment) {
if (food.x != segment.x and food.y != segment.y) {
ctx.fillStyle = 'red';
ctx.fillRect(food.x, food.y, unit, unit);
foodNotPlaced = false;
}
else {
food.x = Math.floor(Math.random()*((cvsW/unit)-1)+1)*unit;
food.y = Math.floor(Math.random()*((cvsW/unit)-1)+1)*unit;
foodNotPlaced = True;
});
Затем перезапустите цикл while, чтобы убедиться, что еда размещена до выполнения остальной части кода
[ 111]Одна опция состоит в том, чтобы сделать params
параметр object[]
:
static string appendFolders(params object[] folders)
{ return (string) folders.Aggregate("",(output, f) =>
Path.Combine( (string)output
,(f is string[])
? appendFolders((object[])f)
: ((string)f).TrimStart('\\')));
}
Если Вы хотите что-то более со строгим контролем типов, другая опция состоит в том, чтобы создать тип таможенного союза с неявными операторами преобразования:
static string appendFolders(params StringOrArray[] folders)
{ return folders.SelectMany(x=>x.AsEnumerable())
.Aggregate("",
(output, f)=>Path.Combine(output,f.TrimStart('\\')));
}
class StringOrArray
{ string[] array;
public IEnumerable<string> AsEnumerable()
{ return soa.array;}
public static implicit operator StringOrArray(string s)
{ return new StringOrArray{array=new[]{s}};}
public static implicit operator StringOrArray(string[] s)
{ return new StringOrArray{array=s};}
}
В любом случае это скомпилирует:
appendFolders("base", "v1", "module", new[]{"debug","bin"});
Просто передайте его. Параметр папок является массивом сначала. "params" функциональность является определенным волшебством компилятора, но это не требуется.
AppendFolders(extraFolders);
Теперь, это этот экземпляр макрочастицы, необходимо будет добавить некоторые вещи к тому массиву, сначала.
List<string> lstFolders = new List<string>(extraFolders);
lstFolder.Insert(0, callingModule);
lstFolder.Insert(0, version);
lstFolder.Insert(0, basefolder);
return AppendFolders(lstFolders.ToArray());
Я придерусь с термином "коллапс", так как кажется, что Вы действительно хотите "расшириться". И я не уверен, что Вы подразумеваете под решениями, "имеющими отношение непосредственно к ключевому слову параметрических усилителей" и что "Вы не интересуетесь обходными решениями". В конце или необходимо передать много строк - который компилятор волшебно упакует в массив - или массив строк непосредственно. Однако мое решение (не изменяя интерфейс) пошло бы что-то как:
return AppendFolders(new string[] { basefolder, version, callingModule }.Concat(extraFolders).ToArray());
Править:
В то время как Вы не можете добавить оператор с помощью дополнительных методов, Вы могли сделать:
return AppendFolders(new string[] { baseFolder, callingModuleName, version }.Concat(extraFolders));
public static T[] Concat<T>(this T[] a, T[] b) {
return ((IEnumerable<T>)a).Concat(b).ToArray();
}
Но, если мы собираемся пойти, что далеко - мог бы также просто расширить Список <T> для обработки этого изящно:
return AppendFolders(new Params<string>() { baseFolder, callingModuleName, version, extraFolders });
class Params<T> : List<T> {
public void Add(IEnumerable<T> collection) {
base.AddRange(collection);
}
public static implicit operator T[](Params<T> a) {
return a.ToArray();
}
}
Быстрое и грязное решение состояло бы в том, чтобы создать Список <строка> из объектов и затем передать это (с ToArray ()).
Обратите внимание, что Вы не должны тестировать на обратную косую черту. Путь. Объединение обрабатывает грязные довольно прекрасные вещи.
Я думаю, что ответ OregonGhost является, вероятно, путем, которым Вы хотите пойти. Только для разработки его он предлагает делать что-то вроде этого:
public string GetPath(string basefolder, string[] extraFolders)
{
string version = Versioner.GetBuildAndDotNetVersions();
string callingModule = StackCrawler.GetCallingModuleName();
List<string> parameters = new List<string>(extraFolders.Length + 3);
parameters.Add(basefolder);
parameters.Add(version);
parameters.Add(callingModule);
parameters.AddRange(extraFolders);
return AppendFolders(parameters.ToArray());
}
И я не подразумеваю, что как урок по тому, как использовать Списки, так же мало разъяснения для кого-либо, кто может приехать, ища решение в будущем.