一个php处理回合制PK过程的问题

溜得滑 发布于 2015/04/28 09:22
阅读 440
收藏 0
PHP
游戏中就是你打我一下,我打你一下,两边都打完进如下一轮,现在是这样的。
左边是进攻方,先打
------------左边
人物A,人物B,人物C
------------右边
敌人A
PK过程是
人物A ---->攻击: 敌人A
敌人A ---->攻击: 人物A   (现在敌人攻击完了,左边没有攻击完)
人物B ---->攻击: 敌人A
人物C ---->攻击: 敌人A
==========到这里,一轮攻击就算完毕,进入下一轮PK===== 人物先手(即左边)
人物A ---->攻击: 敌人A
敌人A ---->攻击: 人物A   (现在敌人攻击完了,左边没有攻击完)
人物B ---->攻击: 敌人A
人物C ---->攻击: 敌人A
.....
比如双方的人物是由数组组成的。
//人物
$humen = array(
    1 => array(
        'name'=>'人物A'
        'is_attack'=>0,//表示本轮是否攻击过,到新一轮的时候就重置他
    ),
    2 => array(
        'name'=>'人物B',
        'is_attack'=>0,
    ),
    3 => array(
        'name'=>'人物C',
        'is_attack'=>0,     
    )
);
//敌人
$enemy= array(
    1 => array(
        'name'=>'敌人A',
        'is_attack'=>0,
    ),
); 最后实形成这样一个过程 

<?php
$process = array(
    0 => array(
        launch => 'left',
        attackor => 1, //人物A发起攻击
        hurt => array(0 => array('beattackors' => 1), //敌人A被攻击  beattackors 对应地方的数组索引
        )
    ),
    1 => array(
        launch => 'right',
        attackor => 1, //敌人A发起攻击
        hurt => array(0 => array('beattackors' => 1), //人物A被攻击  beattackors 对应地方的数组索引
        )
    ),
    2 => array(
        launch => 'left',
        attackor => 2, //人物B发起攻击
        hurt => array(0 => array('beattackors' => 1), //敌人A被攻击  beattackors 对应地方的数组索引
        )
    ), //到这里由于敌人已经攻击完了,但是本方还没有攻击完,继续left
    3 => array(
        launch => 'left',
        attackor => 3, //人物C发起攻击
        hurt => array(0 => array('beattackors' => 1), //攻击敌人A  beattackors 对应地方的数组索引
        )
    )
);





PHP怎么实现这个PK过程呢。 

加载中
0
龙上
龙上
while循环啊..敌人都没有HP吗? HP减到0以后就跳出循环了. 
0
溜得滑
溜得滑

引用来自“龙上”的评论

while循环啊..敌人都没有HP吗? HP减到0以后就跳出循环了. 
嗯,我现在也是那样想的,但是在判断谁攻击了,谁没有攻击,什么时候进入下一轮战斗,就不对了
hmh
hmh
回复 @Ellipse : 就是这个意思!
E
Ellipse
回复 @逆时针合适 : 我理解是数组A=玩家,B=敌人,C=A+B(数组C还可以根据角色的速度什么的排序:D),攻击是foreach数组C,如果item属于A则从B中选择进攻对象,如果属于B则从A
溜得滑
溜得滑
回复 @hmh : 没怎么明白你说的,foreach 我觉得不好使,战斗中需要交换选手的啊,而且还要找有攻击过的和没攻击过的,全部人都攻击过了才进入下一回合
hmh
hmh
把所有人放到一个数组里。 foreach循环, 这样就是轮流攻击了。foreach循环完就是一会合
0
方棱
方棱
制作PK动画的前端开发表示压力很大……
溜得滑
溜得滑
现在讨论后台处理数据,前端咱不考虑
0
溜得滑
溜得滑

看看这个初略的流程图,有不对的吗

0
绿水本无忧
绿水本无忧

估摸着至少得两个循环,一轮攻击结束应该就是敌方了,那么这边的循环就break,正确处理好hp


0
南湖船老大
南湖船老大

游戏都有专门的算法,你说的这个是最简单的,也是 “状态机”的最简单模型。

说白了,“状态机”就是一个while循环。

0
jacky-zhuo
jacky-zhuo
//个人想法, 面对过程...

$humen = array();
$enemy = array();

function play() {
    global $humen, $enemy;

    /*
     * 此处应该以某种规则来合并两个数组, 我这里是直接合并了
     * 如果有速度这个数值我觉得应该以速度降序排
     */
    $players = $humen + $enemy;

    //循环发动攻击
    foreach($players as $player) {
        if(/* 结束战斗条件 */) {
            return;
        }

        /*
        攻击, 被攻击 code
        */
    }

    /*
     * 递归继续下一轮
     * 因为有可能有技能什么的, 可以加减速度, 递归就可以重新对速度进行排序了
     */
    play();  
}



返回顶部
顶部