Я реализую игру, похожую на шашки, и мне нужна последовательность, которая перечисляет все допустимые ходы для данной конфигурации.
] У меня есть следующая функция, прямо переведенная с C #:
seq {
for y1 = 0 to BOARDSIZE-1 do
for x1 = 0 to BOARDSIZE-1 do
for dy = -2 to 2 do
for dx = -2 to 2 do
let x2 = x1 + dx;
let y2 = y1 + dy;
let currentMove = new MoveStruct(x1, y1, x2, y2);
if (currentMove.SomeCondition = true) then
yield currentMove;
}
Она работает, но неудобна, и не совсем в духе F #, не говоря уже о том, что у меня есть скрытое подозрение, что я выполнение m здесь не является оптимальным с точки зрения производительности.
Я бы хотел «сгладить это» до чего-то, что использует комбинацию «итерация по всем ячейкам», «итерация по всем допустимым ходам из этой ячейки».
И вот функции, которые я надеюсь объединить:
let AllCells =
seq {
for y=0 to BOARDSIZE-1 do
for x=0 to BOARDSIZE-1 do
yield (x,y);
};
И
let LegalMovesAround(x1,y1) =
seq {
if board.[x1, y1] = WHITE then
for dy = -2 to 2 do
for dx = -2 to 2 do
let x2 = x1 + dx;
let y2 = y1 + dy;
let currentMove = new MoveStruct(x1, y1, x2, y2);
if (currentMove.DetermineMoveType <> MoveType.ILLEGAL
&& board.[x2, y2] = NONE) then
yield currentMove;
}
Я избавлю вас от подробностей моих различных попыток заставить это работать, потому что ни одна из них не увенчалась успехом. Но, короче говоря, лучшее, что я мог придумать, - это итератор, который возвращает seq с каждым yield, вместо сглаженной версии, которую я ищу, которая возвращала бы простой MoveStruct.
Кто-нибудь знает, как объединить AllCells и LegalMovesAround (x, y)?
С уважением, во что-то, что использует комбинацию «итерация по всем ячейкам», «итерация по всем допустимым ходам из этой ячейки».
А вот функции, которые я надеюсь объединить:
let AllCells =
seq {
for y=0 to BOARDSIZE-1 do
for x=0 to BOARDSIZE-1 do
yield (x,y);
};
И
let LegalMovesAround(x1,y1) =
seq {
if board.[x1, y1] = WHITE then
for dy = -2 to 2 do
for dx = -2 to 2 do
let x2 = x1 + dx;
let y2 = y1 + dy;
let currentMove = new MoveStruct(x1, y1, x2, y2);
if (currentMove.DetermineMoveType <> MoveType.ILLEGAL
&& board.[x2, y2] = NONE) then
yield currentMove;
}
Я собираюсь избавить вас от подробностей моих различных попыток заставить его работать, потому что ни одна из них не увенчалась успехом. Но, короче говоря, лучшее, что я мог придумать, - это итератор, который возвращает seq с каждым yield, вместо сглаженной версии, которую я ищу, которая возвращала бы простой MoveStruct.
Кто-нибудь знает, как объединить AllCells и LegalMovesAround (x, y)?
С уважением, во что-то, что использует комбинацию «итерация по всем ячейкам», «итерация по всем допустимым ходам из этой ячейки».
А вот функции, которые я надеюсь объединить:
let AllCells =
seq {
for y=0 to BOARDSIZE-1 do
for x=0 to BOARDSIZE-1 do
yield (x,y);
};
И
let LegalMovesAround(x1,y1) =
seq {
if board.[x1, y1] = WHITE then
for dy = -2 to 2 do
for dx = -2 to 2 do
let x2 = x1 + dx;
let y2 = y1 + dy;
let currentMove = new MoveStruct(x1, y1, x2, y2);
if (currentMove.DetermineMoveType <> MoveType.ILLEGAL
&& board.[x2, y2] = NONE) then
yield currentMove;
}
Я собираюсь избавить вас от подробностей моих различных попыток заставить его работать, потому что ни одна из них не увенчалась успехом. Но, короче говоря, лучшее, что я мог придумать, - это итератор, который возвращает seq с каждым yield, вместо сглаженной версии, которую я ищу, которая возвращала бы простой MoveStruct.
Кто-нибудь знает, как объединить AllCells и LegalMovesAround (x, y)?
С уважением, Я избавлю вас от подробностей моих различных попыток заставить его работать, потому что ни одна из них не увенчалась успехом. Но, короче говоря, лучшее, что я мог придумать, - это итератор, который возвращает seq с каждым yield, вместо сглаженной версии, которую я ищу, которая возвращала бы простой MoveStruct.
Кто-нибудь знает, как объединить AllCells и LegalMovesAround (x, y)?
С уважением, Я избавлю вас от подробностей моих различных попыток заставить его работать, потому что ни одна из них не увенчалась успехом. Но, короче говоря, лучшее, что я мог придумать, - это итератор, который возвращает seq с каждым yield вместо сглаженной версии, которую я ищу, которая возвращала бы простой MoveStruct.
Кто-нибудь знает, как объединить AllCells и LegalMovesAround (x, y)?
С уважением, Aleks