gpt4 book ai didi

raku - 创建并填充一组 Raku 对象?

转载 作者:行者123 更新时间:2023-12-04 17:29:35 28 4
gpt4 key购买 nike

我选择在 Perl 6 中重新设计我之前代码的一部分,在这种情况下是一个棋盘。前两个类运行良好(或者至少工作正常,我知道的很少,我无法确定它们的正确性) ,但我坚持第三。这是代码:

#!/home/hsmyers/rakudo741/bin/perl6
# board.p6 - Beginnings of a PGN toolset. And place to start learning
# Perl 6/Raku.
use v6d;

#!___________________________________________________________

constant $size = 4;

class Piece {
my Str @namesOfPieces[$size] = <
white-rook white-knight white-bishop white-queen
>;
my Str @abrevsOfPieces[$size] = <
R N B Q K B N R
>;
my Str @symbolsOfPieces[$size] = <
&#9814; &#9816; &#9815; &#9813; &#9812; &#9815; &#9816; &#9814;
>;
my Str @codeptsOfPieces[$size] = (
"\x2656", "\x2658", "\x2657", "\x2655",
);
has Str $.name;
has Str $.abrev;
has Str $.symbol;
has Uni $.codept;

submethod BUILD( :$i ) {
$!name = @namesOfPieces[$i];
$!abrev = @abrevsOfPieces[$i];
$!symbol = @symbolsOfPieces[$i];
$!codept = @codeptsOfPieces[$i].NFC;
}
}

class Square {
my Int @colors[$size] = <
1 0 1 0 1 0 1 0
>;
my Str @names[$size] = <
a1 b1 c1 d1 e1 f1 g1 h1
>;
has Int $.color;
has Int $.index;
has Str $.name;
has Piece $.piece;

submethod BUILD( :$i ) {
$!color = @colors[$i];
$!index = $i;
$!name = @names[$i];
$!piece = Piece.new(:i($i));
}
}

class Board is Array {
}

my $p = Piece.new(:i(0));
$p.say;
my $s = Square.new(:i(0));
$s.say;

#!___________________________________________________________

my @b := Board.new(
Square.new(:i(0)),
Square.new(:i(1)),
Square.new(:i(2))
);
say @b;
say @b.WHAT;

在 cli 上运行时,结果为:
Piece.new(name => "white-rook", abrev => "R", symbol => "♖", codept => Uni.new(0x2656).NFC)
Square.new(color => IntStr.new(1, "1"), index => 0, name => "a1", piece => Piece.new(name => "white-
rook", abrev => "R", symbol => "♖", codept => Uni.new(0x2656).NFC))
[Square.new(color => IntStr.new(1, "1"), index => 0, name => "a1", piece => Piece.new(name =>
"white-rook", abrev => "R", symbol => "♖", codept => Uni.new(0x2656).NFC)) Square.new(color =>
IntStr.new(0, "0"), index => 1, name => "b1", piece => Piece.new(name => "white-knight", abrev =>
"N", symbol => "♘", codept => Uni.new(0x2658).NFC)) Square.new(color => IntStr.new(1, "1"), index =>
2, name => "c1", piece => Piece.new(name => "white-bishop", abrev => "B", symbol => "♗", codept =>
Uni.new(0x2657).NFC))]
(Board)

到目前为止,我的尝试只剩下 Board 类(尽管它是空的)。令人惊讶的是(至少对我而言),它提供了一定程度的可操作性。它有不同的"new"和“构建”,都没有提供有效的解决方案。考虑到实际计数将是 64 而不是 4,当前的方法不起作用。

我目前的想法是我需要构建一个 64 个正方形的数组,这反过来将创建必要的部分。我试图添加到 self 没有任何效果。建议?

最佳答案

继承自 Array可能不是这里最好的设计选择;它揭示并致力于 Board 的底层表示,随着代码的发展,这将带来重构挑战。相反,我建议使用 Board有一个 ArraySquare , 用 Square 初始化对象。

假设董事会应该有 $size平方的地方,那么你可以做这样的事情:

class Board {
has @.squares[$size ** 2];

method TWEAK() {
@!squares = map { Square.new(i => $_ % $size) }, ^($size ** 2);
}
}

也就是说,取范围从 0 到但不包括 $size平方,然后将每个值映射到 Square实例。 (我们对索引求模以避免索引超出其他类别之一的范围。)

二维数组可能更可取:
class Board {
has @.squares[$size;$size];

method TWEAK() {
@!squares = (map -> $i { Square.new(:$i) }, ^$size) xx $size;
}
}

在这里,我们 map再次,但这次因为我们只是在做一维,所以我们放弃了模数。使用命名 $i参数意味着我们可以使用 :$i方便,是 :i($i) 的缩写(在您发布的代码中也有机会做到这一点)。然后我们将该表达式生成一行,并使用 xx运行它 $size次以获取每一列的数据。

最终,它可能不会像这样简单;也许 Square应该采用两个构造函数参数,一个数字和一个字母,以形成其名称。这可能是最好的方式 mapmap .进一步, Piece的初始化实例可能希望发生在 Board也;虽然我上次下国际象棋已经过去了四分之一个世纪,但我很确定在游戏开始时并不是每个方格上都有棋子。

关于raku - 创建并填充一组 Raku 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58920753/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com