Greed: Difference between revisions

1,685 bytes added ,  3 years ago
added Raku programming solution
(Add Z80 assembly version)
(added Raku programming solution)
Line 975:
end procedure
play()</lang>
 
=={{header|Raku}}==
{{trans|Phix}}
<lang perl6># 20200913 added Raku programming solution
 
srand 123456;
 
my @board = [ (1..9).roll xx my \w = 79 ] xx my \h = 22 ;
my \X = $ = w.rand.Int ; my \Y = $ = h.rand.Int;
@board[Y;X] = '@';
my \score = $ = 0;
 
sub execute (\y,\x) {
my \i = @board[Y+y;X+x];
if countSteps(i, x, y) {
score += i;
@board[ Y ; X ] = ' ' ;
@board[ Y+=y ; X+=x ] = ' ' for ^i;
}
}
 
sub countSteps(\i, \x, \y) {
my \tX = $ = X ; my \tY = $ = Y;
for (1..i) {
tX += x; tY += y;
return False if ( tX < 0 or tY < 0 or tX ≥ w or tY ≥ h or @board[tY;tX] eq ' ' )
}
return True;
}
 
sub existsMoves {
for (-1 .. 1) X (-1 .. 1) -> (\x,\y) {
next if x == 0 and y == 0;
next if X+x < 0 or X+x > w or Y+y < 0 or Y+y > h ;
my \i = @board[Y+y;X+x];
return True if ( i ne ' ' and countSteps(i, x, y) )
}
return False;
}
 
loop {
for @board { .join.print ; print "\r\n" } ;
{ say "Game over." and last } unless existsMoves();
print "Current score : ", score, "\r\n";
given my $c = $*IN.getc {
when 'q' { say "So long." and last}
when 'e' { execute(-1,-1) if X > 0 and Y > 0 } # North-West
when 'r' { execute(-1, 0) if Y > 0 } # North
when 't' { execute(-1, 1) if X < w and Y > 0 } # North-East
when 'd' { execute( 0,-1) if X > 0 } # West
when 'g' { execute( 0, 1) if X < w } # East
when 'x' { execute( 1,-1) if X > 0 and Y < h } # South-West
when 'c' { execute( 1, 0) if Y < h } # South
when 'v' { execute( 1, 1) if X < w and Y < h } # South-east
}
@board[Y;X] = '@';
}</lang>
 
=={{header|REXX}}==
350

edits