최근 Perl에 쓴 Conway의 Game of Life의 C++ 코드를 복사하기 시작했습니다. 그리고 나는 그것을 거의 한 마디로 복사했습니다. 그러나 C++ 코드의 출력은 Perl과 크게 다릅니다. C++ 코드는 완벽하게 실행되지만 Perl 코드는 이상한 동작을합니다. 지금까지 생명의 게임을 본 사람이라면이 게임의 다음과 같은 상태가 이상한 것을 볼 수 있어야합니다Perl에서의 Game of Life - C++에서 코드 번역 문제
[][] [] [] [] [][][] [] [] [] [] [] [] [][] []
[] [] [] [] [] [] [] [][] [] [] [][] [] [] []
[] [][] [] [] [] [] [] [][][][] [] [] [][][][][] [] []
[] [][] [] [] [] [][][][] [] [] [] [] [][] []
[] [][] [] [] [][][] [] [] [] [] [][] [] []
[] [] [][][][][] [] [] [][] [][] [] [][] [] [][][] []
[] [] [] [][][] [][] [][][] [][][] [] []
[] [] [][][][][][][][][][] [][][][][] [] []
[][] [] [][][][][][][] [][][] [][] [][] []
[] [] [][][][] [] [] [] [] [][][] []
[][] [] [] [] [] [] [][] [] [][]
[] [] [][] [] [][][][] [][] [] []
[][] [] [][][][][] [][][] [][][][][][][][] [][]
[] [] [] [] [] [][][][] [][]
[][] [] [] [] [] [] [] [][][] [][][][][][][][]
[][] [] [] [] [] [] [] [][][][] [] [][] [][]
[] [][] [] [][] [] [] [][][][] [][][]
[] [][][][] [] [] [] [] [] [] [] [] [] [] [] []
[][][] [][][] [] [][] [][] [] [] [] []
[] [][][] [] [][] [][] [] [] [] [][] []
[][] [] [] [][][][][][] [][] [] [] []
[] [] [][][][][][][][][] [] [] [] [] [][][]
[][] [][][] [] [] [][] [] [] [] [][] [] [] []
[] [] [] [][] [][][][][][][] [] [][] [] [] [] []
각 []
은 살아있는 세포를 나타내고, 두 공백은 죽은 세포를 나타내고있다. 이상한 부분은 코드를 실행하려는 많은 시도에서 나타나는 수평선과 수직선입니다. 나는 예상 된 행동 (글라이더, 발진기 등)을 아직 보지 못했습니다.
내 코드는 다음과 같습니다. 어떤 도움이나 명확한 설명을 해주시면 감사하겠습니다. 미리 감사드립니다!
#!/usr/bin/perl
use warnings;
use strict;
use Curses;
use Time::HiRes 'usleep';
my $iterations = 100;
$iterations = $ARGV[0] if @ARGV;
initscr;
getmaxyx(my $rows, my $columns);
$columns = int($columns/2);
my ($i, $j);
my @initial_state;
foreach $i (0 .. $rows) {
foreach $j (0 .. $columns) {
$initial_state[$i][$j] = int rand(2);
}
}
my @current_state = @initial_state;
my @next_state;
my $iteration;
my ($up, $down, $right, $left);
my $adjacent_cells;
foreach $iteration (0 .. $iterations) {
foreach $i (0 .. $rows) {
foreach $j (0 .. $columns) {
$up = ($i + 1) % $rows;
$down = ($i - 1) % $rows;
$right = ($j + 1) % $columns;
$left = ($j - 1) % $columns;
$adjacent_cells = $current_state[$i][$right]
+ $current_state[$i][$left]
+ $current_state[$up][$right]
+ $current_state[$up][$left]
+ $current_state[$down][$right]
+ $current_state[$down][$left]
+ $current_state[$up][$j]
+ $current_state[$down][$j];
if ($current_state[$i][$j]) {
$next_state[$i][$j] = $adjacent_cells == 2 || $adjacent_cells == 3 ? 1 : 0;
addstr($i, 2*$j, '[]');
}
else {
$next_state[$i][$j] = $adjacent_cells == 3 ? 1 : 0;
addstr($i, 2*$j, ' ');
}
}
}
@current_state = @next_state unless $iteration == $iterations;
usleep 10000;
refresh();
}
getch();
endwin();
빈 공간으로 둘러싸인 글라이더의 초기 상태를 구성 해 보았습니까? 아니면 비슷하게 간단한 무엇입니까? 그것은 무엇을합니까? – spraff
@spraff 네, 방금 시도했습니다. 나는 왼쪽 상단 모서리에 외로운 글라이더를 씌우고 단지 하나의 반복이 끝나면 모양을 바꾸어 (글라이더가 아닌 형태로) 끝까지 놓고 머물렀다. –
그것은 def. 실제 질문에 대한 답변이 아니지만 Conways Game of Life의 [Threaded PDL] (http://pdl.perl.org/?docs=Threading&title=PDL::Threading#threaded_pdl_implementation) 구현을 보았습니까? –