参考
- 多个用户参与游戏
- 每个人猜各自的最终数字
- 每人做多猜五次
代码:
php
function getroundnum() {
$num = rand(0, 30);
return $num;
}
class Persion {
public function __construct(public string $name) {
}
}
class GuessNum extends Persion {
private int $resultnum;
public bool $result;
private int $num;
private int $type;
public function __construct(public string $name, public int $gap = 1) {
$this->num = getroundnum();
$this->resultnum = getroundnum();
$this->result = false;
}
//type 1加数字 2减数字
private function getnextnum() {
if ($this->num === 0) {
return $this->num;
}
$this->num = match ($this->type) {
1 => $this->num + $this->gap,
2 => $this->num - $this->gap,
};
}
public function doguessonce() {
var_dump("resultnum:" . $this->resultnum . " name:" . $this->name . " num:" . $this->num);
$result = false;
$this->type = 0;
match (true) {
$this->num == $this->resultnum => $result = true,
$this->num > $this->resultnum => $this->type = 2, //减
$this->num < $this->resultnum => $this->type = 1//加
};
$this->result = $result;
if (!$result) {
$this->getnextnum();
}
}
}
php
$persion_list = [
new GuessNum("test1", 1),
new GuessNum("npc", 2),
];
$fibers = [];
foreach ($persion_list as $entity) {
$fibers[] = new Fiber(function () use ($entity) {
while (true) {
$entity->doguessonce($entity);
Fiber::suspend($entity);
}
});
}
// Start all fibers
$endresult = false;
foreach ($fibers as $fiber) {
$value = $fiber->start();
if ($value->result) {
$endresult = true;
var_dump("game end success name:" . $value->name);
break;
}
}
if (!$endresult) {
for ($i = 0; $i < 5; $i++) {
foreach ($fibers as $fiber) {
$value = $fiber->resume();
if ($value->result) {
$endresult = true;
var_dump("game end success name:" . $value->name);
break;
}
}
sleep(1);
var_dump("once end");
}
}
var_dump("game end ~");
输出
php
string(30) "resultnum:12 name:test1 num:22"
string(27) "resultnum:7 name:npc num:17"
string(30) "resultnum:12 name:test1 num:21"
string(27) "resultnum:7 name:npc num:15"
string(8) "once end"
string(30) "resultnum:12 name:test1 num:20"
string(27) "resultnum:7 name:npc num:13"
string(8) "once end"
string(30) "resultnum:12 name:test1 num:19"
string(27) "resultnum:7 name:npc num:11"
string(8) "once end"
string(30) "resultnum:12 name:test1 num:18"
string(26) "resultnum:7 name:npc num:9"
string(8) "once end"
string(30) "resultnum:12 name:test1 num:17"
string(26) "resultnum:7 name:npc num:7"
string(25) "game end success name:npc"
string(8) "once end"
string(10) "game end ~"