Я пытаюсь создать генератор лабиринта, и у меня возникают проблемы с моим кодом. Я относительно новичок в Perl, так голый со мной. В начале моего скрипта я создаю многомерный массив (@maze
) с X числом столбцов и Y числом строк. Существует цикл, который выполняет итерацию через массив и устанавливает все элементы в начальное значение 1. Подпрограмма get_neighbors
предполагает создание хэша с ключами top
, right
, bottom
, left
. Затем он устанавливает значения для этих ключей на основе кодов x
и y
, которые передаются. Для ключа top
я устанавливаю его значение непосредственно над элементом, который должен быть [ $y - 1 ][ $x ]
. Я предполагал, что если, например, были переданы координаты 0, 0
, то top
будет установлен в undef, так как это не действительный элемент/позиция, но это не так. Оно установлено на 1. Не знаете, почему .. Наделся кто-то может определить и объяснить, почему это происходит. Вот весь сценарий:Неожиданные значения в хеше?
#!/usr/bin/perl
use warnings;
use strict;
use Switch;
use Data::Dumper;
# Rows is set equal to the first arg passed in
# unless it hasn't been. If it hasn't been, the
# value defaults to 60. This also applies to the
# columns.
my $rows = (defined($ARGV[ 0 ]) ? $ARGV[ 0 ] : 60);
my $cols = (defined($ARGV[ 1 ]) ? $ARGV[ 1 ] : 60);
my $cells = $rows * $cols;
my @maze;
# "Pre-allocate" each "Cell" for the maze.
for(my $y = 0; $y < $rows; ++$y) {
for(my $x = 0; $x < $cols; ++$x) { $maze[ $y ][ $x ] = 1; }
}
# Run
main();
#--------------------------
# Main ~
#--------------------------
sub main {
print Dumper(get_neighbors(0, 0));
generate();
print_maze();
return;
}
#--------------------------
# Generate the maze w/ BFS
#--------------------------
sub generate {
return;
}
#--------------------------
# Print maze to console
#--------------------------
sub print_maze {
for(my $y = 0; $y < $rows; ++$y) {
for(my $x = 0; $x < $cols; ++$x) {
print $maze[ $y ][ $x ] . " ";
}
print "\n";
}
}
#--------------------------
# Returns the values of
# neighboring cells
#--------------------------
sub get_neighbors {
my $x = shift;
my $y = shift;
my %neighbors;
$neighbors{'top'} = defined($maze[ $y - 1 ][ $x ]) ? $maze[ $y - 1 ][ $x ] : undef;
$neighbors{'bottom'} = defined($maze[ $y + 1 ][ $x ]) ? $maze[ $y + 1 ][ $x ] : undef;
$neighbors{'left'} = defined($maze[ $y ][ $x - 1 ]) ? $maze[ $y ][ $x - 1 ] : undef;
$neighbors{'right'} = defined($maze[ $y ][ $x + 1 ]) ? $maze[ $y ][ $x + 1 ] : undef;
return %neighbors;
}
Выездной когда я бег этот сценарий:
# perl mazegen.pl 10 10
$VAR1 = 'left';
$VAR2 = 1;
$VAR3 = 'right';
$VAR4 = 1;
$VAR5 = 'top';
$VAR6 = 1;
$VAR7 = 'bottom';
$VAR8 = 1;
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
Заметим, что '$ соседей { 'сверху'} = определена ($ лабиринте [ $ y - 1] [$ x])? $ maze [$ y - 1] [$ x]: undef' * совпадает * с '$ neighbors {'top'} = $ maze [$ y-1] [$ x]'. Кроме того, вы можете использовать определенные или для 'my $ rows = (определенные ($ ARGV [0])? $ ARGV [0]: 60)' писать 'my $ rows = $ ARGV [0] // 60' , Также лучше избегать цикла 'for' C-стиля и итерации по диапазону, поэтому' for (my $ y = 0; $ y <$ rows; ++ $ y) {...} 'становится' для my $ y (0 .. $ rows-1) {...} ' – Borodin