Asynchronous 还有比赛条件吗?

Asynchronous 还有比赛条件吗?,asynchronous,raku,Asynchronous,Raku,这就是我这个不重要的异步实验的当前状态。你能发现任何赛车或漏洞吗?共同的批评也是受欢迎的 class GameObject { has Int $.id; has Int $.x is rw; has Int $.y is rw; has $.game; has Int $.speed; #the higher the faster multi method start( &action ) { start {

这就是我这个不重要的异步实验的当前状态。你能发现任何赛车或漏洞吗?共同的批评也是受欢迎的

class GameObject
{
    has Int $.id;
    has Int $.x is rw;
    has Int $.y is rw;
    has $.game;
    has Int $.speed; #the higher the faster

    multi method start( &action )
    {
        start {
            loop {
                &action();
                await Promise.in( 1 / self.speed );
            }
            #$.game.remove-object( self );
        }
    }

    method speed {
        $!speed + 
            # 33% variation from the base speed in either direction
            ( -($!speed / 3).Int .. ($!speed / 3).Int ).pick
            ;
    }

    submethod DESTROY { say "DESTROY" }
}

role UnnecessaryViolence
{
    has $.damage;
    has $.hitpoints is rw;
    has $.offense;
    has $.defense;

    method attack ( GameObject $target )
    {
        say "The {self.WHAT.perl} ({self.id}) attacks the {$target.WHAT.perl} ({$target.id})";

        my $attacker = roll( $.offense, 1 .. 6 ).sum;
        say "The {self.WHAT.perl} rolls $attacker";

        my $defender = roll( $target.defense, 1 .. 6 ).sum;
        say "The {$target.WHAT.perl} rolls $defender";

        if $attacker > $defender 
        {
            my $damage = ( 1 .. $!damage ).pick;
            say "The {self.WHAT.perl} inflicts {$damage} damage";

            $target.hitpoints -= $damage ;
        }

        if $target.hitpoints < 0
        {
            say "The {$target.WHAT.perl} is dead";
            return True;
        }
        else
        {
            say "The {$target.WHAT.perl} has { $target.hitpoints } hitpoints left";
            return False;
        }
    }
}

class Player is GameObject does UnnecessaryViolence
{
    has $.name;

    multi method start
    {
        say "A hero was born.";
        self.start({
            # say "The hero is moving";
            # keyboard logic here, in the meantime random movement
            $.game.channel.send( { object => self, x => (-1 .. 1).pick, y => (-1 .. 1).pick } );
        });
    }
}

class Monster is GameObject does UnnecessaryViolence
{
    has $.species;

    multi method start
    {
        say "A monster hatched.";
        self.start({
            # say "The monster {self.id} is moving";
            # AI logic here, in the meantime random movement
            $.game.channel.send( { object => self, x => (-1 .. 1).pick, y => (-1 .. 1).pick } );
        });
    }
}

class Game
{
  my $idc = 0;

    has GameObject @.objects is rw;
    has Channel $.channel = .new;

    method run{
        self.setup;
        self.mainloop;
    }

    method setup
    {
        self.add-object( Monster.new( :id(++$idc), :species("Troll"), :hitpoints(20), :damage(14), :offense(3), :speed(400), :defense(3), :x(4), :y(2), :game(self) ) );
        self.add-object( Monster.new( :id(++$idc), :species("Troll"), :hitpoints(25), :damage(16), :offense(3), :speed(300), :defense(3), :x(3), :y(2), :game(self) ) );
        self.add-object( Player.new( :id(++$idc), :name("Holli"), :hitpoints(50), :damage(60), :offense(4), :speed(200) :defense(2), :x(0), :y(0), :game(self) ) );
    }

    method add-object( GameObject $object )
    {
        @!objects.push( $object );
        $object.start;
    }

    method remove-object( GameObject $object )
    {
        @!objects = @!objects.grep({ !($_ === $object) });
    }

    method mainloop 
    { 
        react {
            whenever $.channel.Supply -> $event
            {
                self.process-movement( $event );

                if self.game-is-over
                {
                    "Game over. The {@!objects[0].WHAT.perl} has won".say;
                    $.channel.close;
                    done;
                };

            };
            whenever Supply.interval(0.01) {
                self.render;
            }
        }

    }

    method process-movement( $event )
    {
        #say "The {$event<object>.WHAT.perl} moves.";
        given $event<object>
        {
            my $to-x = .x + $event<x>;
            my $to-y = .y + $event<y>;

            for @!objects -> $object
            {
                # we don't care abour ourselves
                next 
                    if $_ === $object;

                # see if anything is where we want to be
                if ( $to-x == $object.x && $to-y == $object.y )
                {
                    # can't move, blocked by friendly
                    return 
                        if $object.WHAT eqv .WHAT;

                    # we found a monster, see if we can
                    # kill it and move there
                    return
                        unless .attack( $object );

                    # Something just died
                    self.remove-object( $object );
                    last;
                }
            }

            # we won the fight or the place is empty
            # so let's move
            .x = $to-x ==  5  ?? -4 !!
                 $to-x == -5  ?? 4  !!
                 $to-x;

            .y = $to-y ==  5  ?? -4 !!
                 $to-y == -5  ?? 4  !!
                 $to-y;

        }
    }

    method render
    {
        for @!objects -> $object {
            "The {$object.WHAT.perl} is at {$object.x},{$object.y}".say;
        }
    }

    method game-is-over {
        return (@!objects.map({.WHAT})).unique.elems == 1;
    }
}


Game.new.run;
类游戏对象
{
具有Int$.id;
有Int$。x是rw;
有Int$。y是rw;
有$游戏;
有Int$.speed;#越高速度越快
多方法启动(&操作)
{
开始{
环路{
&动作();
等待承诺(1/自我速度);
}
#$.game.移除对象(自身);
}
}
方法速度{
$!速度+
#在任一方向上与基准速度相差33%
($!speed/3.Int.($!speed/3.Int).pick
;
}
子方法DESTROY{说“DESTROY”}
}
不必要的暴力
{
造成$.损失;
拥有$。生命值为rw;
有……次进攻;
拥有万美元的防御;
方法攻击(游戏对象$target)
{
说“{self.WHAT.perl}({self.id})攻击{$target.WHAT.perl}({$target.id})”;
我的$attacker=掷骰($.attack,1..6).sum;
说“{self.WHAT.perl}抛出$attacker”;
我的$defender=掷骰($target.defense,1..6).sum;
说“{$target.WHAT.perl}滚动$defender”;
如果$攻击者>$defender
{
我的$damage=(1..$!damage)。拾取;
说“{self.WHAT.perl}造成{$damage}伤害”;
$target.hitpoints-=$damage;
}
如果$target.hitpoints<0
{
说“{$target.WHAT.perl}已经死了”;
返回True;
}
其他的
{
说“{$target.WHAT.perl}还有{$target.hitpoints}个hitpoints”;
返回False;
}
}
}
类玩家是游戏对象做不必要的暴力
{
有$.name;
多方法启动
{
说“英雄诞生了”;
自我启动({
#说“英雄在动”;
#键盘逻辑在这里,同时随机移动
$.game.channel.send({object=>self,x=>(-1..1.pick,y=>(-1..1.pick});
});
}
}
类怪物是游戏对象不必要的暴力
{
有$种;
多方法启动
{
说“一个怪物孵化了。”;
自我启动({
#说“怪物{self.id}正在移动”;
#AI逻辑在这里,同时随机运动
$.game.channel.send({object=>self,x=>(-1..1.pick,y=>(-1..1.pick});
});
}
}
班级游戏
{
我的$idc=0;
具有GameObject@。对象为rw;
具有通道$.Channel=.new;
方法运行{
自我设置;
self.mainloop;
}
方法设置
{
自我。添加对象(怪物。新(:id(+$idc),:物种(“巨魔”),:生命值(20),:伤害(14),:进攻(3),:速度(400),:防御(3),:x(4),:y(2),:游戏(自我));
自我。添加对象(怪物。新(:id(+$idc),:物种(“巨魔”),:生命值(25),:伤害(16),:进攻(3),:速度(300),:防御(3),:x(3),:y(2),:游戏(自我));
自我添加对象(玩家新建(:id(+$idc),:name(“Holli”),:生命值(50),:伤害(60),:进攻(4),:速度(200):防御(2),:x(0),:y(0),:游戏(自我));
}
方法添加对象(GameObject$object)
{
@!objects.push($object);
$object.start;
}
方法移除对象(GameObject$object)
{
@!objects=@!objects.grep({!($===$object)});
}
方法主循环
{ 
反应{
每当$.channel.Supply->$事件
{
自我过程运动($事件);
如果赛尔夫游戏结束了
{
“游戏结束,{@!objects[0]。WHAT.perl}赢了”;
$.channel.close;
完成;
};
};
每次供电间隔(0.01){
自我渲染;
}
}
}
方法进程移动($event)
{
#说“{$event.WHAT.perl}移动”;
给定$event
{
我的$to-x=.x+$事件;
my$to-y=.y+$event;
对于@!对象->$object
{
#我们不关心自己
下一个
如果$\ux==$对象;
#看看我们想去哪里
如果($to-x==$object.x&&$to-y==$object.y)
{
#无法移动,被友军阻挡
返回
如果$object.WHAT等式是什么;
#我们发现了一个怪物,看看能不能找到
#杀了它,搬到那里去
返回
除非。攻击($object);
#有东西死了
self.remove对象($object);
最后;
}
}
#我们赢了这场战斗,否则这地方就空了
#那我们走吧
.x=$to-x==5°-4!!
$to-x==-5±4!!
$to-x;
.y=$to-y==5???-4!!
$to-y==-5±4!!
$to-y;
}
}
方法渲染
{
对于@!对象->$object{
“{$object.WHAT.perl}位于{$object.x},{$object.y}”;
}
}
方法游戏结束了{
return(@!objects.map({.WHAT})).unique.elems==1;
}
}
Game.new.run;

大家好。我猜@Holli发布此消息是为了回应。我的计划是对比赛进行适当的记录,因为我认为这会有所帮助。如果人们不想问这个问题,我今晚还是会这么做。你好,你好。我道歉。如果我知道你会在没有种族证据的情况下发布代码,我会指示你在上面发布问题。希望一切都会成功。事实上,我读了你的评论,证实了我的怀疑,所以我去根除所有我能找到的种族,结果就是这个代码。我对这个异步的东西还不熟悉,所以我想我应该这样做