前一篇我们设计了数据对象,今天我们来描述整个游戏的运转流程。
我拿数位板手写了一个流程示意图,如图:
首先概述一下这一整个思路:
当玩家选择进行游戏之后,会跳转到一个Activity。那么在跳转后,我们就要开始载入资源,比如音效、图片素材等。这个载入可能会比较耗时,所以我们可以另开一个线程进行载入,然后通过myHandler进行通知主线程更新UI并进行初始化游戏的动作。另外,由于要实现网络对战的功能,所以我们还要另开一个线程进行网络对接的操作。
load_resources()主要包括载入图像,以及进行一些按键绑定。这个你们可以轻松实现,无非一些FindviewbyId、setOnClickListner,略去。
资源加载完之后,我们要开始初始化游戏的数据,如init_game():
private void init_game() throws Exception{
try{
complete_arrow_uesd=0;//初始化已用完成箭头标志的数目
whosTurn=(int)(Math.random()*4);//随机决定谁先开始
roll_num=0;
}
catch (Exception e){
e.printStackTrace();
System.out.println("注意:初始化游戏失败");
throw e;
}
System.out.println("注意:初始化游戏完毕");
}
在这个函数中,我们不需要做太多操作,只需要把一些游戏常用数值进行初始化。基于这个思想,你可以往里面填充你所需要的其他内容。
接下来,游戏开始。游戏一旦开始,我们需要读取当前对局所有玩家的总体数据。还记得我们曾经设置过一个ConfigHelper类么?所以现在,这个game_start()可以这么写:
private void game_begin(){
//游戏开始时的操作
chdm=new ConfigHelper(Value.Local);//初始化游戏设定,当前游戏为线下游戏
chdm.setHost(true);
chdm.setGreenType(Value.AI);//绿方为AI,下同
chdm.setBlueType(Value.AI);
chdm.setYellowType(Value.AI);
//填充你所需要的其他内容
System.out.println("游戏开始!");
turn_begin();//设定装载完毕,回合开始
}
现在,一个回合正式开始了。
在最初的设计需求中,我提到过我们要满足一个玩家"托管"状态的功能。
所以在这个流程中,我们要对当前回合的玩家进行判断,如果是AI,那么执行AI策略;同时还需要判断当前是否为网络游戏,如果是,判断是否为服务器,如果是服务器,要负责向具体的玩家收信,并把收信内容转发给其他的Online玩家;如果不是,就单纯从服务器收信,并对收到的数据进行处理就行了。我是这么设计的:
private void turn_begin(){
//回合开始
resetRoll();//重置骰子
System.out.println("玩家:["+Value.PlayerName[whosTurn]+"]的回合!Type:"+chdm.getPlayerType(whosTurn)+",请投掷骰子!");
//判断当前玩家是人还是AI
if(chdm.getGameType(