[关闭]
@galaxy-0 2017-06-13T19:08:44.000000Z 字数 2614 阅读 611

软需项目结构

软需


修改记录

时间 内容
6.13 添加Controller的逻辑和接口

流程图

总流程

Created with Raphaël 2.1.2开始游戏初始化界面向Controller请求发牌数据UI发牌出牌或弃牌出牌获取出牌信息提交出牌信息到Controller判断能否出牌UI显示出牌和AI出牌游戏结束?显示游戏结束界面提交弃牌信息到ControllerUI显示弃牌和AI出牌UI提示错误yesnoyesnoyesno

UI显示出牌流程

Created with Raphaël 2.1.2收到Controller回传结果玩家出牌吗玩家牌堆减少要出的牌玩家要出的牌显示在出牌区AI出牌吗AI牌堆数目减少出牌区显示AI出的牌所有AI都行动了吗玩家行动AI显示弃牌提示显示玩家弃牌提示yesnoyesnoyesno

界面大概示意图

微信截图_20170605120643.jpg-29.8kB

其中aiCardArea是AI的牌堆,cardState是显示当前出的牌的地方,cardArea是玩家的牌堆。一个方框是一个layout,建议layout的ID设置为图中的名字方便沟通

页面交互方式

每一个layoutbutton都有自己的id,通过id可以访问到对应的组件。
不同的组件有不同的api,可以对这个组件进行一定的操作
比如获取到一个button之后可以添加点击事件,可以通过代码修改button的样式
比如获取到一个layout之后可以获取子组件列表,可以添加或者删除子组件

一些接口

cardClass.jpg-8kB
卡牌的类,属性包括卡牌的状态(是否被选中),还有卡牌的花色数字
getter包括三个属性的getter,setter允许设置selected
卡牌的数据在初始化的时候就确定下来
在UI上面卡牌使用imageButton实现,通过判断卡牌的花色和数字,在代码中设置imageButton的src值来动态引用图案

result.jpg-13.9kB
这个是和Controller通信的时候的信息类,每次发数据到Controller的时候都会得到result对象
status表明请求是否成功,1是成功0是失败,比如发送一个出牌请求到Controller,得到的回复是1表明可以出牌,执行出牌的ui操作
error是错误信息,在status是0的时候设置
AICard是一个二维数组,分别代表两个ai接下来要出的牌,数组长度为0说明ai弃牌
userCard是一个二维数组,只有在发牌的时候用到,表明三个玩家每个人手里的牌,随机生成
这个类的基本方法已经列出来,可以根据需要添加方法

微信截图_20170613190041.jpg-8.6kB

Controller类需要有三个公共的方法

getInitialCard()

这个方法在获取玩家初始的牌的时候会调用
返回的Result对象中,userCard保存着玩家初始的牌,其它字段见上面的定义

sendCard(Card[])

这个方法在玩家点击出牌按钮的时候调用,会传入一个数组,里面是选中待出的牌,均为Card对象
Controller判断玩家出的牌是否符合规则(在Controller内部自行保存上一个玩家出的牌),如果符合,在返回的result对象里面status设置为1,并且在aiCard(一个二维数组)中保存两个ai要出的牌
如果不符合,status为0,并加上错误信息error

passCard()

这个方法在玩家点击pass按钮时调用,返回的result对象要设置aiCard

一个流程模板

注意:这个模板并不遵循语法

class MainAcitivity extends Activity {
Button submit;
Button pass;
//......
public void onCreate() {
    //初始化
    submit=(Button)findViewById(R.id.submit);
    //........

    //发牌
    startGame();

    //点击出牌按钮的事件
    submit.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            /*
            1.获取当前选中的牌
                Card[] card = getCardSelected();
            2.将当前选中的牌提交到Controller
                Result res = con.sendCrad(card);
            3.判断res的内容
               if (res.state==1)
                    sendCard(card,res);//UI执行玩家出牌动作,展示牌,展示ai出牌,然后回到玩家回合
               else showError(res);//UI显示错误信息,不能够出牌
             */
             Card[] card = getCardSelected();
             Result res = con.sendCrad(card);
             if (res.state==1)
                    sendCard(card,res);//UI执行玩家出牌动作,展示牌,展示ai出牌,然后回到玩家回合
               else showError(res);//UI显示错误信息,不能够出牌
        }
    });

    pass.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            //提交弃牌信息
             Result res = con.passCrad();
             if (res.state==1)
                    sendCard(card,res);//UI执行玩家弃牌动作,展示ai出牌,然后回到玩家回合
               else showError(res);//UI显示错误信息
        }
    });
}

private Card[] getCardSelected(){
    //这个函数返回一个Card数组,代表选中的待出的牌
    //这个函数从cardArea中获取相应的信息打包返回
}

private void sendCard(Card[] card,Result res){
    //这个函数第一个参数是玩家出的牌,第二个参数是结果对象,结果对象中包括了ai出的牌
    //这个函数执行显示出牌的UI操作
}

private void showError(){
    //这个函数执行显示错误的操作
}

private void startGame(){
    //这个函数执行开始游戏的UI操作
    //向Controller请求初始的牌
    //....
    Result res = con.startGame();
    //上面返回的对象有一个userCard的属性,保存了三个玩家的初始的牌
    //....
    }
}

分锅

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注