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